ssh_crawler/stat/network.go

80 lines
1.7 KiB
Go
Raw Normal View History

2017-10-23 05:31:04 +00:00
package stat
import (
"bufio"
2017-10-23 09:08:19 +00:00
"fmt"
"io"
2017-10-23 05:31:04 +00:00
"regexp"
"strings"
)
type NetDevStat struct {
2017-10-24 07:09:17 +00:00
Iface,
RecvByte,
RecvPacket,
RecvErr,
RecvDrop,
RecvFifo,
RecvFrame,
RecvCompressed,
RecvMulticast,
TransByte,
TransPacket,
TransErr,
TransDrop,
TransFifo,
TransFrame,
TransCompressed,
TransMulticast string
2017-10-23 05:31:04 +00:00
}
func (net *NetDevStat) Command() string {
return "cat /proc/net/dev"
}
2017-10-23 09:08:19 +00:00
func (net *NetDevStat) Parse(r io.Reader) (*[]NetDevStat, error) {
2017-10-23 05:31:04 +00:00
var (
scanner = bufio.NewScanner(r)
procNetDevFieldSep = regexp.MustCompile("[ :] *")
netDevStats = []NetDevStat{}
)
scanner.Scan()
scanner.Scan()
parts := strings.Split(scanner.Text(), "|")
if len(parts) != 3 { // interface + receive + transmit
return nil, fmt.Errorf("invalid header line in net/dev: %s",
scanner.Text())
}
header := strings.Fields(parts[1])
for scanner.Scan() {
line := strings.TrimLeft(scanner.Text(), " ")
parts := procNetDevFieldSep.Split(line, -1)
if len(parts) != 2*len(header)+1 {
return nil, fmt.Errorf("invalid line in net/dev: %s", scanner.Text())
}
dev := parts[0][:len(parts[0])]
netDevStats = append(netDevStats, NetDevStat{
2017-10-24 07:09:17 +00:00
Iface: dev,
RecvByte: parts[1],
RecvPacket: parts[2],
RecvErr: parts[3],
RecvDrop: parts[4],
RecvFifo: parts[5],
RecvFrame: parts[6],
RecvCompressed: parts[7],
RecvMulticast: parts[8],
TransByte: parts[9],
TransPacket: parts[10],
TransErr: parts[11],
TransDrop: parts[12],
TransFifo: parts[13],
TransFrame: parts[14],
TransCompressed: parts[15],
TransMulticast: parts[16],
2017-10-23 05:31:04 +00:00
})
}
2017-10-23 09:08:19 +00:00
return &netDevStats, scanner.Err()
}