use std::net::SocketAddr; use std::path::PathBuf; use clap::{ArgAction, Args, Parser, Subcommand}; pub const DEFAULT_PID_FILE: &str = "/var/lib/wakey-control-plane/wakey-control-plane.pid"; pub const DEFAULT_DATA_DIR: &str = "/var/lib/wakey-control-plane"; pub const DEFAULT_CONFIG_FILE: &str = "/etc/wakey-control-plane/config.toml"; #[derive(Args, Clone, Copy, Default)] pub struct AdminTargetArgs { #[arg(long, conflicts_with = "offline")] pub live: bool, #[arg(long, conflicts_with = "live")] pub offline: bool, } #[derive(Parser)] #[command(name = "wakey-control-plane")] #[command(version, about = "Control plane server for wakey-agent fleets")] pub struct Cli { #[arg(short = 'v', long = "verbose", action = ArgAction::Count, global = true)] pub verbose: u8, #[command(subcommand)] pub command: Command, } #[derive(Subcommand)] pub enum Command { /// Run the control-plane daemon. Serve(ServeArgs), /// Render a control-plane config scaffold. InitConfig(InitConfigArgs), /// Create a new enroll token for provisioning a router. IssueEnrollToken(IssueEnrollTokenArgs), /// List current enroll tokens and their expiration status. ListEnrollTokens(ListEnrollTokensArgs), /// Revoke a specific enroll token. RevokeEnrollToken(RevokeEnrollTokenArgs), /// Revoke an enrolled agent's persistent credentials. RevokeAgent(RevokeAgentArgs), /// Print state backend stats. StateStats(StateStatsArgs), /// Migrate a legacy sqlite state into a new SQLite state file. MigrateSqliteState(MigrateSqliteStateArgs), /// Send SIGHUP to an already-running daemon. Reload(ReloadArgs), } #[derive(Args, Clone)] pub struct ServeArgs { #[arg(long)] pub data_dir: Option, #[arg(long)] pub bind: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub state_file: Option, #[arg(long = "bootstrap-enroll-token", visible_alias = "enroll-token")] pub bootstrap_enroll_tokens: Vec, #[arg(long)] pub command_timeout_ms: Option, #[arg(long)] pub enroll_token_ttl_seconds: Option, /// Audit/alert history retention in seconds (legacy CLI name; not device retention). #[arg(long)] pub observation_retention_seconds: Option, #[arg(long)] pub pid_file: Option, #[arg(long)] pub ui_dist_dir: Option, #[arg(long, visible_alias="config", default_value = DEFAULT_CONFIG_FILE)] pub config_file: PathBuf, #[arg(long)] pub bootstrap_config: bool, } #[derive(Args, Clone)] pub struct InitConfigArgs { #[arg( long = "config-file", short, visible_alias = "config", visible_alias = "to", visible_short_alias = 't' )] pub config_file: Option, #[arg(long, short, visible_alias = "from")] pub from_config: Option, #[arg(long, conflicts_with = "config_file")] pub stdout: bool, #[arg(long)] pub data_dir: Option, #[arg(long)] pub bind: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub state_file: Option, #[arg(long)] pub pid_file: Option, #[arg(long)] pub ui_dist_dir: Option, #[arg(long)] pub command_timeout_ms: Option, #[arg(long)] pub enroll_token_ttl_seconds: Option, /// Audit/alert history retention in seconds (legacy CLI name; not device retention). #[arg(long)] pub observation_retention_seconds: Option, #[arg(long = "bootstrap-enroll-token", visible_alias = "enroll-token")] pub bootstrap_enroll_tokens: Vec, #[arg(long)] pub telemetry_otlp_endpoint: Option, #[arg(long)] pub telemetry_service_name: Option, #[arg(long, num_args = 0..=1, default_missing_value = "true")] pub telemetry_json_logs: Option, #[arg(long)] pub force: bool, } #[derive(Args)] pub struct IssueEnrollTokenArgs { #[arg(long, visible_alias = "config", default_value = DEFAULT_CONFIG_FILE)] pub config_file: PathBuf, #[arg(long)] pub state_file: Option, #[arg(long)] pub data_dir: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub ttl_seconds: Option, #[command(flatten)] pub target: AdminTargetArgs, } #[derive(Args)] pub struct ListEnrollTokensArgs { #[arg(long, visible_alias = "config", default_value = DEFAULT_CONFIG_FILE)] pub config_file: PathBuf, #[arg(long)] pub state_file: Option, #[arg(long)] pub data_dir: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub json: bool, #[command(flatten)] pub target: AdminTargetArgs, } #[derive(Args)] pub struct RevokeEnrollTokenArgs { #[arg(long, default_value = DEFAULT_CONFIG_FILE)] pub config_file: PathBuf, #[arg(long)] pub state_file: Option, #[arg(long)] pub data_dir: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub token: String, #[command(flatten)] pub target: AdminTargetArgs, } #[derive(Args)] pub struct RevokeAgentArgs { #[arg(long, default_value = DEFAULT_CONFIG_FILE)] pub config_file: PathBuf, #[arg(long)] pub state_file: Option, #[arg(long)] pub data_dir: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub agent_id: String, #[command(flatten)] pub target: AdminTargetArgs, } #[derive(Args)] pub struct StateStatsArgs { #[arg(long, default_value = DEFAULT_CONFIG_FILE)] pub config_file: PathBuf, #[arg(long)] pub state_file: Option, #[arg(long)] pub data_dir: Option, #[arg(long)] pub public_url: Option, #[arg(long)] pub json: bool, #[command(flatten)] pub target: AdminTargetArgs, } #[derive(Args)] pub struct MigrateSqliteStateArgs { #[arg(long, visible_alias = "from")] pub from_sqlite_db: PathBuf, #[arg(long, visible_alias = "to")] pub to_sqlite_db: PathBuf, #[arg(long)] pub force: bool, } #[derive(Args)] pub struct ReloadArgs { #[arg(long, default_value = DEFAULT_PID_FILE)] pub pid_file: PathBuf, }