[pbs-devel] [PATCH proxmox-backup 3/4] api2/tape: add notify_user to backup(-jobs) and restore api calls

Dominik Csapak d.csapak at proxmox.com
Fri Mar 5 09:45:31 CET 2021


so that a user can be given that will be notified for
manual intervention (e.g. inserting a tape)

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 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<Userid>,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
 
@@ -183,6 +192,7 @@ pub fn restore(
                     &drive,
                     &datastore,
                     &auth_id,
+                    &notify_user,
                 )?;
             }
 
@@ -212,6 +222,7 @@ pub fn request_and_restore_media(
     drive_name: &str,
     datastore: &DataStore,
     authid: &Authid,
+    notify_user: &Option<Userid>,
 ) -> 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<String> {
+pub fn lookup_user_email(userid: &Userid) -> Option<String> {
 
     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<String>,
 ) -> Result<(
     Box<dyn TapeDriver>,
     MediaId,
@@ -375,9 +376,6 @@ pub fn request_and_load_media(
                         return Ok((handle, media_id));
                     }
 
-
-                    let to = "root at 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<PoolWriterState>,
     media_set_catalog: MediaSetCatalog,
+    notify_email: Option<String>,
 }
 
 impl PoolWriter {
 
-    pub fn new(mut pool: MediaPool, drive_name: &str) -> Result<Self, Error> {
+    pub fn new(mut pool: MediaPool, drive_name: &str, notify_email: Option<String>) -> Result<Self, Error> {
 
         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






More information about the pbs-devel mailing list