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 B5CA71FF141 for ; Mon, 30 Mar 2026 20:23:47 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 307106405; Mon, 30 Mar 2026 20:24:10 +0200 (CEST) From: Thomas Lamprecht To: pbs-devel@lists.proxmox.com Subject: [PATCH v2 5/5] fix #5340: client: repository: add PBS_NAMESPACE environment variable Date: Mon, 30 Mar 2026 20:20:41 +0200 Message-ID: <20260330182352.2346420-6-t.lamprecht@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260330182352.2346420-1-t.lamprecht@proxmox.com> References: <20260330182352.2346420-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: 1774894989608 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.507 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: ORWUW57TVWJNRFVOOHQBVRK5RQJ5ITUZ X-Message-ID-Hash: ORWUW57TVWJNRFVOOHQBVRK5RQJ5ITUZ 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 --- new in v2, addresses bug #5340 that Fabian pointed out. docs/backup-client.rst | 3 +++ pbs-client/src/tools/mod.rs | 6 +++++- 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, 41 insertions(+), 20 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 859946079..3e8285cd9 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). /// @@ -260,7 +261,9 @@ fn args_from_env() -> BackupRepositoryArgs { auth_id: std::env::var(ENV_VAR_PBS_AUTH_ID) .ok() .and_then(|s| s.parse::().ok()), - ns: None, + ns: std::env::var(ENV_VAR_PBS_NAMESPACE) + .ok() + .and_then(|s| s.parse().ok()), } } @@ -880,6 +883,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 cdcf99f8c..33a8c4040 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 64de94b42..b188b4cfe 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 53d0efd10..50329dd3d 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