From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 2C65A1FF13E for ; Wed, 01 Jul 2026 16:05:16 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 3BB5721457; Wed, 01 Jul 2026 16:05:07 +0200 (CEST) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox-backup v3 12/15] tape: use proxmox-product-config helper for user lookup Date: Wed, 1 Jul 2026 16:04:09 +0200 Message-ID: <20260701140412.200920-13-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260701140412.200920-1-c.ebner@proxmox.com> References: <20260701140412.200920-1-c.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1782914662641 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.037 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: ESXKYUCIJJL4ENV4JGSPZH67QX4RCT2F X-Message-ID-Hash: ESXKYUCIJJL4ENV4JGSPZH67QX4RCT2F X-MailFrom: c.ebner@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: By this the globally cached user information is used instead of doing a lookup to be consistent with the rest of the codebase. Tests are adapted to call the init exactly once by an init callback for a LazyLock. This is thread safe, so tests can be run in parallel without interference. Signed-off-by: Christian Ebner --- src/tape/media_catalog.rs | 14 ++++---------- src/tape/mod.rs | 8 ++++---- src/tape/test/alloc_writable_media.rs | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/tape/media_catalog.rs b/src/tape/media_catalog.rs index 41c1dcad0..4fcf45dc3 100644 --- a/src/tape/media_catalog.rs +++ b/src/tape/media_catalog.rs @@ -10,7 +10,7 @@ use endian_trait::Endian; use proxmox_sys::fs::read_subdir; use proxmox_io::{ReadExt, WriteExt}; -use proxmox_sys::fs::{CreateOptions, create_path, fchown}; +use proxmox_sys::fs::{create_path, fchown}; use proxmox_uuid::Uuid; use pbs_api_types::{BackupDir, BackupNamespace, parse_ns_and_snapshot, print_ns_and_snapshot}; @@ -168,13 +168,7 @@ impl MediaCatalog { } fn create_basedir>(base_path: P) -> Result<(), Error> { - let backup_user = pbs_config::backup_user()?; - let mode = nix::sys::stat::Mode::from_bits_truncate(0o0640); - let opts = CreateOptions::new() - .perm(mode) - .owner(backup_user.uid) - .group(backup_user.gid); - + let opts = proxmox_product_config::default_create_options(); create_path(base_path, None, Some(opts)) .map_err(|err: Error| format_err!("unable to create media catalog dir - {}", err))?; Ok(()) @@ -200,7 +194,7 @@ impl MediaCatalog { .create(create) .open(&path)?; - let backup_user = pbs_config::backup_user()?; + let backup_user = proxmox_product_config::get_api_user(); fchown( file.as_raw_fd(), Some(backup_user.uid), @@ -261,7 +255,7 @@ impl MediaCatalog { return Ok(file); } - let backup_user = pbs_config::backup_user()?; + let backup_user = proxmox_product_config::get_api_user(); fchown( file.as_raw_fd(), Some(backup_user.uid), diff --git a/src/tape/mod.rs b/src/tape/mod.rs index eba692035..c1f04595f 100644 --- a/src/tape/mod.rs +++ b/src/tape/mod.rs @@ -57,7 +57,7 @@ pub const COMMIT_BLOCK_SIZE: usize = 128 * 1024 * 1024 * 1024; // 128 GiB /// Create tape status dir with correct permission pub fn create_tape_status_dir() -> Result<(), Error> { - let backup_user = pbs_config::backup_user()?; + let backup_user = proxmox_product_config::get_api_user(); let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750); let options = CreateOptions::new() .perm(mode) @@ -76,7 +76,7 @@ pub fn create_tape_status_dir() -> Result<(), Error> { /// Create drive lock dir with correct permission pub fn create_drive_lock_dir() -> Result<(), Error> { - let backup_user = pbs_config::backup_user()?; + let backup_user = proxmox_product_config::get_api_user(); let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750); let options = CreateOptions::new() .perm(mode) @@ -95,7 +95,7 @@ pub fn create_drive_lock_dir() -> Result<(), Error> { /// Create drive state dir with correct permission pub fn create_drive_state_dir() -> Result<(), Error> { - let backup_user = pbs_config::backup_user()?; + let backup_user = proxmox_product_config::get_api_user(); let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750); let options = CreateOptions::new() .perm(mode) @@ -114,7 +114,7 @@ pub fn create_drive_state_dir() -> Result<(), Error> { /// Create changer state cache dir with correct permission pub fn create_changer_state_dir() -> Result<(), Error> { - let backup_user = pbs_config::backup_user()?; + let backup_user = proxmox_product_config::get_api_user(); let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750); let options = CreateOptions::new() .perm(mode) diff --git a/src/tape/test/alloc_writable_media.rs b/src/tape/test/alloc_writable_media.rs index ff9a63489..fc1bb88ce 100644 --- a/src/tape/test/alloc_writable_media.rs +++ b/src/tape/test/alloc_writable_media.rs @@ -4,11 +4,20 @@ use anyhow::Error; use std::path::PathBuf; +use std::sync::LazyLock; use pbs_api_types::{MediaSetPolicy, RetentionPolicy}; use crate::tape::{Inventory, MediaPool}; +static PROXMOX_PRODUCT_CONFIG_INIT_FOR_TESTS: LazyLock = LazyLock::new(|| { + proxmox_product_config::init( + pbs_config::backup_user().unwrap(), + pbs_config::priv_user().unwrap(), + ); + true +}); + fn create_testdir(name: &str) -> Result { let mut testdir: PathBuf = String::from("./target/testout").into(); testdir.push(std::module_path!()); @@ -22,6 +31,8 @@ fn create_testdir(name: &str) -> Result { #[test] fn test_alloc_writable_media_1() -> Result<(), Error> { + assert_eq!(LazyLock::force(&PROXMOX_PRODUCT_CONFIG_INIT_FOR_TESTS), &true); + let testdir = create_testdir("test_alloc_writable_media_1")?; let mut ctime = 0; @@ -48,6 +59,8 @@ fn test_alloc_writable_media_1() -> Result<(), Error> { #[test] fn test_alloc_writable_media_2() -> Result<(), Error> { + assert_eq!(LazyLock::force(&PROXMOX_PRODUCT_CONFIG_INIT_FOR_TESTS), &true); + let testdir = create_testdir("test_alloc_writable_media_2")?; let mut inventory = Inventory::load(&testdir)?; @@ -85,6 +98,8 @@ fn test_alloc_writable_media_2() -> Result<(), Error> { #[test] fn test_alloc_writable_media_3() -> Result<(), Error> { + assert_eq!(LazyLock::force(&PROXMOX_PRODUCT_CONFIG_INIT_FOR_TESTS), &true); + let testdir = create_testdir("test_alloc_writable_media_3")?; let mut inventory = Inventory::load(&testdir)?; @@ -133,6 +148,8 @@ fn test_alloc_writable_media_3() -> Result<(), Error> { #[test] fn test_alloc_writable_media_4() -> Result<(), Error> { + assert_eq!(LazyLock::force(&PROXMOX_PRODUCT_CONFIG_INIT_FOR_TESTS), &true); + let testdir = create_testdir("test_alloc_writable_media_4")?; let mut inventory = Inventory::load(&testdir)?; -- 2.47.3