package models import ( "fmt" "net/http" "sort" "strconv" ps "github.com/shirou/gopsutil/v3/process" ) type Process struct { PID string User string Cmd string CPU float64 Memory uint64 } func GetProcesses() ([]Process, error) { processes, err := ps.Processes() if err != nil { return nil, err } var result []Process for _, p := range processes { pid := p.Pid name, err := p.Name() if err != nil { continue } user, err := p.Username() if err != nil { user = "unknown" } cpu, err := p.CPUPercent() if err != nil { cpu = 0 } memInfo, err := p.MemoryInfo() if err != nil { continue } result = append(result, Process{ PID: fmt.Sprintf("%d", pid), User: user, Cmd: name, CPU: cpu, Memory: memInfo.RSS, }) } return result, 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 } }) }