From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 08C591FF13C for ; Thu, 02 Apr 2026 00:53:04 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id BFC6E2B30; Thu, 2 Apr 2026 00:53:30 +0200 (CEST) From: Thomas Lamprecht To: pbs-devel@lists.proxmox.com Subject: [PATCH v3 5/5] fix #5340: client: repository: add PBS_NAMESPACE environment variable Date: Thu, 2 Apr 2026 00:49:01 +0200 Message-ID: <20260401225305.4069441-6-t.lamprecht@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260401225305.4069441-1-t.lamprecht@proxmox.com> References: <20260401225305.4069441-1-t.lamprecht@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1775083948108 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.499 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 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 1 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 1 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 1 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. 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: CR6XXOVIWOYIA2ZCDK6W75OSBESWPBJN X-Message-ID-Hash: CR6XXOVIWOYIA2ZCDK6W75OSBESWPBJN X-MailFrom: t.lamprecht@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: Add PBS_NAMESPACE as a fallback when --ns is not given on the CLI, addressing the request in bug #5340. The env var is supported uniformly across all client tools (proxmox-backup-client, proxmox-file-restore, proxmox-backup-debug). Like the other PBS_* atom env vars, it provides a default that can be overridden by the corresponding CLI option. Signed-off-by: Thomas Lamprecht --- no real changes since v2, only adapt to context changes. docs/backup-client.rst | 3 +++ pbs-client/src/tools/mod.rs | 2 ++ proxmox-backup-client/src/main.rs | 13 +++++++++---- proxmox-file-restore/src/main.rs | 26 ++++++++++++++++---------- src/bin/proxmox_backup_debug/diff.rs | 13 ++++++++----- 5 files changed, 38 insertions(+), 19 deletions(-) diff --git a/docs/backup-client.rst b/docs/backup-client.rst index 1d464a007..e2a05d4fc 100644 --- a/docs/backup-client.rst +++ b/docs/backup-client.rst @@ -131,6 +131,9 @@ Environment Variables Authentication identity (``user@realm`` or ``user@realm!tokenname``). Defaults to ``root@pam`` if unset. +``PBS_NAMESPACE`` + Backup namespace. Used as a fallback when ``--ns`` is not given. + ``PBS_PASSWORD`` When set, this value is used as the password for the backup server. You can also set this to an API token secret. diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs index 32c55ee1b..634a0d4e5 100644 --- a/pbs-client/src/tools/mod.rs +++ b/pbs-client/src/tools/mod.rs @@ -36,6 +36,7 @@ const ENV_VAR_PBS_SERVER: &str = "PBS_SERVER"; const ENV_VAR_PBS_PORT: &str = "PBS_PORT"; const ENV_VAR_PBS_DATASTORE: &str = "PBS_DATASTORE"; const ENV_VAR_PBS_AUTH_ID: &str = "PBS_AUTH_ID"; +pub const ENV_VAR_PBS_NAMESPACE: &str = "PBS_NAMESPACE"; /// Directory with system [credential]s. See systemd-creds(1). /// @@ -841,6 +842,7 @@ mod tests { ENV_VAR_PBS_PORT, ENV_VAR_PBS_DATASTORE, ENV_VAR_PBS_AUTH_ID, + ENV_VAR_PBS_NAMESPACE, ENV_VAR_CREDENTIALS_DIRECTORY, ]; diff --git a/proxmox-backup-client/src/main.rs b/proxmox-backup-client/src/main.rs index b7376e58c..cd7291428 100644 --- a/proxmox-backup-client/src/main.rs +++ b/proxmox-backup-client/src/main.rs @@ -330,11 +330,16 @@ async fn backup_image>( } pub fn optional_ns_param(param: &Value) -> Result { - Ok(match param.get("ns") { - Some(Value::String(ns)) => ns.parse()?, + match param.get("ns") { + Some(Value::String(ns)) => return ns.parse().map_err(Error::from), Some(_) => bail!("invalid namespace parameter"), - None => BackupNamespace::root(), - }) + None => {} + } + // Fall back to PBS_NAMESPACE environment variable. + if let Ok(ns) = std::env::var(pbs_client::tools::ENV_VAR_PBS_NAMESPACE) { + return ns.parse().map_err(Error::from); + } + Ok(BackupNamespace::root()) } #[api( diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs index 0de56a7d6..f7885c874 100644 --- a/proxmox-file-restore/src/main.rs +++ b/proxmox-file-restore/src/main.rs @@ -274,11 +274,14 @@ async fn list( param: Value, ) -> Result<(), Error> { let repo = extract_repository_from_value(¶m)?; - let ns: BackupNamespace = param["ns"] - .as_str() - .map(|s| s.parse()) - .transpose()? - .unwrap_or_default(); + let ns: BackupNamespace = match param["ns"].as_str() { + Some(s) => s.parse()?, + None => std::env::var(pbs_client::tools::ENV_VAR_PBS_NAMESPACE) + .ok() + .map(|s| s.parse()) + .transpose()? + .unwrap_or_default(), + }; let snapshot: BackupDir = snapshot.parse()?; let path = parse_path(path, base64)?; @@ -429,11 +432,14 @@ async fn extract( param: Value, ) -> Result<(), Error> { let repo = extract_repository_from_value(¶m)?; - let namespace: BackupNamespace = param["ns"] - .as_str() - .map(|s| s.parse()) - .transpose()? - .unwrap_or_default(); + let namespace: BackupNamespace = match param["ns"].as_str() { + Some(s) => s.parse()?, + None => std::env::var(pbs_client::tools::ENV_VAR_PBS_NAMESPACE) + .ok() + .map(|s| s.parse()) + .transpose()? + .unwrap_or_default(), + }; let snapshot: BackupDir = snapshot.parse()?; let orig_path = path; let path = parse_path(orig_path.clone(), base64)?; diff --git a/src/bin/proxmox_backup_debug/diff.rs b/src/bin/proxmox_backup_debug/diff.rs index 88b4199f7..d42768aa7 100644 --- a/src/bin/proxmox_backup_debug/diff.rs +++ b/src/bin/proxmox_backup_debug/diff.rs @@ -108,11 +108,14 @@ async fn diff_archive_cmd( let repo = extract_repository_from_value(¶m)?; let color = color.unwrap_or_default(); - let namespace: BackupNamespace = param["ns"] - .as_str() - .map(|s| s.parse()) - .transpose()? - .unwrap_or_default(); + let namespace: BackupNamespace = match param["ns"].as_str() { + Some(s) => s.parse()?, + None => std::env::var(pbs_client::tools::ENV_VAR_PBS_NAMESPACE) + .ok() + .map(|s| s.parse()) + .transpose()? + .unwrap_or_default(), + }; let crypto = crypto_parameters(¶m)?; -- 2.47.3