[pbs-devel] [PATCH proxmox-backup] implement prune notifications
Dominik Csapak
d.csapak at proxmox.com
Tue Jul 12 12:22:59 CEST 2022
we converted the prune settings of datastores to prune-jobs, but did
not actually implement the notifications for them, even though
we had the notification options in the gui (they did not work).
implement the basic ok/error notification for prune jobs
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
if we want we could collect some basic info about the pruning,
like how many snapshots we removed/kept
adding the whole list of which snapshots were kept/deleted does
not really make sense to me though, thats the purpose of the task log
pbs-api-types/src/jobs.rs | 6 +++
src/api2/config/datastore.rs | 1 +
src/server/email_notifications.rs | 74 +++++++++++++++++++++++++++++++
src/server/prune_job.rs | 9 ++++
www/window/NotifyOptions.js | 2 +-
5 files changed, 91 insertions(+), 1 deletion(-)
diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs
index 925a1829..3ed964a8 100644
--- a/pbs-api-types/src/jobs.rs
+++ b/pbs-api-types/src/jobs.rs
@@ -128,6 +128,10 @@ pub enum Notify {
type: Notify,
optional: true,
},
+ prune: {
+ type: Notify,
+ optional: true,
+ },
},
)]
#[derive(Debug, Serialize, Deserialize)]
@@ -139,6 +143,8 @@ pub struct DatastoreNotify {
pub verify: Option<Notify>,
/// Sync job setting
pub sync: Option<Notify>,
+ /// Prune job setting
+ pub prune: Option<Notify>,
}
pub const DATASTORE_NOTIFY_STRING_SCHEMA: Schema =
diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs
index 2d769722..08adf7c9 100644
--- a/src/api2/config/datastore.rs
+++ b/src/api2/config/datastore.rs
@@ -331,6 +331,7 @@ pub fn update_datastore(
gc: None,
verify: None,
sync: None,
+ prune: None,
} = notify
{
data.notify = None;
diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs
index 6fca4133..e6281e6d 100644
--- a/src/server/email_notifications.rs
+++ b/src/server/email_notifications.rs
@@ -113,6 +113,34 @@ Remote Store: {{job.remote-store}}
Synchronization failed: {{error}}
+Please visit the web interface for further details:
+
+<https://{{fqdn}}:{{port}}/#pbsServerAdministration:tasks>
+
+"###;
+
+const PRUNE_OK_TEMPLATE: &str = r###"
+
+Job ID: {{jobname}}
+Datastore: {{store}}
+
+Pruning successful.
+
+
+Please visit the web interface for further details:
+
+<https://{{fqdn}}:{{port}}/#DataStore-{{store}}>
+
+"###;
+
+const PRUNE_ERR_TEMPLATE: &str = r###"
+
+Job ID: {{jobname}}
+Datastore: {{store}}
+
+Pruning failed: {{error}}
+
+
Please visit the web interface for further details:
<https://{{fqdn}}:{{port}}/#pbsServerAdministration:tasks>
@@ -227,6 +255,9 @@ lazy_static::lazy_static! {
hb.register_template_string("sync_ok_template", SYNC_OK_TEMPLATE)?;
hb.register_template_string("sync_err_template", SYNC_ERR_TEMPLATE)?;
+ hb.register_template_string("prune_ok_template", PRUNE_OK_TEMPLATE)?;
+ hb.register_template_string("prune_err_template", PRUNE_ERR_TEMPLATE)?;
+
hb.register_template_string("tape_backup_ok_template", TAPE_BACKUP_OK_TEMPLATE)?;
hb.register_template_string("tape_backup_err_template", TAPE_BACKUP_ERR_TEMPLATE)?;
@@ -384,6 +415,48 @@ pub fn send_verify_status(
Ok(())
}
+pub fn send_prune_status(
+ email: &str,
+ notify: DatastoreNotify,
+ store: &str,
+ jobname: &str,
+ result: &Result<(), Error>,
+) -> Result<(), Error> {
+ match notify.prune {
+ None => { /* send notifications by default */ }
+ Some(notify) => {
+ if notify == Notify::Never || (result.is_ok() && notify == Notify::Error) {
+ return Ok(());
+ }
+ }
+ }
+
+ let (fqdn, port) = get_server_url();
+ let mut data = json!({
+ "jobname": jobname,
+ "store": store,
+ "fqdn": fqdn,
+ "port": port,
+ });
+
+ let text = match result {
+ Ok(()) => HANDLEBARS.render("prune_ok_template", &data)?,
+ Err(err) => {
+ data["error"] = err.to_string().into();
+ HANDLEBARS.render("prune_err_template", &data)?
+ }
+ };
+
+ let subject = match result {
+ Ok(()) => format!("Pruning datastore '{}' successful", store,),
+ Err(_) => format!("Pruning datastore '{}' failed", store,),
+ };
+
+ send_job_status_mail(email, &subject, &text)?;
+
+ Ok(())
+}
+
pub fn send_sync_status(
email: &str,
notify: DatastoreNotify,
@@ -581,6 +654,7 @@ pub fn lookup_datastore_notify_settings(store: &str) -> (Option<String>, Datasto
gc: None,
verify: None,
sync: None,
+ prune: None,
};
let (config, _digest) = match pbs_config::datastore::config() {
diff --git a/src/server/prune_job.rs b/src/server/prune_job.rs
index a62177e4..e9631183 100644
--- a/src/server/prune_job.rs
+++ b/src/server/prune_job.rs
@@ -169,6 +169,8 @@ pub fn do_prune_job(
None => format!("{store}"),
};
+ let (email, notify) = crate::server::lookup_datastore_notify_settings(&store);
+
let upid_str = WorkerTask::new_thread(
&worker_type,
Some(worker_id),
@@ -191,6 +193,13 @@ pub fn do_prune_job(
eprintln!("could not finish job state for {}: {}", job.jobtype(), err);
}
+ if let Some(email) = email {
+ if let Err(err) =
+ crate::server::send_prune_status(&email, notify, &store, job.jobname(), &result)
+ {
+ eprintln!("send prune notification failed: {}", err);
+ }
+ }
result
},
)?;
diff --git a/www/window/NotifyOptions.js b/www/window/NotifyOptions.js
index 924bbb8b..7c7e6489 100644
--- a/www/window/NotifyOptions.js
+++ b/www/window/NotifyOptions.js
@@ -36,7 +36,7 @@ Ext.define('PBS.window.NotifyOptions', {
xtype: 'inputpanel',
onGetValues: function(values) {
let notify = {};
- for (const k of ['verify', 'sync', 'gc']) {
+ for (const k of ['verify', 'sync', 'gc', 'prune']) {
notify[k] = values[k];
delete values[k];
}
--
2.30.2
More information about the pbs-devel
mailing list