From 59d147fe4de48b837b32118f10d3341897b33b1b Mon Sep 17 00:00:00 2001 From: mrhid6 Date: Wed, 29 Jul 2026 13:03:02 +0100 Subject: [PATCH] feat: handle OpenProxyCmd in the agent command stream --- agent/internal/sync/sync.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/agent/internal/sync/sync.go b/agent/internal/sync/sync.go index 1f6ca3b..1db2fdd 100644 --- a/agent/internal/sync/sync.go +++ b/agent/internal/sync/sync.go @@ -24,6 +24,7 @@ import ( "gitea.hostxtra.co.uk/mrhid6/vantage/agent/internal/inventory" "gitea.hostxtra.co.uk/mrhid6/vantage/agent/internal/keys" "gitea.hostxtra.co.uk/mrhid6/vantage/agent/internal/monitors" + agentproxy "gitea.hostxtra.co.uk/mrhid6/vantage/agent/internal/proxy" "gitea.hostxtra.co.uk/mrhid6/vantage/agent/internal/updates" ) @@ -197,6 +198,9 @@ func connectAndHandleStream(ctx context.Context, cfg *config.Config) error { if cmd.CleanupWorkspace != nil { go handleCleanupWorkspace(cmd) } + if cmd.OpenProxy != nil { + go handleOpenProxy(ctx, cfg, cmd.OpenProxy) + } if cmd.RunStep != nil { go func(rc *pb.RunStepCmd, cid string) { emit := func(seq uint64, data []byte) { @@ -326,6 +330,29 @@ func handleCleanupWorkspace(cmd *pb.ServerCommand) { log.Printf("removed run workspace %s (cmd=%s)", dir, cmd.CommandId) } +// handleOpenProxy relays one console connection. It uses its own gRPC +// connection so console traffic never shares a stream with commands, key sync +// or workflow output. +func handleOpenProxy(ctx context.Context, cfg *config.Config, cmd *pb.OpenProxyCmd) { + client, err := grpcclient.New(cfg.ServerURL, cfg.TLS) + if err != nil { + log.Printf("proxy %s: dial control plane: %v", cmd.ProxyId, err) + return + } + defer client.Close() + + stream, err := client.ProxyStream(ctx) + if err != nil { + log.Printf("proxy %s: open stream: %v", cmd.ProxyId, err) + return + } + + log.Printf("proxy %s: relaying 127.0.0.1:%d", cmd.ProxyId, cmd.Port) + if err := agentproxy.Open(stream, cfg.ServerID, cfg.AgentToken, cmd.ProxyId, cmd.Port); err != nil { + log.Printf("proxy %s: %v", cmd.ProxyId, err) + } +} + func handleDeleteKey(cmd *pb.ServerCommand) { label := cmd.DeleteKey.Label keyPath := fmt.Sprintf("/root/.ssh/vantage_%s", strings.ReplaceAll(label, " ", "_"))