2026-03-05 00:04:26 -06:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"log"
|
|
|
|
|
|
2026-05-21 09:51:12 -05:00
|
|
|
agentRuntime "overlord-client/cmd/agent/runtime"
|
2026-03-05 00:04:26 -06:00
|
|
|
"overlord-client/cmd/agent/wire"
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-21 09:51:12 -05:00
|
|
|
func HandleProcessList(ctx context.Context, env *agentRuntime.Env, cmdID string) error {
|
2026-03-05 00:04:26 -06:00
|
|
|
log.Printf("process_list: listing all processes")
|
|
|
|
|
|
|
|
|
|
processes := []wire.ProcessInfo{}
|
|
|
|
|
var errMsg string
|
|
|
|
|
|
|
|
|
|
procs, err := listProcesses()
|
|
|
|
|
if err != nil {
|
|
|
|
|
errMsg = err.Error()
|
|
|
|
|
log.Printf("process_list error: %v", err)
|
|
|
|
|
} else {
|
|
|
|
|
processes = procs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result := wire.ProcessListResult{
|
|
|
|
|
Type: "process_list_result",
|
|
|
|
|
CommandID: cmdID,
|
|
|
|
|
Processes: processes,
|
|
|
|
|
Error: errMsg,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return wire.WriteMsg(ctx, env.Conn, result)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-21 09:51:12 -05:00
|
|
|
func HandleProcessKill(ctx context.Context, env *agentRuntime.Env, cmdID string, pid int32) error {
|
2026-04-20 13:46:59 -05:00
|
|
|
//garble:controlflow block_splits=10 junk_jumps=10 flatten_passes=2
|
2026-03-05 00:04:26 -06:00
|
|
|
log.Printf("process_kill: %d", pid)
|
|
|
|
|
|
|
|
|
|
err := killProcess(pid)
|
|
|
|
|
ok := err == nil
|
|
|
|
|
errMsg := ""
|
|
|
|
|
if err != nil {
|
|
|
|
|
errMsg = err.Error()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result := wire.CommandResult{
|
|
|
|
|
Type: "command_result",
|
|
|
|
|
CommandID: cmdID,
|
|
|
|
|
OK: ok,
|
|
|
|
|
Message: errMsg,
|
|
|
|
|
}
|
|
|
|
|
return wire.WriteMsg(ctx, env.Conn, result)
|
|
|
|
|
}
|
2026-05-17 02:35:48 -05:00
|
|
|
|
2026-05-21 09:51:12 -05:00
|
|
|
func HandleProcessSuspend(ctx context.Context, env *agentRuntime.Env, cmdID string, pid int32) error {
|
2026-05-17 02:35:48 -05:00
|
|
|
log.Printf("process_suspend: %d", pid)
|
|
|
|
|
|
|
|
|
|
err := suspendProcess(pid)
|
|
|
|
|
ok := err == nil
|
|
|
|
|
errMsg := ""
|
|
|
|
|
if err != nil {
|
|
|
|
|
errMsg = err.Error()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result := wire.CommandResult{
|
|
|
|
|
Type: "command_result",
|
|
|
|
|
CommandID: cmdID,
|
|
|
|
|
OK: ok,
|
|
|
|
|
Message: errMsg,
|
|
|
|
|
}
|
|
|
|
|
return wire.WriteMsg(ctx, env.Conn, result)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-21 09:51:12 -05:00
|
|
|
func HandleProcessResume(ctx context.Context, env *agentRuntime.Env, cmdID string, pid int32) error {
|
2026-05-17 02:35:48 -05:00
|
|
|
log.Printf("process_resume: %d", pid)
|
|
|
|
|
|
|
|
|
|
err := resumeProcess(pid)
|
|
|
|
|
ok := err == nil
|
|
|
|
|
errMsg := ""
|
|
|
|
|
if err != nil {
|
|
|
|
|
errMsg = err.Error()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result := wire.CommandResult{
|
|
|
|
|
Type: "command_result",
|
|
|
|
|
CommandID: cmdID,
|
|
|
|
|
OK: ok,
|
|
|
|
|
Message: errMsg,
|
|
|
|
|
}
|
|
|
|
|
return wire.WriteMsg(ctx, env.Conn, result)
|
|
|
|
|
}
|
2026-05-21 09:51:12 -05:00
|
|
|
|
|
|
|
|
func HandleProcessIcon(ctx context.Context, env *agentRuntime.Env, cmdID string, items []wire.FileIconRequestItem) error {
|
|
|
|
|
out := make([]wire.FileIconResultItem, 0, len(items))
|
|
|
|
|
for _, item := range items {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
return ctx.Err()
|
|
|
|
|
default:
|
|
|
|
|
}
|
|
|
|
|
png, err := extractFileIconPNG(item.Path, item.Ext)
|
|
|
|
|
ri := wire.FileIconResultItem{Key: item.Key}
|
|
|
|
|
if err != nil {
|
|
|
|
|
ri.Error = err.Error()
|
|
|
|
|
} else {
|
|
|
|
|
ri.PNG = png
|
|
|
|
|
}
|
|
|
|
|
out = append(out, ri)
|
|
|
|
|
}
|
|
|
|
|
return wire.WriteMsg(ctx, env.Conn, wire.FileIconResult{
|
|
|
|
|
Type: "process_icon_result",
|
|
|
|
|
CommandID: cmdID,
|
|
|
|
|
Icons: out,
|
|
|
|
|
})
|
|
|
|
|
}
|