From: markus frank <m.frank@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand
Date: Fri, 18 Feb 2022 10:55:38 +0100 [thread overview]
Message-ID: <20220218095538.2868974-1-m.frank@proxmox.com> (raw)
From: Markus Frank <m.frank@proxmox.com>
adds a dry-run parameter for "proxmox-backup-client backup".
With this parameter on it simply prints out what would be uploaded,
instead of uploading it.
Signed-off-by: Markus Frank <m.frank@proxmox.com>
---
version 2:
* tuple matching
* print closure
proxmox-backup-client/src/main.rs | 50 +++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 9 deletions(-)
diff --git a/proxmox-backup-client/src/main.rs b/proxmox-backup-client/src/main.rs
index 081028f2..437c1400 100644
--- a/proxmox-backup-client/src/main.rs
+++ b/proxmox-backup-client/src/main.rs
@@ -613,6 +613,11 @@ fn spawn_catalog_upload(
description: "Verbose output.",
optional: true,
},
+ "dry-run": {
+ type: Boolean,
+ description: "Just show what backup would do, but do not upload anything.",
+ optional: true,
+ },
}
}
)]
@@ -633,6 +638,8 @@ async fn create_backup(
let verbose = param["verbose"].as_bool().unwrap_or(false);
+ let dry_run = param["dry-run"].as_bool().unwrap_or(false);
+
let backup_time_opt = param["backup-time"].as_i64();
let chunk_size_opt = param["chunk-size"].as_u64().map(|v| (v*1024) as usize);
@@ -844,35 +851,55 @@ async fn create_backup(
let mut catalog = None;
let mut catalog_result_rx = None;
+ let printfileinfo = |butype:&str, filename:&str, repo:&pbs_client::BackupRepository, target:&str| {
+ if dry_run{
+ println!("Would upload {} '{}' to '{}' as {}", butype, filename, repo, target);
+ } else {
+ println!("Upload {} '{}' to '{}' as {}", butype, filename, repo, target);
+ }
+ };
+
for (backup_type, filename, target, size) in upload_list {
- match backup_type {
- BackupSpecificationType::CONFIG => {
+ match (backup_type, dry_run) {
+ (BackupSpecificationType::CONFIG, true) => {
+ printfileinfo("config file", &filename, &repo, &target);
+ }
+ (BackupSpecificationType::LOGFILE, true) => {
+ printfileinfo("log file", &filename, &repo, &target);
+ }
+ (BackupSpecificationType::PXAR, true) => {
+ printfileinfo("directory", &filename, &repo, &target);
+ }
+ (BackupSpecificationType::IMAGE, true) => {
+ printfileinfo("image", &filename, &repo, &target);
+ }
+ (BackupSpecificationType::CONFIG, false) => {
let upload_options = UploadOptions {
compress: true,
encrypt: crypto.mode == CryptMode::Encrypt,
..UploadOptions::default()
};
- println!("Upload config file '{}' to '{}' as {}", filename, repo, target);
+ printfileinfo("config file", &filename, &repo, &target);
let stats = client
.upload_blob_from_file(&filename, &target, upload_options)
.await?;
manifest.add_file(target, stats.size, stats.csum, crypto.mode)?;
}
- BackupSpecificationType::LOGFILE => { // fixme: remove - not needed anymore ?
+ (BackupSpecificationType::LOGFILE, false) => { // fixme: remove - not needed anymore ?
let upload_options = UploadOptions {
compress: true,
encrypt: crypto.mode == CryptMode::Encrypt,
..UploadOptions::default()
};
- println!("Upload log file '{}' to '{}' as {}", filename, repo, target);
+ printfileinfo("log file", &filename, &repo, &target);
let stats = client
.upload_blob_from_file(&filename, &target, upload_options)
.await?;
manifest.add_file(target, stats.size, stats.csum, crypto.mode)?;
}
- BackupSpecificationType::PXAR => {
+ (BackupSpecificationType::PXAR, false) => {
// start catalog upload on first use
if catalog.is_none() {
let catalog_upload_res = spawn_catalog_upload(client.clone(), crypto.mode == CryptMode::Encrypt)?;
@@ -881,7 +908,7 @@ async fn create_backup(
}
let catalog = catalog.as_ref().unwrap();
- println!("Upload directory '{}' to '{}' as {}", filename, repo, target);
+ printfileinfo("directory", &filename, &repo, &target);
catalog.lock().unwrap().start_directory(std::ffi::CString::new(target.as_str())?.as_c_str())?;
let pxar_options = pbs_client::pxar::PxarCreateOptions {
@@ -911,8 +938,8 @@ async fn create_backup(
manifest.add_file(target, stats.size, stats.csum, crypto.mode)?;
catalog.lock().unwrap().end_directory()?;
}
- BackupSpecificationType::IMAGE => {
- println!("Upload image '{}' to '{:?}' as {}", filename, repo, target);
+ (BackupSpecificationType::IMAGE, false) => {
+ printfileinfo("image", &filename, &repo, &target);
let upload_options = UploadOptions {
previous_manifest: previous_manifest.clone(),
@@ -933,6 +960,11 @@ async fn create_backup(
}
}
+ if dry_run {
+ println!("dry-run: no upload happend");
+ return Ok(Value::Null);
+ }
+
// finalize and upload catalog
if let Some(catalog) = catalog {
let mutex = Arc::try_unwrap(catalog)
--
2.30.2
next reply other threads:[~2022-02-18 9:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-18 9:55 markus frank [this message]
2022-02-18 10:12 ` Markus Frank
2022-02-18 14:10 ` [pbs-devel] applied: " Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220218095538.2868974-1-m.frank@proxmox.com \
--to=m.frank@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.