From e6983baa734ec2375b658c2b9cef4f524b9a6f28 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 8 Apr 2024 10:22:31 -0700 Subject: [PATCH] cmd/tailscale/cli: fix macOS crash reading envknob in init (#11667) And add a test. Regression from a5e1f7d70364b3 Fixes tailscale/corp#19036 Change-Id: If90984049af0a4820c96e1f77ddf2fce8cb3043f Signed-off-by: Brad Fitzpatrick --- cmd/tailscale/cli/cli.go | 2 +- cmd/tailscale/cli/cli_test.go | 5 +++ cmd/tailscale/cli/exitnode.go | 80 ++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/cmd/tailscale/cli/cli.go b/cmd/tailscale/cli/cli.go index 4c2807053..1705cfb47 100644 --- a/cmd/tailscale/cli/cli.go +++ b/cmd/tailscale/cli/cli.go @@ -131,7 +131,7 @@ change in the future. certCmd, netlockCmd, licensesCmd, - exitNodeCmd, + exitNodeCmd(), updateCmd, whoisCmd, }, diff --git a/cmd/tailscale/cli/cli_test.go b/cmd/tailscale/cli/cli_test.go index d06a6ea3d..604a1511b 100644 --- a/cmd/tailscale/cli/cli_test.go +++ b/cmd/tailscale/cli/cli_test.go @@ -16,6 +16,7 @@ import ( qt "github.com/frankban/quicktest" "github.com/google/go-cmp/cmp" + "tailscale.com/envknob" "tailscale.com/health/healthmsg" "tailscale.com/ipn" "tailscale.com/ipn/ipnstate" @@ -33,6 +34,10 @@ import ( // and at least one thing that's not (darwin, freebsd). var geese = []string{"linux", "darwin", "windows", "freebsd"} +func TestPanicIfAnyEnvCheckedInInit(t *testing.T) { + envknob.PanicIfAnyEnvCheckedInInit() +} + // Test that checkForAccidentalSettingReverts's updateMaskedPrefsFromUpFlag can handle // all flags. This will panic if a new flag creeps in that's unhandled. // diff --git a/cmd/tailscale/cli/exitnode.go b/cmd/tailscale/cli/exitnode.go index 4df208e0d..40aabc53f 100644 --- a/cmd/tailscale/cli/exitnode.go +++ b/cmd/tailscale/cli/exitnode.go @@ -20,45 +20,47 @@ import ( "tailscale.com/tailcfg" ) -var exitNodeCmd = &ffcli.Command{ - Name: "exit-node", - ShortUsage: "exit-node [flags]", - ShortHelp: "Show machines on your tailnet configured as exit nodes", - LongHelp: "Show machines on your tailnet configured as exit nodes", - Exec: func(context.Context, []string) error { - return errors.New("exit-node subcommand required; run 'tailscale exit-node -h' for details") - }, - Subcommands: append([]*ffcli.Command{ - { - Name: "list", - ShortUsage: "exit-node list [flags]", - ShortHelp: "Show exit nodes", - Exec: runExitNodeList, - FlagSet: (func() *flag.FlagSet { - fs := newFlagSet("list") - fs.StringVar(&exitNodeArgs.filter, "filter", "", "filter exit nodes by country") - return fs - })(), - }}, - (func() []*ffcli.Command { - if !envknob.UseWIPCode() { - return nil - } - return []*ffcli.Command{ - { - Name: "connect", - ShortUsage: "exit-node connect", - ShortHelp: "connect to most recently used exit node", - Exec: exitNodeSetUse(true), - }, - { - Name: "disconnect", - ShortUsage: "exit-node disconnect", - ShortHelp: "disconnect from current exit node, if any", - Exec: exitNodeSetUse(false), - }, - } - })()...), +func exitNodeCmd() *ffcli.Command { + return &ffcli.Command{ + Name: "exit-node", + ShortUsage: "exit-node [flags]", + ShortHelp: "Show machines on your tailnet configured as exit nodes", + LongHelp: "Show machines on your tailnet configured as exit nodes", + Exec: func(context.Context, []string) error { + return errors.New("exit-node subcommand required; run 'tailscale exit-node -h' for details") + }, + Subcommands: append([]*ffcli.Command{ + { + Name: "list", + ShortUsage: "exit-node list [flags]", + ShortHelp: "Show exit nodes", + Exec: runExitNodeList, + FlagSet: (func() *flag.FlagSet { + fs := newFlagSet("list") + fs.StringVar(&exitNodeArgs.filter, "filter", "", "filter exit nodes by country") + return fs + })(), + }}, + (func() []*ffcli.Command { + if !envknob.UseWIPCode() { + return nil + } + return []*ffcli.Command{ + { + Name: "connect", + ShortUsage: "exit-node connect", + ShortHelp: "connect to most recently used exit node", + Exec: exitNodeSetUse(true), + }, + { + Name: "disconnect", + ShortUsage: "exit-node disconnect", + ShortHelp: "disconnect from current exit node, if any", + Exec: exitNodeSetUse(false), + }, + } + })()...), + } } var exitNodeArgs struct {