rpcfetch/fetch/apply_linux.go

75 lines
1.3 KiB
Go

package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
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])
}
}
}
}