From 769f8c99987e51c58c8c24e92ce7bd88c8c6b76f Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 19 Dec 2019 08:45:27 +0100 Subject: [PATCH] src/bin/proxmox-backup-manager.rs: connect to daemon to execute GC Signed-off-by: Dietmar Maurer --- src/bin/proxmox-backup-manager.rs | 117 ++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 8 deletions(-) diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index 15c2cf18..72dba8f4 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -1,10 +1,35 @@ -extern crate proxmox_backup; +use failure::*; +use serde_json::Value; -use proxmox::api::cli::*; +use proxmox::api::{api, cli::*}; + +use proxmox_backup::tools; +use proxmox_backup::config; +use proxmox_backup::api2::types::*; +use proxmox_backup::client::*; +use proxmox_backup::tools::ticket::*; +use proxmox_backup::auth_helpers::*; + + +async fn view_task_result( + client: HttpClient, + result: Value, + output_format: &str, +) -> Result<(), Error> { + let data = &result["data"]; + if output_format == "text" { + if let Some(upid) = data.as_str() { + display_task_log(client, upid, true).await?; + } + } else { + format_and_print_result(&data, &output_format); + } + + Ok(()) +} fn datastore_commands() -> CommandLineInterface { - use proxmox_backup::config; use proxmox_backup::api2; let cmd_def = CliCommandMap::new() @@ -23,20 +48,96 @@ fn datastore_commands() -> CommandLineInterface { } +#[api( + input: { + properties: { + store: { + schema: DATASTORE_SCHEMA, + }, + "output-format": { + schema: OUTPUT_FORMAT, + optional: true, + }, + } + } +)] +/// Start garbage collection for a specific datastore. +async fn start_garbage_collection(param: Value) -> Result { + + let output_format = param["output-format"].as_str().unwrap_or("text").to_owned(); + + let store = tools::required_string_param(¶m, "store")?; + + let uid = nix::unistd::Uid::current(); + + let mut client = if uid.is_root() { + let ticket = assemble_rsa_ticket(private_auth_key(), "PBS", Some("root@pam"), None)?; + HttpClient::new("localhost", "root@pam", Some(ticket))? + } else { + HttpClient::new("localhost", "root@pam", None)? + }; + + let path = format!("api2/json/admin/datastore/{}/gc", store); + + let result = client.post(&path, None).await?; + + view_task_result(client, result, &output_format).await?; + + Ok(Value::Null) +} + +#[api( + input: { + properties: { + store: { + schema: DATASTORE_SCHEMA, + }, + "output-format": { + schema: OUTPUT_FORMAT, + optional: true, + }, + } + } +)] +/// Show garbage collection status for a specific datastore. +async fn garbage_collection_status(param: Value) -> Result { + + let output_format = param["output-format"].as_str().unwrap_or("text").to_owned(); + + let store = tools::required_string_param(¶m, "store")?; + + let uid = nix::unistd::Uid::current(); + + let client = if uid.is_root() { + let ticket = assemble_rsa_ticket(private_auth_key(), "PBS", Some("root@pam"), None)?; + HttpClient::new("localhost", "root@pam", Some(ticket))? + } else { + HttpClient::new("localhost", "root@pam", None)? + }; + + let path = format!("api2/json/admin/datastore/{}/gc", store); + + let result = client.get(&path, None).await?; + let data = &result["data"]; + if output_format == "text" { + format_and_print_result(&data, "json-pretty"); + } else { + format_and_print_result(&data, &output_format); + } + + Ok(Value::Null) +} fn garbage_collection_commands() -> CommandLineInterface { - use proxmox_backup::config; - use proxmox_backup::api2; - let cmd_def = CliCommandMap::new() .insert("status", - CliCommand::new(&api2::admin::datastore::API_METHOD_GARBAGE_COLLECTION_STATUS) + CliCommand::new(&API_METHOD_GARBAGE_COLLECTION_STATUS) .arg_param(&["store"]) .completion_cb("store", config::datastore::complete_datastore_name) ) .insert("start", - CliCommand::new(&api2::admin::datastore::API_METHOD_START_GARBAGE_COLLECTION) + CliCommand::new(&API_METHOD_START_GARBAGE_COLLECTION) .arg_param(&["store"]) .completion_cb("store", config::datastore::complete_datastore_name) );