diff options
| author | Denton Gentry <dgentry@tailscale.com> | 2021-05-17 08:15:50 -0700 |
|---|---|---|
| committer | Denton Gentry <dgentry@tailscale.com> | 2021-05-17 08:16:50 -0700 |
| commit | 1dc90404f32e9f4437e188109622dc598cc185cb (patch) | |
| tree | 0b853c62f1b28589de037cd975f95f3e64e4e7f3 /cmd/tailscaled/cli/debug.go | |
| parent | 25df067dd0c854eebcd2841b82ad92ebb1d77165 (diff) | |
| download | tailscale-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.go | 129 |
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 +} |
