socks5ws/src/main.rs

117 lines
2.9 KiB
Rust
Raw Normal View History

2022-09-24 16:23:53 +00:00
extern crate flexi_logger;
mod config;
mod server;
2022-09-24 18:11:12 +00:00
mod service;
2022-09-24 16:23:53 +00:00
2022-09-29 07:58:42 +00:00
use config::Config;
2022-09-26 07:57:47 +00:00
use flexi_logger::{
AdaptiveFormat, Age, Cleanup, Criterion, Duplicate, FileSpec, Logger, LoggerHandle, Naming,
};
2022-09-24 16:23:53 +00:00
2023-08-17 20:09:44 +00:00
use anyhow::{Context, Result};
2022-09-24 18:11:12 +00:00
use clap::{Parser, Subcommand};
2022-09-29 07:58:42 +00:00
use tokio_util::sync::CancellationToken;
2022-09-24 18:11:12 +00:00
#[derive(Subcommand, Debug)]
enum Command {
/// install service
Install,
/// uninstall service
Uninstall,
/// start service
Start,
/// stop service
Stop,
/// run service (by Windows)
Run,
2022-09-26 07:43:49 +00:00
/// save default config
SaveConfig,
2022-09-29 07:58:42 +00:00
/// run server as foreground proccess
Serve,
2022-09-24 18:11:12 +00:00
}
/// SOCKS5 proxy windows service
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
#[clap(propagate_version = true)]
struct Cli {
#[clap(subcommand)]
command: Command,
}
2023-08-17 20:09:44 +00:00
fn create_logger() -> Result<LoggerHandle> {
2022-09-26 07:57:47 +00:00
Logger::try_with_str("info")
2023-08-17 20:09:44 +00:00
.context("default logging level invalid")?
2022-09-24 18:11:12 +00:00
.log_to_file(
2022-09-26 07:57:47 +00:00
FileSpec::default().directory(
std::env::current_exe()
2023-08-17 20:09:44 +00:00
.context("can't get current exe path")?
2022-09-26 07:57:47 +00:00
.parent()
2023-08-17 20:09:44 +00:00
.context("can't get parent folder")?,
2022-09-26 07:57:47 +00:00
),
2022-09-24 18:11:12 +00:00
)
2022-09-24 16:23:53 +00:00
.rotate(
Criterion::Age(Age::Day),
Naming::Timestamps,
Cleanup::KeepLogFiles(4),
)
2022-09-24 20:35:54 +00:00
.format(flexi_logger::detailed_format)
2022-09-28 11:56:22 +00:00
.adaptive_format_for_stdout(AdaptiveFormat::Detailed)
2022-09-24 16:23:53 +00:00
.print_message()
2022-09-28 11:56:22 +00:00
.duplicate_to_stdout(Duplicate::Info)
2022-09-24 20:55:38 +00:00
.write_mode(flexi_logger::WriteMode::Async)
2022-09-24 18:11:12 +00:00
.start_with_specfile(
std::env::current_exe()
2023-08-17 20:09:44 +00:00
.context("can't get current exe path")?
2022-09-24 18:11:12 +00:00
.with_file_name("logspec.toml"),
)
2023-08-17 20:09:44 +00:00
.context("can't start logger")
2022-09-26 07:57:47 +00:00
}
2023-08-17 20:09:44 +00:00
fn save_default_config() -> Result<()> {
Config::default().save();
Ok(())
}
fn server_foreground() -> Result<()> {
2022-09-29 07:58:42 +00:00
let control_token = CancellationToken::new();
let server_token = control_token.child_token();
let res = ctrlc::set_handler(move || {
log::info!("recieved Ctrl-C");
control_token.cancel();
});
if res.is_ok() {
log::info!("Press Ctrl-C to stop server");
}
2023-08-17 20:09:44 +00:00
server::server_executor(Config::get(), server_token)?;
Ok(())
2022-09-29 07:58:42 +00:00
}
2023-08-17 20:09:44 +00:00
fn main() -> Result<()> {
2022-09-26 07:57:47 +00:00
let args = Cli::parse();
2023-08-17 20:09:44 +00:00
let logger = create_logger()?;
2022-09-24 16:23:53 +00:00
2022-09-24 21:09:38 +00:00
let res = match args.command {
Command::Install => service::install(),
Command::Uninstall => service::uninstall(),
Command::Run => service::run(),
Command::Start => service::start(),
Command::Stop => service::stop(),
2023-08-17 20:09:44 +00:00
Command::SaveConfig => save_default_config(),
Command::Serve => server_foreground(),
2022-09-24 21:09:38 +00:00
};
2023-08-17 20:09:44 +00:00
if let Err(e) = &res {
log::error!("{:?} -> error: {:?}", args.command, e);
2022-09-24 18:11:12 +00:00
}
2023-08-17 20:09:44 +00:00
res?;
2022-09-24 21:09:38 +00:00
drop(logger);
2023-08-17 20:09:44 +00:00
Ok(())
2022-09-24 16:23:53 +00:00
}