use tokio::sync::mpsc;
const ENV_VAR_PBS_FINGERPRINT: &str = "PBS_FINGERPRINT";
+const ENV_VAR_PBS_PASSWORD: &str = "PBS_PASSWORD";
proxmox::const_regex! {
BACKUPSPEC_REGEX = r"^([a-zA-Z0-9_-]+\.(?:pxar|img|conf|log)):(.+)$";
let fingerprint = std::env::var(ENV_VAR_PBS_FINGERPRINT).ok();
+ use std::env::VarError::*;
+ let password = match std::env::var(ENV_VAR_PBS_PASSWORD) {
+ Ok(p) => Some(p),
+ Err(NotUnicode(_)) => bail!(format!("{} contains bad characters", ENV_VAR_PBS_PASSWORD)),
+ Err(NotPresent) => None,
+ };
+
let options = HttpClientOptions::new()
.prefix(Some("proxmox-backup".to_string()))
- .password_env(Some("PBS_PASSWORD".to_string()))
+ .password(password)
.interactive(true)
.fingerprint(fingerprint)
.fingerprint_cache(true)
async fn try_get(repo: &BackupRepository, url: &str) -> Value {
let fingerprint = std::env::var(ENV_VAR_PBS_FINGERPRINT).ok();
+ let password = std::env::var(ENV_VAR_PBS_PASSWORD).ok();
let options = HttpClientOptions::new()
.prefix(Some("proxmox-backup".to_string()))
- .password_env(Some("PBS_PASSWORD".to_string()))
+ .password(password)
.interactive(false)
.fingerprint(fingerprint)
.fingerprint_cache(true)
pub struct HttpClientOptions {
prefix: Option<String>,
password: Option<String>,
- password_env: Option<String>,
fingerprint: Option<String>,
interactive: bool,
ticket_cache: bool,
Self {
prefix: None,
password: None,
- password_env: None,
fingerprint: None,
interactive: false,
ticket_cache: false,
self
}
- pub fn password_env(mut self, password_env: Option<String>) -> Self {
- self.password_env = password_env;
- self
- }
-
pub fn fingerprint(mut self, fingerprint: Option<String>) -> Self {
self.fingerprint = fingerprint;
self
if let Some((ticket, _token)) = ticket_info {
ticket
} else {
- Self::get_password(&username, options.interactive, options.password_env.clone())?
+ Self::get_password(&username, options.interactive)?
}
};
(*self.fingerprint.lock().unwrap()).clone()
}
- fn get_password(username: &str, interactive: bool, password_env: Option<String>) -> Result<String, Error> {
- if let Some(password_env) = password_env {
- use std::env::VarError::*;
- match std::env::var(&password_env) {
- Ok(p) => return Ok(p),
- Err(NotUnicode(_)) => bail!(format!("{} contains bad characters", password_env)),
- Err(NotPresent) => {
- // Try another method
- }
- }
- }
-
+ fn get_password(username: &str, interactive: bool) -> Result<String, Error> {
// If we're on a TTY, query the user for a password
if interactive && tty::stdin_isatty() {
let msg = format!("Password for \"{}\": ", username);