feat(ui): home dashboard ala mirador — jam blok, panel judul-di-border, metrik docker+host, navigasi 0/1
CI / test (push) Successful in 10s

This commit is contained in:
oxpoe committed 2026-10-15 09:43:54 +07:00
1 parent fe781591e3
commit 76cdb0b5bb
10 files changed
+641 -66

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
// 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)
}
}