initial commit

This commit is contained in:
Adrian Zürcher
2025-08-04 16:59:29 +02:00
commit 21b41de886
10 changed files with 470 additions and 0 deletions

17
models/htopTable.go Normal file
View File

@@ -0,0 +1,17 @@
package models
type HtopTable struct {
Processes []Process
CurrentSort string
CurrentOrder string
}
func GetTable() (*HtopTable, error) {
processes, err := GetProcesses()
if err != nil {
return &HtopTable{}, err
}
return &HtopTable{
Processes: processes,
}, nil
}

108
models/process.go Normal file
View File

@@ -0,0 +1,108 @@
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
}
})
}