git.sophuwu.com > hwmongo   
              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")
	}
}