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 }