diff options
-rw-r--r-- | nitrocli/CHANGELOG.md | 5 | ||||
-rw-r--r-- | nitrocli/doc/nitrocli.1 | 12 | ||||
-rw-r--r-- | nitrocli/doc/nitrocli.1.pdf | bin | 13301 -> 13820 bytes | |||
-rw-r--r-- | nitrocli/src/args.rs | 12 | ||||
-rw-r--r-- | nitrocli/src/commands.rs | 24 |
5 files changed, 48 insertions, 5 deletions
diff --git a/nitrocli/CHANGELOG.md b/nitrocli/CHANGELOG.md index 26e9e99..e6a4480 100644 --- a/nitrocli/CHANGELOG.md +++ b/nitrocli/CHANGELOG.md @@ -1,3 +1,8 @@ +Unreleased +---------- +- Added the `-v`/`--verbose` option to control libnitrokey log level + + 0.2.1 ----- - Added the `pws` command for accessing the password safe diff --git a/nitrocli/doc/nitrocli.1 b/nitrocli/doc/nitrocli.1 index f16ecc6..7786fc1 100644 --- a/nitrocli/doc/nitrocli.1 +++ b/nitrocli/doc/nitrocli.1 @@ -1,8 +1,9 @@ -.TH NITROCLI 1 2018-12-30 +.TH NITROCLI 1 2019-01-05 .SH NAME nitrocli \- access Nitrokey devices .SH SYNOPSIS .B nitrocli +\fR[\fB\-v\fR|\fB\-\-verbose\fR] \fIcommand\fR [\fIarguments\fR] .SH DESCRIPTION @@ -10,6 +11,15 @@ nitrocli \- access Nitrokey devices It supports the Nitrokey Pro and the Nitrokey Storage. It can be used to access the encrypted volume, the one-time password generator, and the password safe. +.SH OPTIONS +.TP +.B \-v, \-\-verbose +Enable additional logging and control its verbosity. Logging enabled through +this option will appear on the standard error stream. This option can be +supplied multiple times. A single occurrence will show additional warnings. +Commands sent to the device will be shown when supplied three times and full +device communication is available with four occurrences. Supplying this option +five times enables the highest verbosity. .SH COMMANDS .SS General .TP diff --git a/nitrocli/doc/nitrocli.1.pdf b/nitrocli/doc/nitrocli.1.pdf Binary files differindex 0354e93..c5e8898 100644 --- a/nitrocli/doc/nitrocli.1.pdf +++ b/nitrocli/doc/nitrocli.1.pdf diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs index cb66bb2..869734c 100644 --- a/nitrocli/src/args.rs +++ b/nitrocli/src/args.rs @@ -31,7 +31,9 @@ type Result<T> = result::Result<T, Error>; /// A command execution context that captures additional data pertaining /// the command execution. #[derive(Debug)] -pub struct ExecCtx {} +pub struct ExecCtx { + pub verbosity: u64, +} /// A top-level command for nitrocli. #[derive(Debug)] @@ -950,9 +952,15 @@ fn pws_status(ctx: &ExecCtx, args: Vec<String>) -> Result<()> { /// Parse the command-line arguments and return the selected command and /// the remaining arguments for the command. fn parse_arguments(args: Vec<String>) -> Result<(Command, ExecCtx, Vec<String>)> { + let mut verbosity = 0; let mut command = Command::Status; let mut subargs = vec![]; let mut parser = argparse::ArgumentParser::new(); + let _ = parser.refer(&mut verbosity).add_option( + &["-v", "--verbose"], + argparse::IncrBy::<u64>(1), + "Increase the log level (can be supplied multiple times)", + ); parser.set_description("Provides access to a Nitrokey device"); let _ = parser.refer(&mut command).required().add_argument( "command", @@ -970,7 +978,7 @@ fn parse_arguments(args: Vec<String>) -> Result<(Command, ExecCtx, Vec<String>)> subargs.insert(0, format!("nitrocli {}", command)); - let ctx = ExecCtx { }; + let ctx = ExecCtx { verbosity }; Ok((command, ctx, subargs)) } diff --git a/nitrocli/src/commands.rs b/nitrocli/src/commands.rs index aa99bd1..27faf05 100644 --- a/nitrocli/src/commands.rs +++ b/nitrocli/src/commands.rs @@ -38,13 +38,33 @@ fn get_error(msg: &str, err: nitrokey::CommandError) -> Error { Error::Error(format!("{}: {:?}", msg, err)) } +/// Set `libnitrokey`'s log level based on the execution context's verbosity. +fn set_log_level(ctx: &args::ExecCtx) { + let log_lvl = match ctx.verbosity { + // The error log level is what libnitrokey uses by default. As such, + // there is no harm in us setting that as well when the user did not + // ask for higher verbosity. + 0 => nitrokey::LogLevel::Error, + 1 => nitrokey::LogLevel::Warning, + 2 => nitrokey::LogLevel::Info, + 3 => nitrokey::LogLevel::DebugL1, + 4 => nitrokey::LogLevel::Debug, + _ => nitrokey::LogLevel::DebugL2, + }; + nitrokey::set_log_level(log_lvl); +} + /// Connect to any Nitrokey device and return it. -fn get_device(_ctx: &args::ExecCtx) -> Result<nitrokey::DeviceWrapper> { +fn get_device(ctx: &args::ExecCtx) -> Result<nitrokey::DeviceWrapper> { + set_log_level(ctx); + nitrokey::connect().map_err(|_| Error::Error("Nitrokey device not found".to_string())) } /// Connect to a Nitrokey Storage device and return it. -fn get_storage_device(_ctx: &args::ExecCtx) -> Result<nitrokey::Storage> { +fn get_storage_device(ctx: &args::ExecCtx) -> Result<nitrokey::Storage> { + set_log_level(ctx); + nitrokey::Storage::connect().or_else(|_| { Err(Error::Error( "Nitrokey Storage device not found".to_string(), |