[pve-devel] [PATCH v2 proxmox 14/52] notify: add 'disable' parameter for matchers and targets.
Lukas Wagner
l.wagner at proxmox.com
Tue Nov 14 13:59:22 CET 2023
Signed-off-by: Lukas Wagner <l.wagner at proxmox.com>
---
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 at 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 at 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<String>,
+ /// Disable this target.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub disable: Option<bool>,
}
#[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<String>,
+ /// Disable this target.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub disable: Option<bool>,
}
#[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<String>,
+ /// Disable this target.
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub disable: Option<bool>,
}
#[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<String>,
+
+ /// Disable this matcher
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub disable: Option<bool>,
}
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
More information about the pve-devel
mailing list