cmd/tailscaled: fix up install-system-daemon on darwin, add uninstall too

Tangentially related to #987, #177, #594, #925, #505
pull/1341/head
Brad Fitzpatrick 3 years ago
parent 52e24aa966
commit d7569863b5

@ -33,6 +33,8 @@ var debugArgs struct {
derpCheck string derpCheck string
} }
var debugModeFunc = debugMode // so it can be addressable
func debugMode(args []string) error { func debugMode(args []string) error {
fs := flag.NewFlagSet("debug", flag.ExitOnError) fs := flag.NewFlagSet("debug", flag.ExitOnError)
fs.BoolVar(&debugArgs.monitor, "monitor", false, "If true, run link monitor forever. Precludes all other options.") fs.BoolVar(&debugArgs.monitor, "monitor", false, "If true, run link monitor forever. Precludes all other options.")

@ -5,6 +5,7 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@ -14,6 +15,7 @@ import (
func init() { func init() {
installSystemDaemon = installSystemDaemonDarwin installSystemDaemon = installSystemDaemonDarwin
uninstallSystemDaemon = uninstallSystemDaemonDarwin
} }
// darwinLaunchdPlist is the launchd.plist that's written to // darwinLaunchdPlist is the launchd.plist that's written to
@ -44,9 +46,46 @@ const darwinLaunchdPlist = `
const sysPlist = "/Library/LaunchDaemons/com.tailscale.tailscaled.plist" const sysPlist = "/Library/LaunchDaemons/com.tailscale.tailscaled.plist"
const targetBin = "/usr/local/bin/tailscaled" const targetBin = "/usr/local/bin/tailscaled"
const service = "system/com.tailscale.tailscaled" const service = "com.tailscale.tailscaled"
func installSystemDaemonDarwin() (err error) { func uninstallSystemDaemonDarwin(args []string) (ret error) {
if len(args) > 0 {
return errors.New("uninstall subcommand takes no arguments")
}
plist, err := exec.Command("launchctl", "list", "com.tailscale.tailscaled").Output()
_ = plist // parse it? https://github.com/DHowett/go-plist if we need something.
running := err == nil
if running {
out, err := exec.Command("launchctl", "stop", "com.tailscale.tailscaled").CombinedOutput()
if err != nil {
fmt.Printf("launchctl stop com.tailscale.tailscaled: %v, %s\n", err, out)
ret = err
}
out, err = exec.Command("launchctl", "unload", sysPlist).CombinedOutput()
if err != nil {
fmt.Printf("launchctl unload %s: %v, %s\n", sysPlist, err, out)
if ret == nil {
ret = err
}
}
}
err = os.Remove(sysPlist)
if os.IsNotExist(err) {
err = nil
if ret == nil {
ret = err
}
}
return ret
}
func installSystemDaemonDarwin(args []string) (err error) {
if len(args) > 0 {
return errors.New("install subcommand takes no arguments")
}
defer func() { defer func() {
if err != nil && os.Getuid() != 0 { if err != nil && os.Getuid() != 0 {
err = fmt.Errorf("%w; try running tailscaled with sudo", err) err = fmt.Errorf("%w; try running tailscaled with sudo", err)
@ -84,9 +123,8 @@ func installSystemDaemonDarwin() (err error) {
return err return err
} }
// Two best effort commands to stop a previous run. // Best effort:
exec.Command("launchctl", "stop", "system/com.tailscale.tailscaled").Run() uninstallSystemDaemonDarwin(nil)
exec.Command("launchctl", "unload", sysPlist).Run()
if err := ioutil.WriteFile(sysPlist, []byte(darwinLaunchdPlist), 0700); err != nil { if err := ioutil.WriteFile(sysPlist, []byte(darwinLaunchdPlist), 0700); err != nil {
return err return err

@ -71,7 +71,16 @@ var args struct {
verbose int verbose int
} }
var installSystemDaemon func() error // non-nil on some platforms var (
installSystemDaemon func([]string) error // non-nil on some platforms
uninstallSystemDaemon func([]string) error // non-nil on some platforms
)
var subCommands = map[string]*func([]string) error{
"install-system-daemon": &installSystemDaemon,
"uninstall-system-daemon": &uninstallSystemDaemon,
"debug": &debugModeFunc,
}
func main() { func main() {
// We aren't very performance sensitive, and the parts that are // We aren't very performance sensitive, and the parts that are
@ -94,17 +103,13 @@ func main() {
flag.BoolVar(&printVersion, "version", false, "print version information and exit") flag.BoolVar(&printVersion, "version", false, "print version information and exit")
if len(os.Args) > 1 { if len(os.Args) > 1 {
switch os.Args[1] { sub := os.Args[1]
case "debug": if fp, ok := subCommands[sub]; ok {
if err := debugMode(os.Args[2:]); err != nil { if *fp == nil {
log.Fatal(err)
}
return
case "install-system-daemon":
if f := installSystemDaemon; f == nil {
log.SetFlags(0) log.SetFlags(0)
log.Fatalf("install-system-daemon not available on %v", runtime.GOOS) log.Fatalf("%s not available on %v", sub, runtime.GOOS)
} else if err := f(); err != nil { }
if err := (*fp)(os.Args[2:]); err != nil {
log.SetFlags(0) log.SetFlags(0)
log.Fatal(err) log.Fatal(err)
} }

Loading…
Cancel
Save