use std::net::IpAddr;
use anyhow::Ok;
use async_shutdown::ShutdownManager;
use castled::{
debug::setup_logging,
server::{Config, EntrypointConfig, Server},
};
use clap::Parser;
use tokio::signal;
use tracing::info;
#[derive(Parser, Debug, Default)]
struct Args {
#[arg(long, default_value = "6610")]
control_port: u16,
#[arg(long, default_value = "6611")]
vhttp_port: u16,
#[arg(long, required = false)]
domain: Vec<String>,
#[arg(long, required = false)]
ip: Vec<IpAddr>,
#[arg(long, default_value = "false")]
vhttp_behind_proxy_tls: bool,
#[clap(long, default_value_t = 1024)]
random_min_port: u16,
#[clap(long, default_value_t = 65535)]
random_max_port: u16,
#[clap(long, required = false, default_value = "")]
exclude_ports: String,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
setup_logging(6669);
let args = Args::parse();
info!("server args: {:?}", args);
let shutdown = ShutdownManager::new();
let wait_complete = shutdown.wait_shutdown_complete();
let server = Server::new(
Config {
control_port: args.control_port,
vhttp_port: args.vhttp_port,
entrypoint: EntrypointConfig {
domain: args.domain,
ip: args.ip,
vhttp_behind_proxy_tls: args.vhttp_behind_proxy_tls,
port_range: args.random_min_port..=args.random_max_port,
exclude_ports: args
.exclude_ports
.split(',')
.filter(|s| !s.is_empty())
.map(|s| s.parse().unwrap())
.collect(),
},
},
shutdown.clone(),
);
tokio::spawn(async move {
if let Err(e) = signal::ctrl_c().await {
panic!("Failed to listen for the ctrl-c signal: {:?}", e);
}
info!("Received ctrl-c signal. Shutting down...");
shutdown.trigger_shutdown(0).ok();
});
server.run().await?;
match wait_complete.await {
0 => Ok(()),
code => std::process::exit(code as i32),
}
}