Skip to content

Commit 56694fc

Browse files
committed
wip
1 parent 83c8046 commit 56694fc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+999
-717
lines changed

cmd/fibratus/app/rules/validate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ func validateRules() error {
9696

9797
w := warning{rule: rule.Name}
9898
for _, fld := range f.GetFields() {
99-
if isDeprecated, dep := fields.IsDeprecated(fld); isDeprecated {
100-
w.addMessage(fmt.Sprintf("%s field deprecated in favor of %v", fld.String(), dep.Fields))
99+
if isDeprecated, dep := fields.IsDeprecated(fld.Name); isDeprecated {
100+
w.addMessage(fmt.Sprintf("%s field deprecated in favor of %v", fld.Name.String(), dep.Fields))
101101
}
102102
}
103103

pkg/filter/accessor.go

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,23 @@ 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)
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.
5052
type kevtAccessor struct{}
5153

52-
func (kevtAccessor) SetFields([]fields.Field) {}
54+
func (kevtAccessor) SetFields([]Field) {}
55+
func (kevtAccessor) SetSegments([]fields.Segment) {}
5356
func (kevtAccessor) IsFieldAccessible(*kevent.Kevent) bool { return true }
5457

5558
func newKevtAccessor() Accessor {
@@ -59,8 +62,8 @@ func newKevtAccessor() Accessor {
5962
const timeFmt = "15:04:05"
6063
const 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

Comments
 (0)