use super::CmdResult; use crate::cmd::StringifyErr as _; use crate::core::{proxy_control, sysopt::Sysopt}; use gethostname::gethostname; use network_interface::NetworkInterface; use serde_yaml_ng::Mapping; use sysproxy::{Autoproxy, Sysproxy}; use tauri_plugin_clash_verge_sysinfo; #[tauri::command] pub async fn get_sys_proxy() -> CmdResult { Sysopt::global().wait_idle().await; // With no network service there is no proxy configured anywhere, which reads as disabled. let sys_proxy = match Sysproxy::get_system_proxy() { Err(error) if proxy_control::is_missing_network_service(&error) => Sysproxy::default(), other => other.stringify_err()?, }; let Sysproxy { ref host, ref bypass, ref port, ref enable, } = sys_proxy; let mut map = Mapping::new(); map.insert("enable".into(), (*enable).into()); map.insert("server".into(), format!("{}:{}", host, port).into()); map.insert("bypass".into(), bypass.as_str().into()); Ok(map) } #[tauri::command] pub async fn get_auto_proxy() -> CmdResult { Sysopt::global().wait_idle().await; let auto_proxy = match Autoproxy::get_auto_proxy() { Err(error) if proxy_control::is_missing_network_service(&error) => Autoproxy::default(), other => other.stringify_err()?, }; let Autoproxy { ref enable, ref url } = auto_proxy; let mut map = Mapping::new(); map.insert("enable".into(), (*enable).into()); map.insert("url".into(), url.as_str().into()); Ok(map) } #[tauri::command] pub fn get_embedded_server_port() -> CmdResult { crate::utils::server::embedded_server_port().stringify_err() } #[tauri::command] pub fn get_system_hostname() -> String { match gethostname().into_string() { Ok(name) => name, Err(os_string) => { let fallback = format!("{os_string:?}"); fallback.trim_matches('"').to_string() } } } #[tauri::command] pub fn get_network_interfaces() -> Vec { tauri_plugin_clash_verge_sysinfo::list_network_interfaces() } #[tauri::command] pub fn get_network_interfaces_info() -> CmdResult> { use network_interface::{NetworkInterface, NetworkInterfaceConfig as _}; let names = get_network_interfaces(); let interfaces = NetworkInterface::show().stringify_err()?; let mut result = Vec::new(); for interface in interfaces { if names.contains(&interface.name) { result.push(interface); } } Ok(result) }