126
package main
import (
"encoding/json"
"fmt"
"os"
"strings"
)
const HWPATH = "/sys/class/hwmon"
func ReadHwDir(path string) (map[string]string, error) {
dir, err := os.ReadDir(path)
if err != nil {
return nil, err
}
h := make(map[string]string)
var f *os.File
var n int
var r rune
var s string
buff := make([]byte, 32)
for _, d := range dir {
if d.Type().IsRegular() && d.Name() != "uevent" {
f, err = os.OpenFile(path+"/"+d.Name(), os.O_RDONLY, 0)
if err != nil {
continue
}
n, err = f.Read(buff)
if err != nil {
continue
}
// only ascii values
s = ""
for _, r = range string(buff[:n]) {
if r == '\n' || r == '\r' || r < 32 || r > 126 {
continue
}
s += string(r)
}
h[d.Name()] = strings.TrimSuffix(s, "\n")
}
}
return h, nil
}
var doExtra bool = false
var doJson bool = false
func ReadHwMon() (map[string]map[string]string, error) {
dir, err := os.ReadDir(HWPATH)
if err != nil {
return nil, err
}
var hwDir = make(map[string]string)
var hwMon = make(map[string]map[string]string)
var name string
for _, d := range dir {
hwDir, err = ReadHwDir(HWPATH + "/" + d.Name())
if err != nil {
continue
}
if doExtra {
var hwDir2 map[string]string
hwDir2, err = ReadHwDir(HWPATH + "/" + d.Name() + "/device/")
if err != nil {
continue
}
for k, v := range hwDir2 {
hwDir["device_"+k] = v
}
}
hwDir["path"] = HWPATH + "/" + d.Name()
if name = hwDir["name"]; name == "" {
name = d.Name()
}
hwMon[name] = hwDir
}
return hwMon, nil
}
func init() {
for _, arg := range os.Args[1:] {
if arg == "--extra" {
doExtra = true
}
if arg == "--help" || arg == "-h" {
fmt.Println("Usage: hwmon [--extra] [--json] [--help|-h]")
fmt.Println("Read hardware monitoring information from /sys/class/hwmon")
fmt.Println("--extra: get extra details from device subdirectory")
fmt.Println("--json: output in JSON format")
fmt.Println("--help|-h: show this help message")
os.Exit(0)
}
if arg == "--json" {
doJson = true
}
}
}
func main() {
hwMon, err := ReadHwMon()
if err != nil {
fmt.Println(err)
}
if doJson {
var b []byte
b, err = json.MarshalIndent(hwMon, "", " ")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(b))
return
}
var key, val string
for i := range hwMon {
fmt.Printf("%s:\n", i)
for key, val = range hwMon[i] {
fmt.Printf("\t%s: %s\n", key, val)
}
}
if !doExtra {
fmt.Println("\nuse flag --extra to get more details")
}
}