From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 3A3BCFAD4 for ; Mon, 24 Jul 2023 13:27:41 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 184ECD79B for ; Mon, 24 Jul 2023 13:27:11 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Mon, 24 Jul 2023 13:27:09 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 9AA4043ADC for ; Mon, 24 Jul 2023 13:27:09 +0200 (CEST) From: Lukas Wagner To: pve-devel@lists.proxmox.com Cc: Lukas Wagner , Wolfgang Bumiller Date: Mon, 24 Jul 2023 13:26:57 +0200 Message-Id: <20230724112659.524038-1-l.wagner@proxmox.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.065 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pve-devel] [PATCH proxmox-perl-rs] notify: rename PVE::RS::Notify to Proxmox::RS::Notify X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Jul 2023 11:27:41 -0000 Also splitting PVE-specific context into its own file. Suggested-by: Wolfgang Bumiller Signed-off-by: Lukas Wagner --- common/pkg/Makefile | 1 + common/src/mod.rs | 1 + {pve-rs => common}/src/notify.rs | 123 +------------------------------ pve-rs/src/lib.rs | 6 +- pve-rs/src/notify_context.rs | 117 +++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 124 deletions(-) rename {pve-rs => common}/src/notify.rs (79%) create mode 100644 pve-rs/src/notify_context.rs diff --git a/common/pkg/Makefile b/common/pkg/Makefile index 7232f0c..7bf669f 100644 --- a/common/pkg/Makefile +++ b/common/pkg/Makefile @@ -25,6 +25,7 @@ Proxmox/RS/CalendarEvent.pm: $(PERLMOD_GENPACKAGE) \ Proxmox::RS::APT::Repositories \ Proxmox::RS::CalendarEvent \ + Proxmox::RS::Notify \ Proxmox::RS::Subscription all: Proxmox/RS/CalendarEvent.pm diff --git a/common/src/mod.rs b/common/src/mod.rs index 6c86ac0..c3574f4 100644 --- a/common/src/mod.rs +++ b/common/src/mod.rs @@ -1,4 +1,5 @@ pub mod apt; mod calendar_event; pub mod logger; +pub mod notify; mod subscription; diff --git a/pve-rs/src/notify.rs b/common/src/notify.rs similarity index 79% rename from pve-rs/src/notify.rs rename to common/src/notify.rs index f6d70d0..c8ca533 100644 --- a/pve-rs/src/notify.rs +++ b/common/src/notify.rs @@ -1,123 +1,4 @@ -use std::path::Path; - -use log; - -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, "mail_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 crate::notify::{lookup_datacenter_config_key, lookup_mail_address}; - - 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) -} - -#[perlmod::package(name = "PVE::RS::Notify")] +#[perlmod::package(name = "Proxmox::RS::Notify")] mod export { use anyhow::{bail, Error}; use perlmod::Value; @@ -141,7 +22,7 @@ mod export { config: Mutex, } - perlmod::declare_magic!(Box : &NotificationConfig as "PVE::RS::Notify"); + perlmod::declare_magic!(Box : &NotificationConfig as "Proxmox::RS::Notify"); /// Support `dclone` so this can be put into the `ccache` of `PVE::Cluster`. #[export(name = "STORABLE_freeze", raw_return)] diff --git a/pve-rs/src/lib.rs b/pve-rs/src/lib.rs index 49483d7..d1915c9 100644 --- a/pve-rs/src/lib.rs +++ b/pve-rs/src/lib.rs @@ -4,18 +4,18 @@ pub mod common; pub mod apt; -pub mod notify; +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}; + use crate::{common, notify_context}; #[export] pub fn init() { common::logger::init("PVE_LOG", "info"); - notify::init(); + notify_context::init(); } } diff --git a/pve-rs/src/notify_context.rs b/pve-rs/src/notify_context.rs new file mode 100644 index 0000000..48623fd --- /dev/null +++ b/pve-rs/src/notify_context.rs @@ -0,0 +1,117 @@ +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, "mail_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) +} -- 2.39.2