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 5E7B0BC360 for ; Thu, 28 Mar 2024 13:38:44 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8AF6CA109 for ; Thu, 28 Mar 2024 13:37:52 +0100 (CET) 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 for ; Thu, 28 Mar 2024 13:37:50 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 487F5429A5 for ; Thu, 28 Mar 2024 13:37:50 +0100 (CET) From: Christian Ebner To: pbs-devel@lists.proxmox.com Date: Thu, 28 Mar 2024 13:37:02 +0100 Message-Id: <20240328123707.336951-54-c.ebner@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240328123707.336951-1-c.ebner@proxmox.com> References: <20240328123707.336951-1-c.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.030 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy 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 Subject: [pbs-devel] [PATCH v3 proxmox-backup 53/58] client: pxar: opt encode cli exclude patterns as CliParams X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Mar 2024 12:38:44 -0000 Instead of encoding the pxar cli exclude patterns as regular file within the root directory of an archive, store this information directly after the pxar format version entry in a new pxar cli params entry. This behaviour is however currently exclusive to the archives written with format version 2 in a split metadata and payload case. This is a breaking change for the encoding of new cli exclude parameters. Any new exclude parameter will not be added to an already present .pxar-cliexclude file, and it will not be created if not present. Signed-off-by: Christian Ebner --- changes since version 2: - not present in previous version pbs-client/src/pxar/create.rs | 25 +++++++++++++++-------- pbs-client/src/pxar/extract.rs | 3 ++- pbs-client/src/pxar/tools.rs | 6 ++++++ src/tape/file_formats/snapshot_archive.rs | 8 ++++++-- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/pbs-client/src/pxar/create.rs b/pbs-client/src/pxar/create.rs index 461509c39..5f2270fe8 100644 --- a/pbs-client/src/pxar/create.rs +++ b/pbs-client/src/pxar/create.rs @@ -343,13 +343,6 @@ where set.insert(stat.st_dev); } - let mut encoder = Encoder::new( - &mut writers.writer, - &metadata, - writers.payload_writer.as_mut(), - ) - .await?; - let mut patterns = options.patterns; if options.skip_lost_and_found { @@ -359,6 +352,14 @@ where MatchType::Exclude, )?); } + + let cli_params_content = generate_pxar_excludes_cli(&patterns[..]); + let cli_params = if options.previous_ref.is_some() { + Some(cli_params_content.as_slice()) + } else { + None + }; + let (previous_payload_index, previous_metadata_accessor) = if let Some(refs) = options.previous_ref { ( @@ -369,6 +370,14 @@ where (None, None) }; + let mut encoder = Encoder::new( + &mut writers.writer, + &metadata, + writers.payload_writer.as_mut(), + cli_params, + ) + .await?; + let mut archiver = Archiver { feature_flags, fs_feature_flags, @@ -454,7 +463,7 @@ impl Archiver { let mut file_list = self.generate_directory_file_list(&mut dir, is_root)?; - if is_root && old_patterns_count > 0 { + if is_root && old_patterns_count > 0 && previous_metadata_accessor.is_none() { file_list.push(FileListEntry { name: CString::new(".pxarexclude-cli").unwrap(), path: PathBuf::new(), diff --git a/pbs-client/src/pxar/extract.rs b/pbs-client/src/pxar/extract.rs index 56f8d7adc..46ff8fc80 100644 --- a/pbs-client/src/pxar/extract.rs +++ b/pbs-client/src/pxar/extract.rs @@ -267,7 +267,8 @@ where }; let extract_res = match (did_match, entry.kind()) { - (_, EntryKind::Version(_)) => Ok(()), + (_, EntryKind::Version(_version)) => Ok(()), + (_, EntryKind::CliParams(_data)) => Ok(()), (_, EntryKind::Directory) => { self.callback(entry.path()); diff --git a/pbs-client/src/pxar/tools.rs b/pbs-client/src/pxar/tools.rs index 4e9bd5b60..478acdc0f 100644 --- a/pbs-client/src/pxar/tools.rs +++ b/pbs-client/src/pxar/tools.rs @@ -173,6 +173,12 @@ pub fn format_multi_line_entry(entry: &Entry) -> String { let (size, link, type_name, payload_offset) = match entry.kind() { EntryKind::Version(version) => (format!("{version:?}"), String::new(), "version", None), + EntryKind::CliParams(params) => ( + "0".to_string(), + format!(" -> {:?}", params.as_os_str()), + "symlink", + None, + ), EntryKind::File { size, payload_offset, diff --git a/src/tape/file_formats/snapshot_archive.rs b/src/tape/file_formats/snapshot_archive.rs index 43d1cf9c3..7e052919b 100644 --- a/src/tape/file_formats/snapshot_archive.rs +++ b/src/tape/file_formats/snapshot_archive.rs @@ -58,8 +58,12 @@ pub fn tape_write_snapshot_archive<'a>( )); } - let mut encoder = - pxar::encoder::sync::Encoder::new(PxarTapeWriter::new(writer), &root_metadata, None)?; + let mut encoder = pxar::encoder::sync::Encoder::new( + PxarTapeWriter::new(writer), + &root_metadata, + None, + None, + )?; for filename in file_list.iter() { let mut file = snapshot_reader.open_file(filename).map_err(|err| { -- 2.39.2