usiem/components/
kernel_message.rs1use 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}