use super::CmdResult; use crate::cmd::StringifyErr as _; use crate::core::{proxy_control, sysopt::Sysopt}; use gethostname::gethostname; use sysproxy::{Autoproxy, Sysproxy}; use tauri_plugin_clash_verge_sysinfo; #[tauri::command] #[specta::specta] 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 { host, bypass, port, enable, } = sys_proxy; Ok(SystemProxy { enable, server: format!("{host}:{port}"), bypass, }) } #[tauri::command] #[specta::specta] 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 { enable, url } = auto_proxy; Ok(AutoProxy { enable, url }) } #[tauri::command] #[specta::specta] pub fn get_embedded_server_port() -> CmdResult { crate::utils::server::embedded_server_port().stringify_err() } #[tauri::command] #[specta::specta] 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] #[specta::specta] pub fn get_network_interfaces() -> Vec { tauri_plugin_clash_verge_sysinfo::list_network_interfaces() } #[tauri::command] #[specta::specta] 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.into()); } } Ok(result) } #[derive(serde::Serialize, specta::Type)] pub struct SystemProxy { pub enable: bool, pub server: String, pub bypass: String, } #[derive(serde::Serialize, specta::Type)] pub struct AutoProxy { pub enable: bool, pub url: String, }