@ -45,9 +45,10 @@ import (
)
var debugCmd = & ffcli . Command {
Name : "debug" ,
Exec : runDebug ,
LongHelp : ` "tailscale debug" contains misc debug facilities; it is not a stable interface. ` ,
Name : "debug" ,
Exec : runDebug ,
ShortUsage : "tailscale debug <debug-flags | subcommand>" ,
LongHelp : ` HIDDEN: "tailscale debug" contains misc debug facilities; it is not a stable interface. ` ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "debug" )
fs . StringVar ( & debugArgs . file , "file" , "" , "get, delete:NAME, or NAME" )
@ -58,15 +59,16 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
Subcommands : [ ] * ffcli . Command {
{
Name : "derp-map" ,
Exec : runDERPMap ,
ShortHelp : "print DERP map" ,
Name : "derp-map" ,
ShortUsage : "tailscale debug derp-map" ,
Exec : runDERPMap ,
ShortHelp : "Print DERP map" ,
} ,
{
Name : "component-logs" ,
Exec : runDebugComponentLogs ,
ShortHelp : "enable/disable debug logs for a component" ,
ShortUsage : "tailscale debug component-logs [" + strings . Join ( ipn . DebuggableComponents , "|" ) + "]" ,
Exec : runDebugComponentLogs ,
ShortHelp : "Enable/disable debug logs for a component" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "component-logs" )
fs . DurationVar ( & debugComponentLogsArgs . forDur , "for" , time . Hour , "how long to enable debug logs for; zero or negative means to disable" )
@ -74,14 +76,16 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "daemon-goroutines" ,
Exec : runDaemonGoroutines ,
ShortHelp : "print tailscaled's goroutines" ,
Name : "daemon-goroutines" ,
ShortUsage : "tailscale debug daemon-goroutines" ,
Exec : runDaemonGoroutines ,
ShortHelp : "Print tailscaled's goroutines" ,
} ,
{
Name : "daemon-logs" ,
Exec : runDaemonLogs ,
ShortHelp : "watch tailscaled's server logs" ,
Name : "daemon-logs" ,
ShortUsage : "tailscale debug daemon-logs" ,
Exec : runDaemonLogs ,
ShortHelp : "Watch tailscaled's server logs" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "daemon-logs" )
fs . IntVar ( & daemonLogsArgs . verbose , "verbose" , 0 , "verbosity level" )
@ -90,9 +94,10 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "metrics" ,
Exec : runDaemonMetrics ,
ShortHelp : "print tailscaled's metrics" ,
Name : "metrics" ,
ShortUsage : "tailscale debug metrics" ,
Exec : runDaemonMetrics ,
ShortHelp : "Print tailscaled's metrics" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "metrics" )
fs . BoolVar ( & metricsArgs . watch , "watch" , false , "print JSON dump of delta values" )
@ -100,80 +105,95 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "env" ,
Exec : runEnv ,
ShortHelp : "print cmd/tailscale environment" ,
Name : "env" ,
ShortUsage : "tailscale debug env" ,
Exec : runEnv ,
ShortHelp : "Print cmd/tailscale environment" ,
} ,
{
Name : "stat" ,
Exec : runStat ,
ShortHelp : "stat a file" ,
Name : "stat" ,
ShortUsage : "tailscale debug stat <files...>" ,
Exec : runStat ,
ShortHelp : "Stat a file" ,
} ,
{
Name : "hostinfo" ,
Exec : runHostinfo ,
ShortHelp : "print hostinfo" ,
Name : "hostinfo" ,
ShortUsage : "tailscale debug hostinfo" ,
Exec : runHostinfo ,
ShortHelp : "Print hostinfo" ,
} ,
{
Name : "local-creds" ,
Exec : runLocalCreds ,
ShortHelp : "print how to access Tailscale LocalAPI" ,
Name : "local-creds" ,
ShortUsage : "tailscale debug local-creds" ,
Exec : runLocalCreds ,
ShortHelp : "Print how to access Tailscale LocalAPI" ,
} ,
{
Name : "restun" ,
Exec : localAPIAction ( "restun" ) ,
ShortHelp : "force a magicsock restun" ,
Name : "restun" ,
ShortUsage : "tailscale debug restun" ,
Exec : localAPIAction ( "restun" ) ,
ShortHelp : "Force a magicsock restun" ,
} ,
{
Name : "rebind" ,
Exec : localAPIAction ( "rebind" ) ,
ShortHelp : "force a magicsock rebind" ,
Name : "rebind" ,
ShortUsage : "tailscale debug rebind" ,
Exec : localAPIAction ( "rebind" ) ,
ShortHelp : "Force a magicsock rebind" ,
} ,
{
Name : "derp-set-on-demand" ,
Exec : localAPIAction ( "derp-set-homeless" ) ,
ShortHelp : "enable DERP on-demand mode (breaks reachability)" ,
Name : "derp-set-on-demand" ,
ShortUsage : "tailscale debug derp-set-on-demand" ,
Exec : localAPIAction ( "derp-set-homeless" ) ,
ShortHelp : "Enable DERP on-demand mode (breaks reachability)" ,
} ,
{
Name : "derp-unset-on-demand" ,
Exec : localAPIAction ( "derp-unset-homeless" ) ,
ShortHelp : "disable DERP on-demand mode" ,
Name : "derp-unset-on-demand" ,
ShortUsage : "tailscale debug derp-unset-on-demand" ,
Exec : localAPIAction ( "derp-unset-homeless" ) ,
ShortHelp : "Disable DERP on-demand mode" ,
} ,
{
Name : "break-tcp-conns" ,
Exec : localAPIAction ( "break-tcp-conns" ) ,
ShortHelp : "break any open TCP connections from the daemon" ,
Name : "break-tcp-conns" ,
ShortUsage : "tailscale debug break-tcp-conns" ,
Exec : localAPIAction ( "break-tcp-conns" ) ,
ShortHelp : "Break any open TCP connections from the daemon" ,
} ,
{
Name : "break-derp-conns" ,
Exec : localAPIAction ( "break-derp-conns" ) ,
ShortHelp : "break any open DERP connections from the daemon" ,
Name : "break-derp-conns" ,
ShortUsage : "tailscale debug break-derp-conns" ,
Exec : localAPIAction ( "break-derp-conns" ) ,
ShortHelp : "Break any open DERP connections from the daemon" ,
} ,
{
Name : "pick-new-derp" ,
Exec : localAPIAction ( "pick-new-derp" ) ,
ShortHelp : "switch to some other random DERP home region for a short time" ,
Name : "pick-new-derp" ,
ShortUsage : "tailscale debug pick-new-derp" ,
Exec : localAPIAction ( "pick-new-derp" ) ,
ShortHelp : "Switch to some other random DERP home region for a short time" ,
} ,
{
Name : "force-netmap-update" ,
Exec : localAPIAction ( "force-netmap-update" ) ,
ShortHelp : "force a full no-op netmap update (for load testing)" ,
Name : "force-netmap-update" ,
ShortUsage : "tailscale debug force-netmap-update" ,
Exec : localAPIAction ( "force-netmap-update" ) ,
ShortHelp : "Force a full no-op netmap update (for load testing)" ,
} ,
{
// TODO(bradfitz,maisem): eventually promote this out of debug
Name : "reload-config" ,
Exec : reloadConfig ,
ShortHelp : "reload config" ,
Name : "reload-config" ,
ShortUsage : "tailscale debug reload-config" ,
Exec : reloadConfig ,
ShortHelp : "Reload config" ,
} ,
{
Name : "control-knobs" ,
Exec : debugControlKnobs ,
ShortHelp : "see current control knobs" ,
Name : "control-knobs" ,
ShortUsage : "tailscale debug control-knobs" ,
Exec : debugControlKnobs ,
ShortHelp : "See current control knobs" ,
} ,
{
Name : "prefs" ,
Exec : runPrefs ,
ShortHelp : "print prefs" ,
Name : "prefs" ,
ShortUsage : "tailscale debug prefs" ,
Exec : runPrefs ,
ShortHelp : "Print prefs" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "prefs" )
fs . BoolVar ( & prefsArgs . pretty , "pretty" , false , "If true, pretty-print output" )
@ -181,9 +201,10 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "watch-ipn" ,
Exec : runWatchIPN ,
ShortHelp : "subscribe to IPN message bus" ,
Name : "watch-ipn" ,
ShortUsage : "tailscale debug watch-ipn" ,
Exec : runWatchIPN ,
ShortHelp : "Subscribe to IPN message bus" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "watch-ipn" )
fs . BoolVar ( & watchIPNArgs . netmap , "netmap" , true , "include netmap in messages" )
@ -194,9 +215,10 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "netmap" ,
Exec : runNetmap ,
ShortHelp : "print the current network map" ,
Name : "netmap" ,
ShortUsage : "tailscale debug netmap" ,
Exec : runNetmap ,
ShortHelp : "Print the current network map" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "netmap" )
fs . BoolVar ( & netmapArgs . showPrivateKey , "show-private-key" , false , "include node private key in printed netmap" )
@ -204,14 +226,17 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "via" ,
Name : "via" ,
ShortUsage : "tailscale via <site-id> <v4-cidr>\n" +
"tailscale via <v6-route>" ,
Exec : runVia ,
ShortHelp : "convert between site-specific IPv4 CIDRs and IPv6 'via' routes" ,
ShortHelp : " C onvert between site-specific IPv4 CIDRs and IPv6 'via' routes",
} ,
{
Name : "ts2021" ,
Exec : runTS2021 ,
ShortHelp : "debug ts2021 protocol connectivity" ,
Name : "ts2021" ,
ShortUsage : "tailscale debug ts2021" ,
Exec : runTS2021 ,
ShortHelp : "Debug ts2021 protocol connectivity" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "ts2021" )
fs . StringVar ( & ts2021Args . host , "host" , "controlplane.tailscale.com" , "hostname of control plane" )
@ -221,9 +246,10 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "set-expire" ,
Exec : runSetExpire ,
ShortHelp : "manipulate node key expiry for testing" ,
Name : "set-expire" ,
ShortUsage : "tailscale debug set-expire --in=1m" ,
Exec : runSetExpire ,
ShortHelp : "Manipulate node key expiry for testing" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "set-expire" )
fs . DurationVar ( & setExpireArgs . in , "in" , 0 , "if non-zero, set node key to expire this duration from now" )
@ -231,9 +257,10 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "dev-store-set" ,
Exec : runDevStoreSet ,
ShortHelp : "set a key/value pair during development" ,
Name : "dev-store-set" ,
ShortUsage : "tailscale debug dev-store-set" ,
Exec : runDevStoreSet ,
ShortHelp : "Set a key/value pair during development" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "store-set" )
fs . BoolVar ( & devStoreSetArgs . danger , "danger" , false , "accept danger" )
@ -241,14 +268,16 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "derp" ,
Exec : runDebugDERP ,
ShortHelp : "test a DERP configuration" ,
Name : "derp" ,
ShortUsage : "tailscale debug derp" ,
Exec : runDebugDERP ,
ShortHelp : "Test a DERP configuration" ,
} ,
{
Name : "capture" ,
Exec : runCapture ,
ShortHelp : "streams pcaps for debugging" ,
Name : "capture" ,
ShortUsage : "tailscale debug capture" ,
Exec : runCapture ,
ShortHelp : "Streams pcaps for debugging" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "capture" )
fs . StringVar ( & captureArgs . outFile , "o" , "" , "path to stream the pcap (or - for stdout), leave empty to start wireshark" )
@ -256,9 +285,10 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "portmap" ,
Exec : debugPortmap ,
ShortHelp : "run portmap debugging" ,
Name : "portmap" ,
ShortUsage : "tailscale debug portmap" ,
Exec : debugPortmap ,
ShortHelp : "Run portmap debugging" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "portmap" )
fs . DurationVar ( & debugPortmapArgs . duration , "duration" , 5 * time . Second , "timeout for port mapping" )
@ -270,14 +300,16 @@ var debugCmd = &ffcli.Command{
} ) ( ) ,
} ,
{
Name : "peer-endpoint-changes" ,
Exec : runPeerEndpointChanges ,
ShortHelp : "prints debug information about a peer's endpoint changes" ,
Name : "peer-endpoint-changes" ,
ShortUsage : "tailscale debug peer-endpoint-changes <hostname-or-IP>" ,
Exec : runPeerEndpointChanges ,
ShortHelp : "Prints debug information about a peer's endpoint changes" ,
} ,
{
Name : "dial-types" ,
Exec : runDebugDialTypes ,
ShortHelp : "prints debug information about connecting to a given host or IP" ,
Name : "dial-types" ,
ShortUsage : "tailscale debug dial-types <hostname-or-IP> <port>" ,
Exec : runDebugDialTypes ,
ShortHelp : "Prints debug information about connecting to a given host or IP" ,
FlagSet : ( func ( ) * flag . FlagSet {
fs := newFlagSet ( "dial-types" )
fs . StringVar ( & debugDialTypesArgs . network , "network" , "tcp" , ` network type to dial ("tcp", "udp", etc.) ` )
@ -867,7 +899,7 @@ var setExpireArgs struct {
func runSetExpire ( ctx context . Context , args [ ] string ) error {
if len ( args ) != 0 || setExpireArgs . in == 0 {
return errors . New ( "usage --in=<duration>")
return errors . New ( "usage : tailscale debug set-expire --in=<duration>")
}
return localClient . DebugSetExpireIn ( ctx , setExpireArgs . in )
}
@ -966,7 +998,7 @@ func runPeerEndpointChanges(ctx context.Context, args []string) error {
}
if len ( args ) != 1 || args [ 0 ] == "" {
return errors . New ( "usage: peer-statu s <hostname-or-IP>")
return errors . New ( "usage: tailscale debug peer-endpoint-change s <hostname-or-IP>")
}
var ip string
@ -1042,7 +1074,7 @@ func runDebugDialTypes(ctx context.Context, args []string) error {
}
if len ( args ) != 2 || args [ 0 ] == "" || args [ 1 ] == "" {
return errors . New ( "usage: dial-types <hostname-or-IP> <port>")
return errors . New ( "usage: tailscale debug dial-types <hostname-or-IP> <port>")
}
port , err := strconv . ParseUint ( args [ 1 ] , 10 , 16 )