Files
wakey/wakey-control-plane/src/cli.rs
T

275 lines
6.3 KiB
Rust

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<PathBuf>,
#[arg(long)]
pub bind: Option<SocketAddr>,
#[arg(long)]
pub public_url: Option<String>,
#[arg(long)]
pub state_file: Option<PathBuf>,
#[arg(long = "bootstrap-enroll-token", visible_alias = "enroll-token")]
pub bootstrap_enroll_tokens: Vec<String>,
#[arg(long)]
pub command_timeout_ms: Option<u64>,
#[arg(long)]
pub enroll_token_ttl_seconds: Option<u64>,
/// Audit/alert history retention in seconds (legacy CLI name; not device retention).
#[arg(long)]
pub observation_retention_seconds: Option<u64>,
#[arg(long)]
pub pid_file: Option<PathBuf>,
#[arg(long)]
pub ui_dist_dir: Option<PathBuf>,
#[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<PathBuf>,
#[arg(long, short, visible_alias = "from")]
pub from_config: Option<PathBuf>,
#[arg(long, conflicts_with = "config_file")]
pub stdout: bool,
#[arg(long)]
pub data_dir: Option<PathBuf>,
#[arg(long)]
pub bind: Option<SocketAddr>,
#[arg(long)]
pub public_url: Option<String>,
#[arg(long)]
pub state_file: Option<PathBuf>,
#[arg(long)]
pub pid_file: Option<PathBuf>,
#[arg(long)]
pub ui_dist_dir: Option<PathBuf>,
#[arg(long)]
pub command_timeout_ms: Option<u64>,
#[arg(long)]
pub enroll_token_ttl_seconds: Option<u64>,
/// Audit/alert history retention in seconds (legacy CLI name; not device retention).
#[arg(long)]
pub observation_retention_seconds: Option<u64>,
#[arg(long = "bootstrap-enroll-token", visible_alias = "enroll-token")]
pub bootstrap_enroll_tokens: Vec<String>,
#[arg(long)]
pub telemetry_otlp_endpoint: Option<String>,
#[arg(long)]
pub telemetry_service_name: Option<String>,
#[arg(long, num_args = 0..=1, default_missing_value = "true")]
pub telemetry_json_logs: Option<bool>,
#[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<PathBuf>,
#[arg(long)]
pub data_dir: Option<PathBuf>,
#[arg(long)]
pub public_url: Option<String>,
#[arg(long)]
pub ttl_seconds: Option<u64>,
#[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<PathBuf>,
#[arg(long)]
pub data_dir: Option<PathBuf>,
#[arg(long)]
pub public_url: Option<String>,
#[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<PathBuf>,
#[arg(long)]
pub data_dir: Option<PathBuf>,
#[arg(long)]
pub public_url: Option<String>,
#[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<PathBuf>,
#[arg(long)]
pub data_dir: Option<PathBuf>,
#[arg(long)]
pub public_url: Option<String>,
#[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<PathBuf>,
#[arg(long)]
pub data_dir: Option<PathBuf>,
#[arg(long)]
pub public_url: Option<String>,
#[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,
}