use kitsune2_bootstrap_srv::*;
#[derive(clap::Parser, Debug)]
#[command(version)]
pub struct Args {
#[arg(long)]
pub production: bool,
#[arg(long)]
pub json: bool,
#[arg(long)]
pub listen: Vec<std::net::SocketAddr>,
#[arg(long, requires = "tls_key")]
pub tls_cert: Option<std::path::PathBuf>,
#[arg(long, requires = "tls_cert")]
pub tls_key: Option<std::path::PathBuf>,
#[arg(long)]
pub worker_thread_count: Option<usize>,
#[arg(long)]
pub max_entries_per_space: Option<usize>,
#[arg(long)]
pub request_listen_duration_ms: Option<u32>,
#[arg(long)]
pub prune_interval_ms: Option<u32>,
#[arg(long)]
pub no_sbd: bool,
#[arg(long)]
pub sbd_trusted_ip_header: Option<String>,
#[arg(long)]
pub sbd_limit_clients: Option<i32>,
#[arg(long)]
pub sbd_disable_rate_limiting: bool,
}
fn main() {
let args = <Args as clap::Parser>::parse();
let t = tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::builder()
.with_default_directive(tracing::Level::DEBUG.into())
.from_env_lossy(),
)
.with_file(true)
.with_line_number(true);
if args.json {
t.json().try_init()
} else {
t.try_init()
}
.expect("failed to init tracing");
let mut config = if args.production {
Config::production()
} else {
Config::testing()
};
if args.tls_cert.is_some() || args.tls_key.is_some() {
rustls::crypto::ring::default_provider()
.install_default()
.expect("Failed to configure default TLS provider");
}
config.tls_cert = args.tls_cert;
config.tls_key = args.tls_key;
if !args.listen.is_empty() {
config.listen_address_list = args.listen;
}
if let Some(count) = args.worker_thread_count {
config.worker_thread_count = count;
}
if let Some(count) = args.max_entries_per_space {
config.max_entries_per_space = count;
}
if let Some(ms) = args.request_listen_duration_ms {
config.request_listen_duration =
std::time::Duration::from_millis(ms as u64);
}
if let Some(ms) = args.prune_interval_ms {
config.prune_interval = std::time::Duration::from_millis(ms as u64);
}
if let Some(header) = args.sbd_trusted_ip_header {
config.sbd.trusted_ip_header = Some(header);
}
if let Some(limit) = args.sbd_limit_clients {
config.sbd.limit_clients = limit;
}
if args.sbd_disable_rate_limiting {
config.sbd.disable_rate_limiting = true;
}
tracing::info!(?config);
let (send, recv) = std::sync::mpsc::channel();
ctrlc::set_handler(move || {
send.send(()).unwrap();
})
.unwrap();
let srv = BootstrapSrv::new(config);
let _ = recv.recv();
tracing::info!("Terminating...");
drop(srv);
tracing::info!("Exit Process.");
std::process::exit(0);
}