diff --git a/client/cmd/up.go b/client/cmd/up.go index 21b5ebde4..3eeb26c0a 100644 --- a/client/cmd/up.go +++ b/client/cmd/up.go @@ -6,6 +6,7 @@ import ( "github.com/netbirdio/netbird/client/internal" "github.com/netbirdio/netbird/client/proto" "github.com/netbirdio/netbird/util" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "google.golang.org/grpc/codes" gstatus "google.golang.org/grpc/status" @@ -55,7 +56,13 @@ var upCmd = &cobra.Command{ "If the daemon is not running please run: "+ "\nnetbird service install \nnetbird service start\n", err) } - defer conn.Close() + defer func() { + err := conn.Close() + if err != nil { + log.Warnf("failed closing dameon gRPC client connection %v", err) + return + } + }() client := proto.NewDaemonServiceClient(conn) @@ -64,51 +71,51 @@ var upCmd = &cobra.Command{ return fmt.Errorf("unable to get daemon status: %v", err) } - if status.Status == string(internal.StatusNeedsLogin) || status.Status == string(internal.StatusLoginFailed) { - loginRequest := proto.LoginRequest{ - SetupKey: setupKey, - PreSharedKey: preSharedKey, - ManagementUrl: managementURL, - } - - var loginErr error - - var loginResp *proto.LoginResponse - - err = WithBackOff(func() error { - var backOffErr error - loginResp, backOffErr = client.Login(ctx, &loginRequest) - if s, ok := gstatus.FromError(backOffErr); ok && (s.Code() == codes.InvalidArgument || - s.Code() == codes.PermissionDenied || - s.Code() == codes.NotFound || - s.Code() == codes.Unimplemented) { - loginErr = backOffErr - return nil - } - return backOffErr - }) - if err != nil { - return fmt.Errorf("login backoff cycle failed: %v", err) - } - - if loginErr != nil { - return fmt.Errorf("login failed: %v", loginErr) - } - - if loginResp.NeedsSSOLogin { - - openURL(cmd, loginResp.VerificationURIComplete) - - _, err = client.WaitSSOLogin(ctx, &proto.WaitSSOLoginRequest{UserCode: loginResp.UserCode}) - if err != nil { - return fmt.Errorf("waiting sso login failed with: %v", err) - } - } - } else if status.Status != string(internal.StatusIdle) { + if status.Status == string(internal.StatusConnected) { cmd.Println("Already connected") return nil } + loginRequest := proto.LoginRequest{ + SetupKey: setupKey, + PreSharedKey: preSharedKey, + ManagementUrl: managementURL, + } + + var loginErr error + + var loginResp *proto.LoginResponse + + err = WithBackOff(func() error { + var backOffErr error + loginResp, backOffErr = client.Login(ctx, &loginRequest) + if s, ok := gstatus.FromError(backOffErr); ok && (s.Code() == codes.InvalidArgument || + s.Code() == codes.PermissionDenied || + s.Code() == codes.NotFound || + s.Code() == codes.Unimplemented) { + loginErr = backOffErr + return nil + } + return backOffErr + }) + if err != nil { + return fmt.Errorf("login backoff cycle failed: %v", err) + } + + if loginErr != nil { + return fmt.Errorf("login failed: %v", loginErr) + } + + if loginResp.NeedsSSOLogin { + + openURL(cmd, loginResp.VerificationURIComplete) + + _, err = client.WaitSSOLogin(ctx, &proto.WaitSSOLoginRequest{UserCode: loginResp.UserCode}) + if err != nil { + return fmt.Errorf("waiting sso login failed with: %v", err) + } + } + if _, err := client.Up(ctx, &proto.UpRequest{}); err != nil { return fmt.Errorf("call service up method: %v", err) } diff --git a/client/ui/client_ui.go b/client/ui/client_ui.go index 5bf8f511b..7ddc46ae2 100644 --- a/client/ui/client_ui.go +++ b/client/ui/client_ui.go @@ -259,21 +259,13 @@ func (s *serviceClient) menuUpClick() error { return err } - status, err := conn.Status(s.ctx, &proto.StatusRequest{}) + err = s.login() if err != nil { log.Errorf("get service status: %v", err) return err } - if status.Status == string(internal.StatusNeedsLogin) || status.Status == string(internal.StatusLoginFailed) { - err = s.login() - if err != nil { - log.Errorf("get service status: %v", err) - return err - } - } - - status, err = conn.Status(s.ctx, &proto.StatusRequest{}) + status, err := conn.Status(s.ctx, &proto.StatusRequest{}) if err != nil { log.Errorf("get service status: %v", err) return err