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") } }