46 lines
1 KiB
Go
46 lines
1 KiB
Go
package smartctl
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/influxdata/telegraf/internal"
|
|
)
|
|
|
|
// This is here so we can override it during testing
|
|
var scanArgs = []string{"--json", "--scan-open"}
|
|
|
|
type scanDevice struct {
|
|
Name string
|
|
Type string
|
|
}
|
|
|
|
func (s *Smartctl) scan() ([]scanDevice, error) {
|
|
cmd := execCommand(s.Path, scanArgs...)
|
|
if s.UseSudo {
|
|
cmd = execCommand("sudo", append([]string{"-n", s.Path}, scanArgs...)...)
|
|
}
|
|
out, err := internal.CombinedOutputTimeout(cmd, time.Duration(s.Timeout))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error running smartctl with %s: %w", scanArgs, err)
|
|
}
|
|
|
|
var scan smartctlScanJSON
|
|
if err := json.Unmarshal(out, &scan); err != nil {
|
|
return nil, fmt.Errorf("error unmarshalling smartctl scan output: %w", err)
|
|
}
|
|
|
|
devices := make([]scanDevice, 0)
|
|
for _, device := range scan.Devices {
|
|
if s.deviceFilter.Match(device.Name) {
|
|
device := scanDevice{
|
|
Name: device.Name,
|
|
Type: device.Type,
|
|
}
|
|
devices = append(devices, device)
|
|
}
|
|
}
|
|
|
|
return devices, nil
|
|
}
|