From 497b45e4e2e41c2fca55f61995a289a6e62022e6 Mon Sep 17 00:00:00 2001 From: Jose Garcia Date: Tue, 14 Sep 2021 23:57:40 +0000 Subject: [PATCH 1/3] ssh server docs --- ssh_server.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ssh_server.go b/ssh_server.go index 03b45f25f..ca66ec7de 100644 --- a/ssh_server.go +++ b/ssh_server.go @@ -4,14 +4,20 @@ import ( "context" ) +// A SSHServer handles starting the remote SSH server. +// If there is no SSH server available it installs one. type SSHServer struct { session *Session } +// SSHServer returns a new SSHServer from the LiveShare Session. func (session *Session) SSHServer() *SSHServer { return &SSHServer{session: session} } +// SSHServerStartResult contains whether or not the start of the SSH server was +// successful. If it succeeded the server port and user is included. If it failed, +// it contains an explanation message. type SSHServerStartResult struct { Result bool `json:"result"` ServerPort string `json:"serverPort"` @@ -19,6 +25,7 @@ type SSHServerStartResult struct { Message string `json:"message"` } +// StartRemoteServer starts or install the remote SSH server and returns the result. func (s *SSHServer) StartRemoteServer(ctx context.Context) (*SSHServerStartResult, error) { var response SSHServerStartResult From 8abff2af97688a47744066aac4cd632f22259b53 Mon Sep 17 00:00:00 2001 From: Jose Garcia Date: Wed, 15 Sep 2021 13:14:58 +0000 Subject: [PATCH 2/3] move StartSSHServer to Session --- port_forwarder.go | 2 +- session.go | 28 ++++++++++++++++++++++++++++ ssh_server.go | 37 ------------------------------------- 3 files changed, 29 insertions(+), 38 deletions(-) delete mode 100644 ssh_server.go diff --git a/port_forwarder.go b/port_forwarder.go index 400d6ac97..5dafd0c65 100644 --- a/port_forwarder.go +++ b/port_forwarder.go @@ -9,7 +9,7 @@ import ( "github.com/opentracing/opentracing-go" ) -// A PortForwarder forwards TCP traffic over a LiveShare session from a port on a remote +// A PortForwarder forwards TCP traffic over a Live Share session from a port on a remote // container to a local destination such as a network port or Go reader/writer. type PortForwarder struct { session *Session diff --git a/session.go b/session.go index 0e3120cd7..1d13ad58c 100644 --- a/session.go +++ b/session.go @@ -3,6 +3,7 @@ package liveshare import ( "context" "fmt" + "strconv" ) // A Session represents the session between a connected Live Share client and server. @@ -59,3 +60,30 @@ func (s *Session) UpdateSharedVisibility(ctx context.Context, port int, public b return nil } + +// StartSSHServer starts the SSHD server and returns the user and port for which to authenticate with. +// If there is no SSHD server installed on the server, it will attempt to install it. The installation +// process can take upwards of 20+ seconds. +func (s *Session) StartSSHServer(ctx context.Context) (string, int64, error) { + var response struct { + Result bool `json:"result"` + ServerPort string `json:"serverPort"` + User string `json:"user"` + Message string `json:"message"` + } + + if err := s.rpc.do(ctx, "ISshServerHostService.startRemoteServer", []string{}, &response); err != nil { + return "", 0, err + } + + if !response.Result { + return "", 0, fmt.Errorf("failed to start server: %s", response.Message) + } + + port, err := strconv.ParseInt(response.ServerPort, 10, 64) + if err != nil { + return "", 0, fmt.Errorf("failed to parse port: %w", err) + } + + return response.User, port, nil +} diff --git a/ssh_server.go b/ssh_server.go deleted file mode 100644 index ca66ec7de..000000000 --- a/ssh_server.go +++ /dev/null @@ -1,37 +0,0 @@ -package liveshare - -import ( - "context" -) - -// A SSHServer handles starting the remote SSH server. -// If there is no SSH server available it installs one. -type SSHServer struct { - session *Session -} - -// SSHServer returns a new SSHServer from the LiveShare Session. -func (session *Session) SSHServer() *SSHServer { - return &SSHServer{session: session} -} - -// SSHServerStartResult contains whether or not the start of the SSH server was -// successful. If it succeeded the server port and user is included. If it failed, -// it contains an explanation message. -type SSHServerStartResult struct { - Result bool `json:"result"` - ServerPort string `json:"serverPort"` - User string `json:"user"` - Message string `json:"message"` -} - -// StartRemoteServer starts or install the remote SSH server and returns the result. -func (s *SSHServer) StartRemoteServer(ctx context.Context) (*SSHServerStartResult, error) { - var response SSHServerStartResult - - if err := s.session.rpc.do(ctx, "ISshServerHostService.startRemoteServer", []string{}, &response); err != nil { - return nil, err - } - - return &response, nil -} From 20e618fd025e115726853db4b4fc37ec76295ebd Mon Sep 17 00:00:00 2001 From: Jose Garcia Date: Wed, 15 Sep 2021 13:49:03 +0000 Subject: [PATCH 3/3] pr feedback --- session.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/session.go b/session.go index 1d13ad58c..f427fac6d 100644 --- a/session.go +++ b/session.go @@ -61,10 +61,9 @@ func (s *Session) UpdateSharedVisibility(ctx context.Context, port int, public b return nil } -// StartSSHServer starts the SSHD server and returns the user and port for which to authenticate with. -// If there is no SSHD server installed on the server, it will attempt to install it. The installation -// process can take upwards of 20+ seconds. -func (s *Session) StartSSHServer(ctx context.Context) (string, int64, error) { +// StartsSSHServer starts an SSH server in the container, installing sshd if necessary, +// and returns the port on which it listens and the user name clients should provide. +func (s *Session) StartSSHServer(ctx context.Context) (int, string, error) { var response struct { Result bool `json:"result"` ServerPort string `json:"serverPort"` @@ -73,17 +72,17 @@ func (s *Session) StartSSHServer(ctx context.Context) (string, int64, error) { } if err := s.rpc.do(ctx, "ISshServerHostService.startRemoteServer", []string{}, &response); err != nil { - return "", 0, err + return 0, "", err } if !response.Result { - return "", 0, fmt.Errorf("failed to start server: %s", response.Message) + return 0, "", fmt.Errorf("failed to start server: %s", response.Message) } - port, err := strconv.ParseInt(response.ServerPort, 10, 64) + port, err := strconv.Atoi(response.ServerPort) if err != nil { - return "", 0, fmt.Errorf("failed to parse port: %w", err) + return 0, "", fmt.Errorf("failed to parse port: %w", err) } - return response.User, port, nil + return port, response.User, nil }