159
package main
import (
"os"
"time"
)
var (
cpuLoad,
cpuMHz,
cpuTemp int
totalMem,
usedMem,
takenMem,
freeMem,
availMem,
prctMem,
prctBuff,
prctFree float64
)
func errCheck(err error) {
if err != nil {
os.Exit(1)
}
}
func numFromLine(i int, b []byte, n *float64) int {
for ; i < len(b); i++ {
if b[i] == 10 {
return i + 1
}
if b[i] >= 48 && b[i] <= 57 {
*n = *n*10 + float64(b[i]) - 48
}
}
return i
}
func getMem() {
b := make([]byte, 84)
f, err := os.Open("/proc/meminfo")
errCheck(err)
_, err = f.Read(b)
errCheck(err)
f.Close()
i := numFromLine(0, b, &totalMem)
totalMem /= 1000
i = numFromLine(i, b, &freeMem)
freeMem /= 1000
_ = numFromLine(i, b, &availMem)
availMem /= 1000
usedMem = totalMem - freeMem
takenMem = totalMem - availMem
prctMem = takenMem * 100 / totalMem
prctBuff = (usedMem - takenMem) * 100 / totalMem
prctFree = freeMem * 100 / totalMem
}
func getCPUTemp() {
isX86 := func(b []byte) bool {
if len(b) < 12 {
return false
}
for i, v := range []byte{120, 56, 54, 95, 112, 107, 103, 95, 116, 101, 109, 112} {
if b[i] != v {
return false
}
}
return true
}
var (
err error = nil
i int = 0
b = make([]byte, 12)
)
for ; err == nil && !isX86(b); i++ {
b, err = os.ReadFile("/sys/class/thermal/thermal_zone" + string(i+48) + "/type")
}
errCheck(err)
b, err = os.ReadFile("/sys/class/thermal/thermal_zone" + string(i+48-1) + "/temp")
errCheck(err)
cpuTemp = (int(b[0])-48)*10 + int(b[1]) - 48
}
func getCPU() {
readStat := func(n *[4]float64) {
b := make([]byte, 100)
f, err := os.Open("/proc/stat")
errCheck(err)
_, err = f.Read(b)
errCheck(err)
f.Close()
for i, j := 6, 0; j < 4; i++ {
if b[i] >= 48 && b[i] <= 57 {
n[j] = n[j]*10 + float64(b[i]) - 48
} else if b[i] == ' ' {
j++
}
}
}
var a, b [4]float64
readStat(&a)
time.Sleep(1 * time.Second)
readStat(&b)
cpuLoad = int(100 * ((b[0] + b[1] + b[2]) - (a[0] + a[1] + a[2])) / ((b[0] + b[1] + b[2] + b[3]) - (a[0] + a[1] + a[2] + a[3])))
}
func getMHz() {
b, err := os.ReadFile("/proc/cpuinfo")
errCheck(err)
var tmp, j int
cpuMHz = 0
for i := 0; i < len(b); i++ {
if string(b[i:i+7]) == "cpu MHz" {
tmp = 0
for ; i < len(b) && b[i] != 10 && b[i] != '.'; i++ {
if b[i] >= 48 && b[i] <= 57 {
tmp = tmp*10 + int(b[i]) - 48
}
}
cpuMHz += tmp
j++
}
}
cpuMHz /= j
}
func round(f float64) string {
var n int = int(f*1000) % 1000
var s string = ""
for i := 0; i < 3; i++ {
if n%10 >= 5 {
n += 10
}
n /= 10
}
n = int(f) + n
for n > 0 {
s = string(n%10+48) + s
n /= 10
}
return s
}
func main() {
go getMem()
//go getCPUTemp()
go getMHz()
getCPU()
println(" Mem: ", round(prctMem), "% USED ", round(prctBuff), "% BUFF ", round(prctFree), "% FREE CPU: ", cpuLoad, "% ", cpuTemp, "C ", cpuMHz, "MHz")
}