83 lines
1.6 KiB
Go
83 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/shirou/gopsutil/v3/cpu"
|
|
"github.com/shirou/gopsutil/v3/mem"
|
|
)
|
|
|
|
func isSupported() bool {
|
|
goos := os.Getenv("TMUX_SYSUSAGE_GOOS") // Debug/Override optional
|
|
if goos == "" {
|
|
goos = detectGOOS()
|
|
}
|
|
switch goos {
|
|
case "darwin":
|
|
return true
|
|
case "linux":
|
|
id := linuxID()
|
|
return id == "ubuntu" || id == "arch"
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func detectGOOS() string {
|
|
// runtime.GOOS vermeiden, um Import minimal zu halten? Es ist Standard—nutzen wir.
|
|
// (Minimale Imports sind nice-to-have, aber runtime ist winzig.)
|
|
// Wir nehmen ihn doch, weil zuverlässig.
|
|
// → Ein einzelner Import mehr ist ok.
|
|
return runtimeGOOS()
|
|
}
|
|
|
|
//go:noinline
|
|
func runtimeGOOS() string {
|
|
// kleiner Trick: getrennt, damit der Compiler runtime nicht inlined—irrelevant, aber clean.
|
|
return getGOOS()
|
|
}
|
|
|
|
//go:linkname getGOOS runtime.GOOS
|
|
func getGOOS() string
|
|
|
|
func linuxID() string {
|
|
f, err := os.Open("/etc/os-release")
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
defer f.Close()
|
|
sc := bufio.NewScanner(f)
|
|
for sc.Scan() {
|
|
line := sc.Text()
|
|
if strings.HasPrefix(line, "ID=") {
|
|
val := strings.TrimPrefix(line, "ID=")
|
|
val = strings.Trim(val, `"`)
|
|
return strings.ToLower(val)
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func main() {
|
|
if !isSupported() {
|
|
// Keine Ausgabe auf nicht unterstützten Systemen
|
|
return
|
|
}
|
|
// Kurze CPU-Stichprobe
|
|
values, err := cpu.Percent(400*time.Millisecond, false)
|
|
if err != nil || len(values) == 0 {
|
|
return
|
|
}
|
|
vm, err := mem.VirtualMemory()
|
|
if err != nil {
|
|
return
|
|
}
|
|
// Kompakte tmux-Ausgabe
|
|
fmt.Printf("CPU %.0f%% | RAM %.0f%%", values[0], vm.UsedPercent)
|
|
}
|
|
|