* [pbs-devel] [PATCH proxmox-backup] implement prune notifications
@ 2022-07-12 10:22 Dominik Csapak
2022-10-05 15:28 ` Thomas Lamprecht
0 siblings, 1 reply; 2+ messages in thread
From: Dominik Csapak @ 2022-07-12 10:22 UTC (permalink / raw)
To: pbs-devel
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@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
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [pbs-devel] [PATCH proxmox-backup] implement prune notifications
2022-07-12 10:22 [pbs-devel] [PATCH proxmox-backup] implement prune notifications Dominik Csapak
@ 2022-10-05 15:28 ` Thomas Lamprecht
0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2022-10-05 15:28 UTC (permalink / raw)
To: Proxmox Backup Server development discussion, Dominik Csapak
Conflicts, but is auto-, but there's a compile error (see inline).
Am 12/07/2022 um 12:22 schrieb Dominik Csapak:
> 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@proxmox.com>
> ---
> if we want we could collect some basic info about the pruning,
> like how many snapshots we removed/kept
can always add that in the future
>
> 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(-)
>
> +pub fn send_prune_status(
> + email: &str,
fwiw, we could use Option<&str> here and re-use/extend the existing match+early return
to avoid caller headache. We even could drop it completely and call the
lookup_datastore_notify_settings internally, if we ever got other call sites
we can still re-factor it out again or have two methods, an auto variant and a
manual one.
> 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)
compilation errors because your referencing store, which got moved into worker_id above,
simplest thing may be to clone there, I mean we could use &worker.upid().worker_id (it's
pub) but that would be rather a bit ugly IMO.
> + {
> + eprintln!("send prune notification failed: {}", err);
You got that probably from context, but we normally use the log crates fn's over
eprintln for new code IIRC.
> + }
> + }
> result
> },
> )?;
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-10-05 15:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-12 10:22 [pbs-devel] [PATCH proxmox-backup] implement prune notifications Dominik Csapak
2022-10-05 15:28 ` Thomas Lamprecht
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox