detached a536398

refactor(app): use the ports broker route vocabulary directly

commit
a5363989b87afcf29cdb0210da9b4d7f28ec5c4c
author
brice · · 2026-10-08 09:03 UTC
committer
brice · · 2026-10-08 09:31 UTC
parent
7ebc8f8
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
7 files · +38 -43
M internal/app/broker_composition_test.go +2 -2
@@ -128,8 +128,8 @@ func TestProductionBrokerRemoteMuxTransports(t *testing.T) {
128128 for _, tc := range []struct {
129129 name, helper string
130130 }{
131- {hostTransportSSH, brokerMuxStdioCommand},
132- {hostTransportQUIC, brokerMuxQUICBootstrapCommand},
131+ {hostTransportSSH, ports.BrokerMuxStdioCommand},
132+ {hostTransportQUIC, ports.BrokerMuxQUICBootstrapCommand},
133133 } {
134134 t.Run(tc.name, func(t *testing.T) {
135135 binDir := shortTempDir(t, "vb")
@@ -128,8 +128,8 @@ func TestProductionBrokerRemoteMuxTransports(t *testing.T) {
128 for _, tc := range []struct {128 for _, tc := range []struct {
129 name, helper string129 name, helper string
130 }{130 }{
131- {hostTransportSSH, brokerMuxStdioCommand},131+ {hostTransportSSH, ports.BrokerMuxStdioCommand},
132- {hostTransportQUIC, brokerMuxQUICBootstrapCommand},132+ {hostTransportQUIC, ports.BrokerMuxQUICBootstrapCommand},
133 } {133 } {
134 t.Run(tc.name, func(t *testing.T) {134 t.Run(tc.name, func(t *testing.T) {
135 binDir := shortTempDir(t, "vb")135 binDir := shortTempDir(t, "vb")
M internal/app/broker_offline_local_test.go +1 -1
@@ -770,7 +770,7 @@ func TestBrokerLocalProbeRefusesNonLocalRoute(t *testing.T) {
770770 sshRoute := loadTestRoute(t, map[string]any{
771771 "kind": "ssh-stdio",
772772 "target": "user@host:2222",
773- "argv": []any{"vev", brokerMuxStdioCommand, "--offline-root", "/srv/remote"},
773+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--offline-root", "/srv/remote"},
774774 })
775775 require.Equal(t, brokerconfig.RouteSSHStdio, sshRoute.Kind())
776776 require.False(t, sshRoute.IsLocal(), "an ssh helper route is never dialed directly")
@@ -770,7 +770,7 @@ func TestBrokerLocalProbeRefusesNonLocalRoute(t *testing.T) {
770 sshRoute := loadTestRoute(t, map[string]any{770 sshRoute := loadTestRoute(t, map[string]any{
771 "kind": "ssh-stdio",771 "kind": "ssh-stdio",
772 "target": "user@host:2222",772 "target": "user@host:2222",
773- "argv": []any{"vev", brokerMuxStdioCommand, "--offline-root", "/srv/remote"},773+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--offline-root", "/srv/remote"},
774 })774 })
775 require.Equal(t, brokerconfig.RouteSSHStdio, sshRoute.Kind())775 require.Equal(t, brokerconfig.RouteSSHStdio, sshRoute.Kind())
776 require.False(t, sshRoute.IsLocal(), "an ssh helper route is never dialed directly")776 require.False(t, sshRoute.IsLocal(), "an ssh helper route is never dialed directly")
M internal/app/broker_offline_mux.go +7 -15
@@ -63,14 +63,10 @@ import (
6363 // authentication, and the absence of a remote PTY are preserved: the helpers
6464 // only add explicit trust inputs that narrow verification, never disable it.
6565
66-const (
67- // brokerMuxStdioCommand is the hidden remote SSH stdio mux bridge.
68- brokerMuxStdioCommand = ports.BrokerMuxStdioCommand
69- // brokerMuxQUICBootstrapCommand is the hidden remote QUIC mux bootstrap.
70- brokerMuxQUICBootstrapCommand = ports.BrokerMuxQUICBootstrapCommand
71- // brokerMuxQUICProxyCommand is the hidden detached remote QUIC mux proxy.
72- brokerMuxQUICProxyCommand = "_broker-mux-quic-proxy"
73-)
66+// brokerMuxQUICProxyCommand is the hidden detached remote QUIC mux proxy. The
67+// stdio and bootstrap helpers are named by ports.BrokerMuxStdioCommand and
68+// ports.BrokerMuxQUICBootstrapCommand because durable routes persist them.
69+const brokerMuxQUICProxyCommand = "_broker-mux-quic-proxy"
7470
7571 // brokerMuxSetupTimeout bounds each side's bootstrap readiness wait. On the
7672 // broker side it caps the wait for the local ssh bootstrap child's readiness
@@ -103,10 +99,6 @@ const brokerMuxWaitDelay = 2 * time.Second
10399 // brokerDaemonStartArgvFlag's exact spelling, so the two sides can never drift.
104100 const brokerDaemonStartArg = "--daemon-start"
105101
106-// brokerScopeArg is the scope flag carried by every durable remote route argv
107-// (see ports.BrokerRouteForTransport). Stored routes keep it verbatim.
108-const brokerScopeArg = ports.BrokerRouteScopeArg
109-
110102 // brokerMuxOptions is the parsed hidden mux helper invocation.
111103 type brokerMuxOptions struct {
112104 // startMode is the daemon-start authorization the broker propagated. An
@@ -125,11 +117,11 @@ func parseBrokerMuxArgs(name string, kind cmdKind, args []string) (command, erro
125117 scopeSet, startSet := false, false
126118 for index := 0; index < len(args); {
127119 switch args[index] {
128- case brokerScopeArg:
120+ case ports.BrokerRouteScopeArg:
129121 // The scope flag is part of every durable remote route argv, so it
130122 // stays accepted; the helper always serves the per-user scope.
131123 if scopeSet {
132- return command{}, usagef("`%s` received duplicate %s", name, brokerScopeArg)
124+ return command{}, usagef("`%s` received duplicate %s", name, ports.BrokerRouteScopeArg)
133125 }
134126 scopeSet = true
135127 index++
@@ -495,7 +487,7 @@ func runBrokerMuxQUICBootstrapCommand(ctx context.Context, options brokerMuxOpti
495487 }
496488 defer func() { _ = devNull.Close() }()
497489
498- args := []string{brokerMuxQUICProxyCommand, brokerScopeArg}
490+ args := []string{brokerMuxQUICProxyCommand, ports.BrokerRouteScopeArg}
499491 flag, err := brokerDaemonStartArgvFlag(options.startMode)
500492 if err != nil {
501493 _ = writer.Close()
@@ -63,14 +63,10 @@ import (
63 // authentication, and the absence of a remote PTY are preserved: the helpers63 // authentication, and the absence of a remote PTY are preserved: the helpers
64 // only add explicit trust inputs that narrow verification, never disable it.64 // only add explicit trust inputs that narrow verification, never disable it.
65 65
66-const (66+// brokerMuxQUICProxyCommand is the hidden detached remote QUIC mux proxy. The
67- // brokerMuxStdioCommand is the hidden remote SSH stdio mux bridge.67+// stdio and bootstrap helpers are named by ports.BrokerMuxStdioCommand and
68- brokerMuxStdioCommand = ports.BrokerMuxStdioCommand68+// ports.BrokerMuxQUICBootstrapCommand because durable routes persist them.
69- // brokerMuxQUICBootstrapCommand is the hidden remote QUIC mux bootstrap.69+const brokerMuxQUICProxyCommand = "_broker-mux-quic-proxy"
70- brokerMuxQUICBootstrapCommand = ports.BrokerMuxQUICBootstrapCommand
71- // brokerMuxQUICProxyCommand is the hidden detached remote QUIC mux proxy.
72- brokerMuxQUICProxyCommand = "_broker-mux-quic-proxy"
73-)
74 70
75 // brokerMuxSetupTimeout bounds each side's bootstrap readiness wait. On the71 // brokerMuxSetupTimeout bounds each side's bootstrap readiness wait. On the
76 // broker side it caps the wait for the local ssh bootstrap child's readiness72 // broker side it caps the wait for the local ssh bootstrap child's readiness
@@ -103,10 +99,6 @@ const brokerMuxWaitDelay = 2 * time.Second
103 // brokerDaemonStartArgvFlag's exact spelling, so the two sides can never drift.99 // brokerDaemonStartArgvFlag's exact spelling, so the two sides can never drift.
104 const brokerDaemonStartArg = "--daemon-start"100 const brokerDaemonStartArg = "--daemon-start"
105 101
106-// brokerScopeArg is the scope flag carried by every durable remote route argv
107-// (see ports.BrokerRouteForTransport). Stored routes keep it verbatim.
108-const brokerScopeArg = ports.BrokerRouteScopeArg
109-
110 // brokerMuxOptions is the parsed hidden mux helper invocation.102 // brokerMuxOptions is the parsed hidden mux helper invocation.
111 type brokerMuxOptions struct {103 type brokerMuxOptions struct {
112 // startMode is the daemon-start authorization the broker propagated. An104 // startMode is the daemon-start authorization the broker propagated. An
@@ -125,11 +117,11 @@ func parseBrokerMuxArgs(name string, kind cmdKind, args []string) (command, erro
125 scopeSet, startSet := false, false117 scopeSet, startSet := false, false
126 for index := 0; index < len(args); {118 for index := 0; index < len(args); {
127 switch args[index] {119 switch args[index] {
128- case brokerScopeArg:120+ case ports.BrokerRouteScopeArg:
129 // The scope flag is part of every durable remote route argv, so it121 // The scope flag is part of every durable remote route argv, so it
130 // stays accepted; the helper always serves the per-user scope.122 // stays accepted; the helper always serves the per-user scope.
131 if scopeSet {123 if scopeSet {
132- return command{}, usagef("`%s` received duplicate %s", name, brokerScopeArg)124+ return command{}, usagef("`%s` received duplicate %s", name, ports.BrokerRouteScopeArg)
133 }125 }
134 scopeSet = true126 scopeSet = true
135 index++127 index++
@@ -495,7 +487,7 @@ func runBrokerMuxQUICBootstrapCommand(ctx context.Context, options brokerMuxOpti
495 }487 }
496 defer func() { _ = devNull.Close() }()488 defer func() { _ = devNull.Close() }()
497 489
498- args := []string{brokerMuxQUICProxyCommand, brokerScopeArg}490+ args := []string{brokerMuxQUICProxyCommand, ports.BrokerRouteScopeArg}
499 flag, err := brokerDaemonStartArgvFlag(options.startMode)491 flag, err := brokerDaemonStartArgvFlag(options.startMode)
500 if err != nil {492 if err != nil {
501 _ = writer.Close()493 _ = writer.Close()
M internal/app/broker_offline_mux_test.go +19 -19
@@ -156,7 +156,7 @@ func remoteMuxFixture(t *testing.T, policy ports.BrokerPolicy) *brokerMuxFixture
156156
157157 // cleanup kills every recorded mux helper process.
158158 func (e *muxTestEnv) cleanup() {
159- for _, role := range []string{brokerMuxStdioCommand, brokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand} {
159+ for _, role := range []string{ports.BrokerMuxStdioCommand, ports.BrokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand} {
160160 raw, err := os.ReadFile(filepath.Join(e.recordDir, role+".pids"))
161161 if err != nil {
162162 continue
@@ -260,7 +260,7 @@ func TestParseBrokerMuxArgs(t *testing.T) {
260260 }
261261 for _, tt := range tests {
262262 t.Run(tt.name, func(t *testing.T) {
263- command, err := parseBrokerMuxArgs(brokerMuxStdioCommand, kindBrokerMuxStdio, tt.args)
263+ command, err := parseBrokerMuxArgs(ports.BrokerMuxStdioCommand, kindBrokerMuxStdio, tt.args)
264264 if tt.wantErr != "" {
265265 require.Error(t, err)
266266 require.Contains(t, err.Error(), tt.wantErr)
@@ -279,8 +279,8 @@ func TestBrokerMuxHelpersHiddenFromPublicHelp(t *testing.T) {
279279 name string
280280 kind cmdKind
281281 }{
282- {brokerMuxStdioCommand, kindBrokerMuxStdio},
283- {brokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap},
282+ {ports.BrokerMuxStdioCommand, kindBrokerMuxStdio},
283+ {ports.BrokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap},
284284 {brokerMuxQUICProxyCommand, kindBrokerMuxQUICProxy},
285285 } {
286286 require.NotContains(t, usageText, tt.name)
@@ -305,7 +305,7 @@ func TestSSHMuxCommandSpecPreservesTrustAndNoPTY(t *testing.T) {
305305 route := loadTestRoute(t, map[string]any{
306306 "kind": "ssh-stdio",
307307 "target": "user@host:2222",
308- "argv": []any{"vev", brokerMuxStdioCommand, "--production"},
308+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--production"},
309309 "trust": map[string]any{"knownHostsFile": "/etc/ssh/known_hosts", "connectTimeout": "30s"},
310310 })
311311 spec, err := sshMuxCommandSpec(route, ports.BrokerDaemonStartIfNeeded)
@@ -317,7 +317,7 @@ func TestSSHMuxCommandSpecPreservesTrustAndNoPTY(t *testing.T) {
317317 require.Contains(t, spec.Args, "ConnectTimeout=30")
318318 joined := strings.Join(spec.Args, " ")
319319 require.Contains(t, joined, "-- user@host:2222 ")
320- require.Contains(t, joined, brokerMuxStdioCommand)
320+ require.Contains(t, joined, ports.BrokerMuxStdioCommand)
321321 require.Contains(t, joined, "'"+brokerDaemonStartArg+"' 'if-needed'")
322322 require.NotContains(t, joined, "StrictHostKeyChecking")
323323 require.NotContains(t, joined, "BatchMode")
@@ -333,7 +333,7 @@ func TestSSHMuxCommandSpecPreservesTrustAndNoPTY(t *testing.T) {
333333 plain := loadTestRoute(t, map[string]any{
334334 "kind": "ssh-quic",
335335 "target": "host",
336- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
336+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
337337 })
338338 plainSpec, err := sshMuxCommandSpec(plain, ports.BrokerDaemonExistingOnly)
339339 require.NoError(t, err)
@@ -350,7 +350,7 @@ func TestSSHMuxCommandSpecRefusesUnknownStartMode(t *testing.T) {
350350 route := loadTestRoute(t, map[string]any{
351351 "kind": "ssh-stdio",
352352 "target": "host",
353- "argv": []any{"vev", brokerMuxStdioCommand, "--production"},
353+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--production"},
354354 })
355355 _, err := sshMuxCommandSpec(route, ports.BrokerDaemonStartMode(0))
356356 require.Error(t, err)
@@ -403,7 +403,7 @@ func TestBrokerQUICPeerAddr(t *testing.T) {
403403 func TestBrokerMuxHelperReturnsTypedNoDaemonExit(t *testing.T) {
404404 emptyProductionBrokerLayout(t, "")
405405 emptyProductionBrokerLayout(t, "")
406- parsed, err := parseBrokerMuxArgs(brokerMuxStdioCommand, kindBrokerMuxStdio, []string{"--production"})
406+ parsed, err := parseBrokerMuxArgs(ports.BrokerMuxStdioCommand, kindBrokerMuxStdio, []string{"--production"})
407407 require.NoError(t, err)
408408 err = runBrokerMuxStdioCommand(context.Background(), parsed.brokerMux)
409409 var coded *exitCoded
@@ -419,11 +419,11 @@ func TestBrokerServeSSHStdioRouteRoundTrip(t *testing.T) {
419419 policy := brokerTestPolicy()
420420 fixture := remoteMuxFixture(t, policy)
421421 argsFile := installFakeSSH(t, fakeSSHExecHelper)
422- t.Setenv(fakeSSHModeEnv, brokerMuxStdioCommand)
422+ t.Setenv(fakeSSHModeEnv, ports.BrokerMuxStdioCommand)
423423 writeMuxRoot(t, map[string]any{
424424 "kind": "ssh-stdio",
425425 "target": "user@muxhost:2222",
426- "argv": []any{"vev", brokerMuxStdioCommand, "--production"},
426+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--production"},
427427 })
428428
429429 socketPath, stop := startMuxBrokerServe(t)
@@ -435,7 +435,7 @@ func TestBrokerServeSSHStdioRouteRoundTrip(t *testing.T) {
435435 argv := readFileString(t, argsFile)
436436 require.Contains(t, argv, "-T\n")
437437 require.Contains(t, argv, "--\nuser@muxhost:2222\n")
438- require.Contains(t, argv, brokerMuxStdioCommand)
438+ require.Contains(t, argv, ports.BrokerMuxStdioCommand)
439439 require.NotContains(t, argv, "UserKnownHostsFile=")
440440 require.NotContains(t, argv, "StrictHostKeyChecking")
441441 require.NotContains(t, argv, "BatchMode")
@@ -451,11 +451,11 @@ func TestBrokerServeSSHQUICRouteRoundTrip(t *testing.T) {
451451 policy := brokerTestPolicy()
452452 fixture := remoteMuxFixture(t, policy)
453453 installFakeSSH(t, fakeSSHExecHelper)
454- t.Setenv(fakeSSHModeEnv, brokerMuxQUICBootstrapCommand)
454+ t.Setenv(fakeSSHModeEnv, ports.BrokerMuxQUICBootstrapCommand)
455455 writeMuxRoot(t, map[string]any{
456456 "kind": "ssh-quic",
457457 "target": "127.0.0.1",
458- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
458+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
459459 })
460460
461461 socketPath, stop := startMuxBrokerServe(t)
@@ -484,7 +484,7 @@ func TestBrokerMuxQUICRejectsBadPinWithoutLeakingSecret(t *testing.T) {
484484 route, target := loadTestRouteTarget(t, map[string]any{
485485 "kind": "ssh-quic",
486486 "target": "127.0.0.1",
487- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
487+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
488488 })
489489 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
490490 defer cancel()
@@ -514,7 +514,7 @@ func TestBrokerMuxQUICRejectsExpiredReadiness(t *testing.T) {
514514 route, target := loadTestRouteTarget(t, map[string]any{
515515 "kind": "ssh-quic",
516516 "target": "127.0.0.1",
517- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
517+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
518518 })
519519 _, err := dialBrokerRoute(context.Background(), route, target, slog.New(slog.NewTextHandler(io.Discard, nil)))
520520 require.Error(t, err)
@@ -534,7 +534,7 @@ func TestBrokerMuxDialCancellationReapsBootstrap(t *testing.T) {
534534 route, target := loadTestRouteTarget(t, map[string]any{
535535 "kind": "ssh-quic",
536536 "target": "127.0.0.1",
537- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
537+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
538538 })
539539 ctx, cancel := context.WithTimeout(context.Background(), 150*time.Millisecond)
540540 defer cancel()
@@ -562,7 +562,7 @@ func TestBrokerMuxDialFloodedStderrIsReapedAndSanitized(t *testing.T) {
562562 route, target := loadTestRouteTarget(t, map[string]any{
563563 "kind": "ssh-quic",
564564 "target": "127.0.0.1",
565- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
565+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
566566 })
567567
568568 var logs bytes.Buffer
@@ -606,7 +606,7 @@ func TestBrokerMuxDialStalledBootstrapUsesSetupTimeout(t *testing.T) {
606606 route, target := loadTestRouteTarget(t, map[string]any{
607607 "kind": "ssh-quic",
608608 "target": "127.0.0.1",
609- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},
609+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
610610 })
611611 start := time.Now()
612612 _, err := dialBrokerRoute(context.Background(), route, target, slog.New(slog.NewTextHandler(io.Discard, nil)))
@@ -156,7 +156,7 @@ func remoteMuxFixture(t *testing.T, policy ports.BrokerPolicy) *brokerMuxFixture
156 156
157 // cleanup kills every recorded mux helper process.157 // cleanup kills every recorded mux helper process.
158 func (e *muxTestEnv) cleanup() {158 func (e *muxTestEnv) cleanup() {
159- for _, role := range []string{brokerMuxStdioCommand, brokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand} {159+ for _, role := range []string{ports.BrokerMuxStdioCommand, ports.BrokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand} {
160 raw, err := os.ReadFile(filepath.Join(e.recordDir, role+".pids"))160 raw, err := os.ReadFile(filepath.Join(e.recordDir, role+".pids"))
161 if err != nil {161 if err != nil {
162 continue162 continue
@@ -260,7 +260,7 @@ func TestParseBrokerMuxArgs(t *testing.T) {
260 }260 }
261 for _, tt := range tests {261 for _, tt := range tests {
262 t.Run(tt.name, func(t *testing.T) {262 t.Run(tt.name, func(t *testing.T) {
263- command, err := parseBrokerMuxArgs(brokerMuxStdioCommand, kindBrokerMuxStdio, tt.args)263+ command, err := parseBrokerMuxArgs(ports.BrokerMuxStdioCommand, kindBrokerMuxStdio, tt.args)
264 if tt.wantErr != "" {264 if tt.wantErr != "" {
265 require.Error(t, err)265 require.Error(t, err)
266 require.Contains(t, err.Error(), tt.wantErr)266 require.Contains(t, err.Error(), tt.wantErr)
@@ -279,8 +279,8 @@ func TestBrokerMuxHelpersHiddenFromPublicHelp(t *testing.T) {
279 name string279 name string
280 kind cmdKind280 kind cmdKind
281 }{281 }{
282- {brokerMuxStdioCommand, kindBrokerMuxStdio},282+ {ports.BrokerMuxStdioCommand, kindBrokerMuxStdio},
283- {brokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap},283+ {ports.BrokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap},
284 {brokerMuxQUICProxyCommand, kindBrokerMuxQUICProxy},284 {brokerMuxQUICProxyCommand, kindBrokerMuxQUICProxy},
285 } {285 } {
286 require.NotContains(t, usageText, tt.name)286 require.NotContains(t, usageText, tt.name)
@@ -305,7 +305,7 @@ func TestSSHMuxCommandSpecPreservesTrustAndNoPTY(t *testing.T) {
305 route := loadTestRoute(t, map[string]any{305 route := loadTestRoute(t, map[string]any{
306 "kind": "ssh-stdio",306 "kind": "ssh-stdio",
307 "target": "user@host:2222",307 "target": "user@host:2222",
308- "argv": []any{"vev", brokerMuxStdioCommand, "--production"},308+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--production"},
309 "trust": map[string]any{"knownHostsFile": "/etc/ssh/known_hosts", "connectTimeout": "30s"},309 "trust": map[string]any{"knownHostsFile": "/etc/ssh/known_hosts", "connectTimeout": "30s"},
310 })310 })
311 spec, err := sshMuxCommandSpec(route, ports.BrokerDaemonStartIfNeeded)311 spec, err := sshMuxCommandSpec(route, ports.BrokerDaemonStartIfNeeded)
@@ -317,7 +317,7 @@ func TestSSHMuxCommandSpecPreservesTrustAndNoPTY(t *testing.T) {
317 require.Contains(t, spec.Args, "ConnectTimeout=30")317 require.Contains(t, spec.Args, "ConnectTimeout=30")
318 joined := strings.Join(spec.Args, " ")318 joined := strings.Join(spec.Args, " ")
319 require.Contains(t, joined, "-- user@host:2222 ")319 require.Contains(t, joined, "-- user@host:2222 ")
320- require.Contains(t, joined, brokerMuxStdioCommand)320+ require.Contains(t, joined, ports.BrokerMuxStdioCommand)
321 require.Contains(t, joined, "'"+brokerDaemonStartArg+"' 'if-needed'")321 require.Contains(t, joined, "'"+brokerDaemonStartArg+"' 'if-needed'")
322 require.NotContains(t, joined, "StrictHostKeyChecking")322 require.NotContains(t, joined, "StrictHostKeyChecking")
323 require.NotContains(t, joined, "BatchMode")323 require.NotContains(t, joined, "BatchMode")
@@ -333,7 +333,7 @@ func TestSSHMuxCommandSpecPreservesTrustAndNoPTY(t *testing.T) {
333 plain := loadTestRoute(t, map[string]any{333 plain := loadTestRoute(t, map[string]any{
334 "kind": "ssh-quic",334 "kind": "ssh-quic",
335 "target": "host",335 "target": "host",
336- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},336+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
337 })337 })
338 plainSpec, err := sshMuxCommandSpec(plain, ports.BrokerDaemonExistingOnly)338 plainSpec, err := sshMuxCommandSpec(plain, ports.BrokerDaemonExistingOnly)
339 require.NoError(t, err)339 require.NoError(t, err)
@@ -350,7 +350,7 @@ func TestSSHMuxCommandSpecRefusesUnknownStartMode(t *testing.T) {
350 route := loadTestRoute(t, map[string]any{350 route := loadTestRoute(t, map[string]any{
351 "kind": "ssh-stdio",351 "kind": "ssh-stdio",
352 "target": "host",352 "target": "host",
353- "argv": []any{"vev", brokerMuxStdioCommand, "--production"},353+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--production"},
354 })354 })
355 _, err := sshMuxCommandSpec(route, ports.BrokerDaemonStartMode(0))355 _, err := sshMuxCommandSpec(route, ports.BrokerDaemonStartMode(0))
356 require.Error(t, err)356 require.Error(t, err)
@@ -403,7 +403,7 @@ func TestBrokerQUICPeerAddr(t *testing.T) {
403 func TestBrokerMuxHelperReturnsTypedNoDaemonExit(t *testing.T) {403 func TestBrokerMuxHelperReturnsTypedNoDaemonExit(t *testing.T) {
404 emptyProductionBrokerLayout(t, "")404 emptyProductionBrokerLayout(t, "")
405 emptyProductionBrokerLayout(t, "")405 emptyProductionBrokerLayout(t, "")
406- parsed, err := parseBrokerMuxArgs(brokerMuxStdioCommand, kindBrokerMuxStdio, []string{"--production"})406+ parsed, err := parseBrokerMuxArgs(ports.BrokerMuxStdioCommand, kindBrokerMuxStdio, []string{"--production"})
407 require.NoError(t, err)407 require.NoError(t, err)
408 err = runBrokerMuxStdioCommand(context.Background(), parsed.brokerMux)408 err = runBrokerMuxStdioCommand(context.Background(), parsed.brokerMux)
409 var coded *exitCoded409 var coded *exitCoded
@@ -419,11 +419,11 @@ func TestBrokerServeSSHStdioRouteRoundTrip(t *testing.T) {
419 policy := brokerTestPolicy()419 policy := brokerTestPolicy()
420 fixture := remoteMuxFixture(t, policy)420 fixture := remoteMuxFixture(t, policy)
421 argsFile := installFakeSSH(t, fakeSSHExecHelper)421 argsFile := installFakeSSH(t, fakeSSHExecHelper)
422- t.Setenv(fakeSSHModeEnv, brokerMuxStdioCommand)422+ t.Setenv(fakeSSHModeEnv, ports.BrokerMuxStdioCommand)
423 writeMuxRoot(t, map[string]any{423 writeMuxRoot(t, map[string]any{
424 "kind": "ssh-stdio",424 "kind": "ssh-stdio",
425 "target": "user@muxhost:2222",425 "target": "user@muxhost:2222",
426- "argv": []any{"vev", brokerMuxStdioCommand, "--production"},426+ "argv": []any{"vev", ports.BrokerMuxStdioCommand, "--production"},
427 })427 })
428 428
429 socketPath, stop := startMuxBrokerServe(t)429 socketPath, stop := startMuxBrokerServe(t)
@@ -435,7 +435,7 @@ func TestBrokerServeSSHStdioRouteRoundTrip(t *testing.T) {
435 argv := readFileString(t, argsFile)435 argv := readFileString(t, argsFile)
436 require.Contains(t, argv, "-T\n")436 require.Contains(t, argv, "-T\n")
437 require.Contains(t, argv, "--\nuser@muxhost:2222\n")437 require.Contains(t, argv, "--\nuser@muxhost:2222\n")
438- require.Contains(t, argv, brokerMuxStdioCommand)438+ require.Contains(t, argv, ports.BrokerMuxStdioCommand)
439 require.NotContains(t, argv, "UserKnownHostsFile=")439 require.NotContains(t, argv, "UserKnownHostsFile=")
440 require.NotContains(t, argv, "StrictHostKeyChecking")440 require.NotContains(t, argv, "StrictHostKeyChecking")
441 require.NotContains(t, argv, "BatchMode")441 require.NotContains(t, argv, "BatchMode")
@@ -451,11 +451,11 @@ func TestBrokerServeSSHQUICRouteRoundTrip(t *testing.T) {
451 policy := brokerTestPolicy()451 policy := brokerTestPolicy()
452 fixture := remoteMuxFixture(t, policy)452 fixture := remoteMuxFixture(t, policy)
453 installFakeSSH(t, fakeSSHExecHelper)453 installFakeSSH(t, fakeSSHExecHelper)
454- t.Setenv(fakeSSHModeEnv, brokerMuxQUICBootstrapCommand)454+ t.Setenv(fakeSSHModeEnv, ports.BrokerMuxQUICBootstrapCommand)
455 writeMuxRoot(t, map[string]any{455 writeMuxRoot(t, map[string]any{
456 "kind": "ssh-quic",456 "kind": "ssh-quic",
457 "target": "127.0.0.1",457 "target": "127.0.0.1",
458- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},458+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
459 })459 })
460 460
461 socketPath, stop := startMuxBrokerServe(t)461 socketPath, stop := startMuxBrokerServe(t)
@@ -484,7 +484,7 @@ func TestBrokerMuxQUICRejectsBadPinWithoutLeakingSecret(t *testing.T) {
484 route, target := loadTestRouteTarget(t, map[string]any{484 route, target := loadTestRouteTarget(t, map[string]any{
485 "kind": "ssh-quic",485 "kind": "ssh-quic",
486 "target": "127.0.0.1",486 "target": "127.0.0.1",
487- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},487+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
488 })488 })
489 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)489 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
490 defer cancel()490 defer cancel()
@@ -514,7 +514,7 @@ func TestBrokerMuxQUICRejectsExpiredReadiness(t *testing.T) {
514 route, target := loadTestRouteTarget(t, map[string]any{514 route, target := loadTestRouteTarget(t, map[string]any{
515 "kind": "ssh-quic",515 "kind": "ssh-quic",
516 "target": "127.0.0.1",516 "target": "127.0.0.1",
517- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},517+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
518 })518 })
519 _, err := dialBrokerRoute(context.Background(), route, target, slog.New(slog.NewTextHandler(io.Discard, nil)))519 _, err := dialBrokerRoute(context.Background(), route, target, slog.New(slog.NewTextHandler(io.Discard, nil)))
520 require.Error(t, err)520 require.Error(t, err)
@@ -534,7 +534,7 @@ func TestBrokerMuxDialCancellationReapsBootstrap(t *testing.T) {
534 route, target := loadTestRouteTarget(t, map[string]any{534 route, target := loadTestRouteTarget(t, map[string]any{
535 "kind": "ssh-quic",535 "kind": "ssh-quic",
536 "target": "127.0.0.1",536 "target": "127.0.0.1",
537- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},537+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
538 })538 })
539 ctx, cancel := context.WithTimeout(context.Background(), 150*time.Millisecond)539 ctx, cancel := context.WithTimeout(context.Background(), 150*time.Millisecond)
540 defer cancel()540 defer cancel()
@@ -562,7 +562,7 @@ func TestBrokerMuxDialFloodedStderrIsReapedAndSanitized(t *testing.T) {
562 route, target := loadTestRouteTarget(t, map[string]any{562 route, target := loadTestRouteTarget(t, map[string]any{
563 "kind": "ssh-quic",563 "kind": "ssh-quic",
564 "target": "127.0.0.1",564 "target": "127.0.0.1",
565- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},565+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
566 })566 })
567 567
568 var logs bytes.Buffer568 var logs bytes.Buffer
@@ -606,7 +606,7 @@ func TestBrokerMuxDialStalledBootstrapUsesSetupTimeout(t *testing.T) {
606 route, target := loadTestRouteTarget(t, map[string]any{606 route, target := loadTestRouteTarget(t, map[string]any{
607 "kind": "ssh-quic",607 "kind": "ssh-quic",
608 "target": "127.0.0.1",608 "target": "127.0.0.1",
609- "argv": []any{"vev", brokerMuxQUICBootstrapCommand, "--production"},609+ "argv": []any{"vev", ports.BrokerMuxQUICBootstrapCommand, "--production"},
610 })610 })
611 start := time.Now()611 start := time.Now()
612 _, err := dialBrokerRoute(context.Background(), route, target, slog.New(slog.NewTextHandler(io.Discard, nil)))612 _, err := dialBrokerRoute(context.Background(), route, target, slog.New(slog.NewTextHandler(io.Discard, nil)))
M internal/app/broker_routes_test.go +1 -1
@@ -52,7 +52,7 @@ func TestBrokerRoutesDurableFirstAddAndRestart(t *testing.T) {
5252 route, err := brokerconfig.RouteFromSpec(spec)
5353 require.NoError(t, err)
5454 require.Equal(t, brokerconfig.RouteSSHStdio, route.Kind())
55- require.Equal(t, []string{"vev", brokerMuxStdioCommand, "--production"}, route.Argv())
55+ require.Equal(t, []string{"vev", ports.BrokerMuxStdioCommand, "--production"}, route.Argv())
5656 identity, err := registry.BindAuthenticatedIdentity(ctx, ports.BrokerIdentityBindingRequest{Fence: target.Fence, Policy: policy, Identity: "daemon-test"})
5757 require.NoError(t, err)
5858 _, err = routes.AuthorizeRemoteDial(ctx, target)
@@ -52,7 +52,7 @@ func TestBrokerRoutesDurableFirstAddAndRestart(t *testing.T) {
52 route, err := brokerconfig.RouteFromSpec(spec)52 route, err := brokerconfig.RouteFromSpec(spec)
53 require.NoError(t, err)53 require.NoError(t, err)
54 require.Equal(t, brokerconfig.RouteSSHStdio, route.Kind())54 require.Equal(t, brokerconfig.RouteSSHStdio, route.Kind())
55- require.Equal(t, []string{"vev", brokerMuxStdioCommand, "--production"}, route.Argv())55+ require.Equal(t, []string{"vev", ports.BrokerMuxStdioCommand, "--production"}, route.Argv())
56 identity, err := registry.BindAuthenticatedIdentity(ctx, ports.BrokerIdentityBindingRequest{Fence: target.Fence, Policy: policy, Identity: "daemon-test"})56 identity, err := registry.BindAuthenticatedIdentity(ctx, ports.BrokerIdentityBindingRequest{Fence: target.Fence, Policy: policy, Identity: "daemon-test"})
57 require.NoError(t, err)57 require.NoError(t, err)
58 _, err = routes.AuthorizeRemoteDial(ctx, target)58 _, err = routes.AuthorizeRemoteDial(ctx, target)
M internal/app/cli.go +5 -4
@@ -5,6 +5,7 @@ import (
55 "strings"
66
77 "github.com/bnema/vev/internal/domain"
8+ "github.com/bnema/vev/internal/ports"
89 "github.com/bnema/vev/internal/protocol"
910 )
1011
@@ -172,10 +173,10 @@ func parseSubcommand(args []string) (command, error) {
172173 case brokerReadyCommand:
173174 options, err := parseBrokerReadyArgs(args[1:])
174175 return command{kind: kindBrokerReady, brokerReady: options}, err
175- case brokerMuxStdioCommand:
176- return parseBrokerMuxArgs(brokerMuxStdioCommand, kindBrokerMuxStdio, args[1:])
177- case brokerMuxQUICBootstrapCommand:
178- return parseBrokerMuxArgs(brokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap, args[1:])
176+ case ports.BrokerMuxStdioCommand:
177+ return parseBrokerMuxArgs(ports.BrokerMuxStdioCommand, kindBrokerMuxStdio, args[1:])
178+ case ports.BrokerMuxQUICBootstrapCommand:
179+ return parseBrokerMuxArgs(ports.BrokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap, args[1:])
179180 case brokerMuxQUICProxyCommand:
180181 return parseBrokerMuxArgs(brokerMuxQUICProxyCommand, kindBrokerMuxQUICProxy, args[1:])
181182 case uiRemoteCleanupCommand:
@@ -5,6 +5,7 @@ import (
5 "strings"5 "strings"
6 6
7 "github.com/bnema/vev/internal/domain"7 "github.com/bnema/vev/internal/domain"
8+ "github.com/bnema/vev/internal/ports"
8 "github.com/bnema/vev/internal/protocol"9 "github.com/bnema/vev/internal/protocol"
9 )10 )
10 11
@@ -172,10 +173,10 @@ func parseSubcommand(args []string) (command, error) {
172 case brokerReadyCommand:173 case brokerReadyCommand:
173 options, err := parseBrokerReadyArgs(args[1:])174 options, err := parseBrokerReadyArgs(args[1:])
174 return command{kind: kindBrokerReady, brokerReady: options}, err175 return command{kind: kindBrokerReady, brokerReady: options}, err
175- case brokerMuxStdioCommand:176+ case ports.BrokerMuxStdioCommand:
176- return parseBrokerMuxArgs(brokerMuxStdioCommand, kindBrokerMuxStdio, args[1:])177+ return parseBrokerMuxArgs(ports.BrokerMuxStdioCommand, kindBrokerMuxStdio, args[1:])
177- case brokerMuxQUICBootstrapCommand:178+ case ports.BrokerMuxQUICBootstrapCommand:
178- return parseBrokerMuxArgs(brokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap, args[1:])179+ return parseBrokerMuxArgs(ports.BrokerMuxQUICBootstrapCommand, kindBrokerMuxQUICBootstrap, args[1:])
179 case brokerMuxQUICProxyCommand:180 case brokerMuxQUICProxyCommand:
180 return parseBrokerMuxArgs(brokerMuxQUICProxyCommand, kindBrokerMuxQUICProxy, args[1:])181 return parseBrokerMuxArgs(brokerMuxQUICProxyCommand, kindBrokerMuxQUICProxy, args[1:])
181 case uiRemoteCleanupCommand:182 case uiRemoteCleanupCommand:
M internal/app/spawn_test.go +3 -1
@@ -12,6 +12,8 @@ import (
1212 "syscall"
1313 "testing"
1414 "time"
15+
16+ "github.com/bnema/vev/internal/ports"
1517 )
1618
1719 const (
@@ -28,7 +30,7 @@ func TestMain(m *testing.M) {
2830 // runs.
2931 if len(os.Args) >= 2 && os.Getenv(brokerHelperEnv) == "1" {
3032 switch os.Args[1] {
31- case brokerMuxStdioCommand, brokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand,
33+ case ports.BrokerMuxStdioCommand, ports.BrokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand,
3234 brokerReadyCommand,
3335 productionBrokerServeCommand, productionBrokerLauncherCommand, "--daemon":
3436 recordBrokerHelperProcess(os.Args[1])
@@ -12,6 +12,8 @@ import (
12 "syscall"12 "syscall"
13 "testing"13 "testing"
14 "time"14 "time"
15+
16+ "github.com/bnema/vev/internal/ports"
15 )17 )
16 18
17 const (19 const (
@@ -28,7 +30,7 @@ func TestMain(m *testing.M) {
28 // runs.30 // runs.
29 if len(os.Args) >= 2 && os.Getenv(brokerHelperEnv) == "1" {31 if len(os.Args) >= 2 && os.Getenv(brokerHelperEnv) == "1" {
30 switch os.Args[1] {32 switch os.Args[1] {
31- case brokerMuxStdioCommand, brokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand,33+ case ports.BrokerMuxStdioCommand, ports.BrokerMuxQUICBootstrapCommand, brokerMuxQUICProxyCommand,
32 brokerReadyCommand,34 brokerReadyCommand,
33 productionBrokerServeCommand, productionBrokerLauncherCommand, "--daemon":35 productionBrokerServeCommand, productionBrokerLauncherCommand, "--daemon":
34 recordBrokerHelperProcess(os.Args[1])36 recordBrokerHelperProcess(os.Args[1])

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close