added regex parser to config
This commit is contained in:
parent
cb973851d6
commit
2930cdd2ac
|
@ -15,6 +15,7 @@ const PCAP_SIGNATURE_BE: [u8; 4] = [0xa1, 0xb2, 0xc3, 0xa1];
|
||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub filter: String,
|
pub filter: String,
|
||||||
|
pub regex_filter: String,
|
||||||
pub insert_max: usize,
|
pub insert_max: usize,
|
||||||
pub pcap_file: String,
|
pub pcap_file: String,
|
||||||
pub connection: String,
|
pub connection: String,
|
||||||
|
@ -28,6 +29,7 @@ pub fn from_json_file() -> Option<Config> {
|
||||||
let json: serde_json::Value = serde_json::from_reader(config_file).unwrap();
|
let json: serde_json::Value = serde_json::from_reader(config_file).unwrap();
|
||||||
Some(Config {
|
Some(Config {
|
||||||
filter: json.get("filter").unwrap().as_str().unwrap().to_owned(),
|
filter: json.get("filter").unwrap().as_str().unwrap().to_owned(),
|
||||||
|
regex_filter: json.get("regex_filter").unwrap().as_str().unwrap().to_owned(),
|
||||||
insert_max: json.get("insert_max").unwrap().as_u64().unwrap() as usize,
|
insert_max: json.get("insert_max").unwrap().as_u64().unwrap() as usize,
|
||||||
pcap_file: json.get("pcap_file").unwrap().as_str().unwrap().to_owned(),
|
pcap_file: json.get("pcap_file").unwrap().as_str().unwrap().to_owned(),
|
||||||
connection: format!(
|
connection: format!(
|
||||||
|
|
|
@ -60,7 +60,7 @@ async fn main() -> Result<(), Error> {
|
||||||
false => for _pcap_file in pcap_map.keys() {
|
false => for _pcap_file in pcap_map.keys() {
|
||||||
println!("{:?}",&_pcap_file);
|
println!("{:?}",&_pcap_file);
|
||||||
// TODO: Tuning vector capacity according to actuarial excpectation, mean average & std dev of packet size
|
// TODO: Tuning vector capacity according to actuarial excpectation, mean average & std dev of packet size
|
||||||
let v: Vec<parser::QryData> = parser::parse(&_pcap_file, &config.filter);
|
let v: Vec<parser::QryData> = parser::parse(&_pcap_file, &config.filter, &config.regex_filter);
|
||||||
//let mut v = Vec::<parser::QryData>::with_capacity(35536);
|
//let mut v = Vec::<parser::QryData>::with_capacity(35536);
|
||||||
//v.extend(parser::parse(&_pcap_file, &config.filter));
|
//v.extend(parser::parse(&_pcap_file, &config.filter));
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ async fn main() -> Result<(), Error> {
|
||||||
let insert_str = query_string(&config.insert_max);
|
let insert_str = query_string(&config.insert_max);
|
||||||
let statement = client.prepare(&insert_str).await?;
|
let statement = client.prepare(&insert_str).await?;
|
||||||
loop {
|
loop {
|
||||||
let v: Vec<parser::QryData> = parser::parse_device(&config.device, &config.filter, &config.insert_max);
|
let v: Vec<parser::QryData> = parser::parse_device(&config.device, &config.filter, &config.insert_max, &config.regex_filter);
|
||||||
let packets_serialized = serializer::serialize_packets(v);
|
let packets_serialized = serializer::serialize_packets(v);
|
||||||
client
|
client
|
||||||
.query_raw(
|
.query_raw(
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
{
|
{
|
||||||
"insert_max": 10000,
|
"insert_max": 20000,
|
||||||
"filter": "tcp && !ip6",
|
"filter": "!vlan && !ip6 && tcp",
|
||||||
|
"regex_filter": "192.168.0.13",
|
||||||
"from_device": false,
|
"from_device": false,
|
||||||
"parse_device": "enp7s0",
|
"parse_device": "enp7s0",
|
||||||
"pcap_file": "../target/arp_test.pcapng",
|
"pcap_file": "",
|
||||||
"pcap_dir": "../target",
|
"pcap_dir": "../target",
|
||||||
"database_user": "postgres",
|
"database_user": "postgres",
|
||||||
"database_host": "localhost",
|
"database_host": "localhost",
|
||||||
|
|
|
@ -44,7 +44,8 @@ pub struct QryData {
|
||||||
fn flag_carnage(re: &Regex, payload: &[u8]) -> Option<String> {
|
fn flag_carnage(re: &Regex, payload: &[u8]) -> Option<String> {
|
||||||
let mut flags: String = String::new();
|
let mut flags: String = String::new();
|
||||||
for mat in re.find_iter(payload) {
|
for mat in re.find_iter(payload) {
|
||||||
flags.push_str(std::str::from_utf8(mat.as_bytes()).unwrap());
|
flags.push_str(&format!("{} ",std::str::from_utf8(mat.as_bytes()).unwrap()));
|
||||||
|
//flags.push_str(" ");
|
||||||
}
|
}
|
||||||
match 0 < flags.len() {
|
match 0 < flags.len() {
|
||||||
false => None,
|
false => None,
|
||||||
|
@ -52,9 +53,8 @@ fn flag_carnage(re: &Regex, payload: &[u8]) -> Option<String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse(parse_file: &std::path::Path, filter_str: &str) -> Vec<QryData> {
|
pub fn parse(parse_file: &std::path::Path, filter_str: &str, regex_filter: &str) -> Vec<QryData> {
|
||||||
let ether_init = build_ether();
|
let ether_init = build_ether();
|
||||||
|
|
||||||
let mut me = QryData {
|
let mut me = QryData {
|
||||||
id: 0,
|
id: 0,
|
||||||
time: 0.0,
|
time: 0.0,
|
||||||
|
@ -71,7 +71,7 @@ pub fn parse(parse_file: &std::path::Path, filter_str: &str) -> Vec<QryData> {
|
||||||
|
|
||||||
let mut cap = Capture::from_file(parse_file).unwrap();
|
let mut cap = Capture::from_file(parse_file).unwrap();
|
||||||
Capture::filter(&mut cap, &filter_str).unwrap();
|
Capture::filter(&mut cap, &filter_str).unwrap();
|
||||||
let re = Regex::new(r"(?:http|https):[[::punct::]]?").unwrap();
|
let re = Regex::new(regex_filter).unwrap();
|
||||||
while let Ok(packet) = cap.next() {
|
while let Ok(packet) = cap.next() {
|
||||||
me.time = (packet.header.ts.tv_usec as f64 / 1000000.0) + packet.header.ts.tv_sec as f64;
|
me.time = (packet.header.ts.tv_usec as f64 / 1000000.0) + packet.header.ts.tv_sec as f64;
|
||||||
me.data = Some(packet.data.to_vec());
|
me.data = Some(packet.data.to_vec());
|
||||||
|
@ -152,7 +152,7 @@ pub fn parse(parse_file: &std::path::Path, filter_str: &str) -> Vec<QryData> {
|
||||||
|
|
||||||
|
|
||||||
/* This could need some love */
|
/* This could need some love */
|
||||||
pub fn parse_device(parse_device: &str, filter_str: &str, insert_max: &usize) -> Vec<QryData> {
|
pub fn parse_device(parse_device: &str, filter_str: &str, insert_max: &usize, regex_filter: &str) -> Vec<QryData> {
|
||||||
let ether_init = build_ether();
|
let ether_init = build_ether();
|
||||||
|
|
||||||
let mut me = QryData {
|
let mut me = QryData {
|
||||||
|
@ -171,7 +171,7 @@ pub fn parse_device(parse_device: &str, filter_str: &str, insert_max: &usize) ->
|
||||||
let mut cap = Capture::from_device(parse_device).unwrap().open().unwrap();
|
let mut cap = Capture::from_device(parse_device).unwrap().open().unwrap();
|
||||||
Capture::filter(&mut cap, &filter_str).unwrap();
|
Capture::filter(&mut cap, &filter_str).unwrap();
|
||||||
|
|
||||||
let re = Regex::new(r"(?:http|https):[[::punct::]]").unwrap();
|
let re = Regex::new(regex_filter).unwrap();
|
||||||
'parse: while let Ok(packet) = cap.next() {
|
'parse: while let Ok(packet) = cap.next() {
|
||||||
me.time = (packet.header.ts.tv_usec as f64 / 1000000.0) + packet.header.ts.tv_sec as f64;
|
me.time = (packet.header.ts.tv_usec as f64 / 1000000.0) + packet.header.ts.tv_sec as f64;
|
||||||
me.data = Some(packet.data.to_vec());
|
me.data = Some(packet.data.to_vec());
|
||||||
|
|
|
@ -36,9 +36,6 @@ pub fn ethernet_handler(packet_data: &[u8]) -> EtherHeader {
|
||||||
EtherHeader {
|
EtherHeader {
|
||||||
ether_dhost: (MacAddress::new(_ether_dhost as Eui48)),
|
ether_dhost: (MacAddress::new(_ether_dhost as Eui48)),
|
||||||
ether_shost: (MacAddress::new(_ether_shost as Eui48)),
|
ether_shost: (MacAddress::new(_ether_shost as Eui48)),
|
||||||
|
|
||||||
// ether_dhost: _ether_dhost as Eui48,
|
|
||||||
// ether_shost: _ether_shost as Eui48,
|
|
||||||
ether_type: _ether_type as i32,
|
ether_type: _ether_type as i32,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue