diff options
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/cpu.go | 15 | ||||
-rw-r--r-- | widgets/mem_freebsd.go | 5 | ||||
-rw-r--r-- | widgets/temp_freebsd.go | 71 |
3 files changed, 73 insertions, 18 deletions
diff --git a/widgets/cpu.go b/widgets/cpu.go index 37c4220..c0f25bc 100644 --- a/widgets/cpu.go +++ b/widgets/cpu.go @@ -9,6 +9,7 @@ import ( "github.com/prometheus/client_golang/prometheus" psCpu "github.com/shirou/gopsutil/cpu" + "github.com/xxxserxxx/gotop/devices" ui "github.com/xxxserxxx/gotop/termui" ) @@ -25,9 +26,9 @@ type CpuWidget struct { } func NewCpuWidget(updateInterval time.Duration, horizontalScale int, showAverageLoad bool, showPerCpuLoad bool) *CpuWidget { - cpuCount, err := psCpu.Counts(false) + cpuCount, err := devices.Counts(false) if err != nil { - log.Printf("failed to get CPU count from gopsutil: %v", err) + log.Printf("failed to get CPU count: %v", err) } formatString := "CPU%1d" if cpuCount > 10 { @@ -110,9 +111,9 @@ func (b *CpuWidget) Scale(i int) { func (self *CpuWidget) update() { if self.ShowAverageLoad { go func() { - percent, err := psCpu.Percent(self.updateInterval, false) + percent, err := devices.Percent(self.updateInterval, false) if err != nil { - log.Printf("failed to get average CPU usage percent from gopsutil: %v. self.updateInterval: %v. percpu: %v", err, self.updateInterval, false) + log.Printf("failed to get average CPU usage percent: %v. self.updateInterval: %v. percpu: %v", err, self.updateInterval, false) } else { self.Lock() defer self.Unlock() @@ -129,12 +130,12 @@ func (self *CpuWidget) update() { if self.ShowPerCpuLoad { go func() { - percents, err := psCpu.Percent(self.updateInterval, true) + percents, err := devices.Percent(self.updateInterval, true) if err != nil { - log.Printf("failed to get CPU usage percents from gopsutil: %v. self.updateInterval: %v. percpu: %v", err, self.updateInterval, true) + log.Printf("failed to get CPU usage percents: %v. self.updateInterval: %v. percpu: %v", err, self.updateInterval, true) } else { if len(percents) != int(self.CpuCount) { - log.Printf("error: number of CPU usage percents from gopsutil doesn't match CPU count. percents: %v. self.Count: %v", percents, self.CpuCount) + log.Printf("error: number of CPU usage percents doesn't match CPU count. percents: %v. self.Count: %v", percents, self.CpuCount) } else { self.Lock() defer self.Unlock() diff --git a/widgets/mem_freebsd.go b/widgets/mem_freebsd.go index 58286f3..c0151c2 100644 --- a/widgets/mem_freebsd.go +++ b/widgets/mem_freebsd.go @@ -42,7 +42,10 @@ func gatherSwapInfo() (MemoryInfo, error) { } } - ss := strings.Split(strings.TrimSuffix(string(output), "\n"), " ") + s := strings.TrimSuffix(string(output), "\n") + s = strings.ReplaceAll(s, "\n", " ") + ss := strings.Split(s, " ") + ss = ss[((len(ss)/3)-1)*3:] return convert(ss) } diff --git a/widgets/temp_freebsd.go b/widgets/temp_freebsd.go index 8d9eda6..c5d67b2 100644 --- a/widgets/temp_freebsd.go +++ b/widgets/temp_freebsd.go @@ -3,12 +3,11 @@ package widgets import ( - "fmt" - "log" "os/exec" "strconv" "strings" + "github.com/rai-project/nvidia-smi" "github.com/xxxserxxx/gotop/utils" ) @@ -37,31 +36,83 @@ func refineOutput(output []byte) (float64, error) { return value, nil } -func collectSensors() ([]sensorMeasurement, error) { +func collectSysctlSensors() []sensorMeasurement { var measurements []sensorMeasurement for k, v := range sensorOIDS { output, err := exec.Command("sysctl", "-n", k).Output() if err != nil { - return nil, fmt.Errorf("failed to execute 'sysctl' command: %v", err) + continue } value, err := refineOutput(output) if err != nil { - return nil, fmt.Errorf("failed to execute 'sysctl' command: %v", err) + continue } measurements = append(measurements, sensorMeasurement{v, value}) + } + + return measurements +} + +func collectNvidiaSensors() []sensorMeasurement { + var measurements []sensorMeasurement + info, _ := nvidiasmi.New() + if info.HasGPU() { + for i := range info.GPUS { + gpu := info.GPUS[i] + var s sensorMeasurement + s.name = gpu.ProductName + " " + strconv.Itoa(i) + s.temperature, _ = strconv.ParseFloat(strings.ReplaceAll(gpu.GpuTemp, " C", ""), 10) + measurements = append(measurements, s) + } } - return measurements, nil + return measurements } -func (self *TempWidget) update() { - sensors, err := collectSensors() - if err != nil { - log.Printf("error received from gopsutil: %v", err) +func collectAMDGPUSensors() []sensorMeasurement { + var measurments []sensorMeasurement + + return measurments +} + +func collectGPUSensors() []sensorMeasurement { + var measurements []sensorMeasurement + + measurements = append(measurements, collectSysctlSensors()...) + measurements = append(measurements, collectNvidiaSensors()...) + measurements = append(measurements, collectAMDGPUSensors()...) + + return measurements +} + +func collectSensors() []sensorMeasurement { + var measurements []sensorMeasurement + for k, v := range sensorOIDS { + output, err := exec.Command("sysctl", "-n", k).Output() + if err != nil { + continue + } + + value, err := refineOutput(output) + if err != nil { + continue + } + + measurements = append(measurements, sensorMeasurement{v, value}) } + + measurements = append(measurements, collectGPUSensors()...) + + return measurements + +} + +func (self *TempWidget) update() { + sensors := collectSensors() + for _, sensor := range sensors { switch self.TempScale { case Fahrenheit: |