public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand
@ 2022-02-18  9:55 markus frank
  2022-02-18 10:12 ` Markus Frank
  2022-02-18 14:10 ` [pbs-devel] applied: " Thomas Lamprecht
  0 siblings, 2 replies; 3+ messages in thread
From: markus frank @ 2022-02-18  9:55 UTC (permalink / raw)
  To: pbs-devel

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





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [pbs-devel] [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand
  2022-02-18  9:55 [pbs-devel] [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand markus frank
@ 2022-02-18 10:12 ` Markus Frank
  2022-02-18 14:10 ` [pbs-devel] applied: " Thomas Lamprecht
  1 sibling, 0 replies; 3+ messages in thread
From: Markus Frank @ 2022-02-18 10:12 UTC (permalink / raw)
  To: pbs-devel

I gave git two Froms. Should I make a new patch?
If not and the code is okay, please delete the first line, thanks.

On 2/18/22 10:55, markus frank wrote:
> 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)





^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pbs-devel] applied: [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand
  2022-02-18  9:55 [pbs-devel] [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand markus frank
  2022-02-18 10:12 ` Markus Frank
@ 2022-02-18 14:10 ` Thomas Lamprecht
  1 sibling, 0 replies; 3+ messages in thread
From: Thomas Lamprecht @ 2022-02-18 14:10 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, markus frank

On 18.02.22 10:55, markus frank wrote:
> 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(-)
> 
>

dropped one From header and applied, thanks!

Made two followups, one for the helper inline fn, i.e., repo was available in scope
so no need to pass it as param (question is if it's useful to repeat the same value
more than once anyway, but I kept it for now), and the second was for existing
non-ideal way the boolean/defaults where managed, the api macro is able to
handle that more comfortably and so that the default shows up in the CLI help.




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-02-18 14:10 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-18  9:55 [pbs-devel] [PATCH v2 proxmox-backup] fix #3323: dry-run for cli backup subcommand markus frank
2022-02-18 10:12 ` Markus Frank
2022-02-18 14:10 ` [pbs-devel] applied: " Thomas Lamprecht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal