Files
overlord/Overlord-Client/cmd/agent/handlers/processes_unix.go
T
2026-03-05 00:04:26 -06:00

90 lines
1.8 KiB
Go

//go:build !windows
// +build !windows
package handlers
import (
"bufio"
"bytes"
"os/exec"
"strconv"
"strings"
"syscall"
"overlord-client/cmd/agent/wire"
)
func listProcesses() ([]wire.ProcessInfo, error) {
cmd := exec.Command("ps", "aux")
output, err := cmd.Output()
if err != nil {
return nil, err
}
processes := make([]wire.ProcessInfo, 0)
scanner := bufio.NewScanner(bytes.NewReader(output))
scanner.Scan()
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
if len(fields) < 11 {
continue
}
pid, err := strconv.ParseInt(fields[1], 10, 32)
if err != nil {
continue
}
cpu, _ := strconv.ParseFloat(fields[2], 64)
mem, _ := strconv.ParseFloat(fields[3], 64)
memBytes := uint64(mem * 8 * 1024 * 1024 * 1024 / 100)
name := fields[10]
username := fields[0]
ppid := int32(0)
ppidCmd := exec.Command("ps", "-o", "ppid=", "-p", fields[1])
if ppidOutput, err := ppidCmd.Output(); err == nil {
ppidStr := strings.TrimSpace(string(ppidOutput))
if ppidVal, err := strconv.ParseInt(ppidStr, 10, 32); err == nil {
ppid = int32(ppidVal)
}
}
procType := "other"
if pid <= 2 || username == "root" {
procType = "system"
} else {
currentUserCmd := exec.Command("whoami")
if currentUserOutput, err := currentUserCmd.Output(); err == nil {
currentUser := strings.TrimSpace(string(currentUserOutput))
if username == currentUser {
procType = "own"
}
}
}
processes = append(processes, wire.ProcessInfo{
PID: int32(pid),
PPID: ppid,
Name: name,
CPU: cpu,
Memory: memBytes,
Username: username,
Type: procType,
})
}
return processes, scanner.Err()
}
func killProcess(pid int32) error {
return syscall.Kill(int(pid), syscall.SIGKILL)
}