[pbs-devel] [PATCH v8 proxmox-backup 64/69] client: pxar: allow to restore prelude to optional path

Fabian Grünbichler f.gruenbichler at proxmox.com
Mon Jun 3 15:57:35 CEST 2024


On May 28, 2024 11:42 am, Christian Ebner wrote:
> Pxar archives allow to store additional information in a prelude
> entry since pxar format version 2.
> 
> Add an optional parameter to `pxar` and `proxmox-backup-client` to
> specify the path to restore the prelude to and pass this to the
> archive extraction by extending the `PxarExtractOptions` by a
> corresponding field. If none is given, the prelude is simply skipped
> during restore.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
> changes since version 7:
> - no changes
> 
> changes since version 6:
> - remove binding to now not returned version return value
> 
>  pbs-client/src/pxar/extract.rs    | 23 +++++++++++++++++++++--
>  proxmox-backup-client/src/main.rs | 12 +++++++++++-
>  pxar-bin/src/main.rs              |  6 ++++++
>  3 files changed, 38 insertions(+), 3 deletions(-)
> 
> diff --git a/pbs-client/src/pxar/extract.rs b/pbs-client/src/pxar/extract.rs
> index e22390606..99c0d0e10 100644
> --- a/pbs-client/src/pxar/extract.rs
> +++ b/pbs-client/src/pxar/extract.rs
> @@ -2,7 +2,8 @@
>  
>  use std::collections::HashMap;
>  use std::ffi::{CStr, CString, OsStr, OsString};
> -use std::io;
> +use std::fs::OpenOptions;
> +use std::io::{self, Write};
>  use std::os::unix::ffi::OsStrExt;
>  use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
>  use std::path::{Path, PathBuf};
> @@ -37,6 +38,7 @@ pub struct PxarExtractOptions<'a> {
>      pub allow_existing_dirs: bool,
>      pub overwrite_flags: OverwriteFlags,
>      pub on_error: Option<ErrorHandler>,
> +    pub prelude_path: Option<PathBuf>,
>  }
>  
>  bitflags! {
> @@ -125,9 +127,26 @@ where
>          // we use this to keep track of our directory-traversal
>          decoder.enable_goodbye_entries(true);
>  
> -        let (root, _) = handle_root_with_optional_format_version_prelude(&mut decoder)
> +        let (root, prelude) = handle_root_with_optional_format_version_prelude(&mut decoder)
>              .context("error reading pxar archive")?;
>  
> +        if let Some(ref path) = options.prelude_path {
> +            if let Some(entry) = prelude {
> +                let mut prelude_file = OpenOptions::new()
> +                    .create(true)
> +                    .write(true)
> +                    .open(path)
> +                    .with_context(|| format!("error creating prelude file '{path:?}'"))?;
> +                if let pxar::EntryKind::Prelude(ref prelude) = entry.kind() {
> +                    prelude_file.write_all(prelude.as_os_str().as_bytes())?;
> +                } else {
> +                    log::info!("unexpected entry kind for prelude");
> +                }
> +            } else {
> +                log::info!("No prelude entry found, skip prelude restore.");
> +            }
> +        }
> +
>          if !root.is_dir() {
>              bail!("pxar archive does not start with a directory entry!");
>          }
> diff --git a/proxmox-backup-client/src/main.rs b/proxmox-backup-client/src/main.rs
> index 87dbb63d5..ad9042857 100644
> --- a/proxmox-backup-client/src/main.rs
> +++ b/proxmox-backup-client/src/main.rs
> @@ -1433,7 +1433,12 @@ We do not extract '.pxar' archives when writing to standard output.
>                  description: "ignore errors that occur during device node extraction",
>                  optional: true,
>                  default: false,
> -            }
> +            },
> +            "restore-prelude-to": {
> +                description: "Path to restore prelude to, (pxar v2 archives only).",
> +                type: String,
> +                optional: true,
> +            },

I don't think we have any other CLI parameters that follow this pattern,
maybe something like

--prelude-target

is a better fit?

and in any case, it's lacking completion :)

>          }
>      }
>  )]
> @@ -1595,12 +1600,17 @@ async fn restore(
>              overwrite_flags.insert(pbs_client::pxar::OverwriteFlags::all());
>          }
>  
> +        let prelude_path = param["restore-prelude-to"]
> +            .as_str()
> +            .map(|path| PathBuf::from(path));
> +
>          let options = pbs_client::pxar::PxarExtractOptions {
>              match_list: &[],
>              extract_match_default: true,
>              allow_existing_dirs,
>              overwrite_flags,
>              on_error,
> +            prelude_path,
>          };
>  
>          let mut feature_flags = pbs_client::pxar::Flags::DEFAULT;
> diff --git a/pxar-bin/src/main.rs b/pxar-bin/src/main.rs
> index 8040e5ff4..6aa7d21f0 100644
> --- a/pxar-bin/src/main.rs
> +++ b/pxar-bin/src/main.rs
> @@ -131,6 +131,10 @@ fn extract_archive_from_reader<R: std::io::Read>(
>                  description: "'ppxar' payload input data file to restore split archive.",
>                  optional: true,
>              },
> +            "restore-prelude-to": {
> +                description: "Path to restore pxar archive prelude to.",
> +                optional: true,
> +            },

same applies here

>          },
>      },
>  )]
> @@ -154,6 +158,7 @@ fn extract_archive(
>      no_sockets: bool,
>      strict: bool,
>      payload_input: Option<String>,
> +    restore_prelude_to: Option<String>,
>  ) -> Result<(), Error> {
>      let mut feature_flags = Flags::DEFAULT;
>      if no_xattrs {
> @@ -227,6 +232,7 @@ fn extract_archive(
>          overwrite_flags,
>          extract_match_default,
>          on_error,
> +        prelude_path: restore_prelude_to.map(|path| PathBuf::from(path)),
>      };
>  
>      if archive == "-" {
> -- 
> 2.39.2
> 
> 
> 
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
> 
> 
> 




More information about the pbs-devel mailing list