package main import ( "bufio" "fmt" "log" "os" "strconv" "strings" ) func init() { if h, err := os.Hostname(); err != nil { log.Fatalf("error reading hostname: %s", err) } else { hostname = h } } func (s *applyState) populateLoadavg() { if s.loadavg != nil { return } if b, err := os.ReadFile("/proc/loadavg"); err != nil { log.Printf("error reading loadavg: %s", err) } else { res := strings.SplitN(string(b), " ", 4) if len(res) >= 3 { s.loadavg = (*[3]string)(res[:3]) return } log.Printf("unexpected loadavg raw: %s", string(b)) } s.loadavg = &[3]string{"?", "?", "?"} } func (s *applyState) populateMem() { if s.mem != nil { return } // failure defaults s.mem = &[2]int{-1, -1} if f, err := os.Open("/proc/meminfo"); err != nil { log.Printf("error reading meminfo: %s", err) } else { defer func() { if err = f.Close(); err != nil { log.Fatalf("error closing meminfo: %s", err) } }() p := bufio.NewScanner(f) for p.Scan() { res := strings.SplitN(strings.ReplaceAll(p.Text(), " ", ""), ":", 2) if len(res) != 2 { fmt.Printf("unexpected meminfo line: %s", p.Text()) return } format := func(r string) int { var v int if v, err = strconv.Atoi(r[:len(r)-2]); err != nil { log.Printf("error parsing meminfo value: %s", err) v = -1 } return v } switch res[0] { case "MemFree": s.mem[0] = format(res[1]) case "MemTotal": s.mem[1] = format(res[1]) } } } }