From b173b886cc16e2a894bbd5cfe5f024feb2a13305 Mon Sep 17 00:00:00 2001 From: SuperQ Date: Tue, 10 Jan 2023 20:23:47 +0100 Subject: [PATCH] Add device type support Allow passing a custom `-d` / `--device=` flag to smartctl. The default is the same (`auto`) as upstream smartctl. Fixes: https://github.com/prometheus-community/smartctl_exporter/issues/26 Signed-off-by: SuperQ --- main.go | 3 +++ readjson.go | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 3d4e5ba..20b08d1 100644 --- a/main.go +++ b/main.go @@ -66,6 +66,9 @@ var ( smartctlInterval = kingpin.Flag("smartctl.interval", "The interval between smarctl polls", ).Default("60s").Duration() + smartctlDeviceType = kingpin.Flag("smartctl.device-type", + "The device type (-d / --device)", + ).Default("auto").String() smartctlDevices = kingpin.Flag("smartctl.device", "The device to monitor (repeatable)", ).Strings() diff --git a/readjson.go b/readjson.go index 6c3bf26..9f4278a 100644 --- a/readjson.go +++ b/readjson.go @@ -62,9 +62,10 @@ func readFakeSMARTctl(logger log.Logger, device string) gjson.Result { } // Get json from smartctl and parse it -func readSMARTctl(logger log.Logger, device string) (gjson.Result, bool) { - level.Debug(logger).Log("msg", "Collecting S.M.A.R.T. counters", "device", device) - out, err := exec.Command(*smartctlPath, "--json", "--info", "--health", "--attributes", "--tolerance=verypermissive", "--nocheck=standby", "--format=brief", device).Output() +func readSMARTctl(logger log.Logger, deviceType string, device string) (gjson.Result, bool) { + level.Debug(logger).Log("msg", "Collecting S.M.A.R.T. counters", "device_type", deviceType, "device", device) + deviceTypeFlag := fmt.Sprintf("--device=%s", deviceType) + out, err := exec.Command(*smartctlPath, "--json", "--info", "--health", "--attributes", "--tolerance=verypermissive", "--nocheck=standby", "--format=brief", deviceTypeFlag, device).Output() if err != nil { level.Warn(logger).Log("msg", "S.M.A.R.T. output reading", "err", err) } @@ -96,7 +97,7 @@ func readData(logger log.Logger, device string) gjson.Result { cacheValue, cacheOk := jsonCache.Load(device) if !cacheOk || time.Now().After(cacheValue.(JSONCache).LastCollect.Add(*smartctlInterval)) { - json, ok := readSMARTctl(logger, device) + json, ok := readSMARTctl(logger, *smartctlDeviceType, device) if ok { jsonCache.Store(device, JSONCache{JSON: json, LastCollect: time.Now()}) j, found := jsonCache.Load(device)