@@ -36,20 +36,20 @@ 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 )
39+ Get (f Field , evt * kevent.Kevent ) (kparams.Value , error )
4040 // SetFields sets all fields declared in the expression
41- SetFields (fields []fields. Field )
41+ SetFields (fields []Field )
4242 // IsFieldAccessible determines if the field can be extracted from the
4343 // given event. The condition is usually based on the event category,
4444 // but it can also include different circumstances, like the presence
4545 // of the process state or callstacks.
46- IsFieldAccessible (kevt * kevent.Kevent ) bool
46+ IsFieldAccessible (evt * kevent.Kevent ) bool
4747}
4848
4949// kevtAccessor extracts generic event values.
5050type kevtAccessor struct {}
5151
52- func (kevtAccessor ) SetFields ([]fields. Field ) {}
52+ func (kevtAccessor ) SetFields ([]Field ) {}
5353func (kevtAccessor ) IsFieldAccessible (* kevent.Kevent ) bool { return true }
5454
5555func newKevtAccessor () Accessor {
@@ -59,8 +59,8 @@ func newKevtAccessor() Accessor {
5959const timeFmt = "15:04:05"
6060const dateFmt = "2006-01-02"
6161
62- func (k * kevtAccessor ) Get (f fields. Field , kevt * kevent.Kevent ) (kparams.Value , error ) {
63- switch f {
62+ func (k * kevtAccessor ) Get (f Field , kevt * kevent.Kevent ) (kparams.Value , error ) {
63+ switch f . Name {
6464 case fields .KevtSeq :
6565 return kevt .Seq , nil
6666 case fields .KevtPID :
@@ -105,30 +105,35 @@ func (k *kevtAccessor) Get(f fields.Field, kevt *kevent.Kevent) (kparams.Value,
105105 return kevt .Timestamp .Weekday ().String (), nil
106106 case fields .KevtNparams :
107107 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- }
108+ case fields .KevtArg :
109+ // lookup the parameter from the field argument
110+ // and depending on the parameter type, return
111+ // the respective value. The field format is
112+ // expressed as kevt.arg[cmdline] where the string
113+ // inside brackets represents the parameter name
114+ name := f .Arg
115+ par , err := kevt .Kparams .Get (name )
116+ if err != nil {
117+ return nil , err
118+ }
119+
120+ switch par .Type {
121+ case kparams .Uint8 :
122+ return kevt .Kparams .GetUint8 (name )
123+ case kparams .Uint16 , kparams .Port :
124+ return kevt .Kparams .GetUint16 (name )
125+ case kparams .Uint32 , kparams .PID , kparams .TID :
126+ return kevt .Kparams .GetUint32 (name )
127+ case kparams .Uint64 :
128+ return kevt .Kparams .GetUint64 (name )
129+ case kparams .Time :
130+ return kevt .Kparams .GetTime (name )
131+ default :
132+ return kevt .GetParamAsString (name ), nil
129133 }
130- return nil , nil
131134 }
135+
136+ return nil , nil
132137}
133138
134139// narrowAccessors dynamically disables filter accessors by walking
@@ -149,37 +154,34 @@ func (f *filter) narrowAccessors() {
149154 removeMemAccessor = true
150155 removeDNSAccessor = true
151156 )
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 {
157+
158+ for _ , field := range f .fields {
158159 switch {
159- case field .IsKevtField ():
160+ case field .Name . IsKevtField ():
160161 removeKevtAccessor = false
161- case field .IsPsField ():
162+ case field .Name . IsPsField ():
162163 removePsAccessor = false
163- case field .IsThreadField ():
164+ case field .Name . IsThreadField ():
164165 removeThreadAccessor = false
165- case field .IsImageField ():
166+ case field .Name . IsImageField ():
166167 removeImageAccessor = false
167- case field .IsFileField ():
168+ case field .Name . IsFileField ():
168169 removeFileAccessor = false
169- case field .IsRegistryField ():
170+ case field .Name . IsRegistryField ():
170171 removeRegistryAccessor = false
171- case field .IsNetworkField ():
172+ case field .Name . IsNetworkField ():
172173 removeNetworkAccessor = false
173- case field .IsHandleField ():
174+ case field .Name . IsHandleField ():
174175 removeHandleAccessor = false
175- case field .IsPeField ():
176+ case field .Name . IsPeField ():
176177 removePEAccessor = false
177- case field .IsMemField ():
178+ case field .Name . IsMemField ():
178179 removeMemAccessor = false
179- case field .IsDNSField ():
180+ case field .Name . IsDNSField ():
180181 removeDNSAccessor = false
181182 }
182183 }
184+
183185 if removeKevtAccessor {
184186 f .removeAccessor (& kevtAccessor {})
185187 }
@@ -215,7 +217,7 @@ func (f *filter) narrowAccessors() {
215217 }
216218
217219 for _ , accessor := range f .accessors {
218- accessor .SetFields (allFields )
220+ accessor .SetFields (f . fields )
219221 }
220222}
221223
0 commit comments