cmd/tailscale/cli: add json output option to switch --list (#18501)
* cmd/tailscale/cli: add json output option to `switch --list` Closes #14783 Signed-off-by: Cameron Stokes <cameron@tailscale.com>
This commit is contained in:
@@ -5,6 +5,7 @@ package cli
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
@@ -18,9 +19,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var switchCmd = &ffcli.Command{
|
var switchCmd = &ffcli.Command{
|
||||||
Name: "switch",
|
Name: "switch",
|
||||||
ShortUsage: "tailscale switch <id>",
|
ShortUsage: strings.Join([]string{
|
||||||
ShortHelp: "Switch to a different Tailscale account",
|
"tailscale switch <id>",
|
||||||
|
"tailscale switch --list [--json]",
|
||||||
|
}, "\n"),
|
||||||
|
ShortHelp: "Switch to a different Tailscale account",
|
||||||
LongHelp: `"tailscale switch" switches between logged in accounts. You can
|
LongHelp: `"tailscale switch" switches between logged in accounts. You can
|
||||||
use the ID that's returned from 'tailnet switch -list'
|
use the ID that's returned from 'tailnet switch -list'
|
||||||
to pick which profile you want to switch to. Alternatively, you
|
to pick which profile you want to switch to. Alternatively, you
|
||||||
@@ -31,6 +35,7 @@ This command is currently in alpha and may change in the future.`,
|
|||||||
FlagSet: func() *flag.FlagSet {
|
FlagSet: func() *flag.FlagSet {
|
||||||
fs := flag.NewFlagSet("switch", flag.ExitOnError)
|
fs := flag.NewFlagSet("switch", flag.ExitOnError)
|
||||||
fs.BoolVar(&switchArgs.list, "list", false, "list available accounts")
|
fs.BoolVar(&switchArgs.list, "list", false, "list available accounts")
|
||||||
|
fs.BoolVar(&switchArgs.json, "json", false, "list available accounts in JSON format")
|
||||||
return fs
|
return fs
|
||||||
}(),
|
}(),
|
||||||
Exec: switchProfile,
|
Exec: switchProfile,
|
||||||
@@ -82,6 +87,7 @@ func init() {
|
|||||||
|
|
||||||
var switchArgs struct {
|
var switchArgs struct {
|
||||||
list bool
|
list bool
|
||||||
|
json bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func listProfiles(ctx context.Context) error {
|
func listProfiles(ctx context.Context) error {
|
||||||
@@ -109,10 +115,48 @@ func listProfiles(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type switchProfileJSON struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Nickname string `json:"nickname"`
|
||||||
|
Tailnet string `json:"tailnet"`
|
||||||
|
Account string `json:"account"`
|
||||||
|
Selected bool `json:"selected"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func listProfilesJSON(ctx context.Context) error {
|
||||||
|
curP, all, err := localClient.ProfileStatus(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
profiles := make([]switchProfileJSON, 0, len(all))
|
||||||
|
for _, prof := range all {
|
||||||
|
profiles = append(profiles, switchProfileJSON{
|
||||||
|
ID: string(prof.ID),
|
||||||
|
Tailnet: prof.NetworkProfile.DisplayNameOrDefault(),
|
||||||
|
Account: prof.UserProfile.LoginName,
|
||||||
|
Nickname: prof.Name,
|
||||||
|
Selected: prof.ID == curP.ID,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
profilesJSON, err := json.MarshalIndent(profiles, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
printf("%s\n", profilesJSON)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func switchProfile(ctx context.Context, args []string) error {
|
func switchProfile(ctx context.Context, args []string) error {
|
||||||
if switchArgs.list {
|
if switchArgs.list {
|
||||||
|
if switchArgs.json {
|
||||||
|
return listProfilesJSON(ctx)
|
||||||
|
}
|
||||||
return listProfiles(ctx)
|
return listProfiles(ctx)
|
||||||
}
|
}
|
||||||
|
if switchArgs.json {
|
||||||
|
outln("--json argument cannot be used with tailscale switch NAME")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
if len(args) != 1 {
|
if len(args) != 1 {
|
||||||
outln("usage: tailscale switch NAME")
|
outln("usage: tailscale switch NAME")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user