275 lines
6.3 KiB
Rust
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,
|
|
}
|