usiem/components/
parsing.rs1use dyn_clone::{clone_trait_object, DynClone};
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 events::{schema::FieldSchema, SiemLog},
6 prelude::SiemIp,
7};
8
9use super::dataset::holder::DatasetHolder;
10
11pub trait LogParser: DynClone + Send {
13 fn parse_log(&self, log: SiemLog, datasets: &DatasetHolder)
15 -> Result<SiemLog, LogParsingError>;
16 fn name(&self) -> &'static str;
18 fn description(&self) -> &'static str;
20 fn schema(&self) -> &FieldSchema;
22 fn generator(&self) -> Box<dyn LogGenerator>;
24}
25clone_trait_object!(LogParser);
26
27pub trait MultilineLogParser: DynClone + Send {
32 fn parse_log(
34 &mut self,
35 log: SiemLog,
36 datasets: &DatasetHolder,
37 ) -> Result<Option<SiemLog>, LogParsingError>;
38 fn name(&self) -> &'static str;
40 fn description(&self) -> &'static str;
42 fn cleaning(&mut self) -> Vec<SiemLog>;
45 fn unused(&mut self) -> Vec<SiemLog>;
47 fn schema(&self) -> &FieldSchema;
49}
50
51clone_trait_object!(MultilineLogParser);
52
53#[derive(Clone, Debug, Serialize, Deserialize)]
55pub enum LogParsingError {
56 NoValidParser(SiemLog),
58 ParserError(SiemLog, String),
60 NotImplemented(SiemLog),
62 FormatError(SiemLog, String),
64 Discard,
66}
67
68pub trait LogGenerator {
69 fn configure(&mut self, config: GeneratorConfig);
70 fn log(&self) -> String;
72 fn weight(&self) -> u8;
76}
77
78pub struct GeneratorConfig {
80 pub malicious_users: Vec<String>,
81 pub user_generator: Box<dyn Fn() -> String>,
82 pub public_networks: Vec<(SiemIp, u32)>,
83 pub local_networks: Vec<(SiemIp, u32)>,
84 pub domain: String,
85 pub hostname_generator: Box<dyn Fn() -> String>,
86 pub malicious_ips: Vec<SiemIp>,
87}
88
89impl Default for GeneratorConfig {
90 fn default() -> Self {
91 use std::time::{SystemTime, UNIX_EPOCH};
92 Self {
94 malicious_users: Vec::new(),
95 user_generator: Box::new(|| {
96 let nanos = SystemTime::now()
97 .duration_since(UNIX_EPOCH)
98 .unwrap()
99 .subsec_nanos();
100 let nanos = nanos & 0xffff;
101 format!("User{}", nanos)
102 }),
103 public_networks: Default::default(),
104 local_networks: vec![([192, 168, 1, 1].into(), 32)],
105 domain: "Contoso".into(),
106 hostname_generator: Box::new(|| {
107 let nanos = SystemTime::now()
108 .duration_since(UNIX_EPOCH)
109 .unwrap()
110 .subsec_nanos();
111 let nanos = nanos & 0xffff;
112 format!("Host{}", nanos)
113 }),
114 malicious_ips: Default::default(),
115 }
116 }
117}