From 212518c682ae8e89e40cdde74a54750f8ca8570e Mon Sep 17 00:00:00 2001 From: MystiPanda Date: Fri, 28 Jun 2024 11:45:44 +0800 Subject: [PATCH] feat: set dns by service --- src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 2 +- src-tauri/src/core/service.rs | 36 +++++++++++++++++++++++ src-tauri/src/enhance/tun.rs | 55 ++--------------------------------- 4 files changed, 41 insertions(+), 53 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 24f99438..3f78dad5 100644 --- a/src-tauri/Cargo.lock +++ b/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", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2f00f8d6..64a201ff 100644 --- a/src-tauri/Cargo.toml +++ b/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] diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 6872b02d..cf00895c 100644 --- a/src-tauri/src/core/service.rs +++ b/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::() + .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::() + .context("failed to connect to the Clash Verge Service")?; + + if res.code != 0 { + bail!(res.msg); + } + + Ok(()) +} diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 2cd4e115..17e74a2a 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/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 } }