diff --git a/src/agent/Cargo.lock b/src/agent/Cargo.lock index 6c2215d667..ba9ab52651 100644 --- a/src/agent/Cargo.lock +++ b/src/agent/Cargo.lock @@ -60,6 +60,17 @@ dependencies = [ "syn", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.0.1" @@ -173,6 +184,36 @@ dependencies = [ "winapi", ] +[[package]] +name = "clap" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1121e32687f7f90b905d4775273305baa4f32cd418923e9b0fa726533221857" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "indexmap", + "lazy_static", + "os_str_bytes", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cbcf660a32ad0eda4b11996d8761432f499034f6e685bc6072337db662c85f8" +dependencies = [ + "heck 0.4.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "crc32fast" version = "1.3.0" @@ -384,6 +425,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -491,6 +538,7 @@ dependencies = [ "async-trait", "capctl", "cgroups-rs", + "clap", "futures", "ipnetwork", "lazy_static", @@ -841,6 +889,15 @@ dependencies = [ "tokio-stream", ] +[[package]] +name = "os_str_bytes" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" +dependencies = [ + "memchr", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -951,6 +1008,30 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro-hack" version = "0.5.19" @@ -1035,7 +1116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "355f634b43cdd80724ee7848f95770e7e70eefa6dcf14fea676216573b8fd603" dependencies = [ "bytes 1.1.0", - "heck", + "heck 0.3.3", "itertools", "log", "multimap", @@ -1422,6 +1503,12 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "1.0.82" @@ -1453,6 +1540,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" + [[package]] name = "thiserror" version = "1.0.30" @@ -1715,6 +1817,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + [[package]] name = "void" version = "1.0.2" @@ -1835,6 +1943,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/src/agent/Cargo.toml b/src/agent/Cargo.toml index 4926660236..205a1558ff 100644 --- a/src/agent/Cargo.toml +++ b/src/agent/Cargo.toml @@ -60,6 +60,7 @@ vsock-exporter = { path = "vsock-exporter" } # Configuration serde = { version = "1.0.129", features = ["derive"] } toml = "0.5.8" +clap = { version = "3.0.1", features = ["derive"] } [dev-dependencies] tempfile = "3.1.0" diff --git a/src/agent/src/main.rs b/src/agent/src/main.rs index aa7d823efd..d62f1e64c8 100644 --- a/src/agent/src/main.rs +++ b/src/agent/src/main.rs @@ -20,6 +20,7 @@ extern crate scopeguard; extern crate slog; use anyhow::{anyhow, Context, Result}; +use clap::{AppSettings, Parser}; use nix::fcntl::OFlag; use nix::sys::socket::{self, AddressFamily, SockAddr, SockFlag, SockType}; use nix::unistd::{self, dup, Pid}; @@ -80,10 +81,32 @@ const NAME: &str = "kata-agent"; lazy_static! { static ref AGENT_CONFIG: Arc> = Arc::new(RwLock::new( + // Note: We can't do AgentOpts.parse() here to send through the processed arguments to AgentConfig + // clap::Parser::parse() greedily process all command line input including cargo test parameters, + // so should only be used inside main. AgentConfig::from_cmdline("/proc/cmdline", env::args().collect()).unwrap() )); } +#[derive(Parser)] +// The default clap version info doesn't match our form, so we need to override it +#[clap(global_setting(AppSettings::DisableVersionFlag))] +struct AgentOpts { + /// Print the version information + #[clap(short, long)] + version: bool, + #[clap(subcommand)] + subcmd: Option, + /// Specify a custom agent config file + #[clap(short, long)] + config: Option, +} + +#[derive(Parser)] +enum SubCommand { + Init {}, +} + #[instrument] fn announce(logger: &Logger, config: &AgentConfig) { info!(logger, "announce"; @@ -255,9 +278,9 @@ async fn real_main() -> std::result::Result<(), Box> { } fn main() -> std::result::Result<(), Box> { - let args: Vec = env::args().collect(); + let args = AgentOpts::parse(); - if args.len() == 2 && args[1] == "--version" { + if args.version { println!( "{} version {} (api version: {}, commit version: {}, type: rust)", NAME, @@ -265,11 +288,10 @@ fn main() -> std::result::Result<(), Box> { version::API_VERSION, version::VERSION_COMMIT, ); - exit(0); } - if args.len() == 2 && args[1] == "init" { + if let Some(SubCommand::Init {}) = args.subcmd { reset_sigpipe(); rustjail::container::init_child(); exit(0);