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

173 lines
4.2 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::{
config::{ConfigLoader, ConsoleLoggerConfig, FileLoggerConfig, TomlConfigLoader},
constants::EASYTIER_VERSION,
2025-03-11 12:02:10 +08:00
error::Error,
2024-12-21 01:27:39 +08:00
},
2025-05-28 21:29:21 +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
#[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,
2024-12-21 01:27:39 +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()));
}
})
}
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();
2024-11-02 15:13:19 +08:00
let config = TomlConfigLoader::default();
config.set_console_logger_config(ConsoleLoggerConfig {
2024-12-21 01:27:39 +08:00
level: cli.console_log_level,
});
config.set_file_logger_config(FileLoggerConfig {
dir: cli.file_log_dir,
level: cli.file_log_level,
file: None,
2024-11-02 15:13:19 +08:00
});
init_logger(config, false).unwrap();
// 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();
2024-11-02 15:13:19 +08:00
2025-03-11 12:02:10 +08:00
let listener = get_listener_by_url(
&format!(
"{}://0.0.0.0:{}",
cli.config_server_protocol, cli.config_server_port
)
.parse()
.unwrap(),
2025-03-11 12:02:10 +08:00
)
.unwrap();
2024-11-02 15:13:19 +08:00
let mut mgr = client_manager::ClientManager::new(db.clone());
2024-10-26 00:04:22 +08:00
mgr.serve(listener).await.unwrap();
let mgr = Arc::new(mgr);
#[cfg(feature = "embed")]
let restful_also_serve_web = !cli.no_web
&& (cli.web_server_port.is_none() || cli.web_server_port == Some(cli.api_server_port));
#[cfg(not(feature = "embed"))]
let restful_also_serve_web = false;
2024-12-21 01:27:39 +08:00
let mut restful_server = restful::RestfulServer::new(
format!("0.0.0.0:{}", cli.api_server_port).parse().unwrap(),
mgr.clone(),
db,
restful_also_serve_web,
2024-12-21 01:27:39 +08:00
)
.await
.unwrap();
2025-04-01 10:03:58 +08:00
2024-10-26 00:04:22 +08:00
restful_server.start().await.unwrap();
2025-04-01 10:03:58 +08:00
#[cfg(feature = "embed")]
let mut web_server = web::WebServer::new(
format!("0.0.0.0:{}", cli.web_server_port.unwrap_or(0))
.parse()
.unwrap(),
2025-04-01 10:03:58 +08:00
)
.await
.unwrap();
#[cfg(feature = "embed")]
if !cli.no_web && !restful_also_serve_web {
2025-04-01 10:03:58 +08:00
web_server.start().await.unwrap();
}
2024-10-26 00:04:22 +08:00
tokio::signal::ctrl_c().await.unwrap();
2024-10-19 18:10:02 +08:00
}