use dyn_clone::{clone_trait_object, DynClone};
use serde::{Deserialize, Serialize};
use crate::{
events::{schema::FieldSchema, SiemLog},
prelude::SiemIp,
};
use super::dataset::holder::DatasetHolder;
pub trait LogParser: DynClone + Send {
fn parse_log(&self, log: SiemLog, datasets: &DatasetHolder)
-> Result<SiemLog, LogParsingError>;
fn name(&self) -> &'static str;
fn description(&self) -> &'static str;
fn schema(&self) -> &FieldSchema;
fn generator(&self) -> Box<dyn LogGenerator>;
}
clone_trait_object!(LogParser);
pub trait MultilineLogParser: DynClone + Send {
fn parse_log(
&mut self,
log: SiemLog,
datasets: &DatasetHolder,
) -> Result<Option<SiemLog>, LogParsingError>;
fn name(&self) -> &'static str;
fn description(&self) -> &'static str;
fn cleaning(&mut self) -> Vec<SiemLog>;
fn unused(&mut self) -> Vec<SiemLog>;
fn schema(&self) -> &FieldSchema;
}
clone_trait_object!(MultilineLogParser);
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum LogParsingError {
NoValidParser(SiemLog),
ParserError(SiemLog, String),
NotImplemented(SiemLog),
FormatError(SiemLog, String),
Discard,
}
pub trait LogGenerator {
fn configure(&mut self, config: GeneratorConfig);
fn log(&self) -> String;
fn weight(&self) -> u8;
}
pub struct GeneratorConfig {
pub malicious_users: Vec<String>,
pub user_generator: Box<dyn Fn() -> String>,
pub public_networks: Vec<(SiemIp, u32)>,
pub local_networks: Vec<(SiemIp, u32)>,
pub domain: String,
pub hostname_generator: Box<dyn Fn() -> String>,
pub malicious_ips: Vec<SiemIp>,
}
impl Default for GeneratorConfig {
fn default() -> Self {
use std::time::{SystemTime, UNIX_EPOCH};
Self {
malicious_users: Vec::new(),
user_generator: Box::new(|| {
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.subsec_nanos();
let nanos = nanos & 0xffff;
format!("User{}", nanos)
}),
public_networks: Default::default(),
local_networks: vec![([192, 168, 1, 1].into(), 32)],
domain: "Contoso".into(),
hostname_generator: Box::new(|| {
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.subsec_nanos();
let nanos = nanos & 0xffff;
format!("Host{}", nanos)
}),
malicious_ips: Default::default(),
}
}
}