From be61c56c21f72da4db4320da77cf8152b2f25fac Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 16 Feb 2021 09:35:24 +0100 Subject: [PATCH] api2/tape/drive: add optional label-text to erase if given, erases the tape only iff the inserted tape contains that label used to safeguard tape erasing from ui for standalone drives Signed-off-by: Dominik Csapak --- src/api2/tape/drive.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs index 4991d66b..12709df9 100644 --- a/src/api2/tape/drive.rs +++ b/src/api2/tape/drive.rs @@ -202,19 +202,23 @@ pub async fn unload( optional: true, default: true, }, + "label-text": { + schema: MEDIA_LABEL_SCHEMA, + optional: true, + }, }, }, returns: { schema: UPID_SCHEMA, }, )] -/// Erase media +/// Erase media. Check for label-text if given (cancels if wrong media). pub fn erase_media( drive: String, fast: Option, + label_text: Option, rpcenv: &mut dyn RpcEnvironment, ) -> Result { - let (config, _digest) = config::drive::config()?; // early check/lock before starting worker @@ -236,16 +240,32 @@ pub fn erase_media( match drive.read_label() { Err(err) => { + if let Some(label) = label_text { + bail!("expected label '{}', found unrelated data", label); + } /* assume drive contains no or unrelated data */ task_log!(worker, "unable to read media label: {}", err); task_log!(worker, "erase anyways"); drive.erase_media(fast.unwrap_or(true))?; } Ok((None, _)) => { + if let Some(label) = label_text { + bail!("expected label '{}', found empty tape", label); + } task_log!(worker, "found empty media - erase anyways"); drive.erase_media(fast.unwrap_or(true))?; } Ok((Some(media_id), _key_config)) => { + if let Some(label_text) = label_text { + if media_id.label.label_text != label_text { + bail!( + "expected label '{}', found '{}', aborting", + label_text, + media_id.label.label_text + ); + } + } + task_log!( worker, "found media '{}' with uuid '{}'",