47 lines
1 KiB
Go
47 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
|
||
|
}
|