aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nitrocli/Cargo.lock7
-rw-r--r--nitrocli/Cargo.toml3
-rw-r--r--nitrocli/src/args.rs8
-rw-r--r--nitrocli/src/commands.rs41
4 files changed, 47 insertions, 12 deletions
diff --git a/nitrocli/Cargo.lock b/nitrocli/Cargo.lock
index 9ae9299..ec8a1bd 100644
--- a/nitrocli/Cargo.lock
+++ b/nitrocli/Cargo.lock
@@ -72,6 +72,11 @@ dependencies = [
]
[[package]]
+name = "json"
+version = "0.11.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "lazy_static"
version = "1.2.0"
@@ -94,6 +99,7 @@ version = "0.2.4"
dependencies = [
"argparse 0.2.2",
"base32 0.4.0",
+ "json 0.11.15 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.62",
"nitrokey 0.4.0-alpha.3",
"nitrokey-test 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -329,6 +335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
"checksum getrandom 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "fc344b02d3868feb131e8b5fe2b9b0a1cc42942679af493061fc13b853243872"
+"checksum json 0.11.15 (registry+https://github.com/rust-lang/crates.io-index)" = "92c245af8786f6ac35f95ca14feca9119e71339aaab41e878e7cdd655c97e9e5"
"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8"
"checksum nitrokey-test 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e7e81b55db51769209e88a63cdbb4f2dc7ee9cd20ccaf32fbb940a3b0c50259"
"checksum nitrokey-test-state 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a59b732ed6d5212424ed31ec9649f05652bcbc38f45f2292b27a6044e7098803"
diff --git a/nitrocli/Cargo.toml b/nitrocli/Cargo.toml
index f48e7ca..5dd1033 100644
--- a/nitrocli/Cargo.toml
+++ b/nitrocli/Cargo.toml
@@ -49,6 +49,9 @@ version = "0.2.2"
version = "0.4.0"
path = "../base32"
+[dependencies.json]
+version = "0.11"
+
[dependencies.libc]
version = "0.2"
diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs
index 2e56e9e..67f6abf 100644
--- a/nitrocli/src/args.rs
+++ b/nitrocli/src/args.rs
@@ -329,11 +329,17 @@ fn parse(
/// Inquire the status of the Nitrokey.
fn status(ctx: &mut ExecCtx<'_>, args: Vec<String>) -> Result<()> {
+ let mut json = false;
let mut parser = argparse::ArgumentParser::new();
parser.set_description("Prints the status of the connected Nitrokey device");
+ let _ = parser.refer(&mut json).add_option(
+ &["--json"],
+ argparse::StoreTrue,
+ "Emit status output in JSON format",
+ );
parse(ctx, parser, args)?;
- commands::status(ctx)
+ commands::status(ctx, json)
}
/// Perform a factory reset.
diff --git a/nitrocli/src/commands.rs b/nitrocli/src/commands.rs
index 86a66df..969af11 100644
--- a/nitrocli/src/commands.rs
+++ b/nitrocli/src/commands.rs
@@ -330,11 +330,12 @@ fn print_storage_status(
}
/// Query and pretty print the status that is common to all Nitrokey devices.
-fn print_status(
- ctx: &mut args::ExecCtx<'_>,
- model: &'static str,
- device: &nitrokey::DeviceWrapper<'_>,
-) -> Result<()> {
+fn print_status(ctx: &mut args::ExecCtx<'_>, device: &nitrokey::DeviceWrapper<'_>) -> Result<()> {
+ let model = match device {
+ nitrokey::DeviceWrapper::Pro(_) => "Pro",
+ nitrokey::DeviceWrapper::Storage(_) => "Storage",
+ };
+
let serial_number = device
.get_serial_number()
.map_err(|err| get_error("Could not query the serial number", err))?;
@@ -365,14 +366,32 @@ fn print_status(
}
}
+fn emit_json_status(
+ ctx: &mut args::ExecCtx<'_>,
+ device: &nitrokey::DeviceWrapper<'_>,
+) -> Result<()> {
+ let model = match device {
+ nitrokey::DeviceWrapper::Pro(_) => "pro",
+ nitrokey::DeviceWrapper::Storage(_) => "storage",
+ };
+ let serial = device.get_serial_number()?;
+
+ let data = json::object! {
+ "model" => model,
+ "serial" => serial,
+ };
+ ctx.stdout.write_all(data.dump().as_bytes())?;
+ Ok(())
+}
+
/// Inquire the status of the nitrokey.
-pub fn status(ctx: &mut args::ExecCtx<'_>) -> Result<()> {
+pub fn status(ctx: &mut args::ExecCtx<'_>, json: bool) -> Result<()> {
with_device(ctx, |ctx, device| {
- let model = match device {
- nitrokey::DeviceWrapper::Pro(_) => "Pro",
- nitrokey::DeviceWrapper::Storage(_) => "Storage",
- };
- print_status(ctx, model, &device)
+ if json {
+ emit_json_status(ctx, &device)
+ } else {
+ print_status(ctx, &device)
+ }
})
}