@@ -25,8 +25,7 @@ fn timestamp_to_proto(ts: u64) -> prost_types::Timestamp {
2525pub struct Event {
2626 timestamp : u64 ,
2727 hostname : & ' static str ,
28- process : Process ,
29- file : FileData ,
28+ data : EventData ,
3029}
3130
3231impl Event {
@@ -42,6 +41,42 @@ impl Event {
4241 . duration_since ( UNIX_EPOCH )
4342 . unwrap ( )
4443 . as_nanos ( ) as _ ;
44+ let data = match event_type {
45+ file_activity_type_t:: FILE_ACTIVITY_OPEN
46+ | file_activity_type_t:: FILE_ACTIVITY_CREATION
47+ | file_activity_type_t:: FILE_ACTIVITY_UNLINK => {
48+ Event :: new_file_event ( event_type, filename, host_file, process)
49+ }
50+ file_activity_type_t:: PROCESS_EXEC => EventData :: ProcessData ( process) ,
51+ invalid => unreachable ! ( "Invalid event type: {invalid:?}" ) ,
52+ } ;
53+
54+ Ok ( Event {
55+ timestamp,
56+ hostname,
57+ data,
58+ } )
59+ }
60+
61+ pub fn is_file_event ( & self ) -> bool {
62+ matches ! ( self . data, EventData :: FileData { .. } )
63+ }
64+
65+ pub fn is_from_container ( & self ) -> bool {
66+ let p = match & self . data {
67+ EventData :: FileData { process, .. } => process,
68+ EventData :: ProcessData ( process) => process,
69+ } ;
70+ p. is_from_container ( )
71+ }
72+
73+ #[ cfg( test) ]
74+ fn new_file_event (
75+ event_type : file_activity_type_t ,
76+ filename : PathBuf ,
77+ host_file : PathBuf ,
78+ process : Process ,
79+ ) -> EventData {
4580 let inner = BaseFileData {
4681 filename,
4782 host_file,
@@ -52,13 +87,7 @@ impl Event {
5287 file_activity_type_t:: FILE_ACTIVITY_UNLINK => FileData :: Unlink ( inner) ,
5388 invalid => unreachable ! ( "Invalid event type: {invalid:?}" ) ,
5489 } ;
55-
56- Ok ( Event {
57- timestamp,
58- hostname,
59- process,
60- file,
61- } )
90+ EventData :: FileData { process, file }
6291 }
6392}
6493
@@ -68,35 +97,97 @@ impl TryFrom<&event_t> for Event {
6897 fn try_from ( value : & event_t ) -> Result < Self , Self :: Error > {
6998 let process = Process :: try_from ( value. process ) ?;
7099 let timestamp = host_info:: get_boot_time ( ) + value. timestamp ;
71- let file = FileData :: new ( value. type_ , value. filename , value. host_file ) ?;
100+
101+ let data = match value. type_ {
102+ file_activity_type_t:: FILE_ACTIVITY_OPEN
103+ | file_activity_type_t:: FILE_ACTIVITY_CREATION
104+ | file_activity_type_t:: FILE_ACTIVITY_UNLINK => {
105+ let file = FileData :: new ( value. type_ , value. filename , value. host_file ) ?;
106+ EventData :: FileData { process, file }
107+ }
108+ file_activity_type_t:: PROCESS_EXEC => EventData :: ProcessData ( process) ,
109+ invalid => unreachable ! ( "Invalid event type: {invalid:?}" ) ,
110+ } ;
72111
73112 Ok ( Event {
74113 timestamp,
75114 hostname : host_info:: get_hostname ( ) ,
76- process,
77- file,
115+ data,
78116 } )
79117 }
80118}
81119
82- impl From < Event > for fact_api:: FileActivity {
83- fn from ( value : Event ) -> Self {
84- let file = fact_api:: file_activity:: File :: from ( value. file ) ;
120+ impl TryFrom < Event > for fact_api:: sensor:: FileActivity {
121+ type Error = anyhow:: Error ;
122+
123+ fn try_from ( value : Event ) -> Result < Self , Self :: Error > {
124+ let ( process, file) = match value. data {
125+ EventData :: FileData { process, file } => ( process, file) ,
126+ EventData :: ProcessData ( _) => anyhow:: bail!( "Unexpected process event on file pipeline" ) ,
127+ } ;
128+ let file = fact_api:: sensor:: file_activity:: File :: from ( file) ;
85129 let timestamp = timestamp_to_proto ( value. timestamp ) ;
86- let process = fact_api:: ProcessSignal :: from ( value . process ) ;
130+ let process = fact_api:: sensor :: ProcessSignal :: from ( process) ;
87131
88- Self {
132+ Ok ( Self {
89133 file : Some ( file) ,
90134 timestamp : Some ( timestamp) ,
91135 process : Some ( process) ,
92- }
136+ } )
137+ }
138+ }
139+
140+ impl TryFrom < Event > for fact_api:: sensor:: SignalStreamMessage {
141+ type Error = anyhow:: Error ;
142+
143+ fn try_from ( value : Event ) -> Result < Self , Self :: Error > {
144+ let process = match value. data {
145+ EventData :: FileData { .. } => {
146+ anyhow:: bail!( "Unexpected file event on process pipeline" )
147+ }
148+ EventData :: ProcessData ( p) => p,
149+ } ;
150+ let signal = fact_api:: storage:: ProcessSignal :: from ( process) ;
151+ let signal = fact_api:: v1:: signal:: Signal :: ProcessSignal ( signal) ;
152+ let signal = fact_api:: v1:: Signal {
153+ signal : Some ( signal) ,
154+ } ;
155+ let msg = fact_api:: sensor:: signal_stream_message:: Msg :: Signal ( signal) ;
156+
157+ Ok ( Self { msg : Some ( msg) } )
93158 }
94159}
95160
96161#[ cfg( test) ]
97162impl PartialEq for Event {
98163 fn eq ( & self , other : & Self ) -> bool {
99- self . hostname == other. hostname && self . process == other. process && self . file == other. file
164+ self . hostname == other. hostname && self . data == other. data
165+ }
166+ }
167+
168+ #[ derive( Debug , Clone , Serialize ) ]
169+ pub enum EventData {
170+ FileData { process : Process , file : FileData } ,
171+ ProcessData ( Process ) ,
172+ }
173+
174+ #[ cfg( test) ]
175+ impl PartialEq for EventData {
176+ fn eq ( & self , other : & Self ) -> bool {
177+ match ( self , other) {
178+ (
179+ EventData :: FileData {
180+ process : s_proc,
181+ file : s_file,
182+ } ,
183+ EventData :: FileData {
184+ process : o_proc,
185+ file : o_file,
186+ } ,
187+ ) => s_proc == o_proc && s_file == o_file,
188+ ( EventData :: ProcessData ( s_proc) , EventData :: ProcessData ( o_proc) ) => s_proc == o_proc,
189+ _ => false ,
190+ }
100191 }
101192}
102193
@@ -125,23 +216,23 @@ impl FileData {
125216 }
126217}
127218
128- impl From < FileData > for fact_api:: file_activity:: File {
219+ impl From < FileData > for fact_api:: sensor :: file_activity:: File {
129220 fn from ( event : FileData ) -> Self {
130221 match event {
131222 FileData :: Open ( event) => {
132- let activity = Some ( fact_api:: FileActivityBase :: from ( event) ) ;
133- let f_act = fact_api:: FileOpen { activity } ;
134- fact_api:: file_activity:: File :: Open ( f_act)
223+ let activity = Some ( fact_api:: sensor :: FileActivityBase :: from ( event) ) ;
224+ let f_act = fact_api:: sensor :: FileOpen { activity } ;
225+ fact_api:: sensor :: file_activity:: File :: Open ( f_act)
135226 }
136227 FileData :: Creation ( event) => {
137- let activity = Some ( fact_api:: FileActivityBase :: from ( event) ) ;
138- let f_act = fact_api:: FileCreation { activity } ;
139- fact_api:: file_activity:: File :: Creation ( f_act)
228+ let activity = Some ( fact_api:: sensor :: FileActivityBase :: from ( event) ) ;
229+ let f_act = fact_api:: sensor :: FileCreation { activity } ;
230+ fact_api:: sensor :: file_activity:: File :: Creation ( f_act)
140231 }
141232 FileData :: Unlink ( event) => {
142- let activity = Some ( fact_api:: FileActivityBase :: from ( event) ) ;
143- let f_act = fact_api:: FileUnlink { activity } ;
144- fact_api:: file_activity:: File :: Unlink ( f_act)
233+ let activity = Some ( fact_api:: sensor :: FileActivityBase :: from ( event) ) ;
234+ let f_act = fact_api:: sensor :: FileUnlink { activity } ;
235+ fact_api:: sensor :: file_activity:: File :: Unlink ( f_act)
145236 }
146237 }
147238 }
@@ -187,9 +278,9 @@ impl PartialEq for BaseFileData {
187278 }
188279}
189280
190- impl From < BaseFileData > for fact_api:: FileActivityBase {
281+ impl From < BaseFileData > for fact_api:: sensor :: FileActivityBase {
191282 fn from ( value : BaseFileData ) -> Self {
192- fact_api:: FileActivityBase {
283+ fact_api:: sensor :: FileActivityBase {
193284 path : value. filename . to_string_lossy ( ) . to_string ( ) ,
194285 host_path : value. host_file . to_string_lossy ( ) . to_string ( ) ,
195286 }
0 commit comments