From daf1182285c559d7e1a62f3a7e8b19b7ce85f06d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=A0=A9=E5=BD=AC?= Date: Sat, 15 Oct 2022 11:39:36 +0800 Subject: [PATCH] FIX: remove `os.stat` in order to fit in windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 赵栩彬 --- main.go | 35 ++++++++++++++++++++++++++--------- readjson.go | 20 ++++++++------------ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/main.go b/main.go index 32bb7a5..403c269 100644 --- a/main.go +++ b/main.go @@ -94,19 +94,36 @@ func main() { level.Info(logger).Log("msg", "Starting systemd_exporter", "version", version.Info()) level.Info(logger).Log("msg", "Build context", "build_context", version.BuildContext()) - devices := *smartctlDevices + // Scan the host devices + json := readSMARTctlDevices(logger) + scanDevices := json.Get("devices").Array() + scanDevicesSet := make(map[string]bool) + var scanDeviceNames []string + for _, d := range scanDevices { + deviceName := d.Get("name").String() + level.Debug(logger).Log("msg", "Found device", "name", deviceName) + scanDevicesSet[deviceName] = true + scanDeviceNames = append(scanDeviceNames, deviceName) + } - if len(devices) == 0 { - level.Info(logger).Log("msg", "No devices specified, trying to load them automatically") - json := readSMARTctlDevices(logger) - scannedDevices := json.Get("devices").Array() - for _, d := range scannedDevices { - device := d.Get("name").String() - level.Info(logger).Log("msg", "Found device", "device", device) - devices = append(devices, device) + // Read the configuration and verify that it is available + devices := *smartctlDevices + var readDeviceNames []string + for _, device := range devices { + if _, ok := scanDevicesSet[device]; ok { + readDeviceNames = append(readDeviceNames, device) + } else { + level.Warn(logger).Log("msg", "Device unavailable", "name", device) } } + if len(readDeviceNames) > 0 { + devices = readDeviceNames + } else { + level.Info(logger).Log("msg", "No devices specified, trying to load them automatically") + devices = scanDeviceNames + } + if len(devices) == 0 { level.Error(logger).Log("msg", "No devices found") os.Exit(1) diff --git a/readjson.go b/readjson.go index 89b4494..7ad463b 100644 --- a/readjson.go +++ b/readjson.go @@ -16,7 +16,6 @@ package main import ( "fmt" "io/ioutil" - "os" "os/exec" "strings" "time" @@ -94,19 +93,16 @@ func readData(logger log.Logger, device string) (gjson.Result, error) { return readFakeSMARTctl(logger, device), nil } - if _, err := os.Stat(device); err == nil { - cacheValue, cacheOk := jsonCache[device] - if !cacheOk || time.Now().After(cacheValue.LastCollect.Add(*smartctlInterval)) { - json, ok := readSMARTctl(logger, device) - if ok { - jsonCache[device] = JSONCache{JSON: json, LastCollect: time.Now()} - return jsonCache[device].JSON, nil - } - return gjson.Parse("{}"), fmt.Errorf("smartctl returned bad data for device %s", device) + cacheValue, cacheOk := jsonCache[device] + if !cacheOk || time.Now().After(cacheValue.LastCollect.Add(*smartctlInterval)) { + json, ok := readSMARTctl(logger, device) + if ok { + jsonCache[device] = JSONCache{JSON: json, LastCollect: time.Now()} + return jsonCache[device].JSON, nil } - return cacheValue.JSON, nil + return gjson.Parse("{}"), fmt.Errorf("smartctl returned bad data for device %s", device) } - return gjson.Parse("{}"), fmt.Errorf("Device %s unavialable", device) + return cacheValue.JSON, nil } // Parse smartctl return code