102 lines
2.1 KiB
Go
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
|
|
}
|