支持tap网卡,优化tun网卡配置

This commit is contained in:
lubeilin
2023-05-07 18:32:11 +08:00
parent 068580e036
commit 35ed7f7e45
68 changed files with 2810 additions and 2393 deletions
+35 -10
View File
@@ -13,6 +13,7 @@ use crate::StartArgs;
pub mod log_config;
pub struct StartConfig {
pub tap: bool,
pub name: String,
pub token: String,
pub server: SocketAddr,
@@ -21,7 +22,20 @@ pub struct StartConfig {
}
pub fn default_config(start_args: StartArgs) -> Result<StartConfig, String> {
println!("========参数配置========");
let args_config = read_config();
let tap = start_args.tap.unwrap_or_else(|| {
if let Some(c) = &args_config {
c.tap
} else {
false
}
});
if tap {
println!("use tap");
} else {
println!("use tun");
}
if args_config.is_none() && start_args.token.is_none() {
return Err("找不到token(Token not found)".to_string());
}
@@ -32,7 +46,7 @@ pub fn default_config(start_args: StartArgs) -> Result<StartConfig, String> {
if token.len() > 64 {
return Err("token不能超过64字符(Token cannot exceed 64 characters)".to_string());
}
println!("token:{:?}",token);
println!("token:{:?}", token);
let name = start_args.name.unwrap_or_else(|| {
if let Some(c) = &args_config {
if !c.name.is_empty() {
@@ -47,7 +61,7 @@ pub fn default_config(start_args: StartArgs) -> Result<StartConfig, String> {
} else {
name.to_string()
};
println!("name:{:?}",name);
println!("name:{:?}", name);
let device_id = start_args.device_id.unwrap_or_else(|| {
if let Some(c) = &args_config {
if !c.device_id.is_empty() {
@@ -63,7 +77,7 @@ pub fn default_config(start_args: StartArgs) -> Result<StartConfig, String> {
if device_id.is_empty() || device_id.len() > 64 {
return Err("设备id不能为空并且长度不能大于64字符(The device id cannot be empty and the length cannot be greater than 64 characters)".to_string());
}
println!("device_id:{:?}",device_id);
println!("device_id:{:?}", device_id);
let server = match start_args.server.unwrap_or_else(|| {
if let Some(c) = &args_config {
if !c.server.is_empty() {
@@ -83,7 +97,7 @@ pub fn default_config(start_args: StartArgs) -> Result<StartConfig, String> {
return Err(format!("中继服务器地址错误( Relay server address error) :{:?}", e));
}
};
println!("中继服务器:{:?}",server);
println!("中继服务器:{:?}", server);
let nat_test_server = start_args.nat_test_server.unwrap_or_else(|| {
if let Some(c) = &args_config {
if !c.nat_test_server.is_empty() {
@@ -96,14 +110,16 @@ pub fn default_config(start_args: StartArgs) -> Result<StartConfig, String> {
if nat_test_server.is_empty() {
return Err("NAT检测服务地址错误(NAT detection service address error)".to_string());
}
println!("NAT探测服务器:{:?}",nat_test_server);
println!("NAT探测服务器:{:?}", nat_test_server);
let base_config = StartConfig {
tap,
name,
token,
server,
nat_test_server,
device_id,
};
println!("========参数配置========");
Ok(base_config)
}
@@ -114,6 +130,8 @@ lazy_static! {
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ArgsConfig {
#[serde(default = "default_tap")]
pub tap: bool,
#[serde(default = "default_version")]
pub version: String,
#[serde(default = "default_str")]
@@ -123,7 +141,7 @@ pub struct ArgsConfig {
pub command_port: Option<u16>,
#[serde(default = "default_str")]
pub server: String,
#[serde(default = "default_resource_vec")]
#[serde(default = "default_vec")]
pub nat_test_server: Vec<String>,
#[serde(default = "default_str")]
pub device_id: String,
@@ -131,6 +149,10 @@ pub struct ArgsConfig {
pub pid: u32,
}
fn default_tap() -> bool {
false
}
fn default_version() -> String {
"1.0".to_string()
}
@@ -139,7 +161,7 @@ fn default_str() -> String {
"".to_string()
}
fn default_resource_vec() -> Vec<String> {
fn default_vec() -> Vec<String> {
vec![]
}
@@ -148,19 +170,22 @@ fn default_pid() -> u32 {
}
impl ArgsConfig {
pub fn new(token: String, name: String, server: String, nat_test_server: Vec<String>, device_id: String) -> Self {
pub fn new(tap: bool, token: String, name: String, server: SocketAddr,
nat_test_server: &Vec<SocketAddr>, device_id: String, ) -> Self {
Self {
tap,
version: "1.0".to_string(),
token,
name,
command_port: None,
server,
nat_test_server,
server: server.to_string(),
nat_test_server: nat_test_server.iter().map(|v| v.to_string()).collect::<Vec<String>>(),
device_id,
pid: 0,
}
}
}
pub fn lock_file() -> io::Result<File> {
let path = SWITCH_HOME_PATH.lock().clone().unwrap().join(".lock");
Ok(File::create(path)?)
+4 -1
View File
@@ -60,7 +60,7 @@ enum Commands {
Status,
}
#[derive(Parser, Debug)]
#[derive(Parser, Debug,Default)]
pub struct StartArgs {
/// 不超过64个字符
/// 相同token的设备之间才能通信。
@@ -95,6 +95,9 @@ pub struct StartArgs {
/// Output the log in the "home/.switch_desktop" directory
#[arg(long)]
log: bool,
/// 使用tap网卡
#[arg(long)]
tap: Option<bool>,
}
#[cfg(target_os = "windows")]
+5 -3
View File
@@ -24,18 +24,19 @@ pub fn main0(base_args: BaseArgs) {
}
let config = Config::new(
start_config.tap,
start_config.token.clone(),
start_config.device_id.clone(),
start_config.name.clone(),
start_config.server,
start_config.nat_test_server.clone(),
);
let nat_test_server = start_config.nat_test_server.iter().map(|v| v.to_string()).collect::<Vec<String>>();
let args_config = config::ArgsConfig::new(
start_config.tap,
start_config.token.clone(),
start_config.name.clone(),
start_config.server.to_string(),
nat_test_server,
start_config.server,
&start_config.nat_test_server,
start_config.device_id.clone(),
);
let lock = match config::lock_file() {
@@ -93,6 +94,7 @@ pub fn main0(base_args: BaseArgs) {
lock.unlock().unwrap();
}
Err(e) => {
println!("{}", style(&e).red());
log::error!("{:?}", e);
}
}
+9 -7
View File
@@ -68,12 +68,12 @@ pub fn main0(base_args: BaseArgs) {
match service_state() {
Ok(state) => {
if state == ServiceState::Stopped {
if let Err(e) = config::save_config(config::ArgsConfig::new(
start_config.token.clone(),
start_config.name.clone(),
start_config.server.to_string(),
start_config.nat_test_server.iter().map(|v| v.to_string()).collect::<Vec<String>>(),
start_config.device_id.clone(),
if let Err(e) = config::save_config(config::ArgsConfig::new(start_config.tap,
start_config.token.clone(),
start_config.name.clone(),
start_config.server,
&start_config.nat_test_server,
start_config.device_id.clone(),
)) {
log::error!("{:?}",e);
return;
@@ -103,6 +103,7 @@ pub fn main0(base_args: BaseArgs) {
style("服务未安装,在当前进程启动(The service is not installed and started in the current process)").red()
);
let config = Config::new(
start_config.tap,
start_config.token,
start_config.device_id,
start_config.name,
@@ -144,7 +145,8 @@ pub fn main0(base_args: BaseArgs) {
}
}
Err(e) => {
println!("{}", style(e).red());
println!("{}", style(&e).red());
log::error!("{:?}", e);
}
};
pause();
+27 -42
View File
@@ -2,7 +2,6 @@
// extern crate windows_service;
use std::ffi::OsString;
use std::net::ToSocketAddrs;
use std::sync::Arc;
use std::thread;
use std::time::Duration;
@@ -15,8 +14,7 @@ use windows_service::service_control_handler::ServiceControlHandlerResult;
use switch::core::{Config, Switch};
use crate::config;
use crate::windows::config::read_config;
use crate::{config, StartArgs};
use crate::windows::SERVICE_NAME;
define_windows_service!(ffi_service_main, switch_service_main);
@@ -93,47 +91,34 @@ fn service_main() -> windows_service::Result<()> {
}
fn start_switch() -> switch::Result<Arc<Switch>> {
if let Some(config) = read_config() {
let device_id = config.device_id;
if device_id.trim().is_empty() {
return Err(switch::error::Error::Stop("Device id error".to_string()));
match config::default_config(StartArgs::default()) {
Ok(start_config) => {
let config = Config::new(
start_config.tap,
start_config.token,
start_config.device_id,
start_config.name,
start_config.server,
start_config.nat_test_server,
);
let switch = Switch::start(config)?;
log::info!("switch-service服务启动");
let switch = Arc::new(switch);
let command_server = crate::command::server::CommandServer::new();
let switch1 = switch.clone();
thread::spawn(move || {
if let Err(e) = config::update_pid(std::process::id()) {
log::error!("{:?}", e);
}
if let Err(e) = command_server.start(switch1) {
log::error!("{:?}", e);
}
});
Ok(switch)
}
let server_address = if let Some(server_address) = config.server
.to_socket_addrs()?
.next() {
server_address
} else {
return Err(switch::error::Error::Stop("server address error".to_string()));
};
let nat_test_server = config.nat_test_server.iter()
.flat_map(|a| a.to_socket_addrs())
.flatten()
.collect::<Vec<_>>();
if nat_test_server.is_empty() {
return Err(switch::error::Error::Stop("nat test server address error".to_string()));
Err(e) => {
return Err(switch::error::Error::Stop(e));
}
let config = Config::new(
config.token,
device_id,
config.name,
server_address,
nat_test_server);
let switch = Switch::start(config)?;
log::info!("switch-service服务启动");
let switch = Arc::new(switch);
let command_server = crate::command::server::CommandServer::new();
let switch1 = switch.clone();
thread::spawn(move || {
if let Err(e) = config::update_pid(std::process::id()) {
log::error!("{:?}", e);
}
if let Err(e) = command_server.start(switch1) {
log::error!("{:?}", e);
}
});
Ok(switch)
} else {
Err(switch::error::Error::Stop("配置文件为空".to_string()))
}
}