[pbs-devel] [PATCH v8 proxmox-backup 64/69] client: pxar: allow to restore prelude to optional path
Christian Ebner
c.ebner at proxmox.com
Mon Jun 3 17:02:45 CEST 2024
On 6/3/24 15:57, Fabian Grünbichler wrote:
> 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 :)
>
Adapted this as suggested and added lacking completion functions (same
goes for the other mentions :) )
More information about the pbs-devel
mailing list