[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