postfix-log-parser 0.2.0

高性能模块化Postfix日志解析器,经3.2GB生产数据验证,SMTPD事件100%准确率
Documentation
use crate::events::smtp::SmtpEvent;
use serde_json::{Map, Number, Value};

/// 格式化SMTP事件为JSON
pub fn format_smtp_event(event: &SmtpEvent) -> Map<String, Value> {
    let mut event_data = Map::new();

    match event {
        SmtpEvent::Sent {
            queue_id: _,
            to,
            relay_hostname,
            relay_ip,
            relay_port,
            delay,
            delay_before_queue,
            delay_in_queue,
            delay_connection,
            delay_transmission,
            dsn,
            status,
            message_size,
        } => {
            event_data.insert("event_type".to_string(), Value::String("sent".to_string()));
            event_data.insert("to".to_string(), Value::String(to.clone()));
            event_data.insert(
                "relay_hostname".to_string(),
                Value::String(relay_hostname.clone()),
            );

            if let Some(ip) = relay_ip {
                event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
            }
            if let Some(port) = relay_port {
                event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
            }

            event_data.insert(
                "delay".to_string(),
                Value::Number(Number::from_f64(*delay).unwrap()),
            );

            if let Some(delay_val) = delay_before_queue {
                event_data.insert(
                    "delay_before_queue".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_in_queue {
                event_data.insert(
                    "delay_in_queue".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_connection {
                event_data.insert(
                    "delay_connection".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_transmission {
                event_data.insert(
                    "delay_transmission".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }

            if let Some(dsn_val) = dsn {
                event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
            }
            event_data.insert("status".to_string(), Value::String(status.clone()));

            if let Some(size) = message_size {
                event_data.insert(
                    "message_size".to_string(),
                    Value::Number(Number::from(*size)),
                );
            }
        }
        SmtpEvent::Deferred {
            queue_id: _,
            to,
            relay_hostname,
            relay_ip,
            relay_port,
            delay,
            delay_before_queue,
            delay_in_queue,
            delay_connection,
            delay_transmission,
            dsn,
            status,
            defer_reason,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("deferred".to_string()),
            );

            if let Some(to_val) = to {
                event_data.insert("to".to_string(), Value::String(to_val.clone()));
            }
            if let Some(hostname) = relay_hostname {
                event_data.insert(
                    "relay_hostname".to_string(),
                    Value::String(hostname.clone()),
                );
            }
            if let Some(ip) = relay_ip {
                event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
            }
            if let Some(port) = relay_port {
                event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
            }
            if let Some(delay_val) = delay {
                event_data.insert(
                    "delay".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }

            if let Some(delay_val) = delay_before_queue {
                event_data.insert(
                    "delay_before_queue".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_in_queue {
                event_data.insert(
                    "delay_in_queue".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_connection {
                event_data.insert(
                    "delay_connection".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_transmission {
                event_data.insert(
                    "delay_transmission".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }

            if let Some(dsn_val) = dsn {
                event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
            }
            event_data.insert("status".to_string(), Value::String(status.clone()));
            event_data.insert(
                "defer_reason".to_string(),
                Value::String(defer_reason.clone()),
            );
        }
        SmtpEvent::Bounced {
            queue_id: _,
            to,
            relay_hostname,
            relay_ip,
            relay_port,
            delay,
            delay_before_queue,
            delay_in_queue,
            delay_connection,
            delay_transmission,
            dsn,
            status,
            bounce_reason,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("bounced".to_string()),
            );
            event_data.insert("to".to_string(), Value::String(to.clone()));

            if let Some(hostname) = relay_hostname {
                event_data.insert(
                    "relay_hostname".to_string(),
                    Value::String(hostname.clone()),
                );
            }
            if let Some(ip) = relay_ip {
                event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
            }
            if let Some(port) = relay_port {
                event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
            }
            if let Some(delay_val) = delay {
                event_data.insert(
                    "delay".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }

            if let Some(delay_val) = delay_before_queue {
                event_data.insert(
                    "delay_before_queue".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_in_queue {
                event_data.insert(
                    "delay_in_queue".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_connection {
                event_data.insert(
                    "delay_connection".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }
            if let Some(delay_val) = delay_transmission {
                event_data.insert(
                    "delay_transmission".to_string(),
                    Value::Number(Number::from_f64(*delay_val).unwrap()),
                );
            }

            if let Some(dsn_val) = dsn {
                event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
            }
            event_data.insert("status".to_string(), Value::String(status.clone()));
            event_data.insert(
                "bounce_reason".to_string(),
                Value::String(bounce_reason.clone()),
            );
        }
        SmtpEvent::ConnectionTimeout {
            queue_id: _,
            target_hostname,
            target_ip,
            target_port,
            timeout_duration,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("connection_timeout".to_string()),
            );
            event_data.insert(
                "target_hostname".to_string(),
                Value::String(target_hostname.clone()),
            );
            event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
            event_data.insert(
                "target_port".to_string(),
                Value::Number(Number::from(*target_port)),
            );

            if let Some(duration) = timeout_duration {
                event_data.insert(
                    "timeout_duration".to_string(),
                    Value::Number(Number::from(*duration)),
                );
            }
        }
        SmtpEvent::ConnectionRefused {
            queue_id: _,
            target_hostname,
            target_ip,
            target_port,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("connection_refused".to_string()),
            );
            event_data.insert(
                "target_hostname".to_string(),
                Value::String(target_hostname.clone()),
            );
            event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
            event_data.insert(
                "target_port".to_string(),
                Value::Number(Number::from(*target_port)),
            );
        }
        SmtpEvent::ConnectionLost {
            queue_id: _,
            target_hostname,
            target_ip,
            lost_stage,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("connection_lost".to_string()),
            );
            event_data.insert(
                "target_hostname".to_string(),
                Value::String(target_hostname.clone()),
            );
            event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
            event_data.insert("lost_stage".to_string(), Value::String(lost_stage.clone()));
        }
        SmtpEvent::ProtocolInteraction {
            queue_id: _,
            interaction_type,
            details,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("protocol_interaction".to_string()),
            );
            event_data.insert(
                "interaction_type".to_string(),
                Value::String(interaction_type.clone()),
            );
            event_data.insert("details".to_string(), Value::String(details.clone()));
        }
        SmtpEvent::Other {
            queue_id: _,
            event_type,
            message,
        } => {
            event_data.insert("event_type".to_string(), Value::String(event_type.clone()));
            event_data.insert("message".to_string(), Value::String(message.clone()));
        }
    }

    event_data
}