pub mod builder;
pub mod expr;
pub mod flow;
pub(crate) mod kernel_filter;
pub mod packet;
pub mod predicate;
pub mod session;
pub use builder::{
FlowTier, HasHttpHost, HasQname, HasSni, PacketTier, SessionTier, SubscriptionBuilder, flow,
packet, session,
};
pub use expr::{ParseError, parse as parse_expr};
pub use flow::{FlowHandler, FlowSubscription};
pub use packet::{PacketHandler, PacketSubscription};
pub use predicate::{Atom, FieldSource, Glob, Predicate};
pub use session::{L7Fields, SessionHandler, SessionSubscription};
pub trait Subscribable {
fn install(self, builder: crate::monitor::MonitorBuilder) -> crate::monitor::MonitorBuilder;
}
impl Subscribable for PacketSubscription {
fn install(self, builder: crate::monitor::MonitorBuilder) -> crate::monitor::MonitorBuilder {
builder.add_packet_sub(self)
}
}
impl<P: crate::protocol::FlowProtocol> Subscribable for FlowSubscription<P> {
fn install(self, builder: crate::monitor::MonitorBuilder) -> crate::monitor::MonitorBuilder {
let pred = self.predicate;
let user = self.handler;
builder.on_ctx::<crate::protocol::event_typed::FlowEnded<P>>(
move |evt: &crate::protocol::event_typed::FlowEnded<P>,
ctx: &mut crate::ctx::Ctx<'_>| {
if pred.eval(&flow::FlowEndedFields { evt }) {
user(evt, ctx)
} else {
Ok(())
}
},
)
}
}
impl<P> Subscribable for SessionSubscription<P>
where
P: crate::protocol::MessageProtocol,
P::Message: session::L7Fields,
{
fn install(self, builder: crate::monitor::MonitorBuilder) -> crate::monitor::MonitorBuilder {
let pred = self.predicate;
let user = self.handler;
builder.on_ctx::<P>(move |msg: &P::Message, ctx: &mut crate::ctx::Ctx<'_>| {
let fields = session::SessionFields { key: ctx.flow, msg };
if pred.eval(&fields) {
user(msg, ctx)
} else {
Ok(())
}
})
}
}