usiem/components/
kernel_message.rs

1use std::time::Duration;
2
3use chrono::Utc;
4use crossbeam_channel::Sender;
5
6use crate::prelude::{types::LogString, Notification, NotificationLevel, SiemMessage, SiemResult};
7
8#[derive(Clone)]
9pub struct KernelMessager {
10    component_id: u64,
11    component_name: String,
12    channel: Sender<SiemMessage>,
13    level: NotificationLevel,
14}
15
16impl Default for KernelMessager {
17    fn default() -> Self {
18        let (channel, _) = crossbeam_channel::bounded(1);
19        Self {
20            component_id: Default::default(),
21            component_name: Default::default(),
22            channel,
23            level: NotificationLevel::Info,
24        }
25    }
26}
27
28impl KernelMessager {
29    pub fn new(id: u64, name: String, channel: Sender<SiemMessage>) -> Self {
30        Self {
31            component_id: id,
32            component_name: name,
33            channel,
34            level: NotificationLevel::Info,
35        }
36    }
37    pub fn set_level(&mut self, level: NotificationLevel) {
38        self.level = level;
39    }
40
41    pub fn send<T: Into<SiemMessage>>(&self, msg: T) -> SiemResult<()> {
42        let msg: SiemMessage = msg.into();
43        Ok(self.channel.send(msg)?)
44    }
45
46    pub fn try_send<T: Into<SiemMessage>>(&self, msg: T) -> SiemResult<()> {
47        let msg: SiemMessage = msg.into();
48        Ok(self.channel.try_send(msg)?)
49    }
50
51    pub fn send_timeout<T: Into<SiemMessage>>(&self, msg: T, timeout: Duration) -> SiemResult<()> {
52        let msg: SiemMessage = msg.into();
53        Ok(self.channel.send_timeout(msg, timeout)?)
54    }
55
56    fn _send(&self, log: String, level: NotificationLevel) {
57        if self.level < level {
58            return;
59        }
60        let _ = self
61            .channel
62            .try_send(SiemMessage::Notification(Notification {
63                component: self.component_id,
64                timestamp: Utc::now().timestamp_millis(),
65                component_name: LogString::Owned(self.component_name.clone()),
66                log: LogString::Owned(log),
67                level,
68            }));
69    }
70    pub fn log(&self, log: String, level: NotificationLevel) {
71        self._send(log, level);
72    }
73    pub fn trace(&self, log: String) {
74        self._send(log, NotificationLevel::Trace);
75    }
76    pub fn debug(&self, log: String) {
77        self._send(log, NotificationLevel::Debug);
78    }
79    pub fn info(&self, log: String) {
80        self._send(log, NotificationLevel::Info);
81    }
82    pub fn warn(&self, log: String) {
83        self._send(log, NotificationLevel::Warn);
84    }
85    pub fn error(&self, log: String) {
86        self._send(log, NotificationLevel::Error);
87    }
88}