postfix_log_parser/formatters/json/
smtp.rs1use crate::events::smtp::SmtpEvent;
2use serde_json::{Map, Number, Value};
3
4pub fn format_smtp_event(event: &SmtpEvent) -> Map<String, Value> {
6 let mut event_data = Map::new();
7
8 match event {
9 SmtpEvent::Sent {
10 queue_id: _,
11 to,
12 relay_hostname,
13 relay_ip,
14 relay_port,
15 delay,
16 delay_before_queue,
17 delay_in_queue,
18 delay_connection,
19 delay_transmission,
20 dsn,
21 status,
22 message_size,
23 } => {
24 event_data.insert("event_type".to_string(), Value::String("sent".to_string()));
25 event_data.insert("to".to_string(), Value::String(to.clone()));
26 event_data.insert(
27 "relay_hostname".to_string(),
28 Value::String(relay_hostname.clone()),
29 );
30
31 if let Some(ip) = relay_ip {
32 event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
33 }
34 if let Some(port) = relay_port {
35 event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
36 }
37
38 event_data.insert(
39 "delay".to_string(),
40 Value::Number(Number::from_f64(*delay).unwrap()),
41 );
42
43 if let Some(delay_val) = delay_before_queue {
44 event_data.insert(
45 "delay_before_queue".to_string(),
46 Value::Number(Number::from_f64(*delay_val).unwrap()),
47 );
48 }
49 if let Some(delay_val) = delay_in_queue {
50 event_data.insert(
51 "delay_in_queue".to_string(),
52 Value::Number(Number::from_f64(*delay_val).unwrap()),
53 );
54 }
55 if let Some(delay_val) = delay_connection {
56 event_data.insert(
57 "delay_connection".to_string(),
58 Value::Number(Number::from_f64(*delay_val).unwrap()),
59 );
60 }
61 if let Some(delay_val) = delay_transmission {
62 event_data.insert(
63 "delay_transmission".to_string(),
64 Value::Number(Number::from_f64(*delay_val).unwrap()),
65 );
66 }
67
68 if let Some(dsn_val) = dsn {
69 event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
70 }
71 event_data.insert("status".to_string(), Value::String(status.clone()));
72
73 if let Some(size) = message_size {
74 event_data.insert(
75 "message_size".to_string(),
76 Value::Number(Number::from(*size)),
77 );
78 }
79 }
80 SmtpEvent::Deferred {
81 queue_id: _,
82 to,
83 relay_hostname,
84 relay_ip,
85 relay_port,
86 delay,
87 delay_before_queue,
88 delay_in_queue,
89 delay_connection,
90 delay_transmission,
91 dsn,
92 status,
93 defer_reason,
94 } => {
95 event_data.insert(
96 "event_type".to_string(),
97 Value::String("deferred".to_string()),
98 );
99
100 if let Some(to_val) = to {
101 event_data.insert("to".to_string(), Value::String(to_val.clone()));
102 }
103 if let Some(hostname) = relay_hostname {
104 event_data.insert(
105 "relay_hostname".to_string(),
106 Value::String(hostname.clone()),
107 );
108 }
109 if let Some(ip) = relay_ip {
110 event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
111 }
112 if let Some(port) = relay_port {
113 event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
114 }
115 if let Some(delay_val) = delay {
116 event_data.insert(
117 "delay".to_string(),
118 Value::Number(Number::from_f64(*delay_val).unwrap()),
119 );
120 }
121
122 if let Some(delay_val) = delay_before_queue {
123 event_data.insert(
124 "delay_before_queue".to_string(),
125 Value::Number(Number::from_f64(*delay_val).unwrap()),
126 );
127 }
128 if let Some(delay_val) = delay_in_queue {
129 event_data.insert(
130 "delay_in_queue".to_string(),
131 Value::Number(Number::from_f64(*delay_val).unwrap()),
132 );
133 }
134 if let Some(delay_val) = delay_connection {
135 event_data.insert(
136 "delay_connection".to_string(),
137 Value::Number(Number::from_f64(*delay_val).unwrap()),
138 );
139 }
140 if let Some(delay_val) = delay_transmission {
141 event_data.insert(
142 "delay_transmission".to_string(),
143 Value::Number(Number::from_f64(*delay_val).unwrap()),
144 );
145 }
146
147 if let Some(dsn_val) = dsn {
148 event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
149 }
150 event_data.insert("status".to_string(), Value::String(status.clone()));
151 event_data.insert(
152 "defer_reason".to_string(),
153 Value::String(defer_reason.clone()),
154 );
155 }
156 SmtpEvent::Bounced {
157 queue_id: _,
158 to,
159 relay_hostname,
160 relay_ip,
161 relay_port,
162 delay,
163 delay_before_queue,
164 delay_in_queue,
165 delay_connection,
166 delay_transmission,
167 dsn,
168 status,
169 bounce_reason,
170 } => {
171 event_data.insert(
172 "event_type".to_string(),
173 Value::String("bounced".to_string()),
174 );
175 event_data.insert("to".to_string(), Value::String(to.clone()));
176
177 if let Some(hostname) = relay_hostname {
178 event_data.insert(
179 "relay_hostname".to_string(),
180 Value::String(hostname.clone()),
181 );
182 }
183 if let Some(ip) = relay_ip {
184 event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
185 }
186 if let Some(port) = relay_port {
187 event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
188 }
189 if let Some(delay_val) = delay {
190 event_data.insert(
191 "delay".to_string(),
192 Value::Number(Number::from_f64(*delay_val).unwrap()),
193 );
194 }
195
196 if let Some(delay_val) = delay_before_queue {
197 event_data.insert(
198 "delay_before_queue".to_string(),
199 Value::Number(Number::from_f64(*delay_val).unwrap()),
200 );
201 }
202 if let Some(delay_val) = delay_in_queue {
203 event_data.insert(
204 "delay_in_queue".to_string(),
205 Value::Number(Number::from_f64(*delay_val).unwrap()),
206 );
207 }
208 if let Some(delay_val) = delay_connection {
209 event_data.insert(
210 "delay_connection".to_string(),
211 Value::Number(Number::from_f64(*delay_val).unwrap()),
212 );
213 }
214 if let Some(delay_val) = delay_transmission {
215 event_data.insert(
216 "delay_transmission".to_string(),
217 Value::Number(Number::from_f64(*delay_val).unwrap()),
218 );
219 }
220
221 if let Some(dsn_val) = dsn {
222 event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
223 }
224 event_data.insert("status".to_string(), Value::String(status.clone()));
225 event_data.insert(
226 "bounce_reason".to_string(),
227 Value::String(bounce_reason.clone()),
228 );
229 }
230 SmtpEvent::ConnectionTimeout {
231 queue_id: _,
232 target_hostname,
233 target_ip,
234 target_port,
235 timeout_duration,
236 } => {
237 event_data.insert(
238 "event_type".to_string(),
239 Value::String("connection_timeout".to_string()),
240 );
241 event_data.insert(
242 "target_hostname".to_string(),
243 Value::String(target_hostname.clone()),
244 );
245 event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
246 event_data.insert(
247 "target_port".to_string(),
248 Value::Number(Number::from(*target_port)),
249 );
250
251 if let Some(duration) = timeout_duration {
252 event_data.insert(
253 "timeout_duration".to_string(),
254 Value::Number(Number::from(*duration)),
255 );
256 }
257 }
258 SmtpEvent::ConnectionRefused {
259 queue_id: _,
260 target_hostname,
261 target_ip,
262 target_port,
263 } => {
264 event_data.insert(
265 "event_type".to_string(),
266 Value::String("connection_refused".to_string()),
267 );
268 event_data.insert(
269 "target_hostname".to_string(),
270 Value::String(target_hostname.clone()),
271 );
272 event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
273 event_data.insert(
274 "target_port".to_string(),
275 Value::Number(Number::from(*target_port)),
276 );
277 }
278 SmtpEvent::ConnectionLost {
279 queue_id: _,
280 target_hostname,
281 target_ip,
282 lost_stage,
283 } => {
284 event_data.insert(
285 "event_type".to_string(),
286 Value::String("connection_lost".to_string()),
287 );
288 event_data.insert(
289 "target_hostname".to_string(),
290 Value::String(target_hostname.clone()),
291 );
292 event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
293 event_data.insert("lost_stage".to_string(), Value::String(lost_stage.clone()));
294 }
295 SmtpEvent::ProtocolInteraction {
296 queue_id: _,
297 interaction_type,
298 details,
299 } => {
300 event_data.insert(
301 "event_type".to_string(),
302 Value::String("protocol_interaction".to_string()),
303 );
304 event_data.insert(
305 "interaction_type".to_string(),
306 Value::String(interaction_type.clone()),
307 );
308 event_data.insert("details".to_string(), Value::String(details.clone()));
309 }
310 SmtpEvent::Other {
311 queue_id: _,
312 event_type,
313 message,
314 } => {
315 event_data.insert("event_type".to_string(), Value::String(event_type.clone()));
316 event_data.insert("message".to_string(), Value::String(message.clone()));
317 }
318 }
319
320 event_data
321}