You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gopsutil/sensors/ex_linux.go

80 lines
2.1 KiB
Go

// SPDX-License-Identifier: BSD-3-Clause
//go:build linux
package sensors
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
)
// ExTemperature represents Linux dependent temperature sensor data
type ExTemperature struct {
SensorKey string `json:"key"`
Min float64 `json:"min"` // Temperature min value.
Lowest float64 `json:"lowest"` // Historical minimum temperature
Highest float64 `json:"highest"` // Historical maximum temperature
}
type ExLinux struct{}
func NewExLinux() *ExLinux {
return &ExLinux{}
}
func (ex *ExLinux) TemperatureWithContext(ctx context.Context) ([]ExTemperature, error) {
var warns Warnings
files, err := getTemperatureFiles(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get temperature files, %w", err)
}
temperatures := make([]ExTemperature, 0, len(files))
for _, file := range files {
var raw []byte
// Get the base directory location
directory := filepath.Dir(file)
// Get the base filename prefix like temp1
basename := strings.Split(filepath.Base(file), "_")[0]
// Get the base path like <dir>/temp1
basepath := filepath.Join(directory, basename)
// Get the label of the temperature you are reading
label := ""
if raw, _ = os.ReadFile(basepath + "_label"); len(raw) != 0 {
// Format the label from "Core 0" to "core_0"
label = strings.Join(strings.Split(strings.TrimSpace(strings.ToLower(string(raw))), " "), "_")
}
// Get the name of the temperature you are reading
if raw, err = os.ReadFile(filepath.Join(directory, "name")); err != nil {
warns.Add(err)
continue
}
name := strings.TrimSpace(string(raw))
if label != "" {
name = name + "_" + label
}
// Add discovered temperature sensor to the list
temperatures = append(temperatures, ExTemperature{
SensorKey: name,
Min: optionalValueReadFromFile(basepath+"_min") / hostTemperatureScale,
Lowest: optionalValueReadFromFile(basepath+"_lowest") / hostTemperatureScale,
Highest: optionalValueReadFromFile(basepath+"_highest") / hostTemperatureScale,
})
}
return temperatures, warns.Reference()
}