all lists on lists.proxmox.com
 help / color / mirror / Atom feed
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





             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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal