Files
clash-verge-rev/src-tauri/src/cmd/network.rs
T
2026-10-27 06:47:53 +08:00

107 lines
2.7 KiB
Rust

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;
use tristr::alias::String;
#[tauri::command]
#[specta::specta]
pub async fn get_sys_proxy() -> CmdResult<SystemProxy> {
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}").into(),
bypass: bypass.into(),
})
}
#[tauri::command]
#[specta::specta]
pub async fn get_auto_proxy() -> CmdResult<AutoProxy> {
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: url.into(),
})
}
#[tauri::command]
#[specta::specta]
pub fn get_embedded_server_port() -> CmdResult<u16> {
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.into(),
Err(os_string) => {
let fallback = format!("{os_string:?}");
fallback.trim_matches('"').into()
}
}
}
#[tauri::command]
#[specta::specta]
pub fn get_network_interfaces() -> Vec<String> {
tauri_plugin_clash_verge_sysinfo::list_network_interfaces()
.into_iter()
.map(Into::into)
.collect()
}
#[tauri::command]
#[specta::specta]
pub fn get_network_interfaces_info() -> CmdResult<Vec<crate::ipc::NetworkInterfaceView>> {
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.iter().any(|name| name == &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,
}