func DetectHwmon()

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
}