refactor: refine DNS handling to follow config and merge settings

This commit is contained in:
wonfen 2025-03-08 03:33:26 +08:00
parent 10a151d411
commit eddcf209c1

View File

@ -24,18 +24,20 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping {
let mut tun_val = tun_val.map_or(Mapping::new(), |val| { let mut tun_val = tun_val.map_or(Mapping::new(), |val| {
val.as_mapping().cloned().unwrap_or(Mapping::new()) val.as_mapping().cloned().unwrap_or(Mapping::new())
}); });
let dns_key = Value::from("dns");
let dns_val = config.get(&dns_key);
let mut dns_val = dns_val.map_or(Mapping::new(), |val| {
val.as_mapping().cloned().unwrap_or(Mapping::new())
});
let ipv6_key = Value::from("ipv6");
let ipv6_val = config
.get(&ipv6_key)
.and_then(|v| v.as_bool())
.unwrap_or(false);
if enable { if enable {
// 读取DNS配置
let dns_key = Value::from("dns");
let dns_val = config.get(&dns_key);
let mut dns_val = dns_val.map_or(Mapping::new(), |val| {
val.as_mapping().cloned().unwrap_or(Mapping::new())
});
let ipv6_key = Value::from("ipv6");
let ipv6_val = config
.get(&ipv6_key)
.and_then(|v| v.as_bool())
.unwrap_or(false);
// 检查现有的 enhanced-mode 设置 // 检查现有的 enhanced-mode 设置
let current_mode = dns_val let current_mode = dns_val
.get(&Value::from("enhanced-mode")) .get(&Value::from("enhanced-mode"))
@ -61,42 +63,18 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping {
crate::utils::resolve::set_public_dns("223.6.6.6".to_string()).await; crate::utils::resolve::set_public_dns("223.6.6.6".to_string()).await;
} }
} }
// 当TUN启用时将修改后的DNS配置写回
revise!(config, "dns", dns_val);
} else { } else {
revise!( // TUN未启用时仅恢复系统DNS不修改配置文件中的DNS设置
dns_val,
"enable",
dns_val
.get("enable")
.and_then(|v| v.as_bool())
.unwrap_or(true)
);
revise!(dns_val, "ipv6", ipv6_val);
revise!(
dns_val,
"enhanced-mode",
dns_val
.get("enhanced-mode")
.and_then(|v| v.as_str())
.unwrap_or("redir-host")
);
revise!(
dns_val,
"fake-ip-range",
dns_val
.get("fake-ip-range")
.and_then(|v| v.as_str())
.unwrap_or("198.18.0.1/16")
);
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
crate::utils::resolve::restore_public_dns().await; crate::utils::resolve::restore_public_dns().await;
} }
// 更新TUN配置
revise!(tun_val, "enable", enable); revise!(tun_val, "enable", enable);
revise!(config, "tun", tun_val); revise!(config, "tun", tun_val);
revise!(config, "dns", dns_val);
config config
} }