Sfoglia il codice sorgente

feat: set dns by service

MystiPanda 11 mesi fa
parent
commit
8f3801e3c2
4 ha cambiato i file con 41 aggiunte e 53 eliminazioni
  1. 1 0
      src-tauri/Cargo.lock
  2. 1 1
      src-tauri/Cargo.toml
  3. 36 0
      src-tauri/src/core/service.rs
  4. 3 52
      src-tauri/src/enhance/tun.rs

+ 1 - 0
src-tauri/Cargo.lock

@@ -4505,6 +4505,7 @@ dependencies = [
  "base64 0.22.1",
  "bytes",
  "encoding_rs",
+ "futures-channel",
  "futures-core",
  "futures-util",
  "h2 0.4.5",

+ 1 - 1
src-tauri/Cargo.toml

@@ -35,7 +35,7 @@ percent-encoding = "2.3.1"
 window-shadows = { version = "0.2" }
 tokio = { version = "1", features = ["full"] }
 serde = { version = "1.0", features = ["derive"] }
-reqwest = { version = "0.12", features = ["json", "rustls-tls"] }
+reqwest = { version = "0.12", features = ["json", "rustls-tls", "blocking"] }
 sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" }
 tauri = { git="https://github.com/tauri-apps/tauri",branch = "1.x", features = [ "fs-read-file", "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] }
 [target.'cfg(windows)'.dependencies]

+ 36 - 0
src-tauri/src/core/service.rs

@@ -312,3 +312,39 @@ pub(super) async fn stop_core_by_service() -> Result<()> {
 
     Ok(())
 }
+
+/// set dns by service
+pub fn set_dns_by_service() -> Result<()> {
+    let url = format!("{SERVICE_URL}/set_dns");
+    let res = reqwest::blocking::ClientBuilder::new()
+        .no_proxy()
+        .build()?
+        .post(url)
+        .send()?
+        .json::<JsonResponse>()
+        .context("failed to connect to the Clash Verge Service")?;
+
+    if res.code != 0 {
+        bail!(res.msg);
+    }
+
+    Ok(())
+}
+
+/// unset dns by service
+pub fn unset_dns_by_service() -> Result<()> {
+    let url = format!("{SERVICE_URL}/unset_dns");
+    let res = reqwest::blocking::ClientBuilder::new()
+        .no_proxy()
+        .build()?
+        .post(url)
+        .send()?
+        .json::<JsonResponse>()
+        .context("failed to connect to the Clash Verge Service")?;
+
+    if res.code != 0 {
+        bail!(res.msg);
+    }
+
+    Ok(())
+}

+ 3 - 52
src-tauri/src/enhance/tun.rs

@@ -1,3 +1,4 @@
+use crate::core::service;
 use serde_yaml::{Mapping, Value};
 
 macro_rules! revise {
@@ -34,60 +35,10 @@ pub fn use_tun(mut config: Mapping, enable: bool) -> Mapping {
     revise!(config, "tun", tun_val);
 
     if enable {
-        #[cfg(target_os = "macos")]
-        {
-            use crate::utils::dirs;
-            use tauri::api::process::Command;
-            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");
-            let script = script.to_string_lossy();
-            match Command::new("bash")
-                .args([script])
-                .current_dir(resource_dir)
-                .status()
-            {
-                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}");
-                }
-            }
-        }
+        let _ = service::set_dns_by_service();
         use_dns_for_tun(config)
     } else {
-        #[cfg(target_os = "macos")]
-        {
-            use crate::utils::dirs;
-            use tauri::api::process::Command;
-            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");
-            let script = script.to_string_lossy();
-            match Command::new("bash")
-                .args([script])
-                .current_dir(resource_dir)
-                .status()
-            {
-                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}");
-                }
-            }
-        }
+        let _ = service::unset_dns_by_service();
         config
     }
 }