From b905cfd03d41a6e00c54744afc81c2c8deb8ea70 Mon Sep 17 00:00:00 2001 From: Lukas Wagner Date: Tue, 14 Nov 2023 13:59:26 +0100 Subject: [PATCH] pve-rs: notify: remove notify_context for PVE The context has now been moved to `proxmox-notify` due to the fact that we also need it in `proxmox-mail-forward` now. Signed-off-by: Lukas Wagner --- pve-rs/Cargo.toml | 2 +- pve-rs/src/lib.rs | 7 ++- pve-rs/src/notify_context.rs | 117 ----------------------------------- 3 files changed, 5 insertions(+), 121 deletions(-) delete mode 100644 pve-rs/src/notify_context.rs diff --git a/pve-rs/Cargo.toml b/pve-rs/Cargo.toml index e222d9d..2300c8d 100644 --- a/pve-rs/Cargo.toml +++ b/pve-rs/Cargo.toml @@ -36,7 +36,7 @@ perlmod = { version = "0.13", features = [ "exporter" ] } proxmox-apt = "0.10.6" proxmox-http = { version = "0.9", features = ["client-sync", "client-trait"] } proxmox-http-error = "0.1.0" -proxmox-notify = "0.2" +proxmox-notify = { version = "0.2", features = ["pve-context"] } proxmox-openid = "0.10" proxmox-resource-scheduling = "0.3.0" proxmox-subscription = "0.4" diff --git a/pve-rs/src/lib.rs b/pve-rs/src/lib.rs index d1915c9..42be39e 100644 --- a/pve-rs/src/lib.rs +++ b/pve-rs/src/lib.rs @@ -4,18 +4,19 @@ pub mod common; pub mod apt; -pub mod notify_context; pub mod openid; pub mod resource_scheduling; pub mod tfa; #[perlmod::package(name = "Proxmox::Lib::PVE", lib = "pve_rs")] mod export { - use crate::{common, notify_context}; + use proxmox_notify::context::pve::PVE_CONTEXT; + + use crate::common; #[export] pub fn init() { common::logger::init("PVE_LOG", "info"); - notify_context::init(); + proxmox_notify::context::set_context(&PVE_CONTEXT) } } diff --git a/pve-rs/src/notify_context.rs b/pve-rs/src/notify_context.rs deleted file mode 100644 index 3cf3e18..0000000 --- a/pve-rs/src/notify_context.rs +++ /dev/null @@ -1,117 +0,0 @@ -use log; -use std::path::Path; - -use proxmox_notify::context::Context; - -// Some helpers borrowed and slightly adapted from `proxmox-mail-forward` - -fn normalize_for_return(s: Option<&str>) -> Option { - match s?.trim() { - "" => None, - s => Some(s.to_string()), - } -} - -fn attempt_file_read>(path: P) -> Option { - match proxmox_sys::fs::file_read_optional_string(path) { - Ok(contents) => contents, - Err(err) => { - log::error!("{err}"); - None - } - } -} - -fn lookup_mail_address(content: &str, user: &str) -> Option { - normalize_for_return(content.lines().find_map(|line| { - let fields: Vec<&str> = line.split(':').collect(); - #[allow(clippy::get_first)] // to keep expression style consistent - match fields.get(0)?.trim() == "user" && fields.get(1)?.trim() == user { - true => fields.get(6).copied(), - false => None, - } - })) -} - -fn lookup_datacenter_config_key(content: &str, key: &str) -> Option { - let key_prefix = format!("{key}:"); - normalize_for_return( - content - .lines() - .find_map(|line| line.strip_prefix(&key_prefix)), - ) -} - -#[derive(Debug)] -struct PVEContext; - -impl Context for PVEContext { - fn lookup_email_for_user(&self, user: &str) -> Option { - let content = attempt_file_read("/etc/pve/user.cfg"); - content.and_then(|content| lookup_mail_address(&content, user)) - } - - fn default_sendmail_author(&self) -> String { - "Proxmox VE".into() - } - - fn default_sendmail_from(&self) -> String { - let content = attempt_file_read("/etc/pve/datacenter.cfg"); - content - .and_then(|content| lookup_datacenter_config_key(&content, "email_from")) - .unwrap_or_else(|| String::from("root")) - } - - fn http_proxy_config(&self) -> Option { - let content = attempt_file_read("/etc/pve/datacenter.cfg"); - content.and_then(|content| lookup_datacenter_config_key(&content, "http_proxy")) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - const USER_CONFIG: &str = " -user:root@pam:1:0:::root@example.com::: -user:test@pve:1:0:::test@example.com::: -user:no-mail@pve:1:0:::::: - "; - - #[test] - fn test_parse_mail() { - assert_eq!( - lookup_mail_address(USER_CONFIG, "root@pam"), - Some("root@example.com".to_string()) - ); - assert_eq!( - lookup_mail_address(USER_CONFIG, "test@pve"), - Some("test@example.com".to_string()) - ); - assert_eq!(lookup_mail_address(USER_CONFIG, "no-mail@pve"), None); - } - - const DC_CONFIG: &str = " -email_from: user@example.com -http_proxy: http://localhost:1234 -keyboard: en-us -"; - #[test] - fn test_parse_dc_config() { - assert_eq!( - lookup_datacenter_config_key(DC_CONFIG, "email_from"), - Some("user@example.com".to_string()) - ); - assert_eq!( - lookup_datacenter_config_key(DC_CONFIG, "http_proxy"), - Some("http://localhost:1234".to_string()) - ); - assert_eq!(lookup_datacenter_config_key(DC_CONFIG, "foo"), None); - } -} - -static CONTEXT: PVEContext = PVEContext; - -pub fn init() { - proxmox_notify::context::set_context(&CONTEXT) -}