5
0
mirror of git://git.proxmox.com/git/proxmox-backup.git synced 2024-12-22 13:34:16 +03:00

server: notifications: send sync notifications via notification system

If the `notification-mode` parameter is set to `legacy-sendmail`, then
we still use the new infrastructure, but don't consider the
notification config and use a hard-coded sendmail endpoint directly.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Gabriel Goller <g.goller@proxmox.com>
Reviewed-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Lukas Wagner 2024-04-23 13:52:09 +02:00 committed by Thomas Lamprecht
parent 2432775ce8
commit 5b23a70707
8 changed files with 76 additions and 82 deletions

View File

@ -49,6 +49,10 @@ usr/share/proxmox-backup/templates/default/prune-err-body.txt.hbs
usr/share/proxmox-backup/templates/default/prune-ok-body.txt.hbs usr/share/proxmox-backup/templates/default/prune-ok-body.txt.hbs
usr/share/proxmox-backup/templates/default/prune-err-subject.txt.hbs usr/share/proxmox-backup/templates/default/prune-err-subject.txt.hbs
usr/share/proxmox-backup/templates/default/prune-ok-subject.txt.hbs usr/share/proxmox-backup/templates/default/prune-ok-subject.txt.hbs
usr/share/proxmox-backup/templates/default/sync-err-body.txt.hbs
usr/share/proxmox-backup/templates/default/sync-ok-body.txt.hbs
usr/share/proxmox-backup/templates/default/sync-err-subject.txt.hbs
usr/share/proxmox-backup/templates/default/sync-ok-subject.txt.hbs
usr/share/proxmox-backup/templates/default/test-body.txt.hbs usr/share/proxmox-backup/templates/default/test-body.txt.hbs
usr/share/proxmox-backup/templates/default/test-body.html.hbs usr/share/proxmox-backup/templates/default/test-body.html.hbs
usr/share/proxmox-backup/templates/default/test-subject.txt.hbs usr/share/proxmox-backup/templates/default/test-subject.txt.hbs

View File

@ -114,8 +114,6 @@ pub fn do_sync_job(
bail!("can't sync to same datastore"); bail!("can't sync to same datastore");
} }
let (email, notify, _) = crate::server::lookup_datastore_notify_settings(&sync_job.store);
let upid_str = WorkerTask::spawn( let upid_str = WorkerTask::spawn(
&worker_type, &worker_type,
Some(job_id.clone()), Some(job_id.clone()),
@ -194,12 +192,8 @@ pub fn do_sync_job(
} }
} }
if let Some(email) = email { if let Err(err) = crate::server::send_sync_status(&sync_job2, &result) {
if let Err(err) = eprintln!("send sync notification failed: {err}");
crate::server::send_sync_status(&email, notify, &sync_job2, &result)
{
eprintln!("send sync notification failed: {}", err);
}
} }
result result

View File

