]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blame - vendor/github.com/fsouza/go-dockerclient/external/github.com/docker/docker/pkg/system/meminfo_linux.go
provider: Ensured Go 1.11 in TravisCI and README
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / fsouza / go-dockerclient / external / github.com / docker / docker / pkg / system / meminfo_linux.go
CommitLineData
9b12e4fe
JC
1package system
2
3import (
4 "bufio"
5 "io"
6 "os"
7 "strconv"
8 "strings"
9
10 "github.com/fsouza/go-dockerclient/external/github.com/docker/go-units"
11)
12
13// ReadMemInfo retrieves memory statistics of the host system and returns a
14// MemInfo type.
15func ReadMemInfo() (*MemInfo, error) {
16 file, err := os.Open("/proc/meminfo")
17 if err != nil {
18 return nil, err
19 }
20 defer file.Close()
21 return parseMemInfo(file)
22}
23
24// parseMemInfo parses the /proc/meminfo file into
25// a MemInfo object given a io.Reader to the file.
26//
27// Throws error if there are problems reading from the file
28func parseMemInfo(reader io.Reader) (*MemInfo, error) {
29 meminfo := &MemInfo{}
30 scanner := bufio.NewScanner(reader)
31 for scanner.Scan() {
32 // Expected format: ["MemTotal:", "1234", "kB"]
33 parts := strings.Fields(scanner.Text())
34
35 // Sanity checks: Skip malformed entries.
36 if len(parts) < 3 || parts[2] != "kB" {
37 continue
38 }
39
40 // Convert to bytes.
41 size, err := strconv.Atoi(parts[1])
42 if err != nil {
43 continue
44 }
45 bytes := int64(size) * units.KiB
46
47 switch parts[0] {
48 case "MemTotal:":
49 meminfo.MemTotal = bytes
50 case "MemFree:":
51 meminfo.MemFree = bytes
52 case "SwapTotal:":
53 meminfo.SwapTotal = bytes
54 case "SwapFree:":
55 meminfo.SwapFree = bytes
56 }
57
58 }
59
60 // Handle errors that may have occurred during the reading of the file.
61 if err := scanner.Err(); err != nil {
62 return nil, err
63 }
64
65 return meminfo, nil
66}