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 D5C9299B2A for ; Tue, 14 Nov 2023 14:00:38 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 9AAB9300F2 for ; Tue, 14 Nov 2023 14:00:22 +0100 (CET) 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 ; Tue, 14 Nov 2023 14:00:16 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id DA35A428D7 for ; Tue, 14 Nov 2023 14:00:15 +0100 (CET) From: Lukas Wagner To: pve-devel@lists.proxmox.com Date: Tue, 14 Nov 2023 13:59:22 +0100 Message-Id: <20231114130000.565122-15-l.wagner@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231114130000.565122-1-l.wagner@proxmox.com> References: <20231114130000.565122-1-l.wagner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.012 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 v2 proxmox 14/52] notify: add 'disable' parameter for matchers and targets. 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: Tue, 14 Nov 2023 13:00:38 -0000 Signed-off-by: Lukas Wagner --- proxmox-notify/src/api/gotify.rs | 8 +++++++- proxmox-notify/src/api/matcher.rs | 6 ++++++ proxmox-notify/src/api/sendmail.rs | 8 ++++++++ proxmox-notify/src/api/smtp.rs | 6 ++++++ proxmox-notify/src/endpoints/gotify.rs | 9 +++++++++ proxmox-notify/src/endpoints/sendmail.rs | 11 ++++++++++- proxmox-notify/src/endpoints/smtp.rs | 9 +++++++++ proxmox-notify/src/lib.rs | 13 +++++++++++++ proxmox-notify/src/matcher.rs | 21 ++++++++++++++++----- 9 files changed, 84 insertions(+), 7 deletions(-) diff --git a/proxmox-notify/src/api/gotify.rs b/proxmox-notify/src/api/gotify.rs index 22d3d2e..10f5d7d 100644 --- a/proxmox-notify/src/api/gotify.rs +++ b/proxmox-notify/src/api/gotify.rs @@ -88,6 +88,7 @@ pub fn update_endpoint( for deleteable_property in delete { match deleteable_property { DeleteableGotifyProperty::Comment => endpoint.comment = None, + DeleteableGotifyProperty::Disable => endpoint.disable = None, } } } @@ -110,6 +111,10 @@ pub fn update_endpoint( endpoint.comment = Some(comment.into()); } + if let Some(disable) = &endpoint_config_updater.disable { + endpoint.disable = Some(*disable); + } + config .config .set_data(name, GOTIFY_TYPENAME, &endpoint) @@ -172,7 +177,7 @@ mod tests { name: "gotify-endpoint".into(), server: "localhost".into(), comment: Some("comment".into()), - filter: None, + ..Default::default() }, &GotifyPrivateConfig { name: "gotify-endpoint".into(), @@ -232,6 +237,7 @@ mod tests { &GotifyConfigUpdater { server: Some("newhost".into()), comment: Some("newcomment".into()), + ..Default::default() }, &GotifyPrivateConfigUpdater { token: Some("changedtoken".into()), diff --git a/proxmox-notify/src/api/matcher.rs b/proxmox-notify/src/api/matcher.rs index 0592b14..a69ca40 100644 --- a/proxmox-notify/src/api/matcher.rs +++ b/proxmox-notify/src/api/matcher.rs @@ -85,6 +85,7 @@ pub fn update_matcher( DeleteableMatcherProperty::Mode => matcher.mode = None, DeleteableMatcherProperty::InvertMatch => matcher.invert_match = None, DeleteableMatcherProperty::Comment => matcher.comment = None, + DeleteableMatcherProperty::Disable => matcher.disable = None, } } } @@ -113,6 +114,10 @@ pub fn update_matcher( matcher.comment = Some(comment.into()); } + if let Some(disable) = &matcher_updater.disable { + matcher.disable = Some(*disable); + } + if let Some(target) = &matcher_updater.target { super::ensure_endpoints_exist(config, target.as_slice())?; matcher.target = Some(target.clone()); @@ -209,6 +214,7 @@ matcher: matcher2 invert_match: Some(true), target: Some(vec!["foo".into()]), comment: Some("new comment".into()), + ..Default::default() }, None, Some(&digest), diff --git a/proxmox-notify/src/api/sendmail.rs b/proxmox-notify/src/api/sendmail.rs index dbd9559..1f6e9ae 100644 --- a/proxmox-notify/src/api/sendmail.rs +++ b/proxmox-notify/src/api/sendmail.rs @@ -85,6 +85,7 @@ pub fn update_endpoint( DeleteableSendmailProperty::Comment => endpoint.comment = None, DeleteableSendmailProperty::Mailto => endpoint.mailto = None, DeleteableSendmailProperty::MailtoUser => endpoint.mailto_user = None, + DeleteableSendmailProperty::Disable => endpoint.disable = None, } } } @@ -109,6 +110,10 @@ pub fn update_endpoint( endpoint.comment = Some(comment.into()); } + if let Some(disable) = &updater.disable { + endpoint.disable = Some(*disable); + } + if endpoint.mailto.is_none() && endpoint.mailto_user.is_none() { http_bail!( BAD_REQUEST, @@ -165,6 +170,7 @@ pub mod tests { author: Some("root".into()), comment: Some("Comment".into()), filter: None, + ..Default::default() }, )?; @@ -208,6 +214,7 @@ pub mod tests { from_address: Some("root@example.com".into()), author: Some("newauthor".into()), comment: Some("new comment".into()), + ..Default::default() }, None, Some(&[0; 32]), @@ -233,6 +240,7 @@ pub mod tests { from_address: Some("root@example.com".into()), author: Some("newauthor".into()), comment: Some("new comment".into()), + ..Default::default() }, None, Some(&digest), diff --git a/proxmox-notify/src/api/smtp.rs b/proxmox-notify/src/api/smtp.rs index bd9d7bb..aca08e8 100644 --- a/proxmox-notify/src/api/smtp.rs +++ b/proxmox-notify/src/api/smtp.rs @@ -100,6 +100,7 @@ pub fn update_endpoint( match deleteable_property { DeleteableSmtpProperty::Author => endpoint.author = None, DeleteableSmtpProperty::Comment => endpoint.comment = None, + DeleteableSmtpProperty::Disable => endpoint.disable = None, DeleteableSmtpProperty::Mailto => endpoint.mailto = None, DeleteableSmtpProperty::MailtoUser => endpoint.mailto_user = None, DeleteableSmtpProperty::Password => super::set_private_config_entry( @@ -158,6 +159,10 @@ pub fn update_endpoint( endpoint.comment = Some(comment.into()); } + if let Some(disable) = &updater.disable { + endpoint.disable = Some(*disable); + } + if endpoint.mailto.is_none() && endpoint.mailto_user.is_none() { http_bail!( BAD_REQUEST, @@ -215,6 +220,7 @@ pub mod tests { server: "localhost".into(), port: Some(555), username: Some("username".into()), + ..Default::default() }, &SmtpPrivateConfig { name: name.into(), diff --git a/proxmox-notify/src/endpoints/gotify.rs b/proxmox-notify/src/endpoints/gotify.rs index 5713d99..c0d1dcb 100644 --- a/proxmox-notify/src/endpoints/gotify.rs +++ b/proxmox-notify/src/endpoints/gotify.rs @@ -52,6 +52,9 @@ pub struct GotifyConfig { #[serde(skip_serializing)] #[updater(skip)] pub filter: Option, + /// Disable this target. + #[serde(skip_serializing_if = "Option::is_none")] + pub disable: Option, } #[api()] @@ -78,6 +81,7 @@ pub struct GotifyEndpoint { #[serde(rename_all = "kebab-case")] pub enum DeleteableGotifyProperty { Comment, + Disable, } impl Endpoint for GotifyEndpoint { @@ -150,4 +154,9 @@ impl Endpoint for GotifyEndpoint { fn name(&self) -> &str { &self.config.name } + + /// Check if the endpoint is disabled + fn disabled(&self) -> bool { + self.config.disable.unwrap_or_default() + } } diff --git a/proxmox-notify/src/endpoints/sendmail.rs b/proxmox-notify/src/endpoints/sendmail.rs index 4b3d5cd..f948cc6 100644 --- a/proxmox-notify/src/endpoints/sendmail.rs +++ b/proxmox-notify/src/endpoints/sendmail.rs @@ -62,14 +62,18 @@ pub struct SendmailConfig { #[serde(skip_serializing)] #[updater(skip)] pub filter: Option, + /// Disable this target. + #[serde(skip_serializing_if = "Option::is_none")] + pub disable: Option, } #[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum DeleteableSendmailProperty { - FromAddress, Author, Comment, + Disable, + FromAddress, Mailto, MailtoUser, } @@ -133,4 +137,9 @@ impl Endpoint for SendmailEndpoint { fn name(&self) -> &str { &self.config.name } + + /// Check if the endpoint is disabled + fn disabled(&self) -> bool { + self.config.disable.unwrap_or_default() + } } diff --git a/proxmox-notify/src/endpoints/smtp.rs b/proxmox-notify/src/endpoints/smtp.rs index a6899b4..83a705f 100644 --- a/proxmox-notify/src/endpoints/smtp.rs +++ b/proxmox-notify/src/endpoints/smtp.rs @@ -91,6 +91,9 @@ pub struct SmtpConfig { /// Comment #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, + /// Disable this target. + #[serde(skip_serializing_if = "Option::is_none")] + pub disable: Option, } #[derive(Serialize, Deserialize)] @@ -98,6 +101,7 @@ pub struct SmtpConfig { pub enum DeleteableSmtpProperty { Author, Comment, + Disable, Mailto, MailtoUser, Password, @@ -247,4 +251,9 @@ impl Endpoint for SmtpEndpoint { fn name(&self) -> &str { &self.config.name } + + /// Check if the endpoint is disabled + fn disabled(&self) -> bool { + self.config.disable.unwrap_or_default() + } } diff --git a/proxmox-notify/src/lib.rs b/proxmox-notify/src/lib.rs index 427f03a..4bb963a 100644 --- a/proxmox-notify/src/lib.rs +++ b/proxmox-notify/src/lib.rs @@ -139,6 +139,9 @@ pub trait Endpoint { /// The name/identifier for this endpoint fn name(&self) -> &str; + + /// Check if the endpoint is disabled + fn disabled(&self) -> bool; } #[derive(Debug, Clone)] @@ -428,6 +431,12 @@ impl Bus { if let Some(endpoint) = self.endpoints.get(target) { let name = endpoint.name(); + if endpoint.disabled() { + // Skip this target if it is disabled + log::info!("skipping disabled target '{name}'"); + continue; + } + match endpoint.send(notification) { Ok(_) => { log::info!("notified via target `{name}`"); @@ -496,6 +505,10 @@ mod tests { fn name(&self) -> &str { self.name } + + fn disabled(&self) -> bool { + false + } } impl MockEndpoint { diff --git a/proxmox-notify/src/matcher.rs b/proxmox-notify/src/matcher.rs index 553ca87..ba1577d 100644 --- a/proxmox-notify/src/matcher.rs +++ b/proxmox-notify/src/matcher.rs @@ -140,6 +140,10 @@ pub struct MatcherConfig { /// Comment #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, + + /// Disable this matcher + #[serde(skip_serializing_if = "Option::is_none")] + pub disable: Option, } trait MatchDirective { @@ -393,13 +397,14 @@ impl FromStr for CalendarMatcher { #[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum DeleteableMatcherProperty { - MatchSeverity, - MatchField, + Comment, + Disable, + InvertMatch, MatchCalendar, - Target, + MatchField, + MatchSeverity, Mode, - InvertMatch, - Comment, + Target, } pub fn check_matches<'a>( @@ -409,6 +414,12 @@ pub fn check_matches<'a>( let mut targets = HashSet::new(); for matcher in matchers { + if matcher.disable.unwrap_or_default() { + // Skip this matcher if it is disabled + log::info!("skipping disabled matcher '{name}'", name = matcher.name); + continue; + } + match matcher.matches(notification) { Ok(t) => { let t = t.unwrap_or_default(); -- 2.39.2