diff --git a/src/server/notifications/mod.rs b/src/server/notifications/mod.rs index a2730d71..ba55e2b1 100644 --- a/src/server/notifications/mod.rs +++ b/src/server/notifications/mod.rs @@ -23,7 +23,10 @@ const SPOOL_DIR: &str = concatcp!(pbs_buildcfg::PROXMOX_BACKUP_STATE_DIR, "/noti mod template_data; -use template_data::{AcmeErrTemplateData, CommonData, GcErrTemplateData, GcOkTemplateData}; +use template_data::{ + AcmeErrTemplateData, CommonData, GcErrTemplateData, GcOkTemplateData, + PackageUpdatesTemplateData, +}; /// Initialize the notification system by setting context in proxmox_notify pub fn init() -> Result<(), Error> { @@ -464,23 +467,21 @@ fn get_server_url() -> (String, usize) { } pub fn send_updates_available(updates: &[&APTUpdateInfo]) -> Result<(), Error> { - let (fqdn, port) = get_server_url(); let hostname = proxmox_sys::nodename().to_string(); - let data = json!({ - "fqdn": fqdn, - "hostname": &hostname, - "port": port, - "updates": updates, - }); - let metadata = HashMap::from([ ("hostname".into(), hostname), ("type".into(), "package-updates".into()), ]); - let notification = - Notification::from_template(Severity::Info, "package-updates", data, metadata); + let template_data = PackageUpdatesTemplateData::new(updates); + + let notification = Notification::from_template( + Severity::Info, + "package-updates", + serde_json::to_value(template_data)?, + metadata, + ); send_notification(notification)?; Ok(()) diff --git a/src/server/notifications/template_data.rs b/src/server/notifications/template_data.rs index 5455cc23..59a430c2 100644 --- a/src/server/notifications/template_data.rs +++ b/src/server/notifications/template_data.rs @@ -1,4 +1,4 @@ -use pbs_api_types::GarbageCollectionStatus; +use pbs_api_types::{APTUpdateInfo, GarbageCollectionStatus}; use serde::Serialize; // NOTE: For some of these types, the `XyzOkTemplateData` and `XyzErrTemplateData` @@ -144,3 +144,42 @@ pub struct AcmeErrTemplateData { /// The error that occured when trying to request the certificate. pub error: String, } + +#[derive(Serialize)] +#[serde(rename_all = "kebab-case")] +/// A single package which can be upgraded. +pub struct UpgradablePackage { + /// The name of the package. + package_name: String, + /// The new version which can be installed. + available_version: String, + /// The currently installed version. + installed_version: String, +} + +/// Template data for the package-updates template. +#[derive(Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct PackageUpdatesTemplateData { + /// Common properties. + #[serde(flatten)] + pub common: CommonData, + pub available_updates: Vec, +} + +impl PackageUpdatesTemplateData { + /// Create new a new instance. + pub fn new(updates: &[&APTUpdateInfo]) -> Self { + Self { + common: CommonData::new(), + available_updates: updates + .iter() + .map(|info| UpgradablePackage { + package_name: info.package.clone(), + available_version: info.version.clone(), + installed_version: info.old_version.clone(), + }) + .collect(), + } + } +} diff --git a/templates/default/package-updates-body.txt.hbs b/templates/default/package-updates-body.txt.hbs index 62f9c7c4..cf69ae69 100644 --- a/templates/default/package-updates-body.txt.hbs +++ b/templates/default/package-updates-body.txt.hbs @@ -1,8 +1,8 @@ Proxmox Backup Server has the following updates available: -{{#each updates }} - {{Package}}: {{OldVersion}} -> {{Version~}} -{{/each }} +{{#each available-updates}} + {{this.package-name}}: {{this.installed-version}} -> {{this.available-version~}} +{{/each}} To upgrade visit the web interface: - +<{{base-url}}/#pbsServerAdministration:updates> diff --git a/templates/default/package-updates-subject.txt.hbs b/templates/default/package-updates-subject.txt.hbs index c8a775d5..556a67b8 100644 --- a/templates/default/package-updates-subject.txt.hbs +++ b/templates/default/package-updates-subject.txt.hbs @@ -1 +1 @@ -New software packages available ({{ hostname }}) +New software packages available ({{hostname}})