// Package sysinfo — metrik host ringan untuk dashboard (F-027). // Linux: baca /proc. OS lain: nilai nol (degrade anggun, tidak pernah panic). package sysinfo import ( "os" "strconv" "strings" ) type Stats struct { MemTotal uint64 // KB MemAvail uint64 // KB Load1 float64 // load average 1 menit Uptime float64 // detik } func Read() Stats { var s Stats if b, err := os.ReadFile("/proc/meminfo"); err == nil { parseMeminfo(string(b), &s) } if b, err := os.ReadFile("/proc/loadavg"); err == nil { parseLoadavg(string(b), &s) } if b, err := os.ReadFile("/proc/uptime"); err == nil { parseUptime(string(b), &s) } return s } func parseMeminfo(s string, st *Stats) { for _, ln := range strings.Split(s, "\n") { f := strings.Fields(ln) if len(f) < 2 { continue } v, err := strconv.ParseUint(f[1], 10, 64) if err != nil { continue } switch f[0] { case "MemTotal:": st.MemTotal = v case "MemAvailable:": st.MemAvail = v } } } func parseLoadavg(s string, st *Stats) { if f := strings.Fields(s); len(f) > 0 { st.Load1, _ = strconv.ParseFloat(f[0], 64) } } func parseUptime(s string, st *Stats) { if f := strings.Fields(s); len(f) > 0 { st.Uptime, _ = strconv.ParseFloat(f[0], 64) } }