/
info_linux.go
70 lines (59 loc) · 1.33 KB
/
info_linux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package sysinfo
import (
"bytes"
"fmt"
"io/ioutil"
"strings"
"syscall"
humanize "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/go-humanize"
)
func init() {
diskUsageImpl = linuxDiskUsage
memInfoImpl = linuxMemInfo
}
func linuxDiskUsage(path string) (*DiskStats, error) {
var stfst syscall.Statfs_t
err := syscall.Statfs(path, &stfst)
if err != nil {
return nil, err
}
free := stfst.Bfree * uint64(stfst.Bsize)
total := stfst.Bavail * uint64(stfst.Bsize)
return &DiskStats{
Free: free,
Total: total,
FsType: fmt.Sprint(stfst.Type),
}, nil
}
func linuxMemInfo() (*MemStats, error) {
info, err := ioutil.ReadFile("/proc/self/status")
if err != nil {
return nil, err
}
var stats MemStats
for _, e := range bytes.Split(info, []byte("\n")) {
if !bytes.HasPrefix(e, []byte("Vm")) {
continue
}
parts := bytes.Split(e, []byte(":"))
if len(parts) != 2 {
return nil, fmt.Errorf("unexpected line in proc stats: %q", string(e))
}
val := strings.Trim(string(parts[1]), " \n\t")
switch string(parts[0]) {
case "VmSize":
vmsize, err := humanize.ParseBytes(val)
if err != nil {
return nil, err
}
stats.Used = vmsize
case "VmSwap":
swapsize, err := humanize.ParseBytes(val)
if err != nil {
return nil, err
}
stats.Swap = swapsize
}
}
return &stats, nil
}