use anyhow::Result; use clap::Parser; use tokio::signal; use tracing::{error, info}; use tracing_subscriber::EnvFilter; mod collectors; mod discovery; mod notifications; mod simple_agent; use simple_agent::SimpleAgent; #[derive(Parser)] #[command(name = "cm-dashboard-agent")] #[command(about = "CM Dashboard metrics agent with auto-detection")] #[command(version)] struct Cli { /// Increase logging verbosity (-v, -vv) #[arg(short, long, action = clap::ArgAction::Count)] verbose: u8, } #[tokio::main] async fn main() -> Result<()> { let cli = Cli::parse(); // Setup logging let log_level = match cli.verbose { 0 => "info", 1 => "debug", _ => "trace", }; tracing_subscriber::fmt() .with_env_filter(EnvFilter::from_default_env().add_directive(log_level.parse()?)) .init(); info!("CM Dashboard Agent starting..."); // Create and run agent let mut agent = SimpleAgent::new().await?; // Setup graceful shutdown let ctrl_c = async { signal::ctrl_c() .await .expect("failed to install Ctrl+C handler"); }; // Run agent with graceful shutdown tokio::select! { result = agent.run() => { if let Err(e) = result { error!("Agent error: {}", e); return Err(e); } } _ = ctrl_c => { info!("Shutdown signal received"); } } info!("Agent shutdown complete"); Ok(()) }