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 804E76B927 for ; Wed, 27 Jan 2021 11:34:34 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id E611621004 for ; Wed, 27 Jan 2021 11:34:03 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 1F72A20FCA for ; Wed, 27 Jan 2021 11:34:02 +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 DCA4C46130 for ; Wed, 27 Jan 2021 11:34:01 +0100 (CET) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Wed, 27 Jan 2021 11:33:48 +0100 Message-Id: <20210127103401.32535-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210127103401.32535-1-d.csapak@proxmox.com> References: <20210127103401.32535-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.259 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust 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. [changer.rs] Subject: [pbs-devel] [PATCH proxmox-backup 02/15] api2/tape/changer: add get_drives api call 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: Wed, 27 Jan 2021 10:34:34 -0000 so that an api user can get the drives belonging to a changer without having to parse the config listing themselves Signed-off-by: Dominik Csapak --- src/api2/tape/changer.rs | 69 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/src/api2/tape/changer.rs b/src/api2/tape/changer.rs index 87737d32..232f0127 100644 --- a/src/api2/tape/changer.rs +++ b/src/api2/tape/changer.rs @@ -11,9 +11,10 @@ use crate::{ api2::types::{ CHANGER_NAME_SCHEMA, DriveListEntry, - ScsiTapeChanger, - MtxStatusEntry, + LinuxTapeDrive, MtxEntryKind, + MtxStatusEntry, + ScsiTapeChanger, }, tape::{ TAPE_STATUS_DIR, @@ -25,6 +26,7 @@ use crate::{ ScsiMediaChange, mtx_status_to_online_set, }, + linux_tape_device_list, lookup_drive, }, }; @@ -136,6 +138,64 @@ pub async fn transfer( }).await? } +#[api( + input: { + properties: { + name: { + schema: CHANGER_NAME_SCHEMA, + }, + }, + }, + returns: { + description: "The list of configured Drives for the given Changer.", + type: Array, + items: { + type: DriveListEntry, + }, + }, +)] +/// Get Drives belonging to changer +pub fn get_drives( + name: String, +) -> Result, Error> { + + let (config, _) = config::drive::config()?; + + let linux_drives = linux_tape_device_list(); + + let drive_list: Vec = config.convert_to_typed_array("linux")?; + + let mut list = Vec::new(); + + let changer = Some(name); + + for drive in drive_list { + + if drive.changer != changer { + continue; + } + + let mut entry = DriveListEntry { + name: drive.name, + path: drive.path.clone(), + changer: drive.changer, + changer_drivenum: drive.changer_drive_id, + vendor: None, + model: None, + serial: None, + }; + if let Some(info) = lookup_drive(&linux_drives, &drive.path) { + entry.vendor = Some(info.vendor.clone()); + entry.model = Some(info.model.clone()); + entry.serial = Some(info.serial.clone()); + } + + list.push(entry); + } + + Ok(list) +} + #[api( input: { properties: {}, @@ -183,6 +243,11 @@ pub fn list_changers( } const SUBDIRS: SubdirMap = &[ + ( + "get-drives", + &Router::new() + .get(&API_METHOD_GET_DRIVES) + ), ( "status", &Router::new() -- 2.20.1