use std::path::Path;
use crate::Result;
use crate::event::{EndReason, FlowEvent, FlowStats};
use crate::extract::{FiveTuple, FiveTupleKey};
use crate::pcap::PcapFlowSource;
use crate::tracker::FlowTracker;
pub type FlowSummary = (FiveTupleKey, FlowStats, EndReason);
pub fn flow_summaries<P: AsRef<Path>>(path: P) -> Result<impl Iterator<Item = FlowSummary>> {
let mut tracker: FlowTracker<FiveTuple, ()> = FlowTracker::new(FiveTuple::bidirectional());
let mut out: Vec<FlowSummary> = Vec::new();
for view in PcapFlowSource::open(path)?.views() {
let view = view?;
for ev in tracker.track(&view) {
if let FlowEvent::Ended {
key, stats, reason, ..
} = ev
{
out.push((key, stats, reason));
}
}
}
for ev in tracker.finish() {
if let FlowEvent::Ended {
key, stats, reason, ..
} = ev
{
out.push((key, stats, reason));
}
}
Ok(out.into_iter())
}
#[deprecated(
since = "0.20.0",
note = "renamed to `flowscope::pcap::flow_summaries`"
)]
pub fn flow_summaries_from_pcap<P: AsRef<Path>>(
path: P,
) -> Result<impl Iterator<Item = FlowSummary>> {
flow_summaries(path)
}