Files
tecamino-proccessSupervisor/models/htopTable.go
Adrian Zürcher b9efeb670d
Some checks failed
Build Process Supervisor / build (push) Failing after 1s
first running version
2025-08-05 12:01:59 +02:00

102 lines
2.1 KiB
Go

package models
import (
"fmt"
"net/http"
"sort"
"strconv"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/mem"
)
type HtopTable struct {
Processes []Process
CurrentSort string
CurrentOrder string
}
func NewTable() (*HtopTable, error) {
processes, err := GetProcesses()
if err != nil {
return &HtopTable{}, err
}
return &HtopTable{
Processes: processes,
}, nil
}
func (t *HtopTable) UpdateTable() error {
var err error
t.Processes, err = GetProcesses()
if err != nil {
return err
}
return nil
}
func (t *HtopTable) Sort(r *http.Request) {
sortBy := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")
if order == "desc" {
t.CurrentOrder = "desc"
} else {
t.CurrentOrder = "asc"
}
t.CurrentSort = sortBy
sort.Slice(t.Processes, func(i, j int) bool {
switch sortBy {
case "pid":
pidI, _ := strconv.Atoi(t.Processes[i].PID)
pidJ, _ := strconv.Atoi(t.Processes[j].PID)
if t.CurrentOrder == "desc" {
return pidI > pidJ
}
return pidI < pidJ
case "user":
if t.CurrentOrder == "desc" {
return t.Processes[i].User > t.Processes[j].User
}
return t.Processes[i].User < t.Processes[j].User
case "cmd":
if t.CurrentOrder == "desc" {
return t.Processes[i].Cmd > t.Processes[j].Cmd
}
return t.Processes[i].Cmd < t.Processes[j].Cmd
case "cpu":
if t.CurrentOrder == "desc" {
return t.Processes[i].CPU > t.Processes[j].CPU
}
return t.Processes[i].CPU < t.Processes[j].CPU
case "memory":
if t.CurrentOrder == "desc" {
return t.Processes[i].Memory > t.Processes[j].Memory
}
return t.Processes[i].Memory < t.Processes[j].Memory
default:
return true
}
})
}
func GetSystemUsage() (cpuPercent float64, memPercent float64, err error) {
cpuPercents, err := cpu.Percent(0, false)
if err != nil {
return 0, 0, err
}
if len(cpuPercents) == 0 {
return 0, 0, fmt.Errorf("cpu.Percent returned empty slice")
}
vmStat, err := mem.VirtualMemory()
if err != nil {
return 0, 0, err
}
return cpuPercents[0], vmStat.UsedPercent, nil
}