initial commit
This commit is contained in:
		
							
								
								
									
										106
									
								
								cmd/supervisor.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								cmd/supervisor.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
//! # Hero Supervisor Binary
 | 
			
		||||
//!
 | 
			
		||||
//! Main supervisor binary that manages multiple actors and listens to jobs over Redis.
 | 
			
		||||
//! The supervisor builds with actor configuration, starts actors, and dispatches jobs
 | 
			
		||||
//! to the appropriate runners based on the job's runner_name field.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
use hero_supervisor::{SupervisorApp, SupervisorBuilder};
 | 
			
		||||
use clap::Parser;
 | 
			
		||||
use log::{info, error};
 | 
			
		||||
use std::path::PathBuf;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Command line arguments for the supervisor
 | 
			
		||||
#[derive(Parser, Debug)]
 | 
			
		||||
#[command(name = "supervisor")]
 | 
			
		||||
#[command(about = "Hero Supervisor - manages multiple actors and dispatches jobs")]
 | 
			
		||||
struct Args {
 | 
			
		||||
    /// Path to the configuration TOML file
 | 
			
		||||
    #[arg(short, long, value_name = "FILE")]
 | 
			
		||||
    config: Option<PathBuf>,
 | 
			
		||||
    
 | 
			
		||||
    /// Redis URL for job queue
 | 
			
		||||
    #[arg(long, default_value = "redis://localhost:6379")]
 | 
			
		||||
    redis_url: String,
 | 
			
		||||
    
 | 
			
		||||
    /// Namespace for Redis keys
 | 
			
		||||
    #[arg(long, default_value = "")]
 | 
			
		||||
    namespace: String,
 | 
			
		||||
    
 | 
			
		||||
    /// Admin secrets (can be specified multiple times)
 | 
			
		||||
    #[arg(long = "admin-secret", value_name = "SECRET")]
 | 
			
		||||
    admin_secrets: Vec<String>,
 | 
			
		||||
    
 | 
			
		||||
    /// User secrets (can be specified multiple times)
 | 
			
		||||
    #[arg(long = "user-secret", value_name = "SECRET")]
 | 
			
		||||
    user_secrets: Vec<String>,
 | 
			
		||||
    
 | 
			
		||||
    /// Register secrets (can be specified multiple times)
 | 
			
		||||
    #[arg(long = "register-secret", value_name = "SECRET")]
 | 
			
		||||
    register_secrets: Vec<String>,
 | 
			
		||||
    
 | 
			
		||||
    /// OpenRPC server bind address
 | 
			
		||||
    #[arg(long, default_value = "127.0.0.1")]
 | 
			
		||||
    bind_address: String,
 | 
			
		||||
    
 | 
			
		||||
    /// OpenRPC server port
 | 
			
		||||
    #[arg(long, default_value = "3030")]
 | 
			
		||||
    port: u16,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
    // Initialize logging
 | 
			
		||||
    env_logger::init();
 | 
			
		||||
 | 
			
		||||
    info!("Starting Hero Supervisor");
 | 
			
		||||
 | 
			
		||||
    // Parse command line arguments
 | 
			
		||||
    let args = Args::parse();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Create and initialize supervisor using builder pattern
 | 
			
		||||
    let mut builder = SupervisorBuilder::new()
 | 
			
		||||
        .redis_url(&args.redis_url)
 | 
			
		||||
        .namespace(&args.namespace);
 | 
			
		||||
 | 
			
		||||
    // Add secrets from CLI arguments
 | 
			
		||||
    if !args.admin_secrets.is_empty() {
 | 
			
		||||
        info!("Adding {} admin secret(s)", args.admin_secrets.len());
 | 
			
		||||
        builder = builder.admin_secrets(args.admin_secrets);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if !args.user_secrets.is_empty() {
 | 
			
		||||
        info!("Adding {} user secret(s)", args.user_secrets.len());
 | 
			
		||||
        builder = builder.user_secrets(args.user_secrets);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if !args.register_secrets.is_empty() {
 | 
			
		||||
        info!("Adding {} register secret(s)", args.register_secrets.len());
 | 
			
		||||
        builder = builder.register_secrets(args.register_secrets);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let supervisor = match args.config {
 | 
			
		||||
        Some(_config_path) => {
 | 
			
		||||
            info!("Loading configuration from config file not yet implemented");
 | 
			
		||||
            // For now, use CLI configuration
 | 
			
		||||
            builder.build().await?
 | 
			
		||||
        }
 | 
			
		||||
        None => {
 | 
			
		||||
            info!("Using CLI configuration");
 | 
			
		||||
            builder.build().await?
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
    let mut app = SupervisorApp::new(supervisor, args.bind_address, args.port);
 | 
			
		||||
    
 | 
			
		||||
    // Start the complete supervisor application
 | 
			
		||||
    app.start().await?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user