use clap::{Parser, ValueEnum};
use netgauze_pcap_decoder::{
BgpProtocolHandler, BmpProtocolHandler, Config, FlowProtocolHandler, UdpNotifProtocolHandler,
load_pcap_and_process,
};
use std::path::PathBuf;
#[derive(Debug, Clone, ValueEnum)]
pub enum ProtocolToDecode {
BGP,
BMP,
Flow,
UDPNotif,
}
#[derive(Debug, Parser)]
#[command(long_about = None)]
struct Cli {
#[clap(short, long)]
input: String,
#[clap(short, long)]
output: Option<String>,
#[clap(long, value_enum)]
protocol: ProtocolToDecode,
#[clap(long, value_delimiter = ',', required = true)]
ports: Vec<u16>,
#[clap(short = 'c', long)]
input_count: Option<usize>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
let config = Config {
pcap_path: cli
.input
.parse::<PathBuf>()
.expect("Failed to parse pcap path"),
output_path: cli.output.map(PathBuf::from),
input_size: cli.input_count,
dest_ports: cli.ports,
};
match cli.protocol {
ProtocolToDecode::BGP => {
let bgp_handler = BgpProtocolHandler::new(config.dest_ports.clone());
load_pcap_and_process(&config, &bgp_handler)?;
}
ProtocolToDecode::BMP => {
let bmp_handler = BmpProtocolHandler::new(config.dest_ports.clone());
load_pcap_and_process(&config, &bmp_handler)?;
}
ProtocolToDecode::Flow => {
let flow_handler = FlowProtocolHandler::new(config.dest_ports.clone());
load_pcap_and_process(&config, &flow_handler)?;
}
ProtocolToDecode::UDPNotif => {
let udp_notif_handler = UdpNotifProtocolHandler::new(config.dest_ports.clone());
load_pcap_and_process(&config, &udp_notif_handler)?;
}
}
Ok(())
}