fix(inputs.snmp): use the correct path when evaluating symlink (#10748)

This commit is contained in:
reimda 2022-03-11 08:29:16 -07:00 committed by GitHub
parent 6a025f9903
commit 35d69de1fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 8 deletions

View File

@ -20,8 +20,12 @@ var once sync.Once
var cache = make(map[string]bool) var cache = make(map[string]bool)
type MibLoader interface { type MibLoader interface {
loadModule(path string) error // appendPath takes the path of a directory
appendPath(path string) appendPath(path string)
// loadModule takes the name of a file in one of the
// directories. Basename only, no relative or absolute path
loadModule(path string) error
} }
type GosmiMibLoader struct{} type GosmiMibLoader struct{}
@ -60,17 +64,18 @@ func LoadMibsFromPath(paths []string, log telegraf.Logger, loader MibLoader) err
for _, info := range modules { for _, info := range modules {
if info.Mode()&os.ModeSymlink != 0 { if info.Mode()&os.ModeSymlink != 0 {
target, err := filepath.EvalSymlinks(path) symlink := filepath.Join(path, info.Name())
target, err := filepath.EvalSymlinks(symlink)
if err != nil { if err != nil {
log.Warnf("Couldn't evaluate symbolic links for %v: %v", target, err) log.Warnf("Couldn't evaluate symbolic links for %v: %v", symlink, err)
continue continue
} }
info, err = os.Lstat(filepath.Join(path, target)) //replace symlink's info with the target's info
info, err = os.Lstat(target)
if err != nil { if err != nil {
log.Warnf("Couldn't stat target %v: %v", target, err) log.Warnf("Couldn't stat target %v: %v", target, err)
continue continue
} }
path = target
} }
if info.Mode().IsRegular() { if info.Mode().IsRegular() {
err := loader.loadModule(info.Name()) err := loader.loadModule(info.Name())
@ -113,7 +118,7 @@ func walkPaths(paths []string, log telegraf.Logger) ([]string, error) {
if info.Mode()&os.ModeSymlink != 0 { if info.Mode()&os.ModeSymlink != 0 {
target, err := filepath.EvalSymlinks(path) target, err := filepath.EvalSymlinks(path)
if err != nil { if err != nil {
log.Warnf("Couldn't evaluate symbolic links for %v: %v", target, err) log.Warnf("Couldn't evaluate symbolic links for %v: %v", path, err)
} }
info, err = os.Lstat(target) info, err = os.Lstat(target)
if err != nil { if err != nil {

View File

@ -107,8 +107,6 @@ func TestFolderLookup(t *testing.T) {
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
t.Skip("Skipping on windows") t.Skip("Skipping on windows")
} }
var folders []string
var givenPath []string
tests := []struct { tests := []struct {
name string name string
@ -132,17 +130,23 @@ func TestFolderLookup(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
loader := TestingMibLoader{} loader := TestingMibLoader{}
var givenPath []string
for _, paths := range tt.mibPath { for _, paths := range tt.mibPath {
rootPath := filepath.Join(paths...) rootPath := filepath.Join(paths...)
givenPath = append(givenPath, rootPath) givenPath = append(givenPath, rootPath)
} }
err := LoadMibsFromPath(givenPath, testutil.Logger{}, &loader) err := LoadMibsFromPath(givenPath, testutil.Logger{}, &loader)
require.NoError(t, err) require.NoError(t, err)
var folders []string
for _, pathSlice := range tt.paths { for _, pathSlice := range tt.paths {
path := filepath.Join(pathSlice...) path := filepath.Join(pathSlice...)
folders = append(folders, path) folders = append(folders, path)
} }
require.Equal(t, folders, loader.folders) require.Equal(t, folders, loader.folders)
require.Equal(t, tt.files, loader.files) require.Equal(t, tt.files, loader.files)
}) })
} }