Skip to main content

max / makenotwork

3.1 KB · 109 lines History Blame Raw
1 //! tls alert/recovery messages. Domain half of the Alerter split;
2 //! shared dispatch/cooldown plumbing lives in the parent module.
3
4 use tracing::instrument;
5
6 use super::{AlertCategory, AlertMeta, Alerter, tls_expiry_priority};
7
8 impl Alerter {
9 #[instrument(skip_all)]
10 pub async fn send_tls_expiry_alert(
11 &self,
12 target: &str,
13 host: &str,
14 days_remaining: i64,
15 not_after: &str,
16 ) {
17 let alert_key = format!("tls:{target}");
18 let subject = format!("[PoM] {target}: TLS cert expires in {days_remaining} days");
19 let body = format!(
20 "Target: {target}\n\
21 Host: {host}\n\
22 Days remaining: {days_remaining}\n\
23 Expires: {not_after}\n\
24 Instance: {}\n\
25 Time: {}\n\n\
26 - PoM",
27 self.instance_name,
28 chrono::Utc::now().to_rfc3339(),
29 );
30
31 let priority = tls_expiry_priority(days_remaining);
32 self.fire_failure(
33 &subject,
34 &body,
35 priority,
36 "pom-tls",
37 Some(&format!("{target}:{host}")),
38 AlertMeta {
39 key: &alert_key,
40 category: AlertCategory::TlsExpiry,
41 from: None,
42 to: None,
43 error: None,
44 },
45 )
46 .await;
47 }
48
49 #[instrument(skip_all)]
50 pub async fn send_tls_error_alert(&self, target: &str, host: &str, error: &str) {
51 let alert_key = format!("tls:{target}");
52 let subject = format!("[PoM] {target}: TLS check failed");
53 let body = format!(
54 "Target: {target}\n\
55 Host: {host}\n\
56 Error: {error}\n\
57 Instance: {}\n\
58 Time: {}\n\n\
59 - PoM",
60 self.instance_name,
61 chrono::Utc::now().to_rfc3339(),
62 );
63
64 self.fire_failure(
65 &subject,
66 &body,
67 "high",
68 "pom-tls",
69 Some(&format!("{target}:{host}")),
70 AlertMeta {
71 key: &alert_key,
72 category: AlertCategory::TlsError,
73 from: None,
74 to: None,
75 error: Some(error),
76 },
77 )
78 .await;
79 }
80
81 #[instrument(skip_all)]
82 pub async fn send_tls_recovery(&self, target: &str, label: &str, days_remaining: i64) {
83 let alert_key = format!("tls:{target}");
84 let subject = format!("[PoM] {target}: TLS cert renewed");
85 let body = format!(
86 "Target: {label} ({target})\n\
87 Days remaining: {days_remaining}\n\
88 Instance: {}\n\
89 Time: {}\n\n\
90 - PoM",
91 self.instance_name,
92 chrono::Utc::now().to_rfc3339(),
93 );
94
95 self.fire_recovery(
96 &subject,
97 &body,
98 AlertMeta {
99 key: &alert_key,
100 category: AlertCategory::TlsRecovery,
101 from: None,
102 to: None,
103 error: None,
104 },
105 )
106 .await;
107 }
108 }
109