cmd/tailscale/cli: recommend sudo for 'tailscale up' on failure

Fixes #1220

(cherry picked from commit c7d4bf2333)
This commit is contained in:
Brad Fitzpatrick 2021-02-01 13:52:01 -08:00
parent bb0ef32dd2
commit 138bcae525
2 changed files with 15 additions and 2 deletions

View File

@ -228,7 +228,16 @@ func runUp(ctx context.Context, args []string) error {
AuthKey: upArgs.authKey, AuthKey: upArgs.authKey,
Notify: func(n ipn.Notify) { Notify: func(n ipn.Notify) {
if n.ErrMessage != nil { if n.ErrMessage != nil {
fatalf("backend error: %v\n", *n.ErrMessage) msg := *n.ErrMessage
if msg == ipn.ErrMsgPermissionDenied {
switch runtime.GOOS {
case "windows":
msg += " (Tailscale service in use by other user?)"
default:
msg += " (try 'sudo tailscale up [...]')"
}
}
fatalf("backend error: %v\n", msg)
} }
if s := n.State; s != nil { if s := n.State; s != nil {
switch *s { switch *s {

View File

@ -146,6 +146,10 @@ func (bs *BackendServer) GotFakeCommand(ctx context.Context, cmd *Command) error
return bs.GotCommand(ctx, cmd) return bs.GotCommand(ctx, cmd)
} }
// ErrMsgPermissionDenied is the Notify.ErrMessage value used an
// operation was done from a user/context that didn't have permission.
const ErrMsgPermissionDenied = "permission denied"
func (bs *BackendServer) GotCommand(ctx context.Context, cmd *Command) error { func (bs *BackendServer) GotCommand(ctx context.Context, cmd *Command) error {
if cmd.Version != version.Long && !cmd.AllowVersionSkew { if cmd.Version != version.Long && !cmd.AllowVersionSkew {
vs := fmt.Sprintf("GotCommand: Version mismatch! frontend=%#v backend=%#v", vs := fmt.Sprintf("GotCommand: Version mismatch! frontend=%#v backend=%#v",
@ -178,7 +182,7 @@ func (bs *BackendServer) GotCommand(ctx context.Context, cmd *Command) error {
} }
if IsReadonlyContext(ctx) { if IsReadonlyContext(ctx) {
msg := "permission denied" msg := ErrMsgPermissionDenied
bs.send(Notify{ErrMessage: &msg}) bs.send(Notify{ErrMessage: &msg})
return nil return nil
} }