@@ -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
3839func 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