provide a mechanism to specify the absolute path to the smartctl binary used by metrics collector.

- fixes #304
pull/307/head
Jason Kulatunga 3 years ago
parent 7babc280a0
commit 157c93b967

@ -98,10 +98,10 @@ func (mc *MetricsCollector) Run() error {
func (mc *MetricsCollector) Validate() error { func (mc *MetricsCollector) Validate() error {
mc.logger.Infoln("Verifying required tools") mc.logger.Infoln("Verifying required tools")
_, lookErr := exec.LookPath("smartctl") _, lookErr := exec.LookPath(mc.config.GetString("commands.metrics_smartctl_bin"))
if lookErr != nil { if lookErr != nil {
return errors.DependencyMissingError("smartctl is missing") return errors.DependencyMissingError(fmt.Sprintf("%s binary is missing", mc.config.GetString("commands.metrics_smartctl_bin")))
} }
return nil return nil
@ -124,7 +124,7 @@ func (mc *MetricsCollector) Collect(deviceWWN string, deviceName string, deviceT
} }
args = append(args, fullDeviceName) args = append(args, fullDeviceName)
result, err := mc.shell.Command(mc.logger, "smartctl", args, "", os.Environ()) result, err := mc.shell.Command(mc.logger, mc.config.GetString("commands.metrics_smartctl_bin"), args, "", os.Environ())
resultBytes := []byte(result) resultBytes := []byte(result)
if err != nil { if err != nil {
if exitError, ok := err.(*exec.ExitError); ok { if exitError, ok := err.(*exec.ExitError); ok {

@ -43,6 +43,7 @@ func (c *configuration) Init() error {
c.SetDefault("api.endpoint", "http://localhost:8080") c.SetDefault("api.endpoint", "http://localhost:8080")
c.SetDefault("commands.metrics_smartctl_bin", "smartctl")
c.SetDefault("commands.metrics_scan_args", "--scan --json") c.SetDefault("commands.metrics_scan_args", "--scan --json")
c.SetDefault("commands.metrics_info_args", "--info --json") c.SetDefault("commands.metrics_info_args", "--info --json")
c.SetDefault("commands.metrics_smart_args", "--xall --json") c.SetDefault("commands.metrics_smart_args", "--xall --json")

@ -29,7 +29,7 @@ type Detect struct {
func (d *Detect) SmartctlScan() ([]models.Device, error) { func (d *Detect) SmartctlScan() ([]models.Device, error) {
//we use smartctl to detect all the drives available. //we use smartctl to detect all the drives available.
args := strings.Split(d.Config.GetString("commands.metrics_scan_args"), " ") args := strings.Split(d.Config.GetString("commands.metrics_scan_args"), " ")
detectedDeviceConnJson, err := d.Shell.Command(d.Logger, "smartctl", args, "", os.Environ()) detectedDeviceConnJson, err := d.Shell.Command(d.Logger, d.Config.GetString("commands.metrics_smartctl_bin"), args, "", os.Environ())
if err != nil { if err != nil {
d.Logger.Errorf("Error scanning for devices: %v", err) d.Logger.Errorf("Error scanning for devices: %v", err)
return nil, err return nil, err
@ -60,7 +60,7 @@ func (d *Detect) SmartCtlInfo(device *models.Device) error {
} }
args = append(args, fullDeviceName) args = append(args, fullDeviceName)
availableDeviceInfoJson, err := d.Shell.Command(d.Logger, "smartctl", args, "", os.Environ()) availableDeviceInfoJson, err := d.Shell.Command(d.Logger, d.Config.GetString("commands.metrics_smartctl_bin"), args, "", os.Environ())
if err != nil { if err != nil {
d.Logger.Errorf("Could not retrieve device information for %s: %v", device.DeviceName, err) d.Logger.Errorf("Could not retrieve device information for %s: %v", device.DeviceName, err)
return err return err

@ -73,6 +73,7 @@ devices:
# example to show how to override the smartctl command args globally # example to show how to override the smartctl command args globally
#commands: #commands:
# metrics_smartctl_bin: 'smartctl' # change to provide custom `smartctl` binary path, eg. `/usr/sbin/smartctl`
# metrics_scan_args: '--scan --json' # used to detect devices # metrics_scan_args: '--scan --json' # used to detect devices
# metrics_info_args: '--info --json' # used to determine device unique ID & register device with Scrutiny # metrics_info_args: '--info --json' # used to determine device unique ID & register device with Scrutiny
# metrics_smart_args: '--xall --json' # used to retrieve smart data for each device. # metrics_smart_args: '--xall --json' # used to retrieve smart data for each device.

Loading…
Cancel
Save