...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package procfs
15
16 import (
17 "bufio"
18 "os"
19 "path/filepath"
20 "strconv"
21 "strings"
22 )
23
24
25 type NetStat struct {
26 Stats map[string][]uint64
27 Filename string
28 }
29
30
31 func (fs FS) NetStat() ([]NetStat, error) {
32 statFiles, err := filepath.Glob(fs.proc.Path("net/stat/*"))
33 if err != nil {
34 return nil, err
35 }
36
37 var netStatsTotal []NetStat
38
39 for _, filePath := range statFiles {
40 procNetstat, err := parseNetstat(filePath)
41 if err != nil {
42 return nil, err
43 }
44 procNetstat.Filename = filepath.Base(filePath)
45
46 netStatsTotal = append(netStatsTotal, procNetstat)
47 }
48 return netStatsTotal, nil
49 }
50
51
52
53 func parseNetstat(filePath string) (NetStat, error) {
54 netStat := NetStat{
55 Stats: make(map[string][]uint64),
56 }
57 file, err := os.Open(filePath)
58 if err != nil {
59 return netStat, err
60 }
61 defer file.Close()
62
63 scanner := bufio.NewScanner(file)
64 scanner.Scan()
65
66
67 var headers []string
68 headers = append(headers, strings.Fields(scanner.Text())...)
69
70
71 for scanner.Scan() {
72 for num, counter := range strings.Fields(scanner.Text()) {
73 value, err := strconv.ParseUint(counter, 16, 64)
74 if err != nil {
75 return NetStat{}, err
76 }
77 netStat.Stats[headers[num]] = append(netStat.Stats[headers[num]], value)
78 }
79 }
80
81 return netStat, nil
82 }
83
View as plain text