Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions platforms/tauri/src-tauri/src/commands/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,10 @@ fn linux_primary_adapter() -> Option<String> {
}
}

let devices = linux_capture("nmcli", &["-t", "-f", "DEVICE,TYPE,STATE", "device", "status"])?;
let devices = linux_capture(
"nmcli",
&["-t", "-f", "DEVICE,TYPE,STATE", "device", "status"],
)?;

for line in devices.lines() {
let mut fields = line.split(':');
Expand Down Expand Up @@ -204,7 +207,13 @@ fn linux_write_network_snapshot() -> Result<PathBuf, String> {
"nmcli device status",
linux_capture(
"nmcli",
&["-t", "-f", "DEVICE,TYPE,STATE,CONNECTION", "device", "status"],
&[
"-t",
"-f",
"DEVICE,TYPE,STATE,CONNECTION",
"device",
"status",
],
),
),
("resolvectl dns", linux_capture("resolvectl", &["dns"])),
Expand Down Expand Up @@ -644,7 +653,9 @@ async fn resolve_dns_with_server(domain: &str, dns_server: &str) -> bool {
.output();

#[cfg(not(windows))]
let output = linux_command("nslookup").args([domain, dns_server]).output();
let output = linux_command("nslookup")
.args([domain, dns_server])
.output();

match output {
Ok(o) if o.status.success() => {
Expand Down Expand Up @@ -923,10 +934,7 @@ pub async fn open_system_tool(tool: String) -> Result<String, String> {
linux_spawn("xdg-open", &[snapshot_path.as_str()])?;
Ok("Resumen de red abierto en tu visor predeterminado".to_string())
} else {
Ok(format!(
"Resumen de red guardado en {}",
snapshot.display()
))
Ok(format!("Resumen de red guardado en {}", snapshot.display()))
}
}
_ => Err(format!("Herramienta no permitida: {}", tool)),
Expand Down Expand Up @@ -1028,7 +1036,13 @@ pub async fn reset_network_stack() -> Result<String, String> {
actions.push(format!("configuración reaplicada sobre {}", adapter));
} else if let Some(connection) = linux_active_connection(&adapter) {
if linux_command("nmcli")
.args(["connection", "up", connection.as_str(), "ifname", adapter.as_str()])
.args([
"connection",
"up",
connection.as_str(),
"ifname",
adapter.as_str(),
])
.output()
.map(|output| output.status.success())
.unwrap_or(false)
Expand Down
10 changes: 5 additions & 5 deletions platforms/tauri/src-tauri/src/commands/monitoring.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,8 @@ fn get_adapter_metrics(
#[cfg(not(windows))]
{
let read_stat = |name: &str| -> Result<u64, Box<dyn std::error::Error>> {
let value = fs::read_to_string(format!(
"/sys/class/net/{}/statistics/{}",
adapter, name
))?;
let value =
fs::read_to_string(format!("/sys/class/net/{}/statistics/{}", adapter, name))?;
Ok(value.trim().parse().unwrap_or(0))
};

Expand Down Expand Up @@ -217,7 +215,9 @@ fn get_adapter_metrics(
fn measure_latency() -> Result<f64, Box<dyn std::error::Error>> {
#[cfg(not(windows))]
{
let route_output = Command::new("ip").args(["route", "show", "default"]).output()?;
let route_output = Command::new("ip")
.args(["route", "show", "default"])
.output()?;
let routes = String::from_utf8_lossy(&route_output.stdout);
let gateway = routes
.lines()
Expand Down
42 changes: 10 additions & 32 deletions platforms/tauri/src-tauri/src/commands/optimizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,8 @@ fn linux_current_settings() -> TcpSettings {
}
.to_string();

let pacing = linux_sysctl_get("net.core.default_qdisc")
.unwrap_or_else(|| "unknown".to_string());
let pacing =
linux_sysctl_get("net.core.default_qdisc").unwrap_or_else(|| "unknown".to_string());

let rack = match linux_sysctl_get("net.ipv4.tcp_recovery").as_deref() {
Some("0") => "disabled",
Expand Down Expand Up @@ -367,10 +367,8 @@ pub fn get_current_settings_internal() -> Result<TcpSettings, String> {
let ecn = extract_value_multi(&stdout, &["ECN Capability", "Funcionalidad de ECN"]);

// Timestamps
let timestamps = extract_value_multi(
&stdout,
&["RFC 1323 Timestamps", "Marcas de hora RFC 1323"],
);
let timestamps =
extract_value_multi(&stdout, &["RFC 1323 Timestamps", "Marcas de hora RFC 1323"]);

// Chimney (deprecado en Windows 10+)
let chimney = extract_value_multi(&stdout, &["Chimney Offload State"]);
Expand Down Expand Up @@ -494,12 +492,7 @@ pub fn apply_profile_internal(profile: &str) -> Result<Vec<String>, String> {
"Window scaling enabled",
&mut applied,
)?;
linux_apply_sysctl(
"net.ipv4.tcp_ecn",
"1",
"ECN enabled",
&mut applied,
)?;
linux_apply_sysctl("net.ipv4.tcp_ecn", "1", "ECN enabled", &mut applied)?;
linux_apply_sysctl(
"net.ipv4.tcp_timestamps",
"1",
Expand Down Expand Up @@ -535,12 +528,7 @@ pub fn apply_profile_internal(profile: &str) -> Result<Vec<String>, String> {
"Window scaling enabled",
&mut applied,
)?;
linux_apply_sysctl(
"net.ipv4.tcp_ecn",
"1",
"ECN enabled",
&mut applied,
)?;
linux_apply_sysctl("net.ipv4.tcp_ecn", "1", "ECN enabled", &mut applied)?;
linux_apply_sysctl(
"net.ipv4.tcp_timestamps",
"1",
Expand Down Expand Up @@ -686,9 +674,7 @@ pub fn apply_profile_internal(profile: &str) -> Result<Vec<String>, String> {
// https://docs.microsoft.com/en-us/windows/win32/api/qos2/
// Valor 0xFFFFFFFF = sin throttling
if set_registry_dword("NetworkThrottlingIndex", 0xffffffff).is_ok() {
applied.push(
"Network Throttling disabled (10ms delay removed)".to_string(),
);
applied.push("Network Throttling disabled (10ms delay removed)".to_string());
}

// Nagle Algorithm: Desactivar para reducir latencia en gaming/realtime
Expand All @@ -702,9 +688,7 @@ pub fn apply_profile_internal(profile: &str) -> Result<Vec<String>, String> {
// Bit 1 (valor 2): Timestamps
// Valor 3 = ambos habilitados
if set_registry_dword("Tcp1323Opts", 3).is_ok() {
applied.push(
"TCP Window Scaling + Timestamps (Tcp1323Opts=3)".to_string(),
);
applied.push("TCP Window Scaling + Timestamps (Tcp1323Opts=3)".to_string());
}
}
_ => {
Expand Down Expand Up @@ -747,12 +731,7 @@ pub fn reset_to_defaults_internal() -> Result<Vec<String>, String> {
"Window scaling reset",
&mut reset,
)?;
linux_apply_sysctl(
"net.ipv4.tcp_ecn",
"2",
"ECN reset",
&mut reset,
)?;
linux_apply_sysctl("net.ipv4.tcp_ecn", "2", "ECN reset", &mut reset)?;
linux_apply_sysctl(
"net.ipv4.tcp_timestamps",
"1",
Expand Down Expand Up @@ -795,8 +774,7 @@ pub fn reset_to_defaults_internal() -> Result<Vec<String>, String> {

if reset.is_empty() {
return Err(
"No se restauraron valores Linux; faltan permisos o soporte del kernel"
.to_string(),
"No se restauraron valores Linux; faltan permisos o soporte del kernel".to_string(),
);
}

Expand Down
9 changes: 6 additions & 3 deletions platforms/tauri/src-tauri/src/commands/updater.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,8 @@ pub async fn install_update(path: String) -> Result<(), String> {
.to_lowercase();

if filename.ends_with(".appimage") {
let metadata = fs::metadata(&path)
.map_err(|e| format!("No se pudo leer el AppImage: {}", e))?;
let metadata =
fs::metadata(&path).map_err(|e| format!("No se pudo leer el AppImage: {}", e))?;
let mut permissions = metadata.permissions();
permissions.set_mode(permissions.mode() | 0o755);
fs::set_permissions(&path, permissions)
Expand Down Expand Up @@ -164,7 +164,10 @@ pub async fn install_update(path: String) -> Result<(), String> {
return Ok(());
}

Err("No se encontró un abridor gráfico compatible para instalar la actualización en Linux".to_string())
Err(
"No se encontró un abridor gráfico compatible para instalar la actualización en Linux"
.to_string(),
)
}
}

Expand Down
48 changes: 32 additions & 16 deletions platforms/tauri/src-tauri/src/services/dns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,20 @@ fn run_command_capture(program: &str, args: &[&str]) -> Result<String, String> {

#[cfg(not(windows))]
fn is_virtual_linux_interface(device: &str, device_type: &str) -> bool {
matches!(device_type, "loopback" | "bridge" | "wireguard" | "wifi-p2p")
|| matches!(
device,
name if name == "lo"
|| name.starts_with("docker")
|| name.starts_with("br-")
|| name.starts_with("veth")
|| name.starts_with("virbr")
|| name.starts_with("wg")
|| name.starts_with("tun")
|| name.starts_with("tap")
)
matches!(
device_type,
"loopback" | "bridge" | "wireguard" | "wifi-p2p"
) || matches!(
device,
name if name == "lo"
|| name.starts_with("docker")
|| name.starts_with("br-")
|| name.starts_with("veth")
|| name.starts_with("virbr")
|| name.starts_with("wg")
|| name.starts_with("tun")
|| name.starts_with("tap")
)
}

#[cfg(not(windows))]
Expand Down Expand Up @@ -103,7 +105,10 @@ fn normalize_nm_bool(value: &str) -> bool {
#[cfg(not(windows))]
fn parse_dns_server_list(raw: &str) -> Vec<String> {
let values = raw.replace('\n', " ");
let values = values.split_once(':').map(|(_, rest)| rest).unwrap_or(&values);
let values = values
.split_once(':')
.map(|(_, rest)| rest)
.unwrap_or(&values);

values
.split(|ch: char| ch == ',' || ch.is_whitespace())
Expand All @@ -121,7 +126,10 @@ pub fn get_current_dns_servers(adapter: &str) -> Result<Vec<String>, String> {
}
}

let raw = run_command_capture("nmcli", &["-t", "-g", "IP4.DNS,IP6.DNS", "device", "show", adapter])?;
let raw = run_command_capture(
"nmcli",
&["-t", "-g", "IP4.DNS,IP6.DNS", "device", "show", adapter],
)?;
Ok(parse_dns_server_list(&raw))
}

Expand Down Expand Up @@ -217,7 +225,13 @@ pub fn get_primary_adapter() -> Result<String, String> {
{
let raw = run_command_capture(
"nmcli",
&["-t", "-f", "DEVICE,TYPE,STATE,CONNECTION", "device", "status"],
&[
"-t",
"-f",
"DEVICE,TYPE,STATE,CONNECTION",
"device",
"status",
],
)?;

for line in raw.lines() {
Expand All @@ -240,7 +254,9 @@ pub fn get_primary_adapter() -> Result<String, String> {
return Ok(device.to_string());
}

return Err("No se encontró un adaptador Linux activo administrado por NetworkManager".to_string());
return Err(
"No se encontró un adaptador Linux activo administrado por NetworkManager".to_string(),
);
}

#[cfg(windows)]
Expand Down
Loading