|
|
@@ -121,24 +121,10 @@ func runStatus(ctx context.Context, args []string) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- switch st.BackendState {
|
|
|
- default:
|
|
|
- fmt.Fprintf(Stderr, "unexpected state: %s\n", st.BackendState)
|
|
|
- os.Exit(1)
|
|
|
- case ipn.Stopped.String():
|
|
|
- outln("Tailscale is stopped.")
|
|
|
- os.Exit(1)
|
|
|
- case ipn.NeedsLogin.String():
|
|
|
- outln("Logged out.")
|
|
|
- if st.AuthURL != "" {
|
|
|
- printf("\nLog in at: %s\n", st.AuthURL)
|
|
|
- }
|
|
|
- os.Exit(1)
|
|
|
- case ipn.NeedsMachineAuth.String():
|
|
|
- outln("Machine is not yet authorized by tailnet admin.")
|
|
|
+ description, ok := isRunningOrStarting(st)
|
|
|
+ if !ok {
|
|
|
+ outln(description)
|
|
|
os.Exit(1)
|
|
|
- case ipn.Running.String(), ipn.Starting.String():
|
|
|
- // Run below.
|
|
|
}
|
|
|
|
|
|
if len(st.Health) > 0 {
|
|
|
@@ -222,6 +208,27 @@ func runStatus(ctx context.Context, args []string) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+// isRunningOrStarting reports whether st is in state Running or Starting.
|
|
|
+// It also returns a description of the status suitable to display to a user.
|
|
|
+func isRunningOrStarting(st *ipnstate.Status) (description string, ok bool) {
|
|
|
+ switch st.BackendState {
|
|
|
+ default:
|
|
|
+ return fmt.Sprintf("unexpected state: %s", st.BackendState), false
|
|
|
+ case ipn.Stopped.String():
|
|
|
+ return "Tailscale is stopped.", false
|
|
|
+ case ipn.NeedsLogin.String():
|
|
|
+ s := "Logged out."
|
|
|
+ if st.AuthURL != "" {
|
|
|
+ s += fmt.Sprintf("\nLog in at: %s", st.AuthURL)
|
|
|
+ }
|
|
|
+ return s, false
|
|
|
+ case ipn.NeedsMachineAuth.String():
|
|
|
+ return "Machine is not yet authorized by tailnet admin.", false
|
|
|
+ case ipn.Running.String(), ipn.Starting.String():
|
|
|
+ return st.BackendState, true
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func dnsOrQuoteHostname(st *ipnstate.Status, ps *ipnstate.PeerStatus) string {
|
|
|
baseName := dnsname.TrimSuffix(ps.DNSName, st.MagicDNSSuffix)
|
|
|
if baseName != "" {
|