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 DE7897C20D for ; Thu, 4 Nov 2021 10:56:54 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C9FD71DCDC for ; Thu, 4 Nov 2021 10:56:24 +0100 (CET) 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 097911DC9F for ; Thu, 4 Nov 2021 10:56:24 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id D87334647A for ; Thu, 4 Nov 2021 10:56:23 +0100 (CET) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Thu, 4 Nov 2021 10:56:22 +0100 Message-Id: <20211104095622.2207427-6-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211104095622.2207427-1-d.csapak@proxmox.com> References: <20211104095622.2207427-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.247 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox-tape.rs] Subject: [pbs-devel] [PATCH proxmox-backup 5/5] proxmox-tape: add groups filter to backup command 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, 04 Nov 2021 09:56:54 -0000 and add a completion handler to complete the backup groups Signed-off-by: Dominik Csapak --- src/bin/proxmox-tape.rs | 43 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/bin/proxmox-tape.rs b/src/bin/proxmox-tape.rs index b7979026..f49857dd 100644 --- a/src/bin/proxmox-tape.rs +++ b/src/bin/proxmox-tape.rs @@ -1,4 +1,6 @@ -use anyhow::{format_err, Error}; +use std::collections::HashMap; + +use anyhow::{bail, format_err, Error}; use serde_json::{json, Value}; use proxmox_io::ReadExt; @@ -22,7 +24,7 @@ use pbs_config::datastore::complete_datastore_name; use pbs_api_types::{ Userid, Authid, DATASTORE_SCHEMA, DATASTORE_MAP_LIST_SCHEMA, DRIVE_NAME_SCHEMA, MEDIA_LABEL_SCHEMA, MEDIA_POOL_NAME_SCHEMA, - TAPE_RESTORE_SNAPSHOT_SCHEMA, + TAPE_RESTORE_SNAPSHOT_SCHEMA, GROUP_FILTER_LIST_SCHEMA, GroupListItem, }; use pbs_tape::{ PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0, BlockReadError, MediaContentHeader, @@ -49,6 +51,38 @@ use proxmox_backup::{ mod proxmox_tape; use proxmox_tape::*; +async fn get_backup_groups(store: &str) -> Result, Error> { + let client = connect_to_localhost()?; + let api_res = client + .get(&format!("api2/json/admin/datastore/{}/groups", store), None) + .await?; + + match api_res.get("data") { + Some(data) => Ok(serde_json::from_value::>(data.to_owned())?), + None => bail!("could not get group list"), + } +} + +// shell completion helper +pub fn complete_datastore_group_filter(_arg: &str, param: &HashMap) -> Vec { + + let mut list = Vec::new(); + + list.push("regex:".to_string()); + list.push("type:ct".to_string()); + list.push("type:host".to_string()); + list.push("type:vm".to_string()); + + if let Some(store) = param.get("store") { + let groups = pbs_runtime::block_on(async { get_backup_groups(store).await }); + if let Ok(groups) = groups { + list.extend(groups.iter().map(|group| format!("group:{}/{}", group.backup_type, group.backup_id))); + } + } + + list +} + pub fn extract_drive_name( param: &mut Value, config: &SectionConfigData, @@ -834,6 +868,10 @@ async fn clean_drive(mut param: Value) -> Result<(), Error> { optional: true, type: Userid, }, + groups: { + schema: GROUP_FILTER_LIST_SCHEMA, + optional: true, + }, "force-media-set": { description: "Ignore the allocation policy and start a new media-set.", optional: true, @@ -978,6 +1016,7 @@ fn main() { .completion_cb("drive", complete_drive_name) .completion_cb("store", complete_datastore_name) .completion_cb("pool", complete_pool_name) + .completion_cb("groups", complete_datastore_group_filter) ) .insert( "restore", -- 2.30.2