cmd/tailscale: allow use of flags in gokrazy

Enable use of command line arguments with tailscale cli on gokrazy. Before
this change using arguments like "up" would cause tailscale cli to be
repeatedly restarted by gokrazy process supervisor.

We never want to have gokrazy restart tailscale cli, even if user would
manually start the process.

Expected usage is that user creates files:

flags/tailscale.com/cmd/tailscale/flags.txt:

    up

flags/tailscale.com/cmd/tailscaled/flags.txt:

    --statedir=/perm/tailscaled/
    --tun=userspace-networking

Then tailscale prints URL for user to log in with browser.

Alternatively it should be possible to use up with auth key to allow
unattended gokrazy installs.

Signed-off-by: Joonas Kuorilehto <joneskoo@derbian.fi>
This commit is contained in:
Joonas Kuorilehto 2022-03-09 09:50:38 +02:00 committed by Brad Fitzpatrick
parent 2c89b3a601
commit c1b3500a05

View File

@ -125,16 +125,21 @@ func CleanUpArgs(args []string) []string {
} }
// Run runs the CLI. The args do not include the binary name. // Run runs the CLI. The args do not include the binary name.
func Run(args []string) error { func Run(args []string) (err error) {
if len(args) == 1 && (args[0] == "-V" || args[0] == "--version") { if len(args) == 1 && (args[0] == "-V" || args[0] == "--version") {
args = []string{"version"} args = []string{"version"}
} }
if runtime.GOOS == "linux" && distro.Get() == distro.Gokrazy && len(args) == 0 && if runtime.GOOS == "linux" && distro.Get() == distro.Gokrazy &&
os.Getenv("GOKRAZY_FIRST_START") == "1" { os.Getenv("GOKRAZY_FIRST_START") == "1" {
defer func() {
// Exit with 125 otherwise the CLI binary is restarted // Exit with 125 otherwise the CLI binary is restarted
// forever in a loop by the Gokrazy process supervisor. // forever in a loop by the Gokrazy process supervisor.
// See https://gokrazy.org/userguide/process-interface/ // See https://gokrazy.org/userguide/process-interface/
if err != nil {
log.Println(err)
}
os.Exit(125) os.Exit(125)
}()
} }
var warnOnce sync.Once var warnOnce sync.Once
@ -201,7 +206,7 @@ func Run(args []string) error {
} }
}) })
err := rootCmd.Run(context.Background()) err = rootCmd.Run(context.Background())
if tailscale.IsAccessDeniedError(err) && os.Getuid() != 0 && runtime.GOOS != "windows" { if tailscale.IsAccessDeniedError(err) && os.Getuid() != 0 && runtime.GOOS != "windows" {
return fmt.Errorf("%v\n\nUse 'sudo tailscale %s' or 'tailscale up --operator=$USER' to not require root.", err, strings.Join(args, " ")) return fmt.Errorf("%v\n\nUse 'sudo tailscale %s' or 'tailscale up --operator=$USER' to not require root.", err, strings.Join(args, " "))
} }