// SPDX-License-Identifier: AGPL-3.0-or-later use anyhow::Context; use fluxer_admin::{build_router, config::AdminConfig}; use tokio::net::TcpListener; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; #[tokio::main] async fn main() -> anyhow::Result<()> { tracing_subscriber::registry() .with(fluxer_common::config::env_filter("info")) .with(tracing_subscriber::fmt::layer()) .init(); let config = AdminConfig::from_env()?; let addr = format!("{}:{}", config.host, config.port); let router = build_router(config); let listener = TcpListener::bind(&addr) .await .with_context(|| format!("failed to bind Fluxer admin service on {addr}"))?; tracing::info!(%addr, "starting Fluxer admin service"); axum::serve(listener, router) .with_graceful_shutdown(shutdown_signal()) .await .context("admin server exited unexpectedly")?; Ok(()) } async fn shutdown_signal() { let ctrl_c = async { tokio::signal::ctrl_c() .await .expect("failed to install Ctrl+C handler"); }; #[cfg(unix)] let terminate = async { tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) .expect("failed to install SIGTERM handler") .recv() .await; }; #[cfg(not(unix))] let terminate = std::future::pending::<()>(); tokio::select! { _ = ctrl_c => {}, _ = terminate => {}, } }