Files
Easytier_lkddi/easytier-web/src/main.rs
T

239 lines
6.0 KiB
Rust
Raw Normal View History

2024-10-26 00:04:22 +08:00
#![allow(dead_code)]
2024-12-21 01:27:39 +08:00
#[macro_use]
extern crate rust_i18n;
2024-10-26 00:04:22 +08:00
use std::sync::Arc;
2025-04-01 10:03:58 +08:00
use clap::Parser;
2024-11-02 15:13:19 +08:00
use easytier::{
2024-12-21 01:27:39 +08:00
common::{
2025-06-11 23:17:09 +08:00
config::{ConsoleLoggerConfig, FileLoggerConfig, LoggingConfigLoader},
2024-12-21 01:27:39 +08:00
constants::EASYTIER_VERSION,
2025-03-11 12:02:10 +08:00
error::Error,
2025-06-07 22:05:11 +08:00
network::{local_ipv4, local_ipv6},
2024-12-21 01:27:39 +08:00
},
tunnel::{
tcp::TcpTunnelListener, udp::UdpTunnelListener, websocket::WSTunnelListener, TunnelListener,
},
2024-12-21 01:27:39 +08:00
utils::{init_logger, setup_panic_handler},
2024-11-02 15:13:19 +08:00
};
2024-10-26 00:04:22 +08:00
mod client_manager;
2024-11-02 15:13:19 +08:00
mod db;
mod migrator;
2024-10-26 00:04:22 +08:00
mod restful;
2025-04-01 10:03:58 +08:00
#[cfg(feature = "embed")]
mod web;
2024-12-21 01:27:39 +08:00
rust_i18n::i18n!("locales", fallback = "en");
#[derive(Parser, Debug)]
2025-05-28 21:29:21 +08:00
#[command(name = "easytier-web", author, version = EASYTIER_VERSION , about, long_about = None)]
2024-12-21 01:27:39 +08:00
struct Cli {
#[arg(short, long, default_value = "et.db", help = t!("cli.db").to_string())]
db: String,
#[arg(
long,
help = t!("cli.console_log_level").to_string(),
)]
console_log_level: Option<String>,
#[arg(
long,
help = t!("cli.file_log_level").to_string(),
)]
file_log_level: Option<String>,
#[arg(
long,
help = t!("cli.file_log_dir").to_string(),
)]
file_log_dir: Option<String>,
#[arg(
long,
short='c',
default_value = "22020",
help = t!("cli.config_server_port").to_string(),
)]
config_server_port: u16,
#[arg(
long,
short='p',
default_value = "udp",
help = t!("cli.config_server_protocol").to_string(),
)]
config_server_protocol: String,
#[arg(
long,
short='a',
default_value = "11211",
help = t!("cli.api_server_port").to_string(),
)]
api_server_port: u16,
2025-04-01 10:03:58 +08:00
2025-06-25 09:03:47 +08:00
#[arg(
long,
help = t!("cli.geoip_db").to_string(),
)]
geoip_db: Option<String>,
2025-04-01 10:03:58 +08:00
#[cfg(feature = "embed")]
#[arg(
long,
short='l',
help = t!("cli.web_server_port").to_string(),
)]
web_server_port: Option<u16>,
2025-04-01 10:03:58 +08:00
#[cfg(feature = "embed")]
#[arg(
long,
help = t!("cli.no_web").to_string(),
default_value = "false"
)]
no_web: bool,
#[cfg(feature = "embed")]
#[arg(
long,
help = t!("cli.api_host").to_string()
)]
api_host: Option<url::Url>,
2024-12-21 01:27:39 +08:00
}
2025-06-11 23:17:09 +08:00
impl LoggingConfigLoader for &Cli {
fn get_console_logger_config(&self) -> ConsoleLoggerConfig {
ConsoleLoggerConfig {
level: self.console_log_level.clone(),
}
}
fn get_file_logger_config(&self) -> FileLoggerConfig {
FileLoggerConfig {
dir: self.file_log_dir.clone(),
level: self.file_log_level.clone(),
file: None,
size_mb: None,
count: None,
2025-06-11 23:17:09 +08:00
}
}
}
pub fn get_listener_by_url(l: &url::Url) -> Result<Box<dyn TunnelListener>, Error> {
2025-03-11 12:02:10 +08:00
Ok(match l.scheme() {
"tcp" => Box::new(TcpTunnelListener::new(l.clone())),
"udp" => Box::new(UdpTunnelListener::new(l.clone())),
2025-05-28 21:29:21 +08:00
"ws" => Box::new(WSTunnelListener::new(l.clone())),
2025-03-11 12:02:10 +08:00
_ => {
return Err(Error::InvalidUrl(l.to_string()));
}
})
}
2025-06-07 22:05:11 +08:00
async fn get_dual_stack_listener(
protocol: &str,
port: u16,
) -> Result<
(
Option<Box<dyn TunnelListener>>,
Option<Box<dyn TunnelListener>>,
),
Error,
> {
let is_protocol_support_dual_stack =
protocol.trim().to_lowercase() == "tcp" || protocol.trim().to_lowercase() == "udp";
let v6_listener = if is_protocol_support_dual_stack && local_ipv6().await.is_ok() {
get_listener_by_url(&format!("{}://[::0]:{}", protocol, port).parse().unwrap()).ok()
} else {
None
};
2025-08-10 22:56:41 +08:00
let v4_listener = if local_ipv4().await.is_ok() {
2025-06-07 22:05:11 +08:00
get_listener_by_url(&format!("{}://0.0.0.0:{}", protocol, port).parse().unwrap()).ok()
} else {
None
};
Ok((v6_listener, v4_listener))
}
2024-10-26 00:04:22 +08:00
#[tokio::main]
async fn main() {
2024-12-21 01:27:39 +08:00
let locale = sys_locale::get_locale().unwrap_or_else(|| String::from("en-US"));
rust_i18n::set_locale(&locale);
setup_panic_handler();
let cli = Cli::parse();
2025-06-11 23:17:09 +08:00
init_logger(&cli, false).unwrap();
2024-11-02 15:13:19 +08:00
// let db = db::Db::new(":memory:").await.unwrap();
2024-12-21 01:27:39 +08:00
let db = db::Db::new(cli.db).await.unwrap();
2025-06-25 09:03:47 +08:00
let mut mgr = client_manager::ClientManager::new(db.clone(), cli.geoip_db);
2025-06-07 22:05:11 +08:00
let (v6_listener, v4_listener) =
get_dual_stack_listener(&cli.config_server_protocol, cli.config_server_port)
.await
.unwrap();
if v4_listener.is_none() && v6_listener.is_none() {
panic!("Listen to both IPv4 and IPv6 failed");
}
if let Some(listener) = v6_listener {
mgr.add_listener(listener).await.unwrap();
}
if let Some(listener) = v4_listener {
mgr.add_listener(listener).await.unwrap();
}
2024-10-26 00:04:22 +08:00
let mgr = Arc::new(mgr);
#[cfg(feature = "embed")]
let (web_router_restful, web_router_static) = if cli.no_web {
(None, None)
} else {
let web_router = web::build_router(cli.api_host.clone());
if cli.web_server_port.is_none() || cli.web_server_port == Some(cli.api_server_port) {
(Some(web_router), None)
} else {
(None, Some(web_router))
}
};
#[cfg(not(feature = "embed"))]
let web_router_restful = None;
let _restful_server_tasks = restful::RestfulServer::new(
2024-12-21 01:27:39 +08:00
format!("0.0.0.0:{}", cli.api_server_port).parse().unwrap(),
mgr.clone(),
db,
web_router_restful,
2024-12-21 01:27:39 +08:00
)
.await
.unwrap()
.start()
2025-04-01 10:03:58 +08:00
.await
.unwrap();
#[cfg(feature = "embed")]
let _web_server_task = if let Some(web_router) = web_router_static {
Some(
web::WebServer::new(
format!("0.0.0.0:{}", cli.web_server_port.unwrap_or(0))
.parse()
.unwrap(),
web_router,
)
.await
.unwrap()
.start()
.await
.unwrap(),
)
} else {
None
};
2025-04-01 10:03:58 +08:00
2024-10-26 00:04:22 +08:00
tokio::signal::ctrl_c().await.unwrap();
2024-10-19 18:10:02 +08:00
}