Fix parsing of interface aliases in netdev linux
Very old kernels expose interface aliases as `foo0:0`, adjust the line parsing to handle these names. Signed-off-by: Ben Kochie <superq@gmail.com>
This commit is contained in:
parent
768be139be
commit
a528966dcd
4 changed files with 37 additions and 9 deletions
|
|
@ -27,7 +27,8 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
procNetDevFieldSep = regexp.MustCompile("[ :] *")
|
||||
procNetDevInterfaceRE = regexp.MustCompile(`^([\w:]+): *(.+)$`)
|
||||
procNetDevFieldSep = regexp.MustCompile(` +`)
|
||||
)
|
||||
|
||||
func getNetDevStats(ignore *regexp.Regexp) (map[string]map[string]string, error) {
|
||||
|
|
@ -52,28 +53,34 @@ func parseNetDevStats(r io.Reader, ignore *regexp.Regexp) (map[string]map[string
|
|||
|
||||
receiveHeader := strings.Fields(parts[1])
|
||||
transmitHeader := strings.Fields(parts[2])
|
||||
headerLength := len(receiveHeader) + len(transmitHeader) + 1
|
||||
headerLength := len(receiveHeader) + len(transmitHeader)
|
||||
|
||||
netDev := map[string]map[string]string{}
|
||||
for scanner.Scan() {
|
||||
line := strings.TrimLeft(scanner.Text(), " ")
|
||||
parts := procNetDevFieldSep.Split(line, -1)
|
||||
if len(parts) != headerLength {
|
||||
return nil, fmt.Errorf("invalid line in net/dev: %s", scanner.Text())
|
||||
parts := procNetDevInterfaceRE.FindStringSubmatch(line)
|
||||
if len(parts) != 3 {
|
||||
return nil, fmt.Errorf("couldn't get interface name, invalid line in net/dev: %q", line)
|
||||
}
|
||||
|
||||
dev := parts[0][:len(parts[0])]
|
||||
dev := parts[1]
|
||||
if ignore.MatchString(dev) {
|
||||
log.Debugf("Ignoring device: %s", dev)
|
||||
continue
|
||||
}
|
||||
|
||||
values := procNetDevFieldSep.Split(strings.TrimLeft(parts[2], " "), -1)
|
||||
if len(values) != headerLength {
|
||||
return nil, fmt.Errorf("couldn't get values, invalid line in net/dev: %q", parts[2])
|
||||
}
|
||||
|
||||
netDev[dev] = map[string]string{}
|
||||
for i := 0; i < len(receiveHeader); i++ {
|
||||
netDev[dev]["receive_"+receiveHeader[i]] = parts[i+1]
|
||||
netDev[dev]["receive_"+receiveHeader[i]] = values[i]
|
||||
}
|
||||
|
||||
for i := 0; i < len(transmitHeader); i++ {
|
||||
netDev[dev]["transmit_"+transmitHeader[i]] = parts[i+1+len(receiveHeader)]
|
||||
netDev[dev]["transmit_"+transmitHeader[i]] = values[i+len(receiveHeader)]
|
||||
}
|
||||
}
|
||||
return netDev, scanner.Err()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue