From d4a22d05df76efd0ae6d732b62e4e81f8f47ce44 Mon Sep 17 00:00:00 2001 From: Christian Ebner Date: Tue, 23 Apr 2024 19:25:55 +0200 Subject: [PATCH] file restore: cover split metadata and payload archives Attach the payload data archive as input stream to the decoder and accessor instances for split archives. Allows to restore contents from split archives via the `proxmox-file-restore extract` command, by passing the metadata archive name. Signed-off-by: Christian Ebner --- proxmox-file-restore/src/main.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs index c9a54567..e6a21afa 100644 --- a/proxmox-file-restore/src/main.rs +++ b/proxmox-file-restore/src/main.rs @@ -470,9 +470,26 @@ async fn extract( match path { ExtractPath::Pxar(archive_name, path) => { - let (reader, archive_size) = - get_remote_pxar_reader(&archive_name, client, &manifest, crypt_config).await?; - let decoder = Accessor::new(pxar::PxarVariant::Unified(reader), archive_size).await?; + let (archive_name, payload_archive_name) = + pbs_client::tools::get_pxar_archive_names(&archive_name, &manifest)?; + let (reader, archive_size) = get_remote_pxar_reader( + &archive_name, + client.clone(), + &manifest, + crypt_config.clone(), + ) + .await?; + + let reader = if let Some(payload_archive_name) = payload_archive_name { + let (payload_reader, payload_size) = + get_remote_pxar_reader(&payload_archive_name, client, &manifest, crypt_config) + .await?; + pxar::PxarVariant::Split(reader, (payload_reader, payload_size)) + } else { + pxar::PxarVariant::Unified(reader) + }; + let decoder = Accessor::new(reader, archive_size).await?; + extract_to_target(decoder, &path, target, format, zstd).await?; } ExtractPath::VM(file, path) => {