From 38d0d0d6b02d3fb290617fa7d803bcb1350cb4f1 Mon Sep 17 00:00:00 2001 From: Jan Fajerski Date: Fri, 16 Apr 2021 17:01:41 +0200 Subject: [PATCH] sysfs/net_class: filter devices by name This adds regexp-based device filtering to the NetClass function in order to avoid parsing devices files that are uninteresting. Signed-off-by: Jan Fajerski --- sysfs/net_class.go | 10 +++++++--- sysfs/net_class_test.go | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/sysfs/net_class.go b/sysfs/net_class.go index e6e223984..ab1e3356b 100644 --- a/sysfs/net_class.go +++ b/sysfs/net_class.go @@ -20,6 +20,7 @@ import ( "io/ioutil" "os" "path/filepath" + "regexp" "github.com/prometheus/procfs/internal/util" ) @@ -63,7 +64,7 @@ type NetClassIface struct { type NetClass map[string]NetClassIface // NetClassDevices scans /sys/class/net for devices and returns them as a list of names. -func (fs FS) NetClassDevices() ([]string, error) { +func (fs FS) NetClassDevices(ignoredDevicesPattern *regexp.Regexp) ([]string, error) { var res []string path := fs.sys.Path(netclassPath) @@ -76,6 +77,9 @@ func (fs FS) NetClassDevices() ([]string, error) { if deviceDir.Mode().IsRegular() { continue } + if ignoredDevicesPattern.MatchString(deviceDir.Name()) { + continue + } res = append(res, deviceDir.Name()) } @@ -83,8 +87,8 @@ func (fs FS) NetClassDevices() ([]string, error) { } // NetClass returns info for all net interfaces (iface) read from /sys/class/net/. -func (fs FS) NetClass() (NetClass, error) { - devices, err := fs.NetClassDevices() +func (fs FS) NetClass(ignoredDevicesPattern *regexp.Regexp) (NetClass, error) { + devices, err := fs.NetClassDevices(ignoredDevicesPattern) if err != nil { return nil, err } diff --git a/sysfs/net_class_test.go b/sysfs/net_class_test.go index bc219f340..ca6e38e79 100644 --- a/sysfs/net_class_test.go +++ b/sysfs/net_class_test.go @@ -17,6 +17,7 @@ package sysfs import ( "reflect" + "regexp" "testing" ) @@ -26,7 +27,12 @@ func TestNewNetClassDevices(t *testing.T) { t.Fatal(err) } - devices, err := fs.NetClassDevices() + re, err := regexp.Compile("^$") + if err != nil { + t.Fatal(err) + } + + devices, err := fs.NetClassDevices(re) if err != nil { t.Fatal(err) } @@ -39,13 +45,39 @@ func TestNewNetClassDevices(t *testing.T) { } } +func TestNewNetClassDevicesFilter(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + re, err := regexp.Compile("eth") + if err != nil { + t.Fatal(err) + } + + devices, err := fs.NetClassDevices(re) + if err != nil { + t.Fatal(err) + } + + if len(devices) != 0 { + t.Errorf("Unexpected number of devices, want %d, have %d", 0, len(devices)) + } +} + func TestNetClass(t *testing.T) { fs, err := NewFS(sysTestFixtures) if err != nil { t.Fatal(err) } - nc, err := fs.NetClass() + re, err := regexp.Compile("^$") + if err != nil { + t.Fatal(err) + } + + nc, err := fs.NetClass(re) if err != nil { t.Fatal(err) }