| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- package net
- import (
- "context"
- "encoding/json"
- "net"
- "github.com/gofiber/fiber/v2/internal/gopsutil/common"
- )
- var invoke common.Invoker = common.Invoke{}
- type IOCountersStat struct {
- Name string `json:"name"` // interface name
- BytesSent uint64 `json:"bytesSent"` // number of bytes sent
- BytesRecv uint64 `json:"bytesRecv"` // number of bytes received
- PacketsSent uint64 `json:"packetsSent"` // number of packets sent
- PacketsRecv uint64 `json:"packetsRecv"` // 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)
- Fifoin uint64 `json:"fifoin"` // total number of FIFO buffers errors while receiving
- Fifoout uint64 `json:"fifoout"` // total number of FIFO buffers errors while sending
- }
- // Addr is implemented compatibility to psutil
- type Addr struct {
- IP string `json:"ip"`
- Port uint32 `json:"port"`
- }
- type ConnectionStat 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"`
- Uids []int32 `json:"uids"`
- Pid int32 `json:"pid"`
- }
- // System wide stats about different network protocols
- type ProtoCountersStat struct {
- Protocol string `json:"protocol"`
- Stats map[string]int64 `json:"stats"`
- }
- // NetInterfaceAddr is designed for represent interface addresses
- type InterfaceAddr struct {
- Addr string `json:"addr"`
- }
- type InterfaceStat struct {
- Index int `json:"index"`
- 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 []InterfaceAddr `json:"addrs"`
- }
- type FilterStat struct {
- ConnTrackCount int64 `json:"conntrackCount"`
- ConnTrackMax int64 `json:"conntrackMax"`
- }
- // ConntrackStat has conntrack summary info
- type ConntrackStat struct {
- Entries uint32 `json:"entries"` // Number of entries in the conntrack table
- Searched uint32 `json:"searched"` // Number of conntrack table lookups performed
- Found uint32 `json:"found"` // Number of searched entries which were successful
- New uint32 `json:"new"` // Number of entries added which were not expected before
- Invalid uint32 `json:"invalid"` // Number of packets seen which can not be tracked
- Ignore uint32 `json:"ignore"` // Packets seen which are already connected to an entry
- Delete uint32 `json:"delete"` // Number of entries which were removed
- DeleteList uint32 `json:"delete_list"` // Number of entries which were put to dying list
- Insert uint32 `json:"insert"` // Number of entries inserted into the list
- InsertFailed uint32 `json:"insert_failed"` // # insertion attempted but failed (same entry exists)
- Drop uint32 `json:"drop"` // Number of packets dropped due to conntrack failure.
- EarlyDrop uint32 `json:"early_drop"` // Dropped entries to make room for new ones, if maxsize reached
- IcmpError uint32 `json:"icmp_error"` // Subset of invalid. Packets that can't be tracked d/t error
- ExpectNew uint32 `json:"expect_new"` // Entries added after an expectation was already present
- ExpectCreate uint32 `json:"expect_create"` // Expectations added
- ExpectDelete uint32 `json:"expect_delete"` // Expectations deleted
- SearchRestart uint32 `json:"search_restart"` // Conntrack table lookups restarted due to hashtable resizes
- }
- func NewConntrackStat(e, s, f, n, inv, ign, del, dlst, ins, insfail, drop, edrop, ie, en, ec, ed, sr uint32) *ConntrackStat {
- return &ConntrackStat{
- Entries: e,
- Searched: s,
- Found: f,
- New: n,
- Invalid: inv,
- Ignore: ign,
- Delete: del,
- DeleteList: dlst,
- Insert: ins,
- InsertFailed: insfail,
- Drop: drop,
- EarlyDrop: edrop,
- IcmpError: ie,
- ExpectNew: en,
- ExpectCreate: ec,
- ExpectDelete: ed,
- SearchRestart: sr,
- }
- }
- type ConntrackStatList struct {
- items []*ConntrackStat
- }
- func NewConntrackStatList() *ConntrackStatList {
- return &ConntrackStatList{
- items: []*ConntrackStat{},
- }
- }
- func (l *ConntrackStatList) Append(c *ConntrackStat) {
- l.items = append(l.items, c)
- }
- func (l *ConntrackStatList) Items() []ConntrackStat {
- items := make([]ConntrackStat, len(l.items))
- for i, el := range l.items {
- items[i] = *el
- }
- return items
- }
- // Summary returns a single-element list with totals from all list items.
- func (l *ConntrackStatList) Summary() []ConntrackStat {
- summary := NewConntrackStat(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
- for _, cs := range l.items {
- summary.Entries += cs.Entries
- summary.Searched += cs.Searched
- summary.Found += cs.Found
- summary.New += cs.New
- summary.Invalid += cs.Invalid
- summary.Ignore += cs.Ignore
- summary.Delete += cs.Delete
- summary.DeleteList += cs.DeleteList
- summary.Insert += cs.Insert
- summary.InsertFailed += cs.InsertFailed
- summary.Drop += cs.Drop
- summary.EarlyDrop += cs.EarlyDrop
- summary.IcmpError += cs.IcmpError
- summary.ExpectNew += cs.ExpectNew
- summary.ExpectCreate += cs.ExpectCreate
- summary.ExpectDelete += cs.ExpectDelete
- summary.SearchRestart += cs.SearchRestart
- }
- return []ConntrackStat{*summary}
- }
- func (n IOCountersStat) String() string {
- s, _ := json.Marshal(n)
- return string(s)
- }
- func (n ConnectionStat) String() string {
- s, _ := json.Marshal(n)
- return string(s)
- }
- func (n ProtoCountersStat) String() string {
- s, _ := json.Marshal(n)
- return string(s)
- }
- func (a Addr) String() string {
- s, _ := json.Marshal(a)
- return string(s)
- }
- func (n InterfaceStat) String() string {
- s, _ := json.Marshal(n)
- return string(s)
- }
- func (n InterfaceAddr) String() string {
- s, _ := json.Marshal(n)
- return string(s)
- }
- func (n ConntrackStat) String() string {
- s, _ := json.Marshal(n)
- return string(s)
- }
- func Interfaces() ([]InterfaceStat, error) {
- return InterfacesWithContext(context.Background())
- }
- func InterfacesWithContext(ctx context.Context) ([]InterfaceStat, error) {
- is, err := net.Interfaces()
- if err != nil {
- return nil, err
- }
- ret := make([]InterfaceStat, 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 := InterfaceStat{
- Index: ifi.Index,
- Name: ifi.Name,
- MTU: ifi.MTU,
- HardwareAddr: ifi.HardwareAddr.String(),
- Flags: flags,
- }
- addrs, err := ifi.Addrs()
- if err == nil {
- r.Addrs = make([]InterfaceAddr, 0, len(addrs))
- for _, addr := range addrs {
- r.Addrs = append(r.Addrs, InterfaceAddr{
- Addr: addr.String(),
- })
- }
- }
- ret = append(ret, r)
- }
- return ret, nil
- }
- func getIOCountersAll(n []IOCountersStat) ([]IOCountersStat, error) {
- r := IOCountersStat{
- 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 []IOCountersStat{r}, nil
- }
|