package device import ( "encoding/json" "fmt" "git.sophuwu.com/statlog/types" "os" "strings" ) type MEM struct { Total types.Bytes `json:"Total"` Free types.Bytes `json:"Free"` Buffer types.Bytes `json:"Buffer"` Used types.Bytes `json:"Used"` Percent struct { Used types.Percent `json:"Used"` Buff types.Percent `json:"Buff"` Free types.Percent `json:"Free"` } `json:"Percent"` } func (m *MEM) Update() { b := make([]byte, 140) f, _ := os.Open("/proc/meminfo") _, err := f.Read(b) if err != nil { return } f.Close() var seeker types.NumSeeker seeker.Init(b) m.Total.FromKiB(seeker.GetNum()) m.Free.FromKiB(seeker.GetNum()) m.Used.FromKiB(seeker.GetNum()) m.Used = m.Total - m.Used m.Buffer.FromKiB(seeker.GetNum() + seeker.GetNum()) m.Percent.Used.CalcBytes(m.Used, m.Total) m.Percent.Buff.CalcBytes(m.Buffer, m.Total) m.Percent.Free.CalcBytes(m.Free, m.Total) } func (m *MEM) String() string { return fmt.Sprintf("%s (%s) USED %s BUFF %s FREE", m.Used, m.Percent.Used.Compact(), m.Buffer, m.Free) } func (m *MEM) Bar() (string, error) { w, _ := types.TermSize() if w < 40 { return "", fmt.Errorf("terminal too narrow") } s := "MEM: " // s += "[\033[1;35m" + m.Used.Human() + " USED\033[0m " // s += "\033[1;36m" + m.Buffer.Human() + " BUFF\033[0m " // s += "\033[1;32m" + m.Free.Human() + " FREE\033[0m]" s += "[\033[1;35mUSED\033[0m/" s += "\033[1;36mBUFF\033[0m/" s += "\033[1;32mFREE\033[0m] " l := len(strings.NewReplacer("\033[1;32m", "", "\033[1;36m", "", "\033[1;35m", "", "\033[0m", "").Replace(s)) w -= l if w < 40 { return "", fmt.Errorf("terminal too narrow") } w -= 2 s += "[\033[1;35m" i, ul := 0, int(m.Percent.Used.Value()*float64(w)/100) c := m.Percent.Used.Compact() s += c for i = len(c); i < w && i < ul; i++ { s += "|" } s += "\033[0m\033[1;36m" c = m.Percent.Buff.Compact() s += c i += len(c) for ul += int(m.Percent.Buff.Value() * float64(w) / 100); i < w && i < ul; i++ { s += "|" } s += "\033[0m\033[1;32m" c = m.Percent.Free.Compact() s += c i += len(c) for ; i < w; i++ { s += "|" } s += "\033[0m]" return s, nil } func (m *MEM) JSON() (string, error) { b, e := json.Marshal(m) return string(b), e }