diff --git a/README.rst b/README.rst index c14d2ef..ac67d54 100644 --- a/README.rst +++ b/README.rst @@ -102,7 +102,7 @@ Current Status - disk_partitions (linux, freebsd, windows) - disk_io_counters (linux) - disk_usage (linux, freebsd, windows) - - net_io_counters (linux, windows) + - net_io_counters (linux, freebsd, windows) - boot_time (linux, freebsd, windows(but little broken)) - users (linux, freebsd) - pids (linux, freebsd) diff --git a/net_freebsd.go b/net_freebsd.go index fb0a3f0..27257c9 100644 --- a/net_freebsd.go +++ b/net_freebsd.go @@ -3,9 +3,43 @@ package gopsutil import ( - "errors" + "os/exec" + "strings" ) func NetIOCounters(pernic bool) ([]NetIOCountersStat, error) { - return nil, errors.New("not implemented yet") + out, err := exec.Command("/usr/bin/netstat", "-ibdn").Output() + if err != nil { + return nil, err + } + + lines := strings.Split(string(out), "\n") + ret := make([]NetIOCountersStat, 0, len(lines)-1) + + for _, line := range lines { + values := strings.Fields(line) + if len(values) < 1 || values[0] == "Name" { + continue + } + base := 1 + // sometimes Address is ommitted + if len(values) < 13 { + base = 0 + } + + n := NetIOCountersStat{ + Name: values[0], + PacketsRecv: mustParseUint64(values[base+3]), + Errin: mustParseUint64(values[base+4]), + Dropin: mustParseUint64(values[base+5]), + BytesRecv: mustParseUint64(values[base+6]), + PacketsSent: mustParseUint64(values[base+7]), + Errout: mustParseUint64(values[base+8]), + BytesSent: mustParseUint64(values[base+9]), + Dropout: mustParseUint64(values[base+11]), + } + ret = append(ret, n) + } + + return ret, nil }