From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 402259564 for ; Tue, 26 Apr 2022 12:14:06 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3AEA019EA4 for ; Tue, 26 Apr 2022 12:14:06 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 698F219E71 for ; Tue, 26 Apr 2022 12:14:03 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 3E2FB42BA6 for ; Tue, 26 Apr 2022 12:14:03 +0200 (CEST) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Tue, 26 Apr 2022 12:13:57 +0200 Message-Id: <20220426101401.3216096-5-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220426101401.3216096-1-d.csapak@proxmox.com> References: <20220426101401.3216096-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.127 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [main.rs] Subject: [pve-devel] [PATCH proxmox-backup v2 4/5] file-restore: factor out 'list_files' X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Apr 2022 10:14:06 -0000 we'll want to reuse that in a later patch Signed-off-by: Dominik Csapak --- proxmox-file-restore/src/main.rs | 156 +++++++++++++++++-------------- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs index ab50c636..4b327f6b 100644 --- a/proxmox-file-restore/src/main.rs +++ b/proxmox-file-restore/src/main.rs @@ -26,7 +26,7 @@ use pbs_client::tools::{ }, REPO_URL_SCHEMA, }; -use pbs_client::{BackupReader, RemoteChunkReader}; +use pbs_client::{BackupReader, BackupRepository, RemoteChunkReader}; use pbs_config::key_config::decrypt_key; use pbs_datastore::catalog::{ArchiveEntry, CatalogReader, DirEntryAttribute}; use pbs_datastore::dynamic_index::{BufferedDynamicReader, LocalDynamicReadAt}; @@ -92,6 +92,84 @@ fn keyfile_path(param: &Value) -> Option { None } +async fn list_files( + repo: BackupRepository, + snapshot: BackupDir, + path: ExtractPath, + crypt_config: Option>, + keyfile: Option, + driver: Option, +) -> Result, Error> { + let client = connect(&repo)?; + let client = BackupReader::start( + client, + crypt_config.clone(), + repo.store(), + snapshot.group.ty, + &snapshot.group.id, + snapshot.time, + true, + ) + .await?; + + let (manifest, _) = client.download_manifest().await?; + manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?; + + match path { + ExtractPath::ListArchives => { + let mut entries = vec![]; + for file in manifest.files() { + if !file.filename.ends_with(".pxar.didx") && !file.filename.ends_with(".img.fidx") { + continue; + } + let path = format!("/{}", file.filename); + let attr = if file.filename.ends_with(".pxar.didx") { + // a pxar file is a file archive, so it's root is also a directory root + Some(&DirEntryAttribute::Directory { start: 0 }) + } else { + None + }; + entries.push(ArchiveEntry::new_with_size( + path.as_bytes(), + attr, + Some(file.size), + )); + } + + Ok(entries) + } + ExtractPath::Pxar(file, mut path) => { + let index = client + .download_dynamic_index(&manifest, CATALOG_NAME) + .await?; + let most_used = index.find_most_used_chunks(8); + let file_info = manifest.lookup_file_info(CATALOG_NAME)?; + let chunk_reader = RemoteChunkReader::new( + client.clone(), + crypt_config, + file_info.chunk_crypt_mode(), + most_used, + ); + let reader = BufferedDynamicReader::new(index, chunk_reader); + let mut catalog_reader = CatalogReader::new(reader); + + let mut fullpath = file.into_bytes(); + fullpath.append(&mut path); + + catalog_reader.list_dir_contents(&fullpath) + } + ExtractPath::VM(file, path) => { + let details = SnapRestoreDetails { + manifest, + repo, + snapshot, + keyfile, + }; + data_list(driver, details, file, path).await + } + } +} + #[api( input: { properties: { @@ -163,78 +241,12 @@ async fn list(snapshot: String, path: String, base64: bool, param: Value) -> Res } }; - let client = connect(&repo)?; - let client = BackupReader::start( - client, - crypt_config.clone(), - repo.store(), - snapshot.group.ty, - &snapshot.group.id, - snapshot.time, - true, - ) - .await?; - - let (manifest, _) = client.download_manifest().await?; - manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?; - - let result = match path { - ExtractPath::ListArchives => { - let mut entries = vec![]; - for file in manifest.files() { - if !file.filename.ends_with(".pxar.didx") && !file.filename.ends_with(".img.fidx") { - continue; - } - let path = format!("/{}", file.filename); - let attr = if file.filename.ends_with(".pxar.didx") { - // a pxar file is a file archive, so it's root is also a directory root - Some(&DirEntryAttribute::Directory { start: 0 }) - } else { - None - }; - entries.push(ArchiveEntry::new_with_size( - path.as_bytes(), - attr, - Some(file.size), - )); - } - - Ok(entries) - } - ExtractPath::Pxar(file, mut path) => { - let index = client - .download_dynamic_index(&manifest, CATALOG_NAME) - .await?; - let most_used = index.find_most_used_chunks(8); - let file_info = manifest.lookup_file_info(CATALOG_NAME)?; - let chunk_reader = RemoteChunkReader::new( - client.clone(), - crypt_config, - file_info.chunk_crypt_mode(), - most_used, - ); - let reader = BufferedDynamicReader::new(index, chunk_reader); - let mut catalog_reader = CatalogReader::new(reader); - - let mut fullpath = file.into_bytes(); - fullpath.append(&mut path); + let driver: Option = match param.get("driver") { + Some(drv) => Some(serde::Deserialize::deserialize(drv)?), + None => None, + }; - catalog_reader.list_dir_contents(&fullpath) - } - ExtractPath::VM(file, path) => { - let details = SnapRestoreDetails { - manifest, - repo, - snapshot, - keyfile, - }; - let driver: Option = match param.get("driver") { - Some(drv) => Some(serde::Deserialize::deserialize(drv)?), - None => None, - }; - data_list(driver, details, file, path).await - } - }?; + let result = list_files(repo, snapshot, path, crypt_config, keyfile, driver).await?; let options = default_table_format_options() .sortby("type", false) -- 2.30.2