Skip to content

Commit 4974e4c

Browse files
committed
wip
1 parent 83c8046 commit 4974e4c

22 files changed

+904
-715
lines changed

pkg/filter/accessor.go

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,20 @@ var (
3636
// from the non-params constructs such as process' state or PE metadata.
3737
type 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.
5050
type kevtAccessor struct{}
5151

52-
func (kevtAccessor) SetFields([]fields.Field) {}
52+
func (kevtAccessor) SetFields([]Field) {}
5353
func (kevtAccessor) IsFieldAccessible(*kevent.Kevent) bool { return true }
5454

5555
func newKevtAccessor() Accessor {
@@ -59,8 +59,8 @@ func newKevtAccessor() Accessor {
5959
const timeFmt = "15:04:05"
6060
const 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

Comments
 (0)