diff --git a/src/server/notifications/mod.rs b/src/server/notifications/mod.rs index e0dd92d2..9e069710 100644 --- a/src/server/notifications/mod.rs +++ b/src/server/notifications/mod.rs @@ -25,7 +25,8 @@ mod template_data; use template_data::{ AcmeErrTemplateData, CommonData, GcErrTemplateData, GcOkTemplateData, - PackageUpdatesTemplateData, PruneErrTemplateData, PruneOkTemplateData, + PackageUpdatesTemplateData, PruneErrTemplateData, PruneOkTemplateData, SyncErrTemplateData, + SyncOkTemplateData, }; /// Initialize the notification system by setting context in proxmox_notify @@ -320,21 +321,6 @@ pub fn send_prune_status( } pub fn send_sync_status(job: &SyncJobConfig, result: &Result<(), Error>) -> Result<(), Error> { - let (fqdn, port) = get_server_url(); - let mut data = json!({ - "job": job, - "fqdn": fqdn, - "port": port, - }); - - let (template, severity) = match result { - Ok(()) => ("sync-ok", Severity::Info), - Err(err) => { - data["error"] = err.to_string().into(); - ("sync-err", Severity::Error) - } - }; - let metadata = HashMap::from([ ("job-id".into(), job.id.clone()), ("datastore".into(), job.store.clone()), @@ -342,7 +328,39 @@ pub fn send_sync_status(job: &SyncJobConfig, result: &Result<(), Error>) -> Resu ("type".into(), "sync".into()), ]); - let notification = Notification::from_template(severity, template, data, metadata); + let notification = match result { + Ok(()) => { + let template_data = SyncOkTemplateData { + common: CommonData::new(), + datastore: job.store.clone(), + job_id: job.id.clone(), + remote: job.remote.clone(), + remote_datastore: job.remote_store.clone(), + }; + Notification::from_template( + Severity::Info, + "sync-ok", + serde_json::to_value(template_data)?, + metadata, + ) + } + Err(err) => { + let template_data = SyncErrTemplateData { + common: CommonData::new(), + datastore: job.store.clone(), + job_id: job.id.clone(), + remote: job.remote.clone(), + remote_datastore: job.remote_store.clone(), + error: format!("{err:#}"), + }; + Notification::from_template( + Severity::Error, + "sync-err", + serde_json::to_value(template_data)?, + metadata, + ) + } + }; let (email, notify, mode) = lookup_datastore_notify_settings(&job.store); match mode { diff --git a/src/server/notifications/template_data.rs b/src/server/notifications/template_data.rs index 1b04352e..81ee19c6 100644 --- a/src/server/notifications/template_data.rs +++ b/src/server/notifications/template_data.rs @@ -211,3 +211,39 @@ pub struct PruneErrTemplateData { /// The error that occured during the prune job. pub error: String, } + +/// Template data for the sync-ok template. +#[derive(Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct SyncOkTemplateData { + /// Common properties. + #[serde(flatten)] + pub common: CommonData, + /// The datastore. + pub datastore: String, + /// The ID of the job. + pub job_id: String, + /// The remote. + pub remote: Option, + /// The remote datastore we synced to/from. + pub remote_datastore: String, +} + +/// Template data for the sync-err template. +#[derive(Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct SyncErrTemplateData { + /// Common properties. + #[serde(flatten)] + pub common: CommonData, + /// The datastore. + pub datastore: String, + /// The ID of the job. + pub job_id: String, + /// The remote. + pub remote: Option, + /// The remote datastore we synced to/from. + pub remote_datastore: String, + /// The error that occurred during the sync job. + pub error: String, +} diff --git a/templates/default/sync-err-body.txt.hbs b/templates/default/sync-err-body.txt.hbs index a56d9d22..d47a5d6c 100644 --- a/templates/default/sync-err-body.txt.hbs +++ b/templates/default/sync-err-body.txt.hbs @@ -1,14 +1,14 @@ -Job ID: {{job.id}} -Datastore: {{job.store}} -{{#if job.remote~}} -Remote: {{job.remote}} -Remote Store: {{job.remote-store}} +Job ID: {{job-id}} +Datastore: {{datastore}} +{{#if remote~}} +Remote: {{remote}} +Remote Store: {{remote-datastore}} {{else~}} -Local Source Store: {{job.remote-store}} +Local Source Store: {{remote-datastore}} {{/if}} Synchronization failed: {{error}} Please visit the web interface for further details: - +<{{base-url}}/#pbsServerAdministration:tasks> diff --git a/templates/default/sync-err-subject.txt.hbs b/templates/default/sync-err-subject.txt.hbs index a1464802..d4e5cfcf 100644 --- a/templates/default/sync-err-subject.txt.hbs +++ b/templates/default/sync-err-subject.txt.hbs @@ -1,5 +1,5 @@ -{{#if job.remote~}} -Sync remote '{{ job.remote }}' datastore '{{ job.remote-store }}' failed +{{#if remote~}} +Sync remote '{{remote}}' datastore '{{remote-datastore}}' failed {{else~}} -Sync local datastore '{{ job.remote-store }}' failed +Sync local datastore '{{remote-datastore}}' failed {{/if}} diff --git a/templates/default/sync-ok-body.txt.hbs b/templates/default/sync-ok-body.txt.hbs index 25c4b33b..6ef5993d 100644 --- a/templates/default/sync-ok-body.txt.hbs +++ b/templates/default/sync-ok-body.txt.hbs @@ -1,14 +1,14 @@ -Job ID: {{job.id}} -Datastore: {{job.store}} -{{#if job.remote~}} -Remote: {{job.remote}} -Remote Store: {{job.remote-store}} +Job ID: {{job-id}} +Datastore: {{datastore}} +{{#if remote~}} +Remote: {{remote}} +Remote Store: {{remote-datastore}} {{else~}} -Local Source Store: {{job.remote-store}} +Local Source Store: {{remote-datastore}} {{/if}} Synchronization successful. Please visit the web interface for further details: - +<{{base-url}}/#DataStore-{{datastore}}> diff --git a/templates/default/sync-ok-subject.txt.hbs b/templates/default/sync-ok-subject.txt.hbs index 76616b5c..35fac2ce 100644 --- a/templates/default/sync-ok-subject.txt.hbs +++ b/templates/default/sync-ok-subject.txt.hbs @@ -1,5 +1,5 @@ -{{#if job.remote~}} -Sync remote '{{ job.remote }}' datastore '{{ job.remote-store }}' successful +{{#if remote~}} +Sync remote '{{remote}}' datastore '{{remote-datastore}}' successful {{else~}} -Sync local datastore '{{ job.remote-store }}' successful +Sync local datastore '{{remote-datastore}}' successful {{/if}}