Skip to content

Commit b3f166f

Browse files
Hiruma31Hiruma31
authored andcommitted
feat: Make opt-in with include_file_owner_name and include_file_owner_group_name
1 parent f0539d4 commit b3f166f

File tree

7 files changed

+75
-48
lines changed

7 files changed

+75
-48
lines changed

filebeat/input/filestream/config.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ type config struct {
4949
// This feature is experimental and subject to change.
5050
GZIPExperimental bool `config:"gzip_experimental"`
5151

52+
// Whether to add the file owner name and group to the event metadata.
53+
// Disabled by default.
54+
IncludeFileOwnerName bool `config:"include_file_owner_name"`
55+
IncludeFileOwnerGroupName bool `config:"include_file_owner_group_name"`
56+
5257
// -1 means that registry will never be cleaned, disabling clean_inactive.
5358
// Setting it to 0 also disables clean_inactive
5459
// "clean_inactive" is parsed, again, and used by internal/input-logfile/manager.go
@@ -134,6 +139,8 @@ func defaultConfig() config {
134139
Reader: defaultReaderConfig(),
135140
Paths: []string{},
136141
Close: defaultCloserConfig(),
142+
IncludeFileOwnerName: false,
143+
IncludeFileOwnerGroupName: false,
137144
CleanInactive: -1,
138145
CleanRemoved: true,
139146
HarvesterLimit: 0,

filebeat/input/filestream/input.go

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,16 @@ type fileMeta struct {
6161
// filestream is the input for reading from files which
6262
// are actively written by other applications.
6363
type filestream struct {
64-
readerConfig readerConfig
65-
encodingFactory encoding.EncodingFactory
66-
closerConfig closerConfig
67-
deleterConfig deleterConfig
68-
parsers parser.Config
69-
takeOver loginp.TakeOverConfig
70-
scannerCheckInterval time.Duration
71-
gzipExperimental bool
64+
readerConfig readerConfig
65+
encodingFactory encoding.EncodingFactory
66+
closerConfig closerConfig
67+
deleterConfig deleterConfig
68+
parsers parser.Config
69+
takeOver loginp.TakeOverConfig
70+
scannerCheckInterval time.Duration
71+
gzipExperimental bool
72+
includeFileOwnerName bool
73+
includeFileOwnerGroupName bool
7274

7375
// Function references for testing
7476
waitGracePeriodFn func(
@@ -132,17 +134,19 @@ func configure(cfg *conf.C, log *logp.Logger) (loginp.Prospector, loginp.Harvest
132134
}
133135

134136
filestream := &filestream{
135-
readerConfig: c.Reader,
136-
encodingFactory: encodingFactory,
137-
closerConfig: c.Close,
138-
parsers: c.Reader.Parsers,
139-
takeOver: c.TakeOver,
140-
gzipExperimental: c.GZIPExperimental,
141-
deleterConfig: c.Delete,
142-
waitGracePeriodFn: waitGracePeriod,
143-
tickFn: time.Tick,
144-
removeFn: os.Remove,
145-
statFn: os.Stat,
137+
readerConfig: c.Reader,
138+
encodingFactory: encodingFactory,
139+
closerConfig: c.Close,
140+
parsers: c.Reader.Parsers,
141+
takeOver: c.TakeOver,
142+
gzipExperimental: c.GZIPExperimental,
143+
includeFileOwnerName: c.IncludeFileOwnerName,
144+
includeFileOwnerGroupName: c.IncludeFileOwnerGroupName,
145+
deleterConfig: c.Delete,
146+
waitGracePeriodFn: waitGracePeriod,
147+
tickFn: time.Tick,
148+
removeFn: os.Remove,
149+
statFn: os.Stat,
146150
}
147151

148152
// Read the scan interval from the prospector so we can use during the
@@ -481,7 +485,7 @@ func (inp *filestream) open(
481485

482486
r = readfile.NewStripNewline(r, inp.readerConfig.LineTerminator)
483487

484-
r = readfile.NewFilemeta(r, fs.newPath, fs.desc.Info, fs.desc.Fingerprint, offset)
488+
r = readfile.NewFilemeta(r, fs.newPath, fs.desc.Info, inp.includeFileOwnerName, inp.includeFileOwnerGroupName, fs.desc.Fingerprint, offset)
485489

486490
r = inp.parsers.Create(r, log)
487491

libbeat/reader/readfile/fs_metafields_other.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const (
3535
group = "log.file.group"
3636
)
3737

38-
func setFileSystemMetadata(fi file.ExtendedFileInfo, fields mapstr.M) error {
38+
func setFileSystemMetadata(fi file.ExtendedFileInfo, fields mapstr.M, includeOwner bool, includeGroup bool) error {
3939
osstate := fi.GetOSState()
4040
_, err := fields.Put(deviceIDKey, strconv.FormatUint(osstate.Device, 10))
4141
if err != nil {
@@ -46,22 +46,26 @@ func setFileSystemMetadata(fi file.ExtendedFileInfo, fields mapstr.M) error {
4646
return fmt.Errorf("failed to set %q: %w", inodeKey, err)
4747
}
4848

49-
o, err := user.LookupId(strconv.FormatUint(osstate.UID, 10))
50-
if err != nil {
51-
return fmt.Errorf("failed to lookup uid %q: %w", osstate.UID, err)
52-
}
53-
_, err = fields.Put(owner, o.Username)
54-
if err != nil {
55-
return fmt.Errorf("failed to set %q: %w", owner, err)
49+
if includeOwner {
50+
o, err := user.LookupId(strconv.FormatUint(osstate.UID, 10))
51+
if err != nil {
52+
return fmt.Errorf("failed to lookup uid %q: %w", osstate.UID, err)
53+
}
54+
_, err = fields.Put(owner, o.Username)
55+
if err != nil {
56+
return fmt.Errorf("failed to set %q: %w", owner, err)
57+
}
5658
}
5759

58-
g, err := user.LookupGroupId(strconv.FormatUint(osstate.GID, 10))
59-
if err != nil {
60-
return fmt.Errorf("failed to lookup gid %q: %w", osstate.GID, err)
61-
}
62-
_, err = fields.Put(group, g.Name)
63-
if err != nil {
64-
return fmt.Errorf("failed to set %q: %w", group, err)
60+
if includeGroup {
61+
g, err := user.LookupGroupId(strconv.FormatUint(osstate.GID, 10))
62+
if err != nil {
63+
return fmt.Errorf("failed to lookup gid %q: %w", osstate.GID, err)
64+
}
65+
_, err = fields.Put(group, g.Name)
66+
if err != nil {
67+
return fmt.Errorf("failed to set %q: %w", group, err)
68+
}
6569
}
6670
return nil
6771
}

libbeat/reader/readfile/fs_metafields_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const (
3131
volKey = "log.file.vol"
3232
)
3333

34-
func setFileSystemMetadata(fi file.ExtendedFileInfo, fields mapstr.M) error {
34+
func setFileSystemMetadata(fi file.ExtendedFileInfo, fields mapstr.M, includeOwner bool, includeGroup bool) error {
3535
osstate := fi.GetOSState()
3636
_, err := fields.Put(idxhiKey, strconv.FormatUint(osstate.IdxHi, 10))
3737
if err != nil {

libbeat/reader/readfile/metafields.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,19 @@ import (
2828
// Reader produces lines by reading lines from an io.Reader
2929
// through a decoder converting the reader it's encoding to utf-8.
3030
type FileMetaReader struct {
31-
reader reader.Reader
32-
path string
33-
fi file.ExtendedFileInfo
34-
fingerprint string
35-
offset int64
31+
reader reader.Reader
32+
path string
33+
fi file.ExtendedFileInfo
34+
includeOwner bool
35+
includeGroup bool
36+
fingerprint string
37+
offset int64
3638
}
3739

3840
// New creates a new Encode reader from input reader by applying
3941
// the given codec.
40-
func NewFilemeta(r reader.Reader, path string, fi file.ExtendedFileInfo, fingerprint string, offset int64) reader.Reader {
41-
return &FileMetaReader{r, path, fi, fingerprint, offset}
42+
func NewFilemeta(r reader.Reader, path string, fi file.ExtendedFileInfo, includeOwner bool, includeGroup bool, fingerprint string, offset int64) reader.Reader {
43+
return &FileMetaReader{r, path, fi, includeOwner, includeGroup, fingerprint, offset}
4244
}
4345

4446
// Next reads the next line from it's initial io.Reader
@@ -61,7 +63,7 @@ func (r *FileMetaReader) Next() (reader.Message, error) {
6163
},
6264
})
6365

64-
err = setFileSystemMetadata(r.fi, message.Fields)
66+
err = setFileSystemMetadata(r.fi, message.Fields, r.includeOwner, r.includeGroup)
6567
if err != nil {
6668
return message, fmt.Errorf("failed to set file system metadata: %w", err)
6769
}

libbeat/reader/readfile/metafields_other_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func createTestFileInfo() file.ExtendedFileInfo {
3535
name: "filename",
3636
size: 42,
3737
time: time.Now(),
38-
sys: &syscall.Stat_t{Dev: 17, Ino: 999},
38+
sys: &syscall.Stat_t{Dev: 17, Ino: 999, Uid: 0, Gid: 0},
3939
})
4040
}
4141

@@ -54,5 +54,17 @@ func checkFields(t *testing.T, expected, actual mapstr.M) {
5454
err = actual.Delete(inodeKey)
5555
require.NoError(t, err)
5656

57+
o, err := actual.GetValue(owner)
58+
require.NoError(t, err)
59+
require.Equal(t, "root", o)
60+
err = actual.Delete(owner)
61+
require.NoError(t, err)
62+
63+
g, err := actual.GetValue(group)
64+
require.NoError(t, err)
65+
require.Equal(t, "root", g)
66+
err = actual.Delete(group)
67+
require.NoError(t, err)
68+
5769
require.Equal(t, expected, actual)
5870
}

libbeat/reader/readfile/metafields_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestMetaFields(t *testing.T) {
5252
path := "test/path"
5353
offset := int64(0)
5454

55-
in := &FileMetaReader{msgReader(messages), path, createTestFileInfo(), "hash", offset}
55+
in := &FileMetaReader{msgReader(messages), path, createTestFileInfo(), true, true, "hash", offset}
5656
for {
5757
msg, err := in.Next()
5858
if errors.Is(err, io.EOF) {
@@ -66,8 +66,6 @@ func TestMetaFields(t *testing.T) {
6666
"file": mapstr.M{
6767
"path": path,
6868
"fingerprint": "hash",
69-
"owner": "root",
70-
"group": "root",
7169
},
7270
"offset": offset,
7371
},

0 commit comments

Comments
 (0)