@@ -36,20 +36,23 @@ var (
3636// from the non-params constructs such as process' state or PE metadata.
3737type Accessor interface {
3838 // Get fetches the parameter value for the specified filter field.
39- Get (f fields.Field , kevt * kevent.Kevent ) (kparams.Value , error )
40- // SetFields sets all fields declared in the expression
41- SetFields (fields []fields.Field )
39+ Get (f Field , evt * kevent.Kevent ) (kparams.Value , error )
40+ // SetFields sets all fields declared in the expression.
41+ SetFields (fields []Field )
42+ // SetSegments sets all segments utilized in the function predicate expression.
43+ SetSegments (segments []fields.Segment )
4244 // IsFieldAccessible determines if the field can be extracted from the
4345 // given event. The condition is usually based on the event category,
4446 // but it can also include different circumstances, like the presence
4547 // of the process state or callstacks.
46- IsFieldAccessible (kevt * kevent.Kevent ) bool
48+ IsFieldAccessible (evt * kevent.Kevent ) bool
4749}
4850
4951// kevtAccessor extracts generic event values.
5052type kevtAccessor struct {}
5153
52- func (kevtAccessor ) SetFields ([]fields.Field ) {}
54+ func (kevtAccessor ) SetFields ([]Field ) {}
55+ func (kevtAccessor ) SetSegments ([]fields.Segment ) {}
5356func (kevtAccessor ) IsFieldAccessible (* kevent.Kevent ) bool { return true }
5457
5558func newKevtAccessor () Accessor {
@@ -59,8 +62,8 @@ func newKevtAccessor() Accessor {
5962const timeFmt = "15:04:05"
6063const dateFmt = "2006-01-02"
6164
62- func (k * kevtAccessor ) Get (f fields. Field , kevt * kevent.Kevent ) (kparams.Value , error ) {
63- switch f {
65+ func (k * kevtAccessor ) Get (f Field , kevt * kevent.Kevent ) (kparams.Value , error ) {
66+ switch f . Name {
6467 case fields .KevtSeq :
6568 return kevt .Seq , nil
6669 case fields .KevtPID :
@@ -105,30 +108,35 @@ func (k *kevtAccessor) Get(f fields.Field, kevt *kevent.Kevent) (kparams.Value,
105108 return kevt .Timestamp .Weekday ().String (), nil
106109 case fields .KevtNparams :
107110 return uint64 (kevt .Kparams .Len ()), nil
108- default :
109- if f .IsKevtArgMap () {
110- name , _ := captureInBrackets (f .String ())
111- kpar , err := kevt .Kparams .Get (name )
112- if err != nil {
113- return nil , err
114- }
115- switch kpar .Type {
116- case kparams .Uint8 :
117- return kevt .Kparams .GetUint8 (name )
118- case kparams .Uint16 , kparams .Port :
119- return kevt .Kparams .GetUint16 (name )
120- case kparams .Uint32 , kparams .PID , kparams .TID :
121- return kevt .Kparams .GetUint32 (name )
122- case kparams .Uint64 :
123- return kevt .Kparams .GetUint64 (name )
124- case kparams .Time :
125- return kevt .Kparams .GetTime (name )
126- default :
127- return kevt .GetParamAsString (name ), nil
128- }
111+ case fields .KevtArg :
112+ // lookup the parameter from the field argument
113+ // and depending on the parameter type, return
114+ // the respective value. The field format is
115+ // expressed as kevt.arg[cmdline] where the string
116+ // inside brackets represents the parameter name
117+ name := f .Arg
118+ par , err := kevt .Kparams .Get (name )
119+ if err != nil {
120+ return nil , err
121+ }
122+
123+ switch par .Type {
124+ case kparams .Uint8 :
125+ return kevt .Kparams .GetUint8 (name )
126+ case kparams .Uint16 , kparams .Port :
127+ return kevt .Kparams .GetUint16 (name )
128+ case kparams .Uint32 , kparams .PID , kparams .TID :
129+ return kevt .Kparams .GetUint32 (name )
130+ case kparams .Uint64 :
131+ return kevt .Kparams .GetUint64 (name )
132+ case kparams .Time :
133+ return kevt .Kparams .GetTime (name )
134+ default :
135+ return kevt .GetParamAsString (name ), nil
129136 }
130- return nil , nil
131137 }
138+
139+ return nil , nil
132140}
133141
134142// narrowAccessors dynamically disables filter accessors by walking
@@ -149,37 +157,34 @@ func (f *filter) narrowAccessors() {
149157 removeMemAccessor = true
150158 removeDNSAccessor = true
151159 )
152- allFields := make ([]fields.Field , 0 )
153- allFields = append (allFields , f .fields ... )
154- for _ , field := range f .boundFields {
155- allFields = append (allFields , field .Field ())
156- }
157- for _ , field := range allFields {
160+
161+ for _ , field := range f .fields {
158162 switch {
159- case field .IsKevtField ():
163+ case field .Name . IsKevtField ():
160164 removeKevtAccessor = false
161- case field .IsPsField ():
165+ case field .Name . IsPsField ():
162166 removePsAccessor = false
163- case field .IsThreadField ():
167+ case field .Name . IsThreadField ():
164168 removeThreadAccessor = false
165- case field .IsImageField ():
169+ case field .Name . IsImageField ():
166170 removeImageAccessor = false
167- case field .IsFileField ():
171+ case field .Name . IsFileField ():
168172 removeFileAccessor = false
169- case field .IsRegistryField ():
173+ case field .Name . IsRegistryField ():
170174 removeRegistryAccessor = false
171- case field .IsNetworkField ():
175+ case field .Name . IsNetworkField ():
172176 removeNetworkAccessor = false
173- case field .IsHandleField ():
177+ case field .Name . IsHandleField ():
174178 removeHandleAccessor = false
175- case field .IsPeField ():
179+ case field .Name . IsPeField ():
176180 removePEAccessor = false
177- case field .IsMemField ():
181+ case field .Name . IsMemField ():
178182 removeMemAccessor = false
179- case field .IsDNSField ():
183+ case field .Name . IsDNSField ():
180184 removeDNSAccessor = false
181185 }
182186 }
187+
183188 if removeKevtAccessor {
184189 f .removeAccessor (& kevtAccessor {})
185190 }
@@ -215,7 +220,8 @@ func (f *filter) narrowAccessors() {
215220 }
216221
217222 for _ , accessor := range f .accessors {
218- accessor .SetFields (allFields )
223+ accessor .SetFields (f .fields )
224+ accessor .SetSegments (f .segments )
219225 }
220226}
221227
0 commit comments