diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index 31d459d5..4df7de16 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -43,7 +43,7 @@ fn record_repository(repo: &BackupRepository) { _ => return, }; - let mut data = tools::file_get_json(&path).unwrap_or(json!({})); + let mut data = tools::file_get_json(&path, None).unwrap_or(json!({})); let repo = repo.to_string(); @@ -93,7 +93,7 @@ fn complete_repository(_arg: &str, _param: &HashMap) -> Vec return result, }; - let data = tools::file_get_json(&path).unwrap_or(json!({})); + let data = tools::file_get_json(&path, None).unwrap_or(json!({})); if let Some(map) = data.as_object() { for (repo, _count) in map { diff --git a/src/client/http_client.rs b/src/client/http_client.rs index a9813223..e13a0ea3 100644 --- a/src/client/http_client.rs +++ b/src/client/http_client.rs @@ -33,7 +33,7 @@ fn store_ticket_info(server: &str, username: &str, ticket: &str, token: &str) -> let mode = nix::sys::stat::Mode::from_bits_truncate(0o0600); - let mut data = tools::file_get_json(&path).unwrap_or(json!({})); + let mut data = tools::file_get_json(&path, Some(json!({})))?; let now = Utc::now().timestamp(); @@ -72,7 +72,10 @@ fn load_ticket_info(server: &str, username: &str) -> Option<(String, String)> { _ => return None, }; - let data = tools::file_get_json(&path).unwrap_or(json!({})); + let data = match tools::file_get_json(&path, None) { + Ok(v) => v, + _ => return None, + }; let now = Utc::now().timestamp(); diff --git a/src/tools.rs b/src/tools.rs index 90499644..f63102cb 100644 --- a/src/tools.rs +++ b/src/tools.rs @@ -126,17 +126,27 @@ pub fn file_get_contents>(path: P) -> Result, Error> { }).map_err(|err| format_err!("unable to read {:?} - {}", path, err)) } -pub fn file_get_json>(path: P) -> Result { +pub fn file_get_json>(path: P, default: Option) -> Result { let path = path.as_ref(); - let raw = file_get_contents(path)?; + let raw = match std::fs::read(path) { + Ok(v) => v, + Err(err) => { + if err.kind() == std::io::ErrorKind::NotFound { + if let Some(v) = default { + return Ok(v); + } + } + bail!("unable to read json {:?} - {}", path, err); + } + }; try_block!({ let data = String::from_utf8(raw)?; let json = serde_json::from_str(&data)?; Ok(json) - }).map_err(|err: Error| format_err!("unable to read json from {:?} - {}", path, err)) + }).map_err(|err: Error| format_err!("unable to parse json from {:?} - {}", path, err)) } /// Atomically write a file. We first create a temporary file, which