//! Attune Worker Service use anyhow::Result; use attune_common::config::Config; use clap::Parser; use tokio::signal::unix::{signal, SignalKind}; use tracing::info; use attune_worker::service::WorkerService; #[derive(Parser, Debug)] #[command(name = "attune-worker")] #[command(about = "Attune Worker Service - Executes automation actions", long_about = None)] struct Args { /// Path to configuration file #[arg(short, long)] config: Option, /// Worker name (overrides config) #[arg(short, long)] name: Option, } #[tokio::main] async fn main() -> Result<()> { // Initialize tracing tracing_subscriber::fmt() .with_target(false) .with_thread_ids(true) .init(); let args = Args::parse(); info!("Starting Attune Worker Service"); // Load configuration if let Some(config_path) = args.config { std::env::set_var("ATTUNE_CONFIG", config_path); } let mut config = Config::load()?; config.validate()?; // Override worker name if provided via CLI if let Some(name) = args.name { if let Some(ref mut worker_config) = config.worker { worker_config.name = Some(name); } else { config.worker = Some(attune_common::config::WorkerConfig { name: Some(name), worker_type: None, runtime_id: None, host: None, port: None, capabilities: None, max_concurrent_tasks: 10, heartbeat_interval: 30, task_timeout: 300, max_stdout_bytes: 10 * 1024 * 1024, max_stderr_bytes: 10 * 1024 * 1024, shutdown_timeout: Some(30), stream_logs: true, }); } } info!("Configuration loaded successfully"); info!("Environment: {}", config.environment); // Initialize and run worker service let mut service = WorkerService::new(config).await?; info!("Attune Worker Service is ready"); // Start the service service.start().await?; // Setup signal handlers for graceful shutdown let mut sigint = signal(SignalKind::interrupt())?; let mut sigterm = signal(SignalKind::terminate())?; tokio::select! { _ = sigint.recv() => { info!("Received SIGINT signal"); } _ = sigterm.recv() => { info!("Received SIGTERM signal"); } } info!("Shutting down gracefully..."); // Stop the service and mark worker as inactive service.stop().await?; info!("Attune Worker Service shutdown complete"); Ok(()) }