feat: create standalone native fnOS repository
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
//go:build linux
|
||||
|
||||
package sysinfo
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func readPlatform() (Stats, CPUSample) {
|
||||
var (
|
||||
stats Stats
|
||||
sample CPUSample
|
||||
)
|
||||
if raw, err := os.ReadFile("/proc/stat"); err == nil {
|
||||
sample = parseProcStat(string(raw))
|
||||
}
|
||||
if raw, err := os.ReadFile("/proc/meminfo"); err == nil {
|
||||
stats.MemTotalBytes, stats.MemUsedBytes = parseMemInfo(string(raw))
|
||||
}
|
||||
stats.DiskTotalBytes, stats.DiskUsedBytes = diskUsage("/")
|
||||
return stats, sample
|
||||
}
|
||||
|
||||
// LoadAvg 返回 1 / 5 / 15 分钟平均负载;读取失败返回 nil
|
||||
func LoadAvg() []float64 {
|
||||
raw, err := os.ReadFile("/proc/loadavg")
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
fields := strings.Fields(string(raw))
|
||||
if len(fields) < 3 {
|
||||
return nil
|
||||
}
|
||||
values := make([]float64, 0, 3)
|
||||
for _, field := range fields[:3] {
|
||||
value, err := strconv.ParseFloat(field, 64)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
values = append(values, value)
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
// UptimeSeconds 返回系统运行秒数(/proc/uptime)
|
||||
func UptimeSeconds() uint64 {
|
||||
raw, err := os.ReadFile("/proc/uptime")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
fields := strings.Fields(string(raw))
|
||||
if len(fields) == 0 {
|
||||
return 0
|
||||
}
|
||||
seconds, err := strconv.ParseFloat(fields[0], 64)
|
||||
if err != nil || seconds < 0 {
|
||||
return 0
|
||||
}
|
||||
return uint64(seconds)
|
||||
}
|
||||
|
||||
func diskUsage(path string) (total, used uint64) {
|
||||
var stat syscall.Statfs_t
|
||||
if err := syscall.Statfs(path, &stat); err != nil {
|
||||
return 0, 0
|
||||
}
|
||||
total = stat.Blocks * uint64(stat.Bsize)
|
||||
free := stat.Bavail * uint64(stat.Bsize)
|
||||
if free > total {
|
||||
return total, 0
|
||||
}
|
||||
return total, total - free
|
||||
}
|
||||
Reference in New Issue
Block a user