[pbs-devel] [PATCH proxmox-backup 5/8] api: datastore: add optional archive-name to file-restore

Fabian Grünbichler f.gruenbichler at proxmox.com
Fri Jun 7 12:24:18 CEST 2024


On June 7, 2024 11:43 am, Christian Ebner wrote:
> Allow to pass the archive name as optional api call parameter instead
> of having it as prefix to the path.
> If this parameter is given, instead of splitting of the archive name
> from the path, the parameter itself is used, leaving the path
> untouched.
> 
> This allows to restore single files from the archive, without having
> to artificially construct the path in case of file restores for split
> pxar archives, where the response path of the listing does not
> include the archive, as opposed to the response provided by lookup
> via the catalog.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>  src/api2/admin/datastore.rs | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
> index e25a78bca..d33422d13 100644
> --- a/src/api2/admin/datastore.rs
> +++ b/src/api2/admin/datastore.rs
> @@ -1773,6 +1773,7 @@ pub const API_METHOD_PXAR_FILE_DOWNLOAD: ApiMethod = ApiMethod::new(
>              ("backup-time", false, &BACKUP_TIME_SCHEMA),
>              ("filepath", false, &StringSchema::new("Base64 encoded path").schema()),
>              ("tar", true, &BooleanSchema::new("Download as .tar.zst").schema()),
> +            ("archive-name", true, &StringSchema::new("Base64 encoded archive name").schema()),

same question here - this should be safe as regular string with the
appropriate schema?

>          ]),
>      )
>  ).access(
> @@ -1840,9 +1841,17 @@ pub fn pxar_file_download(
>              components.remove(0);
>          }
>  
> -        let mut split = components.splitn(2, |c| *c == b'/');
> -        let pxar_name = std::str::from_utf8(split.next().unwrap())?;
> -        let file_path = split.next().unwrap_or(b"/");
> +        let (pxar_name, file_path) = if let Some(archive_name) = param["archive-name"].as_str() {
> +            let archive_name = base64::decode(archive_name)
> +                .map_err(|err| format_err!("base64 decode of archive-name failed - {err}"))?;
> +            (archive_name, base64::decode(&filepath)?)
> +        } else {
> +            let mut split = components.splitn(2, |c| *c == b'/');
> +            let pxar_name = split.next().unwrap();
> +            let file_path = split.next().unwrap_or(b"/");
> +            (pxar_name.to_owned(), file_path.to_owned())
> +        };
> +        let pxar_name = std::str::from_utf8(&pxar_name)?;
>          let (manifest, files) = read_backup_index(&backup_dir)?;
>          for file in files {
>              if file.filename == pxar_name && file.crypt_mode == Some(CryptMode::Encrypt) {
> @@ -1865,7 +1874,7 @@ pub fn pxar_file_download(
>          let decoder = Accessor::new(reader, archive_size).await?;
>  
>          let root = decoder.open_root().await?;
> -        let path = OsStr::from_bytes(file_path).to_os_string();
> +        let path = OsStr::from_bytes(&file_path).to_os_string();
>          let file = root
>              .lookup(&path)
>              .await?
> -- 
> 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