Update the entry parser
The latest OpenSMTPD draft added the timeout event, it therefore has been added to the parser. As shown in the new sessions examples, the timestamp format changed and the parameters are also optional.
This commit is contained in:
parent
98e4beadd3
commit
a6b9d18374
3 changed files with 51 additions and 16 deletions
|
@ -1,4 +1,10 @@
|
||||||
report|1|1544130229|smtp-in|tx-mail|4b0148c60f798628|fc08ce7d|<owner-hackers+M85937=gilles=poolp.org@openbsd.org>|ok
|
report|1|1546681202.276920|smtp-in|link-connect|dbd829906c50e764|localhost|pass|127.0.0.1:34818|127.0.0.1:25
|
||||||
report|1|1544130229|smtp-in|tx-mail|0f3004c08c82d33e|fc08ce7d|<owner-hackers+M85937=gilles=poolp.org@openbsd.org>|ok
|
report|1|1546681202.277715|smtp-in|filter-response|dbd829906c50e764|connected|proceed
|
||||||
report|1|1544130229|smtp-in|tx-rcpt|4b0148c60f798628|fc08ce7d|<gilles@poolp.org>|ok
|
report|1|1546681202.276920|smtp-in|link-connect|4b0148c60f798628|localhost|pass|127.0.0.1:34818|127.0.0.1:25
|
||||||
report|1|1544130229|smtp-in|tx-rcpt|0f3004c08c82d33e|fc08ce7d|<gilles@poolp.org>|ok
|
report|1|1546681202.277715|smtp-in|filter-response|4b0148c60f798628|connected|proceed
|
||||||
|
report|1|1546681202.277761|smtp-in|protocol-server|dbd829906c50e764|220 laptop.home ESMTP OpenSMTPD
|
||||||
|
report|1|1546681232.283049|smtp-in|timeout|dbd829906c50e764
|
||||||
|
report|1|1546681202.277761|smtp-in|protocol-server|4b0148c60f798628|220 laptop.home ESMTP OpenSMTPD
|
||||||
|
report|1|1546681232.283049|smtp-in|timeout|4b0148c60f798628
|
||||||
|
report|1|1546681232.283083|smtp-in|link-disconnect|dbd829906c50e764
|
||||||
|
report|1|1546681232.283083|smtp-in|link-disconnect|4b0148c60f798628
|
||||||
|
|
|
@ -1,2 +1,5 @@
|
||||||
report|1|1544130229|smtp-in|tx-mail|0f3004c08c82d33e|fc08ce7d|<owner-hackers+M85937=gilles=poolp.org@openbsd.org>|ok
|
report|1|1546681202.276920|smtp-in|link-connect|dbd829906c50e764|localhost|pass|127.0.0.1:34818|127.0.0.1:25
|
||||||
report|1|1544130229|smtp-in|tx-rcpt|0f3004c08c82d33e|fc08ce7d|<gilles@poolp.org>|ok
|
report|1|1546681202.277715|smtp-in|filter-response|dbd829906c50e764|connected|proceed
|
||||||
|
report|1|1546681202.277761|smtp-in|protocol-server|dbd829906c50e764|220 laptop.home ESMTP OpenSMTPD
|
||||||
|
report|1|1546681232.283049|smtp-in|timeout|dbd829906c50e764
|
||||||
|
report|1|1546681232.283083|smtp-in|link-disconnect|dbd829906c50e764
|
||||||
|
|
46
src/entry.rs
46
src/entry.rs
|
@ -1,20 +1,20 @@
|
||||||
use crate::errors::Error;
|
use crate::errors::Error;
|
||||||
use nom::{alt, alt_complete, call, complete, cond, do_parse, error_position, map_res, named, tag,
|
use nom::{alt, alt_complete, call, complete, cond, do_parse, error_position, map_res, named, opt,
|
||||||
take_until, take_while};
|
tag, take_until, take_while};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub enum Kind {
|
pub enum Kind {
|
||||||
Report,
|
Report,
|
||||||
Filter,
|
Filter,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub enum Subsystem {
|
pub enum Subsystem {
|
||||||
SmtpIn,
|
SmtpIn,
|
||||||
SmtpOut,
|
SmtpOut,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
LinkConnect,
|
LinkConnect,
|
||||||
LinkDisconnect,
|
LinkDisconnect,
|
||||||
|
@ -29,6 +29,7 @@ pub enum Event {
|
||||||
TxRollback,
|
TxRollback,
|
||||||
ProtocolClient,
|
ProtocolClient,
|
||||||
ProtocolServer,
|
ProtocolServer,
|
||||||
|
Timeout,
|
||||||
FilterResponse,
|
FilterResponse,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +42,7 @@ pub struct Entry {
|
||||||
pub event: Event,
|
pub event: Event,
|
||||||
pub token: Option<u64>,
|
pub token: Option<u64>,
|
||||||
pub session_id: u64,
|
pub session_id: u64,
|
||||||
pub params: String,
|
pub params: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ascii_digit(c: char) -> bool {
|
fn is_ascii_digit(c: char) -> bool {
|
||||||
|
@ -56,6 +57,10 @@ fn to_u8(s: &str) -> Result<u8, std::num::ParseIntError> {
|
||||||
s.parse()
|
s.parse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn to_i32(s: &str) -> Result<i32, std::num::ParseIntError> {
|
||||||
|
s.parse()
|
||||||
|
}
|
||||||
|
|
||||||
fn to_u64(s: &str) -> Result<u64, std::num::ParseIntError> {
|
fn to_u64(s: &str) -> Result<u64, std::num::ParseIntError> {
|
||||||
s.parse()
|
s.parse()
|
||||||
}
|
}
|
||||||
|
@ -93,14 +98,28 @@ named!(parse_event<&str, Event>,
|
||||||
tag!("tx-rollback") => { |_| Event::TxRollback } |
|
tag!("tx-rollback") => { |_| Event::TxRollback } |
|
||||||
tag!("protocol-client") => { |_| Event::ProtocolClient } |
|
tag!("protocol-client") => { |_| Event::ProtocolClient } |
|
||||||
tag!("protocol-server") => { |_| Event::ProtocolServer } |
|
tag!("protocol-server") => { |_| Event::ProtocolServer } |
|
||||||
|
tag!("timeout") => { |_| Event::Timeout } |
|
||||||
tag!("filter-response") => { |_| Event::FilterResponse }
|
tag!("filter-response") => { |_| Event::FilterResponse }
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
named!(parse_timestamp<&str, u64>,
|
||||||
|
do_parse!(
|
||||||
|
sec: parse_u64 >>
|
||||||
|
tag!(".") >>
|
||||||
|
nsec: parse_i32 >>
|
||||||
|
(sec)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
named!(parse_version<&str, u8>,
|
named!(parse_version<&str, u8>,
|
||||||
map_res!(take_while!(is_ascii_digit), to_u8)
|
map_res!(take_while!(is_ascii_digit), to_u8)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
named!(parse_i32<&str, i32>,
|
||||||
|
map_res!(take_while!(is_ascii_digit), to_i32)
|
||||||
|
);
|
||||||
|
|
||||||
named!(parse_u64<&str, u64>,
|
named!(parse_u64<&str, u64>,
|
||||||
map_res!(take_while!(is_ascii_digit), to_u64)
|
map_res!(take_while!(is_ascii_digit), to_u64)
|
||||||
);
|
);
|
||||||
|
@ -117,6 +136,14 @@ named!(parse_token<&str, u64>,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
named!(parse_params<&str, String>,
|
||||||
|
do_parse!(
|
||||||
|
tag!("|") >>
|
||||||
|
s: take_until!("\n") >>
|
||||||
|
(s.to_string())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
named!(
|
named!(
|
||||||
parse_entry<&str, Entry>,
|
parse_entry<&str, Entry>,
|
||||||
do_parse!(
|
do_parse!(
|
||||||
|
@ -124,7 +151,7 @@ named!(
|
||||||
tag!("|") >>
|
tag!("|") >>
|
||||||
version: parse_version >>
|
version: parse_version >>
|
||||||
tag!("|") >>
|
tag!("|") >>
|
||||||
timestamp: parse_u64 >>
|
timestamp: parse_timestamp >>
|
||||||
tag!("|") >>
|
tag!("|") >>
|
||||||
subsystem: parse_subsystem >>
|
subsystem: parse_subsystem >>
|
||||||
tag!("|") >>
|
tag!("|") >>
|
||||||
|
@ -132,8 +159,7 @@ named!(
|
||||||
tag!("|") >>
|
tag!("|") >>
|
||||||
token: cond!(kind == Kind::Filter, parse_token) >>
|
token: cond!(kind == Kind::Filter, parse_token) >>
|
||||||
session_id: parse_u64_hex >>
|
session_id: parse_u64_hex >>
|
||||||
tag!("|") >>
|
params: opt!(parse_params) >>
|
||||||
params: take_until!("\n") >>
|
|
||||||
(Entry {
|
(Entry {
|
||||||
kind,
|
kind,
|
||||||
version,
|
version,
|
||||||
|
@ -142,7 +168,7 @@ named!(
|
||||||
event,
|
event,
|
||||||
token,
|
token,
|
||||||
session_id,
|
session_id,
|
||||||
params: params.to_string(),
|
params: params,
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
Reference in a new issue