in metric/system/hwmon/hwmon.go [55:112]
func DetectHwmon(hostfs resolve.Resolver) ([]Device, error) {
sensorTypeRegex := regexp.MustCompile("(^[a-z]*)([0-9]*)")
fullPath := hostfs.ResolveHostFS(baseDir)
_, err := os.Stat(fullPath)
if os.IsNotExist(err) {
return nil, fmt.Errorf("hwmon path %s does not exist", fullPath)
}
paths, err := os.ReadDir(fullPath)
if err != nil {
return nil, fmt.Errorf("error reading directory %s: %w", fullPath, err)
}
sensorList := []Device{}
for _, path := range paths {
name := filepath.Join(fullPath, path.Name())
apath := name
// This lstat call is largely to deal with the relative paths used by tests
stat, err := os.Lstat(name)
if err != nil {
return nil, fmt.Errorf("error statting hwinfo path %s: %w", name, err)
}
if stat.Mode()&os.ModeSymlink != 0 {
apath, err = os.Readlink(name)
if err != nil {
return nil, fmt.Errorf("error reading path link %s: %w", name, err)
}
}
if !filepath.IsAbs(apath) && stat.Mode()&os.ModeSymlink != 0 {
apath = filepath.Join(baseDir, apath)
}
sensors, err := findSensorsInPath(apath, sensorTypeRegex)
if err != nil {
return nil, err
}
namePath := filepath.Join(apath, "name")
sensorName, err := os.ReadFile(namePath)
if err != nil {
return nil, fmt.Errorf("error reading sensor name file %s: %w", namePath, err)
}
strName := strings.TrimSpace(string(sensorName))
sensorList = append(sensorList, Device{Name: strName, AbsPath: apath, Sensors: sensors})
}
if len(sensorList) == 0 {
return nil, fmt.Errorf("no hwmon devices found in %s", fullPath)
}
return sensorList, nil
}