feat(ui): home dashboard ala mirador — jam blok, panel judul-di-border, metrik docker+host, navigasi 0/1
CI / test (push) Successful in 10s
CI / test (push) Successful in 10s
This commit is contained in:
1 parent
fe781591e3
commit
76cdb0b5bb
10 files changed
+641
-66
No files matched your search
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user