commit
b45fb2dc1c
13
src/utils/conversions.go
Normal file
13
src/utils/conversions.go
Normal file
@ -0,0 +1,13 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ConvertLocalizedString(s string) string {
|
||||
if strings.ContainsAny(s, ",") {
|
||||
return strings.Replace(s, ",", ".", 1)
|
||||
} else {
|
||||
return s
|
||||
}
|
||||
}
|
@ -16,6 +16,38 @@ type MemWidget struct {
|
||||
updateInterval time.Duration
|
||||
}
|
||||
|
||||
type MemoryInfo struct {
|
||||
Total uint64
|
||||
Used uint64
|
||||
UsedPercent float64
|
||||
}
|
||||
|
||||
func (self *MemWidget) renderMemInfo(line string, memoryInfo MemoryInfo) {
|
||||
self.Data[line] = append(self.Data[line], memoryInfo.UsedPercent)
|
||||
memoryTotalBytes, memoryTotalMagnitude := utils.ConvertBytes(memoryInfo.Total)
|
||||
memoryUsedBytes, memoryUsedMagnitude := utils.ConvertBytes(memoryInfo.Used)
|
||||
self.Labels[line] = fmt.Sprintf("%3.0f%% %5.1f%s/%.0f%s",
|
||||
memoryInfo.UsedPercent,
|
||||
memoryUsedBytes,
|
||||
memoryUsedMagnitude,
|
||||
memoryTotalBytes,
|
||||
memoryTotalMagnitude,
|
||||
)
|
||||
}
|
||||
|
||||
func (self *MemWidget) updateMainMemory() {
|
||||
mainMemory, err := psMem.VirtualMemory()
|
||||
if err != nil {
|
||||
log.Printf("failed to get main memory info from gopsutil: %v", err)
|
||||
} else {
|
||||
self.renderMemInfo("Main", MemoryInfo{
|
||||
Total: mainMemory.Total,
|
||||
Used: mainMemory.Used,
|
||||
UsedPercent: mainMemory.UsedPercent,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func NewMemWidget(updateInterval time.Duration, horizontalScale int) *MemWidget {
|
||||
self := &MemWidget{
|
||||
LineGraph: ui.NewLineGraph(),
|
||||
@ -26,49 +58,17 @@ func NewMemWidget(updateInterval time.Duration, horizontalScale int) *MemWidget
|
||||
self.Data["Main"] = []float64{0}
|
||||
self.Data["Swap"] = []float64{0}
|
||||
|
||||
self.update()
|
||||
self.updateMainMemory()
|
||||
self.updateSwapMemory()
|
||||
|
||||
go func() {
|
||||
for range time.NewTicker(self.updateInterval).C {
|
||||
self.Lock()
|
||||
self.update()
|
||||
self.updateMainMemory()
|
||||
self.updateSwapMemory()
|
||||
self.Unlock()
|
||||
}
|
||||
}()
|
||||
|
||||
return self
|
||||
}
|
||||
|
||||
func (self *MemWidget) update() {
|
||||
mainMemory, err := psMem.VirtualMemory()
|
||||
if err != nil {
|
||||
log.Printf("failed to get main memory info from gopsutil: %v", err)
|
||||
} else {
|
||||
self.Data["Main"] = append(self.Data["Main"], mainMemory.UsedPercent)
|
||||
mainMemoryTotalBytes, mainMemoryTotalMagnitude := utils.ConvertBytes(mainMemory.Total)
|
||||
mainMemoryUsedBytes, mainMemoryUsedMagnitude := utils.ConvertBytes(mainMemory.Used)
|
||||
self.Labels["Main"] = fmt.Sprintf("%3.0f%% %5.1f%s/%.0f%s",
|
||||
mainMemory.UsedPercent,
|
||||
mainMemoryUsedBytes,
|
||||
mainMemoryUsedMagnitude,
|
||||
mainMemoryTotalBytes,
|
||||
mainMemoryTotalMagnitude,
|
||||
)
|
||||
}
|
||||
|
||||
swapMemory, err := psMem.SwapMemory()
|
||||
if err != nil {
|
||||
log.Printf("failed to get swap memory info from gopsutil: %v", err)
|
||||
} else {
|
||||
self.Data["Swap"] = append(self.Data["Swap"], swapMemory.UsedPercent)
|
||||
swapMemoryTotalBytes, swapMemoryTotalMagnitude := utils.ConvertBytes(swapMemory.Total)
|
||||
swapMemoryUsedBytes, swapMemoryUsedMagnitude := utils.ConvertBytes(swapMemory.Used)
|
||||
self.Labels["Swap"] = fmt.Sprintf("%3.0f%% %5.1f%s/%.0f%s",
|
||||
swapMemory.UsedPercent,
|
||||
swapMemoryUsedBytes,
|
||||
swapMemoryUsedMagnitude,
|
||||
swapMemoryTotalBytes,
|
||||
swapMemoryTotalMagnitude,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
61
src/widgets/mem_freebsd.go
Normal file
61
src/widgets/mem_freebsd.go
Normal file
@ -0,0 +1,61 @@
|
||||
package widgets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/cjbassi/gotop/src/utils"
|
||||
)
|
||||
|
||||
func convert(s []string) (MemoryInfo, error) {
|
||||
total, err := strconv.ParseUint(s[0], 10, 64)
|
||||
if err != nil {
|
||||
return MemoryInfo{}, fmt.Errorf("int converion failed %v", err)
|
||||
}
|
||||
|
||||
used, err := strconv.ParseUint(s[1], 10, 64)
|
||||
if err != nil {
|
||||
return MemoryInfo{}, fmt.Errorf("int converion failed %v", err)
|
||||
}
|
||||
|
||||
percentage, err := strconv.ParseFloat(strings.TrimSuffix(s[2], "%"), 64)
|
||||
if err != nil {
|
||||
return MemoryInfo{}, fmt.Errorf("float converion failed %v", err)
|
||||
}
|
||||
|
||||
return MemoryInfo{
|
||||
Total: total * utils.KB,
|
||||
Used: used * utils.KB,
|
||||
UsedPercent: percentage,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func gatherSwapInfo() (MemoryInfo, error) {
|
||||
cmd := "swapinfo -k|sed -n '1!p'|awk '{print $2,$3,$5}'"
|
||||
output, err := exec.Command("sh", "-c", cmd).Output()
|
||||
if err != nil {
|
||||
if err != nil {
|
||||
return MemoryInfo{}, fmt.Errorf("command failed %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
ss := strings.Split(strings.TrimSuffix(string(output), "\n"), " ")
|
||||
|
||||
return convert(ss)
|
||||
}
|
||||
|
||||
func (self *MemWidget) updateSwapMemory() {
|
||||
swapMemory, err := gatherSwapInfo()
|
||||
if err != nil {
|
||||
log.Printf("failed to get swap memory info from gopsutil: %v", err)
|
||||
} else {
|
||||
self.renderMemInfo("Swap", MemoryInfo{
|
||||
Total: swapMemory.Total,
|
||||
Used: swapMemory.Used,
|
||||
UsedPercent: swapMemory.UsedPercent,
|
||||
})
|
||||
}
|
||||
}
|
22
src/widgets/mem_other.go
Normal file
22
src/widgets/mem_other.go
Normal file
@ -0,0 +1,22 @@
|
||||
// +build !freebsd
|
||||
|
||||
package widgets
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
psMem "github.com/shirou/gopsutil/mem"
|
||||
)
|
||||
|
||||
func (self *MemWidget) updateSwapMemory() {
|
||||
swapMemory, err := psMem.SwapMemory()
|
||||
if err != nil {
|
||||
log.Printf("failed to get swap memory info from gopsutil: %v", err)
|
||||
} else {
|
||||
self.renderMemInfo("Swap", MemoryInfo{
|
||||
Total: swapMemory.Total,
|
||||
Used: swapMemory.Used,
|
||||
UsedPercent: swapMemory.UsedPercent,
|
||||
})
|
||||
}
|
||||
}
|
@ -1,5 +1,3 @@
|
||||
// +build freebsd
|
||||
|
||||
package widgets
|
||||
|
||||
import (
|
||||
@ -9,6 +7,8 @@ import (
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/cjbassi/gotop/src/utils"
|
||||
)
|
||||
|
||||
type processList struct {
|
||||
@ -44,11 +44,11 @@ func getProcs() ([]Proc, error) {
|
||||
if err != nil {
|
||||
log.Printf("failed to convert first field to int: %v. split: %v", err, process)
|
||||
}
|
||||
cpu, err := strconv.ParseFloat(process.Cpu, 64)
|
||||
cpu, err := strconv.ParseFloat(utils.ConvertLocalizedString(process.Cpu), 32)
|
||||
if err != nil {
|
||||
log.Printf("failed to convert third field to float: %v. split: %v", err, process)
|
||||
}
|
||||
mem, err := strconv.ParseFloat(process.Mem, 64)
|
||||
mem, err := strconv.ParseFloat(utils.ConvertLocalizedString(process.Mem), 32)
|
||||
if err != nil {
|
||||
log.Printf("failed to convert fourth field to float: %v. split: %v", err, process)
|
||||
}
|
||||
|
71
src/widgets/temp_freebsd.go
Normal file
71
src/widgets/temp_freebsd.go
Normal file
@ -0,0 +1,71 @@
|
||||
package widgets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/cjbassi/gotop/src/utils"
|
||||
)
|
||||
|
||||
var sensorOIDS = map[string]string{
|
||||
"dev.cpu.0.temperature": "CPU 0 ",
|
||||
"hw.acpi.thermal.tz0.temperature": "Thermal zone 0",
|
||||
}
|
||||
|
||||
type sensorMeasurement struct {
|
||||
name string
|
||||
temperature float64
|
||||
}
|
||||
|
||||
func removeUnusedChars(s string) string {
|
||||
s1 := strings.Replace(s, "C", "", 1)
|
||||
s2 := strings.TrimSuffix(s1, "\n")
|
||||
return s2
|
||||
}
|
||||
|
||||
func refineOutput(output []byte) (float64, error) {
|
||||
convertedOutput := utils.ConvertLocalizedString(removeUnusedChars(string(output)))
|
||||
value, err := strconv.ParseFloat(convertedOutput, 64)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func collectSensors() ([]sensorMeasurement, error) {
|
||||
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)
|
||||
}
|
||||
|
||||
value, err := refineOutput(output)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to execute 'sysctl' command: %v", err)
|
||||
}
|
||||
|
||||
measurements = append(measurements, sensorMeasurement{v, value})
|
||||
|
||||
}
|
||||
return measurements, nil
|
||||
|
||||
}
|
||||
|
||||
func (self *TempWidget) update() {
|
||||
sensors, err := collectSensors()
|
||||
if err != nil {
|
||||
log.Printf("error recieved from gopsutil: %v", err)
|
||||
}
|
||||
for _, sensor := range sensors {
|
||||
switch self.TempScale {
|
||||
case Fahrenheit:
|
||||
self.Data[sensor.name] = utils.CelsiusToFahrenheit(int(sensor.temperature))
|
||||
case Celcius:
|
||||
self.Data[sensor.name] = int(sensor.temperature)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,3 @@
|
||||
// +build linux freebsd
|
||||
|
||||
package widgets
|
||||
|
||||
import (
|
Loading…
x
Reference in New Issue
Block a user