From: Thomas Lamprecht <t.lamprecht@proxmox.com>
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 [thread overview]
Message-ID: <20260330182352.2346420-6-t.lamprecht@proxmox.com> (raw)
In-Reply-To: <20260330182352.2346420-1-t.lamprecht@proxmox.com>
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 <t.lamprecht@proxmox.com>
---
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::<Authid>().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<P: AsRef<Path>>(
}
pub fn optional_ns_param(param: &Value) -> Result<BackupNamespace, Error> {
- 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
next prev parent reply other threads:[~2026-03-30 18:23 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-30 18:20 [PATCH v2 0/5] client: repository: add individual component parameters Thomas Lamprecht
2026-03-30 18:20 ` [PATCH v2 1/5] client: repository: add tests for BackupRepository parsing Thomas Lamprecht
2026-03-30 18:20 ` [PATCH v2 2/5] client: repository: add individual component parameters Thomas Lamprecht
2026-03-31 8:55 ` Thomas Lamprecht
2026-03-30 18:20 ` [PATCH v2 3/5] client: migrate commands to flattened repository args Thomas Lamprecht
2026-03-30 18:20 ` [PATCH v2 4/5] docs: document repository component options and env vars Thomas Lamprecht
2026-03-30 18:20 ` Thomas Lamprecht [this message]
2026-04-01 22:56 ` superseded: [PATCH v2 0/5] client: repository: add individual component parameters Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260330182352.2346420-6-t.lamprecht@proxmox.com \
--to=t.lamprecht@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.