Skip to content

Commit f87411f

Browse files
authored
feat: Use Port IDs on Grant, Revoke SSH (#397)
* fix: update ssh port test * fix * another one * use port ids * lint * go mod tidy
1 parent 6b83fdb commit f87411f

18 files changed

Lines changed: 752 additions & 582 deletions

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,11 @@ develop-with-nix:
346346
nix develop .
347347

348348
.PHONY: update-devplane-deps
349-
update-devplane-deps: ## update devplane dependencies (use: make update-devplane-deps commit=<hash-or-tag>, defaults to latest)
349+
update-devplane-deps: ## update devplane Buf modules (use: make update-devplane-deps commit=<buf-tag>, defaults to latest)
350350
@COMMIT=$${commit:-latest}; \
351351
echo "Updating devplane dependencies to: $$COMMIT"; \
352352
GOPRIVATE=github.com/brevdev/* go get -u github.com/brevdev/dev-plane@$$COMMIT; \
353-
go get buf.build/gen/go/brevdev/devplane/grpc/go@$$COMMIT; \
353+
go get buf.build/gen/go/brevdev/devplane/connectrpc/go@$$COMMIT; \
354354
go get buf.build/gen/go/brevdev/devplane/protocolbuffers/go@$$COMMIT; \
355355
GOPRIVATE=github.com/brevdev/* go mod tidy; \
356356
echo "Successfully updated to $$COMMIT"

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ module github.com/brevdev/brev-cli
33
go 1.25.0
44

55
require (
6-
buf.build/gen/go/brevdev/devplane/connectrpc/go v1.19.1-20260228021043-887d38e1b474.2
7-
buf.build/gen/go/brevdev/devplane/protocolbuffers/go v1.36.11-20260309172248-8105d701fdce.1
8-
connectrpc.com/connect v1.19.1
6+
buf.build/gen/go/brevdev/devplane/connectrpc/go v1.19.2-20260520183101-9f4cb67aff2c.1
7+
buf.build/gen/go/brevdev/devplane/protocolbuffers/go v1.36.11-20260520183101-9f4cb67aff2c.1
8+
connectrpc.com/connect v1.19.2
99
github.com/NVIDIA/go-nvml v0.13.0-1
1010
github.com/alessio/shellescape v1.4.1
1111
github.com/brevdev/parse v0.0.11

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
buf.build/gen/go/brevdev/devplane/connectrpc/go v1.19.1-20260228021043-887d38e1b474.2 h1:Sq0kIa/xKzScbJcqB5EbPVhOL0QYHPr3araQaupL2lk=
2-
buf.build/gen/go/brevdev/devplane/connectrpc/go v1.19.1-20260228021043-887d38e1b474.2/go.mod h1:Yh34p9aADmWsKv2umYlMpnCZuBmNBE9N+HImgRriJXM=
3-
buf.build/gen/go/brevdev/devplane/protocolbuffers/go v1.36.11-20260309172248-8105d701fdce.1 h1:lWdcuXsXpMfPOer4yawjwomVbtSAnGgFAWYF8ggK9g4=
4-
buf.build/gen/go/brevdev/devplane/protocolbuffers/go v1.36.11-20260309172248-8105d701fdce.1/go.mod h1:V/y7Wxg0QvU4XPVwqErF5NHLobUT1QEyfgrGuQIxdPo=
1+
buf.build/gen/go/brevdev/devplane/connectrpc/go v1.19.2-20260520183101-9f4cb67aff2c.1 h1:OtdZWOk/dypzAe4bylO+TFfcw9J3Ndyeh1yylWSNgRc=
2+
buf.build/gen/go/brevdev/devplane/connectrpc/go v1.19.2-20260520183101-9f4cb67aff2c.1/go.mod h1:eaa0R5ozu4wxcy62DEtRxO6hahJ0WuFsMAG33Zj/lVQ=
3+
buf.build/gen/go/brevdev/devplane/protocolbuffers/go v1.36.11-20260520183101-9f4cb67aff2c.1 h1:fDUuYv/K3h8IpEGf0uic/1/A1nBN+Vao4jzVWDRMLLc=
4+
buf.build/gen/go/brevdev/devplane/protocolbuffers/go v1.36.11-20260520183101-9f4cb67aff2c.1/go.mod h1:V/y7Wxg0QvU4XPVwqErF5NHLobUT1QEyfgrGuQIxdPo=
55
buf.build/gen/go/brevdev/protoc-gen-gotag/protocolbuffers/go v1.36.11-20220906235457-8b4922735da5.1 h1:6amhprQmCKJ4wgJ6ngkh32d9V+dQcOLUZ/SfHdOnYgo=
66
buf.build/gen/go/brevdev/protoc-gen-gotag/protocolbuffers/go v1.36.11-20220906235457-8b4922735da5.1/go.mod h1:O+pnSHMru/naTMrm4tmpBoH3wz6PHa+R75HR7Mv8X2g=
77
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
@@ -41,8 +41,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
4141
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
4242
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
4343
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
44-
connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14=
45-
connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w=
44+
connectrpc.com/connect v1.19.2 h1:McQ83FGdzL+t60peksi0gXC7MQ/iLKgLduAnThbM0mo=
45+
connectrpc.com/connect v1.19.2/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w=
4646
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
4747
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
4848
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=

pkg/cmd/enablessh/enablessh.go

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ type enableSSHDeps struct {
3333
platform externalnode.PlatformChecker
3434
nodeClients externalnode.NodeClientFactory
3535
registrationStore register.RegistrationStore
36+
prompter terminal.Selector
3637
}
3738

3839
func defaultEnableSSHDeps() enableSSHDeps {
3940
return enableSSHDeps{
4041
platform: register.LinuxPlatform{},
4142
nodeClients: register.DefaultNodeClientFactory{},
4243
registrationStore: register.NewFileRegistrationStore(),
44+
prompter: register.TerminalPrompter{},
4345
}
4446
}
4547

@@ -103,53 +105,39 @@ func enableSSH(
103105
t.Vprintf(" Linux user: %s\n", linuxUsername)
104106
t.Vprint("")
105107

106-
// Check if the node already has an SSH port allocated (e.g. for another linux user)
107-
port, err := existingSSHPort(ctx, deps, tokenProvider, reg)
108+
node, err := fetchRegisteredNode(ctx, deps, tokenProvider, reg)
108109
if err != nil {
109-
t.Vprintf(" %s\n", t.Yellow(fmt.Sprintf("Warning: could not check for existing ports: %v", err)))
110+
return fmt.Errorf("enable SSH failed: %w", err)
110111
}
111112

112-
if port != 0 {
113-
t.Vprintf(" Using existing SSH port %d.\n", port)
114-
} else {
115-
t.Vprint("")
116-
port, err = register.PromptSSHPort(t)
117-
if err != nil {
118-
return fmt.Errorf("invalid SSH port: %w", err)
119-
}
120-
121-
if err := register.OpenSSHPort(ctx, t, deps.nodeClients, tokenProvider, reg, port); err != nil {
122-
return fmt.Errorf("enable SSH failed: %w", err)
123-
}
113+
brevPortID, err := register.ResolveSSHAccessPort(ctx, t, deps.prompter, deps.nodeClients, tokenProvider, reg, node)
114+
if err != nil {
115+
return fmt.Errorf("enable SSH failed: %w", err)
124116
}
125117

126-
if err := register.SetupAndRegisterNodeSSHAccess(ctx, t, deps.nodeClients, tokenProvider, reg, brevUser, linuxUsername); err != nil {
118+
if err := register.SetupAndRegisterNodeSSHAccess(ctx, t, deps.nodeClients, tokenProvider, reg, brevUser, linuxUsername, brevPortID); err != nil {
127119
return fmt.Errorf("enable SSH failed: %w", err)
128120
}
129121

130122
t.Vprint(t.Green(fmt.Sprintf("SSH access enabled. You can now SSH to this device via: brev shell %s", reg.DisplayName)))
131123
return nil
132124
}
133125

134-
// existingSSHPort calls GetNode and returns the PortNumber of an already-allocated
135-
// SSH port, or 0 if none exists
136-
func existingSSHPort(ctx context.Context, deps enableSSHDeps, tokenProvider externalnode.TokenProvider, reg *register.DeviceRegistration) (int32, error) {
126+
func fetchRegisteredNode(
127+
ctx context.Context,
128+
deps enableSSHDeps,
129+
tokenProvider externalnode.TokenProvider,
130+
reg *register.DeviceRegistration,
131+
) (*nodev1.ExternalNode, error) {
137132
client := deps.nodeClients.NewNodeClient(tokenProvider, config.GlobalConfig.GetBrevPublicAPIURL())
138133
resp, err := client.GetNode(ctx, connect.NewRequest(&nodev1.GetNodeRequest{
139134
ExternalNodeId: reg.ExternalNodeID,
140135
OrganizationId: reg.OrgID,
141136
}))
142137
if err != nil {
143-
return 0, fmt.Errorf("error retrieving node: %w", err)
144-
}
145-
146-
for _, p := range resp.Msg.GetExternalNode().GetPorts() {
147-
// TODO if we ever allow more than one SSH port, this should be modified
148-
if p.GetProtocol() == nodev1.PortProtocol_PORT_PROTOCOL_SSH {
149-
return p.GetPortNumber(), nil
150-
}
138+
return nil, fmt.Errorf("error retrieving node: %w", err)
151139
}
152-
return 0, nil
140+
return resp.Msg.GetExternalNode(), nil
153141
}
154142

155143
// checkSSHDaemon prints a warning if neither "ssh" nor "sshd" systemd services

0 commit comments

Comments
 (0)