@ -23,44 +23,6 @@ use proxmox_notify::{Endpoint, Notification, Severity};
const SPOOL_DIR: &str = concatcp!(pbs_buildcfg::PROXMOX_BACKUP_STATE_DIR, "/notifications"); const SPOOL_DIR: &str = concatcp!(pbs_buildcfg::PROXMOX_BACKUP_STATE_DIR, "/notifications");
const SYNC_OK_TEMPLATE: &str = r###"
Job ID: {{job.id}}
Datastore: {{job.store}}
{{#if job.remote~}}
Remote: {{job.remote}}
Remote Store: {{job.remote-store}}
{{else~}}
Local Source Store: {{job.remote-store}}
{{/if}}
Synchronization successful.
Please visit the web interface for further details:
<https://{{fqdn}}:{{port}}/#DataStore-{{job.store}}>
"###;
const SYNC_ERR_TEMPLATE: &str = r###"
Job ID: {{job.id}}
Datastore: {{job.store}}
{{#if job.remote~}}
Remote: {{job.remote}}
Remote Store: {{job.remote-store}}
{{else~}}
Local Source Store: {{job.remote-store}}
{{/if}}
Synchronization failed: {{error}}
Please visit the web interface for further details:
<https://{{fqdn}}:{{port}}/#pbsServerAdministration:tasks>
"###;
const PACKAGE_UPDATES_TEMPLATE: &str = r###" const PACKAGE_UPDATES_TEMPLATE: &str = r###"
Proxmox Backup Server has the following updates available: Proxmox Backup Server has the following updates available:
{{#each updates }} {{#each updates }}
@ -157,9 +119,6 @@ lazy_static::lazy_static! {
hb.set_strict_mode(true); hb.set_strict_mode(true);
hb.register_escape_fn(handlebars::no_escape); hb.register_escape_fn(handlebars::no_escape);
hb.register_template_string("sync_ok_template", SYNC_OK_TEMPLATE)?;
hb.register_template_string("sync_err_template", SYNC_ERR_TEMPLATE)?;
hb.register_template_string("tape_backup_ok_template", TAPE_BACKUP_OK_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)?; hb.register_template_string("tape_backup_err_template", TAPE_BACKUP_ERR_TEMPLATE)?;
@ -485,21 +444,7 @@ pub fn send_prune_status(
Ok(()) Ok(())
} }
pub fn send_sync_status( pub fn send_sync_status(job: &SyncJobConfig, result: &Result<(), Error>) -> Result<(), Error> {
email: &str,
notify: DatastoreNotify,
job: &SyncJobConfig,
result: &Result<(), Error>,
) -> Result<(), Error> {
match notify.sync {
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 (fqdn, port) = get_server_url();
let mut data = json!({ let mut data = json!({
"job": job, "job": job,
@ -507,28 +452,40 @@ pub fn send_sync_status(
"port": port, "port": port,
}); });
let text = match result { let (template, severity) = match result {
Ok(()) => HANDLEBARS.render("sync_ok_template", &data)?, Ok(()) => ("sync-ok", Severity::Info),
Err(err) => { Err(err) => {
data["error"] = err.to_string().into(); data["error"] = err.to_string().into();
HANDLEBARS.render("sync_err_template", &data)? ("sync-err", Severity::Error)
} }
}; };
let tmp_src_string; let metadata = HashMap::from([
let source_str = if let Some(remote) = &job.remote { ("job-id".into(), job.id.clone()),
tmp_src_string = format!("Sync remote '{}'", remote); ("datastore".into(), job.store.clone()),
&tmp_src_string ("hostname".into(), proxmox_sys::nodename().into()),
} else { ("type".into(), "sync".into()),
"Sync local" ]);
};
let subject = match result { let notification = Notification::from_template(severity, template, data, metadata);
Ok(()) => format!("{} datastore '{}' successful", source_str, job.remote_store,),
Err(_) => format!("{} datastore '{}' failed", source_str, job.remote_store,),
};
send_job_status_mail(email, &subject, &text)?; let (email, notify, mode) = lookup_datastore_notify_settings(&job.store);
match mode {
NotificationMode::LegacySendmail => {
let notify = notify.prune.unwrap_or(Notify::Error);
if notify == Notify::Never || (result.is_ok() && notify == Notify::Error) {
return Ok(());
}
if let Some(email) = email {
send_sendmail_legacy_notification(notification, &email)?;
}
}
NotificationMode::NotificationSystem => {
send_notification(notification)?;
}
}
Ok(()) Ok(())
} }
@ -727,9 +684,6 @@ pub fn lookup_datastore_notify_settings(
#[test] #[test]
fn test_template_register() { fn test_template_register() {
assert!(HANDLEBARS.has_template("sync_ok_template"));
assert!(HANDLEBARS.has_template("sync_err_template"));
assert!(HANDLEBARS.has_template("tape_backup_ok_template")); assert!(HANDLEBARS.has_template("tape_backup_ok_template"));
assert!(HANDLEBARS.has_template("tape_backup_err_template")); assert!(HANDLEBARS.has_template("tape_backup_err_template"));

View File

@ -9,6 +9,10 @@ NOTIFICATION_TEMPLATES= \
default/prune-ok-body.txt.hbs \ default/prune-ok-body.txt.hbs \
default/prune-err-subject.txt.hbs \ default/prune-err-subject.txt.hbs \
default/prune-ok-subject.txt.hbs \ default/prune-ok-subject.txt.hbs \
default/sync-err-body.txt.hbs \
default/sync-ok-body.txt.hbs \
default/sync-err-subject.txt.hbs \
default/sync-ok-subject.txt.hbs \
default/test-body.txt.hbs \ default/test-body.txt.hbs \
default/test-body.html.hbs \ default/test-body.html.hbs \
default/test-subject.txt.hbs \ default/test-subject.txt.hbs \

View File

@ -0,0 +1,14 @@
Job ID: {{job.id}}
Datastore: {{job.store}}
{{#if job.remote~}}
Remote: {{job.remote}}
Remote Store: {{job.remote-store}}
{{else~}}
Local Source Store: {{job.remote-store}}
{{/if}}
Synchronization failed: {{error}}
Please visit the web interface for further details:
<https://{{fqdn}}:{{port}}/#pbsServerAdministration:tasks>

View File

@ -0,0 +1,5 @@
{{#if job.remote~}}
Sync remote '{{ job.remote }}' datastore '{{ job.remote-store }}' failed
{{else~}}
Sync local datastore '{{ job.remote-store }}' failed
{{/if}}

View File

@ -0,0 +1,14 @@
Job ID: {{job.id}}
Datastore: {{job.store}}
{{#if job.remote~}}
Remote: {{job.remote}}
Remote Store: {{job.remote-store}}
{{else~}}
Local Source Store: {{job.remote-store}}
{{/if}}
Synchronization successful.
Please visit the web interface for further details:
<https://{{fqdn}}:{{port}}/#DataStore-{{job.store}}>

View File

@ -0,0 +1,5 @@
{{#if job.remote~}}
Sync remote '{{ job.remote }}' datastore '{{ job.remote-store }}' successful
{{else~}}
Sync local datastore '{{ job.remote-store }}' successful
{{/if}}