use clap::Parser;
use dwctl::{Application, Config, telemetry};
async fn shutdown_signal() {
use tokio::signal;
let ctrl_c = async {
signal::ctrl_c().await.expect("Failed to install Ctrl+C handler");
};
#[cfg(unix)]
let terminate = async {
signal::unix::signal(signal::unix::SignalKind::terminate())
.expect("Failed to install SIGTERM handler")
.recv()
.await;
};
#[cfg(not(unix))]
let terminate = std::future::pending::<()>();
tokio::select! {
_ = ctrl_c => {
tracing::info!("Received Ctrl+C, shutting down gracefully...");
},
_ = terminate => {
tracing::info!("Received SIGTERM, shutting down gracefully...");
},
}
}
fn main() -> anyhow::Result<()> {
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.thread_stack_size(8 * 1024 * 1024)
.build()?
.block_on(async_main())
}
async fn async_main() -> anyhow::Result<()> {
let args = dwctl::config::Args::parse();
let config = Config::load(&args)?;
if args.validate {
println!("Configuration is valid.");
return Ok(());
}
let tracer_provider = telemetry::init_telemetry(config.enable_otel_export)?;
tracing::debug!("{:?}", args);
let shutdown = shutdown_signal();
Application::new_with_config_path(config, Some(args.config.clone()), tracer_provider)
.await?
.serve(shutdown)
.await
}