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 C11676A640 for ; Fri, 5 Mar 2021 09:46:07 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 9C60521FC2 for ; Fri, 5 Mar 2021 09:45:37 +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)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id D085D21F9C for ; Fri, 5 Mar 2021 09:45:36 +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 9AABA40470 for ; Fri, 5 Mar 2021 09:45:36 +0100 (CET) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Fri, 5 Mar 2021 09:45:31 +0100 Message-Id: <20210305084532.19550-4-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210305084532.19550-1-d.csapak@proxmox.com> References: <20210305084532.19550-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.198 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. [restore.rs, backup.rs, mod.rs] Subject: [pbs-devel] [PATCH proxmox-backup 3/4] api2/tape: add notify_user to backup(-jobs) and restore api calls 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: Fri, 05 Mar 2021 08:46:07 -0000 so that a user can be given that will be notified for manual intervention (e.g. inserting a tape) Signed-off-by: Dominik Csapak --- src/api2/tape/backup.rs | 7 ++++++- src/api2/tape/restore.rs | 20 ++++++++++++++++++-- src/server/email_notifications.rs | 2 +- src/tape/drive/mod.rs | 8 ++++---- src/tape/pool_writer.rs | 6 ++++-- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index 2f9f03d0..621fcf4d 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -29,6 +29,7 @@ use crate::{ }, }, server::{ + lookup_user_email, jobstate::{ Job, JobState, @@ -45,6 +46,7 @@ use crate::{ UPID_SCHEMA, JOB_ID_SCHEMA, MediaPoolConfig, + Userid, }, server::WorkerTask, task::TaskState, @@ -295,7 +297,10 @@ fn backup_worker( let pool = MediaPool::with_config(status_path, &pool_config, changer_name)?; - let mut pool_writer = PoolWriter::new(pool, &setup.drive)?; + let notify_user = setup.notify_user.as_ref().unwrap_or_else(|| &Userid::root_userid()); + let email = lookup_user_email(notify_user); + + let mut pool_writer = PoolWriter::new(pool, &setup.drive, email)?; let mut group_list = BackupInfo::list_backup_groups(&datastore.base_path())?; diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index e506c36c..157e3513 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -32,6 +32,7 @@ use crate::{ DRIVE_NAME_SCHEMA, UPID_SCHEMA, Authid, + Userid, }, config, backup::{ @@ -47,7 +48,10 @@ use crate::{ DynamicIndexReader, FixedIndexReader, }, - server::WorkerTask, + server::{ + lookup_user_email, + WorkerTask, + }, tape::{ TAPE_STATUS_DIR, TapeRead, @@ -90,6 +94,10 @@ pub const ROUTER: Router = Router::new() description: "Media set UUID.", type: String, }, + "notify-user": { + type: Userid, + optional: true, + }, }, }, returns: { @@ -101,6 +109,7 @@ pub fn restore( store: String, drive: String, media_set: String, + notify_user: Option, rpcenv: &mut dyn RpcEnvironment, ) -> Result { @@ -183,6 +192,7 @@ pub fn restore( &drive, &datastore, &auth_id, + ¬ify_user, )?; } @@ -212,6 +222,7 @@ pub fn request_and_restore_media( drive_name: &str, datastore: &DataStore, authid: &Authid, + notify_user: &Option, ) -> Result<(), Error> { let media_set_uuid = match media_id.media_set_label { @@ -219,7 +230,12 @@ pub fn request_and_restore_media( Some(ref set) => &set.uuid, }; - let (mut drive, info) = request_and_load_media(worker, &drive_config, &drive_name, &media_id.label)?; + let email = notify_user + .as_ref() + .and_then(|userid| lookup_user_email(userid)) + .or_else(|| lookup_user_email(&authid.clone().into())); + + let (mut drive, info) = request_and_load_media(worker, &drive_config, &drive_name, &media_id.label, &email)?; match info.media_set_label { None => { diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs index 6af6bd38..3ff1be7c 100644 --- a/src/server/email_notifications.rs +++ b/src/server/email_notifications.rs @@ -397,7 +397,7 @@ pub fn send_updates_available( } /// Lookup users email address -fn lookup_user_email(userid: &Userid) -> Option { +pub fn lookup_user_email(userid: &Userid) -> Option { use crate::config::user::{self, User}; diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index 8bbca98c..c3021dc3 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -319,6 +319,7 @@ pub fn request_and_load_media( config: &SectionConfigData, drive: &str, label: &MediaLabel, + notify_email: &Option, ) -> Result<( Box, MediaId, @@ -375,9 +376,6 @@ pub fn request_and_load_media( return Ok((handle, media_id)); } - - let to = "root@localhost"; // fixme - let mut last_media_uuid = None; let mut last_error = None; @@ -390,7 +388,9 @@ pub fn request_and_load_media( if tried { if let Some(reason) = failure_reason { task_log!(worker, "Please insert media '{}' into drive '{}'", label_text, drive); - send_load_media_email(drive, &label_text, to, Some(reason))?; + if let Some(to) = notify_email { + send_load_media_email(drive, &label_text, to, Some(reason))?; + } } failure_reason = None; diff --git a/src/tape/pool_writer.rs b/src/tape/pool_writer.rs index 149c1913..40a3f783 100644 --- a/src/tape/pool_writer.rs +++ b/src/tape/pool_writer.rs @@ -64,11 +64,12 @@ pub struct PoolWriter { drive_name: String, status: Option, media_set_catalog: MediaSetCatalog, + notify_email: Option, } impl PoolWriter { - pub fn new(mut pool: MediaPool, drive_name: &str) -> Result { + pub fn new(mut pool: MediaPool, drive_name: &str, notify_email: Option) -> Result { let current_time = proxmox::tools::time::epoch_i64(); @@ -92,6 +93,7 @@ impl PoolWriter { drive_name: drive_name.to_string(), status: None, media_set_catalog, + notify_email, }) } @@ -218,7 +220,7 @@ impl PoolWriter { let (drive_config, _digest) = crate::config::drive::config()?; let (mut drive, old_media_id) = - request_and_load_media(worker, &drive_config, &self.drive_name, media.label())?; + request_and_load_media(worker, &drive_config, &self.drive_name, media.label(), &self.notify_email)?; // test for critical tape alert flags if let Ok(alert_flags) = drive.tape_alert_flags() { -- 2.20.1