138 lines
3.6 KiB
Go
138 lines
3.6 KiB
Go
package net
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net"
|
|
)
|
|
|
|
type NetIOCountersStat struct {
|
|
Name string `json:"name"` // interface name
|
|
BytesSent uint64 `json:"bytes_sent"` // number of bytes sent
|
|
BytesRecv uint64 `json:"bytes_recv"` // number of bytes received
|
|
PacketsSent uint64 `json:"packets_sent"` // number of packets sent
|
|
PacketsRecv uint64 `json:"packets_recv"` // number of packets received
|
|
Errin uint64 `json:"errin"` // total number of errors while receiving
|
|
Errout uint64 `json:"errout"` // total number of errors while sending
|
|
Dropin uint64 `json:"dropin"` // total number of incoming packets which were dropped
|
|
Dropout uint64 `json:"dropout"` // total number of outgoing packets which were dropped (always 0 on OSX and BSD)
|
|
}
|
|
|
|
// Addr is implemented compatibility to psutil
|
|
type Addr struct {
|
|
IP string `json:"ip"`
|
|
Port uint32 `json:"port"`
|
|
}
|
|
|
|
type NetConnectionStat struct {
|
|
Fd uint32 `json:"fd"`
|
|
Family uint32 `json:"family"`
|
|
Type uint32 `json:"type"`
|
|
Laddr Addr `json:"localaddr"`
|
|
Raddr Addr `json:"remoteaddr"`
|
|
Status string `json:"status"`
|
|
Pid int32 `json:"pid"`
|
|
}
|
|
|
|
// NetInterfaceAddr is designed for represent interface addresses
|
|
type NetInterfaceAddr struct {
|
|
Addr string `json:"addr"`
|
|
}
|
|
|
|
type NetInterfaceStat struct {
|
|
MTU int `json:"mtu"` // maximum transmission unit
|
|
Name string `json:"name"` // e.g., "en0", "lo0", "eth0.100"
|
|
HardwareAddr string `json:"hardwareaddr"` // IEEE MAC-48, EUI-48 and EUI-64 form
|
|
Flags []string `json:"flags"` // e.g., FlagUp, FlagLoopback, FlagMulticast
|
|
Addrs []NetInterfaceAddr `json:"addrs"`
|
|
}
|
|
|
|
func (n NetIOCountersStat) String() string {
|
|
s, _ := json.Marshal(n)
|
|
return string(s)
|
|
}
|
|
|
|
func (n NetConnectionStat) String() string {
|
|
s, _ := json.Marshal(n)
|
|
return string(s)
|
|
}
|
|
|
|
func (a Addr) String() string {
|
|
s, _ := json.Marshal(a)
|
|
return string(s)
|
|
}
|
|
|
|
func (n NetInterfaceStat) String() string {
|
|
s, _ := json.Marshal(n)
|
|
return string(s)
|
|
}
|
|
|
|
func (n NetInterfaceAddr) String() string {
|
|
s, _ := json.Marshal(n)
|
|
return string(s)
|
|
}
|
|
|
|
func NetInterfaces() ([]NetInterfaceStat, error) {
|
|
is, err := net.Interfaces()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ret := make([]NetInterfaceStat, 0, len(is))
|
|
for _, ifi := range is {
|
|
|
|
var flags []string
|
|
if ifi.Flags&net.FlagUp != 0 {
|
|
flags = append(flags, "up")
|
|
}
|
|
if ifi.Flags&net.FlagBroadcast != 0 {
|
|
flags = append(flags, "broadcast")
|
|
}
|
|
if ifi.Flags&net.FlagLoopback != 0 {
|
|
flags = append(flags, "loopback")
|
|
}
|
|
if ifi.Flags&net.FlagPointToPoint != 0 {
|
|
flags = append(flags, "pointtopoint")
|
|
}
|
|
if ifi.Flags&net.FlagMulticast != 0 {
|
|
flags = append(flags, "multicast")
|
|
}
|
|
|
|
r := NetInterfaceStat{
|
|
Name: ifi.Name,
|
|
MTU: ifi.MTU,
|
|
HardwareAddr: ifi.HardwareAddr.String(),
|
|
Flags: flags,
|
|
}
|
|
addrs, err := ifi.Addrs()
|
|
if err == nil {
|
|
r.Addrs = make([]NetInterfaceAddr, 0, len(addrs))
|
|
for _, addr := range addrs {
|
|
r.Addrs = append(r.Addrs, NetInterfaceAddr{
|
|
Addr: addr.String(),
|
|
})
|
|
}
|
|
|
|
}
|
|
ret = append(ret, r)
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
func getNetIOCountersAll(n []NetIOCountersStat) ([]NetIOCountersStat, error) {
|
|
r := NetIOCountersStat{
|
|
Name: "all",
|
|
}
|
|
for _, nic := range n {
|
|
r.BytesRecv += nic.BytesRecv
|
|
r.PacketsRecv += nic.PacketsRecv
|
|
r.Errin += nic.Errin
|
|
r.Dropin += nic.Dropin
|
|
r.BytesSent += nic.BytesSent
|
|
r.PacketsSent += nic.PacketsSent
|
|
r.Errout += nic.Errout
|
|
r.Dropout += nic.Dropout
|
|
}
|
|
|
|
return []NetIOCountersStat{r}, nil
|
|
}
|