more abstraction and simple dashboard for processes
All checks were successful
Build Process Supervisor / build (amd64, .exe, windows) (push) Successful in 2m24s
Build Process Supervisor / build (amd64, , linux) (push) Successful in 2m36s
Build Process Supervisor / build (arm, 6, , linux) (push) Successful in 2m19s
Build Process Supervisor / build (arm64, , linux) (push) Successful in 2m14s
All checks were successful
Build Process Supervisor / build (amd64, .exe, windows) (push) Successful in 2m24s
Build Process Supervisor / build (amd64, , linux) (push) Successful in 2m36s
Build Process Supervisor / build (arm, 6, , linux) (push) Successful in 2m19s
Build Process Supervisor / build (arm64, , linux) (push) Successful in 2m14s
This commit is contained in:
102
htop/htopTable.go
Normal file
102
htop/htopTable.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package htop
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"processSupervisor/htop/models"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
||||
"github.com/shirou/gopsutil/v3/cpu"
|
||||
"github.com/shirou/gopsutil/v3/mem"
|
||||
)
|
||||
|
||||
type HtopTable struct {
|
||||
Processes []models.Process
|
||||
CurrentSort string
|
||||
CurrentOrder string
|
||||
}
|
||||
|
||||
func NewTable() (*HtopTable, error) {
|
||||
processes, err := models.GetProcesses()
|
||||
if err != nil {
|
||||
return &HtopTable{}, err
|
||||
}
|
||||
return &HtopTable{
|
||||
Processes: processes,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (t *HtopTable) UpdateTable() error {
|
||||
var err error
|
||||
t.Processes, err = models.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
|
||||
}
|
Reference in New Issue
Block a user