From 7a8feb155b62f9ed0b0d09a8ff1ca688473db7a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Sat, 5 Feb 2022 22:18:25 +0200 Subject: [PATCH] [host][solaris] implement SensorsTemperaturesWithContext --- host/host_solaris.go | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/host/host_solaris.go b/host/host_solaris.go index 62d4786..0398db9 100644 --- a/host/host_solaris.go +++ b/host/host_solaris.go @@ -4,7 +4,9 @@ import ( "bufio" "bytes" "context" + "encoding/csv" "fmt" + "io" "io/ioutil" "os" "os/exec" @@ -106,7 +108,44 @@ func UsersWithContext(ctx context.Context) ([]UserStat, error) { } func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, error) { - return []TemperatureStat{}, common.ErrNotImplementedError + ipmitool, err := exec.LookPath("ipmitool") + var ret []TemperatureStat + if err != nil { + return ret, err + } + + out, err := invoke.CommandWithContext(ctx, ipmitool, "-c", "sdr", "list") + if err != nil { + return ret, err + } + + r := csv.NewReader(strings.NewReader(string(out))) + // Output may contain errors, e.g. "bmc_send_cmd: Permission denied", don't expect a consistent number of records + r.FieldsPerRecord = -1 + for { + record, err := r.Read() + if err == io.EOF { + break + } + if err != nil { + return ret, err + } + // CPU1 Temp,40,degrees C,ok + if len(record) < 3 || record[1] == "" || record[2] != "degrees C" { + continue + } + v, err := strconv.ParseFloat(record[1], 64) + if err != nil { + return ret, err + } + ts := TemperatureStat{ + SensorKey: strings.TrimSuffix(record[0], " Temp"), + Temperature: v, + } + ret = append(ret, ts) + } + + return ret, nil } func VirtualizationWithContext(ctx context.Context) (string, string, error) {