From 74251af163594922424b3fe6bcaf08f97a15391c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 28 Oct 2024 00:24:57 +0800 Subject: [PATCH] fix: dns not restored when exiting the app --- src-tauri/src/cmds.rs | 2 +- src-tauri/src/enhance/tun.rs | 77 +--------------------------------- src-tauri/src/feat.rs | 5 +++ src-tauri/src/utils/resolve.rs | 73 ++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 76 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index a2c7cb8a..8bd24378 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -371,7 +371,7 @@ pub fn open_devtools(app_handle: tauri::AppHandle) { } #[tauri::command] -pub fn exit_app() { +pub async fn exit_app() { feat::quit(Some(0)); } diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 87c78efa..3714d8c2 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -36,11 +36,11 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(dns_val, "enhanced-mode", "fake-ip"); revise!(dns_val, "fake-ip-range", "10.96.0.0/16"); #[cfg(target_os = "macos")] - set_public_dns("10.96.0.2".to_string()).await; + crate::utils::resolve::set_public_dns("10.96.0.2".to_string()).await; } else { revise!(dns_val, "enhanced-mode", "redir-host"); #[cfg(target_os = "macos")] - restore_public_dns().await; + crate::utils::resolve::restore_public_dns().await; } revise!(tun_val, "enable", enable); @@ -48,76 +48,3 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(config, "dns", dns_val); config } - -#[cfg(target_os = "macos")] -async fn set_public_dns(dns_server: String) { - use crate::core::handle; - use crate::utils::dirs; - use tauri_plugin_shell::ShellExt; - let app_handle = handle::Handle::global().app_handle().unwrap(); - - log::info!(target: "app", "try to set system dns"); - let resource_dir = dirs::app_resources_dir().unwrap(); - let script = resource_dir.join("set_dns.sh"); - if !script.exists() { - log::error!(target: "app", "set_dns.sh not found"); - return; - } - let script = script.to_string_lossy().into_owned(); - match app_handle - .shell() - .command("bash") - .args([script, dns_server]) - .current_dir(resource_dir) - .status() - .await - { - Ok(status) => { - if status.success() { - log::info!(target: "app", "set system dns successfully"); - } else { - let code = status.code().unwrap_or(-1); - log::error!(target: "app", "set system dns failed: {code}"); - } - } - Err(err) => { - log::error!(target: "app", "set system dns failed: {err}"); - } - } -} - -#[cfg(target_os = "macos")] -async fn restore_public_dns() { - use crate::core::handle; - use crate::utils::dirs; - use tauri_plugin_shell::ShellExt; - let app_handle = handle::Handle::global().app_handle().unwrap(); - log::info!(target: "app", "try to unset system dns"); - let resource_dir = dirs::app_resources_dir().unwrap(); - let script = resource_dir.join("unset_dns.sh"); - if !script.exists() { - log::error!(target: "app", "unset_dns.sh not found"); - return; - } - let script = script.to_string_lossy().into_owned(); - match app_handle - .shell() - .command("bash") - .args([script]) - .current_dir(resource_dir) - .status() - .await - { - Ok(status) => { - if status.success() { - log::info!(target: "app", "unset system dns successfully"); - } else { - let code = status.code().unwrap_or(-1); - log::error!(target: "app", "unset system dns failed: {code}"); - } - } - Err(err) => { - log::error!(target: "app", "unset system dns failed: {err}"); - } - } -} diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 32023ee7..0e0d5cfd 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -101,6 +101,11 @@ pub fn toggle_tun_mode() { pub fn quit(code: Option) { let app_handle = handle::Handle::global().app_handle().unwrap(); resolve::resolve_reset(); + #[cfg(target_os = "macos")] + tauri::async_runtime::block_on(async { + resolve::restore_public_dns().await; + }); + app_handle.exit(code.unwrap_or(0)); } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index c86db794..7c37819f 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -344,3 +344,76 @@ fn resolve_random_port_config() -> Result<()> { clash_config.data().save_config()?; Ok(()) } + +#[cfg(target_os = "macos")] +pub async fn set_public_dns(dns_server: String) { + use crate::core::handle; + use crate::utils::dirs; + use tauri_plugin_shell::ShellExt; + let app_handle = handle::Handle::global().app_handle().unwrap(); + + log::info!(target: "app", "try to set system dns"); + let resource_dir = dirs::app_resources_dir().unwrap(); + let script = resource_dir.join("set_dns.sh"); + if !script.exists() { + log::error!(target: "app", "set_dns.sh not found"); + return; + } + let script = script.to_string_lossy().into_owned(); + match app_handle + .shell() + .command("bash") + .args([script, dns_server]) + .current_dir(resource_dir) + .status() + .await + { + Ok(status) => { + if status.success() { + log::info!(target: "app", "set system dns successfully"); + } else { + let code = status.code().unwrap_or(-1); + log::error!(target: "app", "set system dns failed: {code}"); + } + } + Err(err) => { + log::error!(target: "app", "set system dns failed: {err}"); + } + } +} + +#[cfg(target_os = "macos")] +pub async fn restore_public_dns() { + use crate::core::handle; + use crate::utils::dirs; + use tauri_plugin_shell::ShellExt; + let app_handle = handle::Handle::global().app_handle().unwrap(); + log::info!(target: "app", "try to unset system dns"); + let resource_dir = dirs::app_resources_dir().unwrap(); + let script = resource_dir.join("unset_dns.sh"); + if !script.exists() { + log::error!(target: "app", "unset_dns.sh not found"); + return; + } + let script = script.to_string_lossy().into_owned(); + match app_handle + .shell() + .command("bash") + .args([script]) + .current_dir(resource_dir) + .status() + .await + { + Ok(status) => { + if status.success() { + log::info!(target: "app", "unset system dns successfully"); + } else { + let code = status.code().unwrap_or(-1); + log::error!(target: "app", "unset system dns failed: {code}"); + } + } + Err(err) => { + log::error!(target: "app", "unset system dns failed: {err}"); + } + } +}