Support resolution of symlinks in filecount input (#6735)
This commit is contained in:
parent
03a6910689
commit
906027c39b
|
@ -27,6 +27,9 @@ Reports the number and total size of files in specified directories.
|
|||
## Only count regular files. Defaults to true.
|
||||
regular_only = true
|
||||
|
||||
## Follow all symlinks while walking the directory tree. Defaults to false.
|
||||
follow_symlinks = false
|
||||
|
||||
## Only count files that are at least this size. If size is
|
||||
## a negative number, only count files that are smaller than the
|
||||
## absolute value of size. Acceptable units are B, KiB, MiB, KB, ...
|
||||
|
|
|
@ -35,6 +35,9 @@ const sampleConfig = `
|
|||
## Only count regular files. Defaults to true.
|
||||
regular_only = true
|
||||
|
||||
## Follow all symlinks while walking the directory tree. Defaults to false.
|
||||
follow_symlinks = false
|
||||
|
||||
## Only count files that are at least this size. If size is
|
||||
## a negative number, only count files that are smaller than the
|
||||
## absolute value of size. Acceptable units are B, KiB, MiB, KB, ...
|
||||
|
@ -48,17 +51,18 @@ const sampleConfig = `
|
|||
`
|
||||
|
||||
type FileCount struct {
|
||||
Directory string // deprecated in 1.9
|
||||
Directories []string
|
||||
Name string
|
||||
Recursive bool
|
||||
RegularOnly bool
|
||||
Size internal.Size
|
||||
MTime internal.Duration `toml:"mtime"`
|
||||
fileFilters []fileFilterFunc
|
||||
globPaths []globpath.GlobPath
|
||||
Fs fileSystem
|
||||
Log telegraf.Logger
|
||||
Directory string // deprecated in 1.9
|
||||
Directories []string
|
||||
Name string
|
||||
Recursive bool
|
||||
RegularOnly bool
|
||||
FollowSymlinks bool
|
||||
Size internal.Size
|
||||
MTime internal.Duration `toml:"mtime"`
|
||||
fileFilters []fileFilterFunc
|
||||
globPaths []globpath.GlobPath
|
||||
Fs fileSystem
|
||||
Log telegraf.Logger
|
||||
}
|
||||
|
||||
func (_ *FileCount) Description() string {
|
||||
|
@ -208,6 +212,7 @@ func (fc *FileCount) count(acc telegraf.Accumulator, basedir string, glob globpa
|
|||
Callback: walkFn,
|
||||
PostChildrenCallback: postChildrenFn,
|
||||
Unsorted: true,
|
||||
FollowSymbolicLinks: fc.FollowSymlinks,
|
||||
ErrorCallback: func(osPathname string, err error) godirwalk.ErrorAction {
|
||||
if os.IsPermission(errors.Cause(err)) {
|
||||
fc.Log.Debug(err)
|
||||
|
@ -292,15 +297,16 @@ func (fc *FileCount) initGlobPaths(acc telegraf.Accumulator) {
|
|||
|
||||
func NewFileCount() *FileCount {
|
||||
return &FileCount{
|
||||
Directory: "",
|
||||
Directories: []string{},
|
||||
Name: "*",
|
||||
Recursive: true,
|
||||
RegularOnly: true,
|
||||
Size: internal.Size{Size: 0},
|
||||
MTime: internal.Duration{Duration: 0},
|
||||
fileFilters: nil,
|
||||
Fs: osFS{},
|
||||
Directory: "",
|
||||
Directories: []string{},
|
||||
Name: "*",
|
||||
Recursive: true,
|
||||
RegularOnly: true,
|
||||
FollowSymlinks: false,
|
||||
Size: internal.Size{Size: 0},
|
||||
MTime: internal.Duration{Duration: 0},
|
||||
fileFilters: nil,
|
||||
Fs: osFS{},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -102,7 +102,6 @@ func TestSizeFilter(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestMTimeFilter(t *testing.T) {
|
||||
|
||||
mtime := time.Date(2011, time.December, 14, 18, 25, 5, 0, time.UTC)
|
||||
fileAge := time.Since(mtime) - (60 * time.Second)
|
||||
|
||||
|
@ -119,6 +118,19 @@ func TestMTimeFilter(t *testing.T) {
|
|||
fileCountEquals(t, fc, len(matches), 0)
|
||||
}
|
||||
|
||||
// The library dependency karrick/godirwalk completely abstracts out the
|
||||
// behavior of the FollowSymlinks plugin input option. However, it should at
|
||||
// least behave identically when enabled on a filesystem with no symlinks.
|
||||
func TestFollowSymlinks(t *testing.T) {
|
||||
fc := getNoFilterFileCount()
|
||||
fc.FollowSymlinks = true
|
||||
matches := []string{"foo", "bar", "baz", "qux",
|
||||
"subdir/", "subdir/quux", "subdir/quuz",
|
||||
"subdir/nested2", "subdir/nested2/qux"}
|
||||
|
||||
fileCountEquals(t, fc, len(matches), 5096)
|
||||
}
|
||||
|
||||
// Paths with a trailing slash will not exactly match paths produced during the
|
||||
// walk as these paths are cleaned before being returned from godirwalk. #6329
|
||||
func TestDirectoryWithTrailingSlash(t *testing.T) {
|
||||
|
|
Loading…
Reference in New Issue