// +build !windows package staros import ( "errors" "io/ioutil" "strconv" "strings" "time" ) func NetUsage() ([]NetAdapter, error) { data, err := ioutil.ReadFile("/proc/net/dev") if err != nil { return []NetAdapter{}, err } sps := strings.Split(strings.TrimSpace(string(data)), "\n") if len(sps) < 3 { return []NetAdapter{}, errors.New("No Adaptor") } var res []NetAdapter netLists := sps[2:] for _, v := range netLists { v = strings.ReplaceAll(v, " ", " ") for strings.Contains(v, " ") { v = strings.ReplaceAll(v, " ", " ") } v = strings.TrimSpace(v) card := strings.Split(v, " ") name := strings.ReplaceAll(card[0], ":", "") recvBytes, _ := strconv.Atoi(card[1]) sendBytes, _ := strconv.Atoi(card[9]) res = append(res, NetAdapter{name, uint64(recvBytes), uint64(sendBytes)}) } return res, nil } func NetUsageByname(name string) (NetAdapter, error) { ada, err := NetUsage() if err != nil { return NetAdapter{}, err } for _, v := range ada { if v.Name == name { return v, nil } } return NetAdapter{}, errors.New("Not Found") } func NetSpeeds(duration time.Duration) ([]NetSpeed, error) { list1, err := NetUsage() if err != nil { return []NetSpeed{}, err } time.Sleep(duration) list2, err := NetUsage() if err != nil { return []NetSpeed{}, err } if len(list1) > len(list2) { return []NetSpeed{}, errors.New("NetWork Adaptor Num Not ok") } var res []NetSpeed for k, v := range list1 { recv := float64(list2[k].RecvBytes-v.RecvBytes) / duration.Seconds() send := float64(list2[k].SendBytes-v.SendBytes) / duration.Seconds() res = append(res, NetSpeed{v.Name, recv, send}) } return res, nil } func NetSpeedsByName(duration time.Duration, name string) (NetSpeed, error) { ada, err := NetSpeeds(duration) if err != nil { return NetSpeed{}, err } for _, v := range ada { if v.Name == name { return v, nil } } return NetSpeed{}, errors.New("Not Found") }