github.com/Cloud-Foundations/Dominator@v0.3.4/lib/meminfo/getMemInfo_linux.go (about) 1 package meminfo 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "strings" 8 ) 9 10 var procMeminfo string = "/proc/meminfo" 11 12 func getMemInfo() (*MemInfo, error) { 13 file, err := os.Open(procMeminfo) 14 if err != nil { 15 return nil, err 16 } 17 defer file.Close() 18 scanner := bufio.NewScanner(file) 19 memInfo := new(MemInfo) 20 for scanner.Scan() { 21 if err := memInfo.processMeminfoLine(scanner.Text()); err != nil { 22 return nil, err 23 } 24 } 25 if err := scanner.Err(); err != nil { 26 return nil, err 27 } 28 return memInfo, nil 29 } 30 31 func (m *MemInfo) processMeminfoLine(line string) error { 32 splitLine := strings.SplitN(line, ":", 2) 33 if len(splitLine) != 2 { 34 return nil 35 } 36 meminfoName := splitLine[0] 37 meminfoDataString := strings.TrimSpace(splitLine[1]) 38 var ptr *uint64 39 switch meminfoName { 40 case "MemAvailable": 41 m.HaveAvailable = true 42 ptr = &m.Available 43 case "MemFree": 44 ptr = &m.Free 45 case "MemTotal": 46 ptr = &m.Total 47 default: 48 return nil 49 } 50 var meminfoData uint64 51 var meminfoUnit string 52 fmt.Sscanf(meminfoDataString, "%d %s", &meminfoData, &meminfoUnit) 53 if meminfoUnit != "kB" { 54 return fmt.Errorf("unknown unit: %s for: %s", meminfoUnit, meminfoName) 55 } 56 *ptr = meminfoData * 1024 57 return nil 58 }