use clap::Parser; use clap::Subcommand; #[derive(Parser, Debug)] #[clap( name = "Husk milter", about = "Encrypting milter.", arg_required_else_help = true, )] pub struct CliArgs { #[clap( long, short, global = true, help = "Configuration file.", )] pub config: Option, #[clap( long, global = true, help = "Certificate store (SEQUOIA_HOME).", )] pub home: Option, #[clap(subcommand)] pub subcommand: HuskSubcommands, } // Subcommands Level 1 #[derive(Debug, Subcommand)] pub enum HuskSubcommands { Daemon(DaemonCommand), Introducer(IntroducerCommand), Locals(LocalsCommand), Signkey(SignkeyCommand), } // Daemon subcommands #[derive(Parser, Debug)] #[clap( name = "daemon", about = "Manage milter daemon.", subcommand_required = true, arg_required_else_help = true, disable_colored_help = true, disable_version_flag = true, )] pub struct DaemonCommand { #[clap(subcommand)] pub subcommand: DaemonSubcommand, } #[derive(Debug, Subcommand)] pub enum DaemonSubcommand { Start, Stop, Status } // Introducer subcommands #[derive(Parser, Debug)] #[clap( name = "introducer", about = "Manage introducers.", subcommand_required = true, arg_required_else_help = true, disable_colored_help = true, disable_version_flag = true, )] pub struct IntroducerCommand { #[clap(subcommand)] pub subcommand: IntroducerSubcommand, } #[derive(Debug, Subcommand)] pub enum IntroducerSubcommand { Add(IntroducerAddCommand), Remove(IntroducerRemoveCommand), #[clap( about = "List introducers." )] List } #[derive(Parser, Debug)] #[clap( name = "introducer", about = "Add introducers.", )] pub struct IntroducerAddCommand { #[clap( long = "cert", help = "Certificate to declare as introducer.", conflicts_with = "cert_file", value_name = "FINGERPRINT", )] pub cert: Option, #[clap( long = "cert-file", help = "Import certificate from and declare it as introducer.", value_name = "FILE", conflicts_with = "cert" )] pub cert_file: Option, #[clap( long = "domains", help = "Domains this certificate introduces.", required = true, num_args = 1.., value_delimiter = ' ' )] pub domains: Vec, } #[derive(Parser, Debug)] #[clap( name = "introducer", about = "Remove introducers.", )] pub struct IntroducerRemoveCommand { #[clap( long = "cert", help = "Certificate to be removed as introducer.", value_name = "FINGERPRINT", )] pub cert: String, #[clap( long = "demote", help = "Remove introducing capabilities, but keep certificate authenticated.", default_value_t = false, )] pub demote: bool, } // Local subcommands #[derive(Parser, Debug)] #[clap( name = "local", about = "Manage manually added certificates.", subcommand_required = true, arg_required_else_help = true, disable_colored_help = true, disable_version_flag = true, )] pub struct LocalsCommand { #[clap(subcommand)] pub subcommand: LocalsSubcommand, } #[derive(Debug, Subcommand)] pub enum LocalsSubcommand { Add(LocalsAddCommand), Remove(LocalsRemoveCommand), #[clap( about = "List locals." )] List } #[derive(Parser, Debug)] #[clap( name = "locals_add", about = "Add an authenticated certificate.", )] pub struct LocalsAddCommand { #[clap( long, help = "Import a certificate from .", value_name = "FILE", )] pub cert_file: String, } #[derive(Parser, Debug)] #[clap( name = "locals_remove", about = "Disable a Certificate.", )] pub struct LocalsRemoveCommand { #[clap( long = "cert", help = "Certificate to be removed.", value_name = "FINGERPRINT", )] pub cert: String, } // Signkey subcommands #[derive(Parser, Debug)] #[clap( name = "signkey", about = "Manage the signing key.", subcommand_required = true, arg_required_else_help = true, disable_colored_help = true, disable_version_flag = true, )] pub struct SignkeyCommand { #[clap(subcommand)] pub subcommand: SignkeySubcommand, } #[derive(Debug, Subcommand)] pub enum SignkeySubcommand { Set(SignkeySetCommand), Create(SignkeyCreateCommand), #[clap( about = "Show the fingerprint of the signing key." )] Show, #[clap( about = "Print the certificate of the signing key." )] Dump, } #[derive(Parser, Debug)] #[clap( about = "Set a new signing key.", )] pub struct SignkeySetCommand { #[clap( long, help = "Load a new signing key from .", value_name = "FILE", conflicts_with = "cert" )] pub cert_file: Option, #[clap( long = "cert", help = "Certificate to declare as signing key.", conflicts_with = "cert_file", value_name = "FINGERPRINT", )] pub cert: Option, } #[derive(Parser, Debug)] #[clap( about = "Create a new signing key.", )] pub struct SignkeyCreateCommand { #[clap( long, help = "Set the userid of the new key.", value_name = "USERID", default_value = "Husk signing key", )] pub userid: String, }