use single map, improve logic and logging

This commit is contained in:
rare-magma 2022-06-19 22:11:56 +02:00
parent e96355d0b8
commit d7232aacb7

View File

@ -8,12 +8,10 @@ import (
"github.com/anatol/smart.go" "github.com/anatol/smart.go"
"github.com/jaypipes/ghw" "github.com/jaypipes/ghw"
"github.com/jaypipes/ghw/pkg/block"
"github.com/shirou/gopsutil/host" "github.com/shirou/gopsutil/host"
) )
var disks []block.Disk var smDevices map[string]smart.Device
var smDevices []smart.Device
func init() { func init() {
devs() // Populate the sensorMap devs() // Populate the sensorMap
@ -24,27 +22,29 @@ func init() {
} }
func startBlock(vars map[string]string) error { func startBlock(vars map[string]string) error {
smDevices = make(map[string]smart.Device)
block, err := ghw.Block() block, err := ghw.Block()
if err != nil { if err != nil {
log.Print("error getting block device info") log.Printf("error getting block device info: %s", err)
return err return err
} }
for _, disk := range block.Disks { for _, disk := range block.Disks {
dev, err := smart.Open("/dev/" + disk.Name) dev, err := smart.Open("/dev/" + disk.Name)
if err == nil { if err != nil {
disks = append(disks, *disk) log.Printf("error opening smart info for %s: %s", disk.Name, err)
smDevices = append(smDevices, dev) continue
} }
smDevices[disk.Name+"_"+disk.Model] = dev
} }
return err return nil
} }
func endBlock() error { func endBlock() error {
for _, dev := range smDevices { for name, dev := range smDevices {
err := dev.Close() err := dev.Close()
if err != nil { if err != nil {
log.Print("error closing device") log.Printf("error closing device %s: %s", name, err)
return err
} }
} }
return nil return nil
@ -66,31 +66,29 @@ func getTemps(temps map[string]int) map[string]error {
} }
} }
for i, dev := range smDevices { for name, dev := range smDevices {
switch sm := dev.(type) { switch sm := dev.(type) {
case *smart.SataDevice: case *smart.SataDevice:
data, err := sm.ReadSMARTData() data, err := sm.ReadSMARTData()
if err != nil { if err != nil {
log.Print("error getting smart data for " + disks[i].Name + "_" + disks[i].Model) log.Printf("error getting smart data for %s: %s", name, err)
log.Print(err) continue
break
} }
if attr, ok := data.Attrs[194]; ok { if attr, ok := data.Attrs[194]; ok {
val, _, _, _, err := attr.ParseAsTemperature() val, _, _, _, err := attr.ParseAsTemperature()
if err != nil { if err != nil {
log.Print("error parsing temperature smart data for " + disks[i].Name + "_" + disks[i].Model) log.Printf("error parsing temperature smart data for %s: %s", name, err)
log.Print(err) continue
break
} }
temps[disks[i].Name+"_"+disks[i].Model] = int(val) temps[name] = val
} }
case *smart.NVMeDevice: case *smart.NVMeDevice:
data, err := sm.ReadSMART() data, err := sm.ReadSMART()
if err != nil { if err != nil {
log.Print("error getting smart data for " + disks[i].Name + "_" + disks[i].Model) log.Printf("error getting smart data for %s: %s", name, err)
break continue
} }
temps[disks[i].Name+"_"+disks[i].Model] = int(data.Temperature) temps[name] = int(data.Temperature)
default: default:
} }
} }