summaryrefslogtreecommitdiffhomepage
path: root/cmd/tailscaled/cli/debug.go
diff options
context:
space:
mode:
authorDenton Gentry <dgentry@tailscale.com>2021-05-17 08:15:50 -0700
committerDenton Gentry <dgentry@tailscale.com>2021-05-17 08:16:50 -0700
commit1dc90404f32e9f4437e188109622dc598cc185cb (patch)
tree0b853c62f1b28589de037cd975f95f3e64e4e7f3 /cmd/tailscaled/cli/debug.go
parent25df067dd0c854eebcd2841b82ad92ebb1d77165 (diff)
downloadtailscale-onebinary.tar.xz
tailscale-onebinary.zip
cmd/tailscale{,d}: combine into a single binaryonebinary
To reduce size, combine tailscaled and tailscale into a single binary which will figure out what it should do based on argv[0]. Signed-off-by: Denton Gentry <dgentry@tailscale.com>
Diffstat (limited to 'cmd/tailscaled/cli/debug.go')
-rw-r--r--cmd/tailscaled/cli/debug.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/cmd/tailscaled/cli/debug.go b/cmd/tailscaled/cli/debug.go
new file mode 100644
index 000000000..851bb97de
--- /dev/null
+++ b/cmd/tailscaled/cli/debug.go
@@ -0,0 +1,129 @@
+// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cli
+
+import (
+ "context"
+ "encoding/json"
+ "errors"
+ "flag"
+ "fmt"
+ "io"
+ "log"
+ "os"
+ "runtime"
+ "strings"
+
+ "github.com/peterbourgon/ff/v2/ffcli"
+ "tailscale.com/client/tailscale"
+ "tailscale.com/ipn"
+ "tailscale.com/paths"
+ "tailscale.com/safesocket"
+)
+
+var debugCmd = &ffcli.Command{
+ Name: "debug",
+ Exec: runDebug,
+ FlagSet: (func() *flag.FlagSet {
+ fs := flag.NewFlagSet("debug", flag.ExitOnError)
+ fs.BoolVar(&debugArgs.goroutines, "daemon-goroutines", false, "If true, dump the tailscaled daemon's goroutines")
+ fs.BoolVar(&debugArgs.ipn, "ipn", false, "If true, subscribe to IPN notifications")
+ fs.BoolVar(&debugArgs.prefs, "prefs", false, "If true, dump active prefs")
+ fs.BoolVar(&debugArgs.pretty, "pretty", false, "If true, pretty-print output (for --prefs)")
+ fs.BoolVar(&debugArgs.netMap, "netmap", true, "whether to include netmap in --ipn mode")
+ fs.BoolVar(&debugArgs.localCreds, "local-creds", false, "print how to connect to local tailscaled")
+ fs.StringVar(&debugArgs.file, "file", "", "get, delete:NAME, or NAME")
+ return fs
+ })(),
+}
+
+var debugArgs struct {
+ localCreds bool
+ goroutines bool
+ ipn bool
+ netMap bool
+ file string
+ prefs bool
+ pretty bool
+}
+
+func runDebug(ctx context.Context, args []string) error {
+ if len(args) > 0 {
+ return errors.New("unknown arguments")
+ }
+ if debugArgs.localCreds {
+ port, token, err := safesocket.LocalTCPPortAndToken()
+ if err == nil {
+ fmt.Printf("curl -u:%s http://localhost:%d/localapi/v0/status\n", token, port)
+ return nil
+ }
+ if runtime.GOOS == "windows" {
+ fmt.Printf("curl http://localhost:41112/localapi/v0/status\n")
+ return nil
+ }
+ fmt.Printf("curl --unix-socket %s http://foo/localapi/v0/status\n", paths.DefaultTailscaledSocket())
+ return nil
+ }
+ if debugArgs.prefs {
+ prefs, err := tailscale.GetPrefs(ctx)
+ if err != nil {
+ return err
+ }
+ if debugArgs.pretty {
+ fmt.Println(prefs.Pretty())
+ } else {
+ j, _ := json.MarshalIndent(prefs, "", "\t")
+ fmt.Println(string(j))
+ }
+ return nil
+ }
+ if debugArgs.goroutines {
+ goroutines, err := tailscale.Goroutines(ctx)
+ if err != nil {
+ return err
+ }
+ os.Stdout.Write(goroutines)
+ return nil
+ }
+ if debugArgs.ipn {
+ c, bc, ctx, cancel := connect(ctx)
+ defer cancel()
+
+ bc.SetNotifyCallback(func(n ipn.Notify) {
+ if !debugArgs.netMap {
+ n.NetMap = nil
+ }
+ j, _ := json.MarshalIndent(n, "", "\t")
+ fmt.Printf("%s\n", j)
+ })
+ bc.RequestEngineStatus()
+ pump(ctx, bc, c)
+ return errors.New("exit")
+ }
+ if debugArgs.file != "" {
+ if debugArgs.file == "get" {
+ wfs, err := tailscale.WaitingFiles(ctx)
+ if err != nil {
+ log.Fatal(err)
+ }
+ e := json.NewEncoder(os.Stdout)
+ e.SetIndent("", "\t")
+ e.Encode(wfs)
+ return nil
+ }
+ delete := strings.HasPrefix(debugArgs.file, "delete:")
+ if delete {
+ return tailscale.DeleteWaitingFile(ctx, strings.TrimPrefix(debugArgs.file, "delete:"))
+ }
+ rc, size, err := tailscale.GetWaitingFile(ctx, debugArgs.file)
+ if err != nil {
+ return err
+ }
+ log.Printf("Size: %v\n", size)
+ io.Copy(os.Stdout, rc)
+ return nil
+ }
+ return nil
+}