From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 89EE968C4A for ; Thu, 22 Jul 2021 16:36:22 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 9CEF61301A for ; Thu, 22 Jul 2021 16:35:42 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 352F71300F for ; Thu, 22 Jul 2021 16:35:39 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 0CD13425CD for ; Thu, 22 Jul 2021 16:35:39 +0200 (CEST) From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= To: pbs-devel@lists.proxmox.com Date: Thu, 22 Jul 2021 16:35:08 +0200 Message-Id: <20210722143510.238967-6-f.gruenbichler@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210722143510.238967-1-f.gruenbichler@proxmox.com> References: <20210722143510.238967-1-f.gruenbichler@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.452 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH proxmox-backup 5/7] manager: extend sync/pull completion X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Jul 2021 14:36:22 -0000 complete groups by scanning the remote store if available, and query the sync job config if remote or remote-store is not given on the current command-line (e.g., when updating a job config). unfortunately groups already given on the current command line are not passed to the completion helper, so we can't filter those out.. Signed-off-by: Fabian Grünbichler --- src/bin/proxmox-backup-manager.rs | 91 ++++++++++++++++++++++---- src/bin/proxmox_backup_manager/sync.rs | 2 + 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index 6844a1ab..1e257886 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::io::{self, Write}; -use anyhow::{format_err, Error}; +use anyhow::Error; use serde_json::{json, Value}; use proxmox::api::{api, cli::*, RpcEnvironment}; @@ -10,7 +10,7 @@ use pbs_client::{connect_to_localhost, display_task_log, view_task_result}; use pbs_tools::percent_encoding::percent_encode_component; use pbs_tools::json::required_string_param; -use proxmox_backup::config; +use proxmox_backup::config::{self, sync, sync::SyncJobConfig}; use proxmox_backup::api2::{self, types::* }; use proxmox_backup::server::wait_for_local_worker; @@ -396,6 +396,7 @@ fn main() { .completion_cb("local-store", config::datastore::complete_datastore_name) .completion_cb("remote", config::remote::complete_remote_name) .completion_cb("remote-store", complete_remote_datastore_name) + .completion_cb("groups", complete_remote_datastore_group) ) .insert( "verify", @@ -418,24 +419,90 @@ fn main() { pbs_runtime::main(run_async_cli_command(cmd_def, rpcenv)); } +fn get_sync_job(id: &String) -> Result { + let (config, _digest) = sync::config()?; + + config.lookup("sync", id) +} + +fn get_remote(param: &HashMap) -> Option { + param + .get("remote") + .map(|r| r.to_owned()) + .or_else(|| { + if let Some(id) = param.get("id") { + if let Ok(job) = get_sync_job(id) { + return Some(job.remote.clone()); + } + } + None + }) +} + +fn get_remote_store(param: &HashMap) -> Option<(String, String)> { + let mut job: Option = None; + + let remote = param + .get("remote") + .map(|r| r.to_owned()) + .or_else(|| { + if let Some(id) = param.get("id") { + job = get_sync_job(id).ok(); + if let Some(ref job) = job { + return Some(job.remote.clone()); + } + } + None + }); + + if let Some(remote) = remote { + let store = param + .get("remote-store") + .map(|r| r.to_owned()) + .or_else(|| job.map(|job| job.remote_store.clone())); + + if let Some(store) = store { + return Some((remote, store)) + } + } + + None +} + // shell completion helper pub fn complete_remote_datastore_name(_arg: &str, param: &HashMap) -> Vec { let mut list = Vec::new(); - let _ = proxmox::try_block!({ - let remote = param.get("remote").ok_or_else(|| format_err!("no remote"))?; + if let Some(remote) = get_remote(param) { + if let Ok(data) = pbs_runtime::block_on(async move { + crate::api2::config::remote::scan_remote_datastores(remote).await + }) { - let data = pbs_runtime::block_on(async move { - crate::api2::config::remote::scan_remote_datastores(remote.clone()).await - })?; - - for item in data { - list.push(item.store); + for item in data { + list.push(item.store); + } } + } + + list +} + +// shell completion helper +pub fn complete_remote_datastore_group(_arg: &str, param: &HashMap) -> Vec { + + let mut list = Vec::new(); + + if let Some((remote, remote_store)) = get_remote_store(param) { + if let Ok(data) = pbs_runtime::block_on(async move { + crate::api2::config::remote::scan_remote_groups(remote.clone(), remote_store.clone()).await + }) { - Ok(()) - }).map_err(|_err: Error| { /* ignore */ }); + for item in data { + list.push(format!("{}/{}", item.backup_type, item.backup_id)); + } + } + } list } diff --git a/src/bin/proxmox_backup_manager/sync.rs b/src/bin/proxmox_backup_manager/sync.rs index f05f0c8d..0c9bac49 100644 --- a/src/bin/proxmox_backup_manager/sync.rs +++ b/src/bin/proxmox_backup_manager/sync.rs @@ -87,6 +87,7 @@ pub fn sync_job_commands() -> CommandLineInterface { .completion_cb("store", config::datastore::complete_datastore_name) .completion_cb("remote", config::remote::complete_remote_name) .completion_cb("remote-store", crate::complete_remote_datastore_name) + .completion_cb("groups", crate::complete_remote_datastore_group) ) .insert("update", CliCommand::new(&api2::config::sync::API_METHOD_UPDATE_SYNC_JOB) @@ -95,6 +96,7 @@ pub fn sync_job_commands() -> CommandLineInterface { .completion_cb("schedule", config::datastore::complete_calendar_event) .completion_cb("store", config::datastore::complete_datastore_name) .completion_cb("remote-store", crate::complete_remote_datastore_name) + .completion_cb("groups", crate::complete_remote_datastore_group) ) .insert("remove", CliCommand::new(&api2::config::sync::API_METHOD_DELETE_SYNC_JOB) -- 2.30.2