Skip to content

Commit 3aac2f3

Browse files
authored
Support regexp exclusions (#43)
1 parent 4fca19a commit 3aac2f3

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

Diff for: cmd/main.go

+27-10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"os"
99
"os/signal"
1010
"path/filepath"
11+
"regexp"
1112
"strings"
1213
"sync"
1314
"time"
@@ -122,12 +123,13 @@ Initialises all the consumers along with pre-populating genericDiffPaths used by
122123
func (c Configuration) consumers(db *pkg.AgentDB, genericDiffPaths *[]string) (consumers pkg.BaseConsumers) {
123124
fs := afero.NewOsFs()
124125
var existingConsumersFiles = make(map[string]bool)
126+
listOfRegexpsExcludes := c.compileRegex(c.Consumers.Excludes)
125127

126128
if c.Consumers.Root != "" {
127129
fs = afero.NewBasePathFs(fs, c.Consumers.Root)
128130
}
129131
if c.Consumers.Access != "" {
130-
if !c.isFileToBeExcluded(c.Consumers.Access, existingConsumersFiles) {
132+
if !c.isFileToBeExcluded(c.Consumers.Access, existingConsumersFiles, listOfRegexpsExcludes) {
131133
state := &pkg.AccessState{
132134
AccessListener: pkg.NewAccessListener(
133135
pkg.AccessFileOpt(fs, c.Consumers.Access, c.logger()),
@@ -138,7 +140,8 @@ func (c Configuration) consumers(db *pkg.AgentDB, genericDiffPaths *[]string) (c
138140
}
139141
}
140142
if c.Consumers.Users.Shadow != "" && c.Consumers.Users.Passwd != "" {
141-
if !c.isFileToBeExcluded(c.Consumers.Users.Shadow, existingConsumersFiles) || !c.isFileToBeExcluded(c.Consumers.Users.Passwd, existingConsumersFiles) {
143+
if !c.isFileToBeExcluded(c.Consumers.Users.Shadow, existingConsumersFiles, listOfRegexpsExcludes) ||
144+
!c.isFileToBeExcluded(c.Consumers.Users.Passwd, existingConsumersFiles, listOfRegexpsExcludes) {
142145
state := &pkg.UsersState{
143146
UsersListener: pkg.NewUsersListener(func(l *pkg.UsersListener) {
144147
l.Passwd = c.Consumers.Users.Passwd
@@ -155,7 +158,7 @@ func (c Configuration) consumers(db *pkg.AgentDB, genericDiffPaths *[]string) (c
155158
//get list of files to watch
156159
genericDiffFiles := c.getListOfFiles(fs, c.Consumers.GenericDiff)
157160
for _, genericDiffFile := range genericDiffFiles {
158-
if !c.isFileToBeExcluded(genericDiffFile.File, existingConsumersFiles) {
161+
if !c.isFileToBeExcluded(genericDiffFile.File, existingConsumersFiles, listOfRegexpsExcludes) {
159162
state := &pkg.GenericDiffState{
160163
GenericDiffListener: pkg.NewGenericDiffListener(
161164
pkg.GenericDiffFileOpt(fs, genericDiffFile.File, c.logger()),
@@ -171,7 +174,7 @@ func (c Configuration) consumers(db *pkg.AgentDB, genericDiffPaths *[]string) (c
171174
if len(c.Consumers.Generic) > 0 {
172175
genericFiles := c.getListOfFiles(fs, c.Consumers.Generic)
173176
for _, genericFile := range genericFiles {
174-
if !c.isFileToBeExcluded(genericFile.File, existingConsumersFiles) {
177+
if !c.isFileToBeExcluded(genericFile.File, existingConsumersFiles, listOfRegexpsExcludes) {
175178
genericFile := genericFile
176179
state := &pkg.GenericState{
177180
GenericListener: pkg.NewGenericListener(func(l *pkg.GenericListener) {
@@ -189,22 +192,36 @@ func (c Configuration) consumers(db *pkg.AgentDB, genericDiffPaths *[]string) (c
189192
return consumers
190193
}
191194

195+
// Gets list of regexp objects from regexp paths
196+
func (c Configuration) compileRegex(listofPaths []string) []*regexp.Regexp {
197+
logger := c.logger()
198+
var regexpObjects []*regexp.Regexp
199+
for _, path := range listofPaths {
200+
reg, err := regexp.Compile(path)
201+
if err != nil {
202+
logger.Error().Err(err).Msgf("Error while compiling regex: %v", err)
203+
continue
204+
}
205+
regexpObjects = append(regexpObjects, reg)
206+
}
207+
return regexpObjects
208+
}
209+
192210
/* Checks if file belongs to exclusion list or is already assigned to a consumer and excludes it accordingly
193211
true: if file needs to be excluded
194212
false: otherwise
195213
*/
196-
func (c Configuration) isFileToBeExcluded(file string, existingConsumersFiles map[string]bool) bool {
214+
func (c Configuration) isFileToBeExcluded(file string, existingConsumersFiles map[string]bool, listOfRegexpsExcludes []*regexp.Regexp) bool {
197215
logger := c.logger()
198216
isFileExcluded := false
199-
200-
for _, excludeFile := range c.Consumers.Excludes {
201-
if strings.HasPrefix(file, excludeFile) {
217+
for _, excludeRegexp := range listOfRegexpsExcludes {
218+
matches := excludeRegexp.MatchString(file)
219+
if matches {
202220
logger.Debug().Msgf("File belongs to exclusion list, excluding from monitoring: %v", file)
203221
isFileExcluded = true
204222
break
205223
}
206224
}
207-
208225
return isFileExcluded || existingConsumersFiles[file]
209226
}
210227

@@ -396,7 +413,7 @@ func (c Configuration) watcher() (*pkg.Watcher, error) {
396413
}
397414
}
398415
return pkg.NewWatcher(func(w *pkg.Watcher) {
399-
w.Logger, w.Consumers, w.FIM, w.Database, w.Key, w.Excludes, w.GenericDiff = logger, consumers.Consumers(), fim, database, c.key, c.Consumers.Excludes, genericDiffPaths
416+
w.Logger, w.Consumers, w.FIM, w.Database, w.Key, w.Excludes, w.GenericDiff = logger, consumers.Consumers(), fim, database, c.key, c.compileRegex(c.Consumers.Excludes), genericDiffPaths
400417
}), nil
401418
}
402419

Diff for: pkg/watcher.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"fmt"
66
"path"
7+
"regexp"
78
"strings"
89
"sync"
910

@@ -20,7 +21,7 @@ type (
2021
Consumers []Consumer
2122
consumers Consumers
2223
CloseChannels chan struct{}
23-
Excludes []string
24+
Excludes []*regexp.Regexp
2425
GenericDiff []string
2526
Metrics *Metrics
2627
}
@@ -130,17 +131,21 @@ func (w *Watcher) addInode(event *Event, isdir bool) {
130131
fullPath := path.Join(file, event.Path)
131132
event.Path = fullPath
132133

133-
// Exclude file from monitoring if it belongs to exclusion list
134-
for _, excludeFile := range w.Excludes {
135-
if strings.HasPrefix(event.Path, excludeFile) {
136-
w.Debug().Msgf("File belongs to exclusion list, excluding from monitoring: %v", event.Path)
134+
/* Exclude file from monitoring if it belongs to exclusion list
135+
w.Excludes is a list of compiled regexp objects
136+
*/
137+
for _, excludeRegexp := range w.Excludes {
138+
matches := excludeRegexp.MatchString(event.Path)
139+
if matches {
140+
w.Debug().Msgf("File belongs to exclusion list, excluding from monitoring: %v", file)
137141
return
138142
}
139143
}
140144
var isGenericDiffFile bool
141145
for _, genericDiffFile := range w.GenericDiff {
142146
if strings.HasPrefix(event.Path, genericDiffFile) {
143147
isGenericDiffFile = true
148+
break
144149
}
145150
}
146151
if isGenericDiffFile {

0 commit comments

Comments
 (0)