From bfeda40e34d9f6d2698acedf635ac3f5494320df Mon Sep 17 00:00:00 2001 From: decentral1se Date: Thu, 3 Feb 2022 13:43:11 +0100 Subject: [PATCH] fix: catch more ssh failure modes with help --- cli/internal/cli.go | 18 ++++++++++++++++++ cli/server/add.go | 9 ++++++--- pkg/client/client.go | 6 +++++- pkg/upstream/commandconn/connection.go | 6 +++--- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/cli/internal/cli.go b/cli/internal/cli.go index 277ff385..701c8c9b 100644 --- a/cli/internal/cli.go +++ b/cli/internal/cli.go @@ -410,6 +410,24 @@ Good luck! ` +var ServerAddFailMsg = ` +Failed to add server %s. + +This could be caused by two things. + +Abra isn't picking up your SSH configuration or you need to specify it on the +command-line (e.g you use a non-standard port or username to connect). Run +"server add" with "-d/--debug" to learn more about what Abra is doing under the +hood. + +Docker is not installed on your server. You can pass "-p/--provision" to +install Docker and initialise Docker Swarm mode. See help output for "server +add" + +See "abra server add -h" for more. + +` + // SubCommandBefore wires up pre-action machinery (e.g. --debug handling). func SubCommandBefore(c *cli.Context) error { if Debug { diff --git a/cli/server/add.go b/cli/server/add.go index 6dea74ce..54ebccac 100644 --- a/cli/server/add.go +++ b/cli/server/add.go @@ -463,14 +463,17 @@ developer machine. cl, err := newClient(c, domainName) if err != nil { - logrus.Fatal(err) + cleanUp(domainName) + logrus.Debugf("failed to construct client for %s, saw %s", domainName, err.Error()) + logrus.Fatalf(fmt.Sprintf(internal.ServerAddFailMsg, domainName)) } if provision { logrus.Debugf("attempting to construct SSH client for %s", domainName) sshCl, err := ssh.New(domainName, sshAuth, username, port) if err != nil { - logrus.Fatal(err) + cleanUp(domainName) + logrus.Fatalf(fmt.Sprintf(internal.ServerAddFailMsg, domainName)) } defer sshCl.Close() logrus.Debugf("successfully created SSH client for %s", domainName) @@ -485,7 +488,7 @@ developer machine. if _, err := cl.Info(context.Background()); err != nil { cleanUp(domainName) - logrus.Fatalf("couldn't make a remote docker connection to %s? use --provision/-p to attempt to install", domainName) + logrus.Fatalf(fmt.Sprintf(internal.ServerAddFailMsg, domainName)) } return nil diff --git a/pkg/client/client.go b/pkg/client/client.go index 59eb178b..ab9a7935 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -27,7 +27,11 @@ func New(contextName string) (*client.Client, error) { return nil, err } - helper := commandconnPkg.NewConnectionHelper(ctxEndpoint) + helper, err := commandconnPkg.NewConnectionHelper(ctxEndpoint) + if err != nil { + return nil, err + } + httpClient := &http.Client{ // No tls, no proxy Transport: &http.Transport{ diff --git a/pkg/upstream/commandconn/connection.go b/pkg/upstream/commandconn/connection.go index 94ce8905..6f632a6e 100644 --- a/pkg/upstream/commandconn/connection.go +++ b/pkg/upstream/commandconn/connection.go @@ -67,13 +67,13 @@ func getConnectionHelper(daemonURL string, sshFlags []string) (*connhelper.Conne return nil, err } -func NewConnectionHelper(daemonURL string) *connhelper.ConnectionHelper { +func NewConnectionHelper(daemonURL string) (*connhelper.ConnectionHelper, error) { helper, err := GetConnectionHelper(daemonURL) if err != nil { - logrus.Fatal(err) + return nil, err } - return helper + return helper, nil } func getDockerEndpoint(host string) (docker.Endpoint, error) {