From 35d69de1fc59ddfe21910553b0f89ca8f9fc84e5 Mon Sep 17 00:00:00 2001 From: reimda Date: Fri, 11 Mar 2022 08:29:16 -0700 Subject: [PATCH] fix(inputs.snmp): use the correct path when evaluating symlink (#10748) --- internal/snmp/translate.go | 17 +++++++++++------ internal/snmp/translate_test.go | 8 ++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/internal/snmp/translate.go b/internal/snmp/translate.go index 7402439db..603dc2712 100644 --- a/internal/snmp/translate.go +++ b/internal/snmp/translate.go @@ -20,8 +20,12 @@ var once sync.Once var cache = make(map[string]bool) type MibLoader interface { - loadModule(path string) error + // appendPath takes the path of a directory 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{} @@ -60,17 +64,18 @@ func LoadMibsFromPath(paths []string, log telegraf.Logger, loader MibLoader) err for _, info := range modules { 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 { - 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 } - 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 { log.Warnf("Couldn't stat target %v: %v", target, err) continue } - path = target } if info.Mode().IsRegular() { err := loader.loadModule(info.Name()) @@ -113,7 +118,7 @@ func walkPaths(paths []string, log telegraf.Logger) ([]string, error) { if info.Mode()&os.ModeSymlink != 0 { target, err := filepath.EvalSymlinks(path) 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) if err != nil { diff --git a/internal/snmp/translate_test.go b/internal/snmp/translate_test.go index d3b8ae020..9f22947e8 100644 --- a/internal/snmp/translate_test.go +++ b/internal/snmp/translate_test.go @@ -107,8 +107,6 @@ func TestFolderLookup(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("Skipping on windows") } - var folders []string - var givenPath []string tests := []struct { name string @@ -132,17 +130,23 @@ func TestFolderLookup(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { loader := TestingMibLoader{} + + var givenPath []string for _, paths := range tt.mibPath { rootPath := filepath.Join(paths...) givenPath = append(givenPath, rootPath) } + err := LoadMibsFromPath(givenPath, testutil.Logger{}, &loader) require.NoError(t, err) + + var folders []string for _, pathSlice := range tt.paths { path := filepath.Join(pathSlice...) folders = append(folders, path) } require.Equal(t, folders, loader.folders) + require.Equal(t, tt.files, loader.files) }) }