From 887d83cb5eb088e4fbaa2474f8d504916243f502 Mon Sep 17 00:00:00 2001 From: Markus Frank Date: Wed, 29 Nov 2023 14:20:18 +0100 Subject: [PATCH] cli: add interactive confirmation for block device wipe If stdin is a TTY, an interactive prompt is added to confirm the deletion of a block device, ensuring user verification before proceeding. Signed-off-by: Markus Frank --- src/bin/proxmox_backup_manager/disk.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/bin/proxmox_backup_manager/disk.rs b/src/bin/proxmox_backup_manager/disk.rs index 7a292098..e0056f6c 100644 --- a/src/bin/proxmox_backup_manager/disk.rs +++ b/src/bin/proxmox_backup_manager/disk.rs @@ -3,6 +3,7 @@ use serde_json::Value; use proxmox_router::{cli::*, ApiHandler, RpcEnvironment}; use proxmox_schema::api; +use std::io::{IsTerminal, Write}; use pbs_api_types::{ ZfsCompressionType, ZfsRaidLevel, BLOCKDEVICE_DISK_AND_PARTITION_NAME_SCHEMA, @@ -152,6 +153,26 @@ async fn initialize_disk( async fn wipe_disk(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result { param["node"] = "localhost".into(); + // If we're on a TTY, query the user + if std::io::stdin().is_terminal() { + loop { + eprintln!("You are about to wipe block device {}.", param["disk"]); + eprint!("Are you sure you want to continue? (y/N): "); + let _ = std::io::stdout().flush(); + use std::io::{BufRead, BufReader}; + let mut line = String::new(); + match BufReader::new(std::io::stdin()).read_line(&mut line) { + Ok(_) => { + match line.trim() { + "y" | "Y" => break, + _ => bail!("Aborting."), + } + } + Err(err) => bail!("Failed to read line - {err}."), + } + } + } + let info = &api2::node::disks::API_METHOD_WIPE_DISK; let result = match info.handler { ApiHandler::Sync(handler) => (handler)(param, info, rpcenv)?,