aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2020-09-19 15:04:18 +0200
committerDaniel Mueller <deso@posteo.net>2020-09-20 10:50:26 -0700
commitd5c357e4564318577cf7e36d0f29b566f61dc825 (patch)
tree3d2d95abef64a342e757509bab29e7482398f370
parent57a177e2f946390559a1f17787c5a15d23ac3393 (diff)
downloadnitrocli-d5c357e4564318577cf7e36d0f29b566f61dc825.tar.gz
nitrocli-d5c357e4564318577cf7e36d0f29b566f61dc825.tar.bz2
Add the --progress option to the fill command
The fill command starts a background operation on a Nitrokey Storage device that fills the SD card with random data. This patch adds a new option, --progress, to the fill command that checks if a fill operation is already running on the device and shows its progress.
-rw-r--r--doc/nitrocli.17
-rw-r--r--doc/nitrocli.1.pdfbin43024 -> 43326 bytes
-rw-r--r--src/args.rs10
-rw-r--r--src/commands.rs29
-rw-r--r--src/output.rs4
5 files changed, 37 insertions, 13 deletions
diff --git a/doc/nitrocli.1 b/doc/nitrocli.1
index 0b0a8fe..aa87136 100644
--- a/doc/nitrocli.1
+++ b/doc/nitrocli.1
@@ -137,7 +137,7 @@ open.
\fBnitrocli hidden close
Close a hidden volume.
.TP
-\fBnitrocli fill\fR
+\fBnitrocli fill \fR[\fB\-a\fR|\fB\-\-attach\fR
Fills the SD card with random data, overwriting all existing data.
This operation takes about one hour to finish for a 16 GB SD card.
It cannot be cancelled, even if the \fBnitrocli\fR process is terminated before
@@ -147,6 +147,11 @@ This command requires the admin PIN.
To avoid accidental calls of this command, the user has to enter the PIN even
if it has been cached.
+If the \fB\-\-attach\fR option is set, this command will not start a new fill
+operation.
+Instead it checks whether a fill operation is currently running on the device
+and shows its progress.
+
.SS One-time passwords
The Nitrokey Pro and the Nitrokey Storage support the generation of one-time
passwords using the HOTP algorithm according to RFC 4226 or the TOTP algorithm
diff --git a/doc/nitrocli.1.pdf b/doc/nitrocli.1.pdf
index fb41790..fb1aa9d 100644
--- a/doc/nitrocli.1.pdf
+++ b/doc/nitrocli.1.pdf
Binary files differ
diff --git a/src/args.rs b/src/args.rs
index 4947825..8af38ca 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -80,7 +80,7 @@ Command! {
/// Interacts with the device's encrypted volume
Encrypted(EncryptedArgs) => |ctx, args: EncryptedArgs| args.subcmd.execute(ctx),
/// Fills the SD card with random data
- Fill => crate::commands::fill,
+ Fill(FillArgs) => |ctx, args: FillArgs| crate::commands::fill(ctx, args.attach),
/// Interacts with the device's hidden volume
Hidden(HiddenArgs) => |ctx, args: HiddenArgs| args.subcmd.execute(ctx),
/// Lists the attached Nitrokey devices
@@ -190,6 +190,14 @@ Command! {EncryptedCommand, [
]}
#[derive(Debug, PartialEq, structopt::StructOpt)]
+pub struct FillArgs {
+ /// Checks if a fill operation is already running and show its progress instead of starting a new
+ /// operation.
+ #[structopt(short, long)]
+ attach: bool,
+}
+
+#[derive(Debug, PartialEq, structopt::StructOpt)]
pub struct HiddenArgs {
#[structopt(subcommand)]
subcmd: HiddenCommand,
diff --git a/src/commands.rs b/src/commands.rs
index ced976c..9685050 100644
--- a/src/commands.rs
+++ b/src/commands.rs
@@ -471,19 +471,30 @@ pub fn list(ctx: &mut Context<'_>, no_connect: bool) -> anyhow::Result<()> {
}
/// Fill the SD card with random data
-pub fn fill(ctx: &mut Context<'_>) -> anyhow::Result<()> {
+pub fn fill(ctx: &mut Context<'_>, attach: bool) -> anyhow::Result<()> {
with_storage_device(ctx, |ctx, mut device| {
- let pin_entry = pinentry::PinEntry::from(args::PinType::Admin, &device)?;
+ let mut initial_progress = 0;
+ if attach {
+ let status = device
+ .get_operation_status()
+ .context("Failed to query operation status")?;
+ match status {
+ nitrokey::OperationStatus::Ongoing(progress) => initial_progress = progress,
+ nitrokey::OperationStatus::Idle => anyhow::bail!("No fill operation in progress"),
+ }
+ } else {
+ let pin_entry = pinentry::PinEntry::from(args::PinType::Admin, &device)?;
- // Similar to reset, we want the user to re-enter the admin PIN even if is cached to avoid
- // accidental data loss.
- pinentry::clear(&pin_entry).context("Failed to clear cached secret")?;
+ // Similar to reset, we want the user to re-enter the admin PIN
+ // even if is cached to avoid accidental data loss.
+ pinentry::clear(&pin_entry).context("Failed to clear cached secret")?;
- try_with_pin(ctx, &pin_entry, |pin| {
- device.fill_sd_card(&pin).context("Failed to fill SD card")
- })?;
+ try_with_pin(ctx, &pin_entry, |pin| {
+ device.fill_sd_card(&pin).context("Failed to fill SD card")
+ })?;
+ }
- let mut progress_bar = output::ProgressBar::new();
+ let mut progress_bar = output::ProgressBar::new(initial_progress);
progress_bar.draw(ctx)?;
while !progress_bar.is_finished() {
diff --git a/src/output.rs b/src/output.rs
index bd6c03c..1811cc3 100644
--- a/src/output.rs
+++ b/src/output.rs
@@ -26,10 +26,10 @@ pub struct ProgressBar {
impl ProgressBar {
/// Creates a new empty progress bar.
- pub fn new() -> ProgressBar {
+ pub fn new(progress: u8) -> ProgressBar {
ProgressBar {
redraw: true,
- progress: 0,
+ progress,
toggle: false,
finished: false,
}