From f24fc1166bcda47dc21a3cb7ed0574bcb241daa0 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 27 Feb 2020 11:27:44 +0100 Subject: [PATCH] src/bin/proxmox-backup-client.rs - list_snapshots: use format_and_print_result_full() Depend on proxmox v0.1.14. --- Cargo.toml | 2 +- src/api2/admin/datastore.rs | 2 +- src/bin/proxmox-backup-client.rs | 56 ++++++++++++++++++-------------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 788184f3..5c6b861c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ pam = "0.7" pam-sys = "0.5" percent-encoding = "2.1" pin-utils = "0.1.0-alpha" -proxmox = { version = "0.1.13", features = [ "sortable-macro", "api-macro" ] } +proxmox = { version = "0.1.14", features = [ "sortable-macro", "api-macro" ] } #proxmox = { git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] } #proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro" ] } regex = "1.2" diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index ad94e4d8..283aca8a 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -229,7 +229,7 @@ fn delete_snapshot( }, )] /// List backup snapshots. -fn list_snapshots ( +pub fn list_snapshots ( param: Value, _info: &ApiMethod, _rpcenv: &mut dyn RpcEnvironment, diff --git a/src/bin/proxmox-backup-client.rs b/src/bin/proxmox-backup-client.rs index 866ec88a..8f8881e6 100644 --- a/src/bin/proxmox-backup-client.rs +++ b/src/bin/proxmox-backup-client.rs @@ -210,7 +210,7 @@ async fn api_datastore_list_snapshots( client: &HttpClient, store: &str, group: Option, -) -> Result, Error> { +) -> Result { let path = format!("api2/json/admin/datastore/{}/snapshots", store); @@ -222,9 +222,7 @@ async fn api_datastore_list_snapshots( let mut result = client.get(&path, Some(args)).await?; - let list: Vec = serde_json::from_value(result["data"].take())?; - - Ok(list) + Ok(result["data"].take()) } async fn api_datastore_latest_snapshot( @@ -233,7 +231,8 @@ async fn api_datastore_latest_snapshot( group: BackupGroup, ) -> Result<(String, String, DateTime), Error> { - let mut list = api_datastore_list_snapshots(client, store, Some(group.clone())).await?; + let list = api_datastore_list_snapshots(client, store, Some(group.clone())).await?; + let mut list: Vec = serde_json::from_value(list)?; if list.is_empty() { bail!("backup group {:?} does not contain any snapshots.", group.group_path()); @@ -445,34 +444,41 @@ async fn list_snapshots(param: Value) -> Result { None }; - let mut list = api_datastore_list_snapshots(&client, repo.store(), group).await?; - - list.sort_unstable_by(|a, b| a.backup_time.cmp(&b.backup_time)); + let mut data = api_datastore_list_snapshots(&client, repo.store(), group).await?; record_repository(&repo); - if output_format != "text" { - format_and_print_result(&serde_json::to_value(list)?, &output_format); - return Ok(Value::Null); - } - - for item in list { - + let render_snapshot_path = |_v: &Value, record: &Value| -> Result { + let item: SnapshotListItem = serde_json::from_value(record.to_owned())?; let snapshot = BackupDir::new(item.backup_type, item.backup_id, item.backup_time); + Ok(snapshot.relative_path().to_str().unwrap().to_owned()) + }; - let path = snapshot.relative_path().to_str().unwrap().to_owned(); - - let files = item.files.iter() + let render_files = |_v: &Value, record: &Value| -> Result { + let item: SnapshotListItem = serde_json::from_value(record.to_owned())?; + let mut files: Vec = item.files.iter() .map(|v| strip_server_file_expenstion(&v)) .collect(); - let size_str = if let Some(size) = item.size { - size.to_string() - } else { - String::from("-") - }; - println!("{} | {} | {}", path, size_str, tools::join(&files, ' ')); - } + files.sort(); + + Ok(tools::join(&files, ' ')) + }; + + let options = TableFormatOptions::new() + .noborder(false) + .noheader(false) + .sortby("backup-type", false) + .sortby("backup-id", false) + .sortby("backup-time", false) + .column(ColumnConfig::new("backup-id").renderer(render_snapshot_path).header("snapshot")) + .column(ColumnConfig::new("size")) + .column(ColumnConfig::new("files").renderer(render_files)) + ; + + let info = &proxmox_backup::api2::admin::datastore::API_RETURN_SCHEMA_LIST_SNAPSHOTS; + + format_and_print_result_full(&mut data, info, &output_format, &options); Ok(Value::Null) }