From b9cc14aaf51836171322c1fe9dcc516021bad112 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 12 Oct 2021 12:49:09 +0900 Subject: [PATCH 1/3] cmd/tailscale/cli: rename runCp to runFileCp --- cmd/tailscale/cli/file.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/tailscale/cli/file.go b/cmd/tailscale/cli/file.go index 9490ca5db..80264dc64 100644 --- a/cmd/tailscale/cli/file.go +++ b/cmd/tailscale/cli/file.go @@ -53,7 +53,7 @@ var fileCpCmd = &ffcli.Command{ Name: "cp", ShortUsage: "file cp :", ShortHelp: "Copy file(s) to a host", - Exec: runCp, + Exec: runFileCp, FlagSet: (func() *flag.FlagSet { fs := flag.NewFlagSet("cp", flag.ExitOnError) fs.StringVar(&cpArgs.name, "name", "", "alternate filename to use, especially useful when is \"-\" (stdin)") @@ -69,7 +69,7 @@ var cpArgs struct { targets bool } -func runCp(ctx context.Context, args []string) error { +func runFileCp(ctx context.Context, args []string) error { if cpArgs.targets { return runCpTargets(ctx, args) } From a8ce5f14eaed1f951679fae8dfee502add92be33 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 12 Oct 2021 12:53:53 +0900 Subject: [PATCH 2/3] cmd/tailscale/cli: Add ls sub-command for file --- cmd/tailscale/cli/file.go | 49 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/cmd/tailscale/cli/file.go b/cmd/tailscale/cli/file.go index 80264dc64..69709d30f 100644 --- a/cmd/tailscale/cli/file.go +++ b/cmd/tailscale/cli/file.go @@ -35,11 +35,12 @@ import ( var fileCmd = &ffcli.Command{ Name: "file", - ShortUsage: "file ...", + ShortUsage: "file ...", ShortHelp: "Send or receive files", Subcommands: []*ffcli.Command{ fileCpCmd, fileGetCmd, + fileLsCmd, }, Exec: func(context.Context, []string) error { // TODO(bradfitz): is there a better ffcli way to @@ -434,3 +435,49 @@ func waitForFile(ctx context.Context) error { return ctx.Err() } } + +var fileLsCmd = &ffcli.Command{ + Name: "ls", + ShortUsage: "file ls", + ShortHelp: "Show pending files", + Exec: runFileLs, + FlagSet: (func() *flag.FlagSet { + fs := flag.NewFlagSet("ls", flag.ExitOnError) + fs.BoolVar(&lsArgs.verbose, "verbose", false, "verbose output") + return fs + })(), +} + +var lsArgs struct { + verbose bool +} + +func runFileLs(ctx context.Context, args []string) error { + if len(args) != 0 { + return errors.New("usage: file ls") + } + log.SetFlags(0) + + var wfs []apitype.WaitingFile + var err error + for { + wfs, err = tailscale.WaitingFiles(ctx) + if err != nil { + return fmt.Errorf("getting WaitingFiles: %v", err) + } + if len(wfs) != 0 || !getArgs.wait { + break + } + if getArgs.verbose { + log.Printf("waiting for file...") + } + if err := waitForFile(ctx); err != nil { + return err + } + } + + for _, wf := range wfs { + fmt.Println(wf.Name) + } + return nil +} From 4efc56195694431c96ef27f8ad147a0ecce48d24 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 12 Oct 2021 13:00:04 +0900 Subject: [PATCH 3/3] cmd/tailscale/cli: -json for file ls --- cmd/tailscale/cli/file.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd/tailscale/cli/file.go b/cmd/tailscale/cli/file.go index 69709d30f..45d3b8693 100644 --- a/cmd/tailscale/cli/file.go +++ b/cmd/tailscale/cli/file.go @@ -7,6 +7,7 @@ package cli import ( "bytes" "context" + "encoding/json" "errors" "flag" "fmt" @@ -443,6 +444,7 @@ var fileLsCmd = &ffcli.Command{ Exec: runFileLs, FlagSet: (func() *flag.FlagSet { fs := flag.NewFlagSet("ls", flag.ExitOnError) + fs.BoolVar(&lsArgs.asJson, "json", false, "output JSON") fs.BoolVar(&lsArgs.verbose, "verbose", false, "verbose output") return fs })(), @@ -450,6 +452,7 @@ var fileLsCmd = &ffcli.Command{ var lsArgs struct { verbose bool + asJson bool } func runFileLs(ctx context.Context, args []string) error { @@ -476,8 +479,14 @@ func runFileLs(ctx context.Context, args []string) error { } } - for _, wf := range wfs { - fmt.Println(wf.Name) + if lsArgs.asJson { + if err := json.NewEncoder(os.Stdout).Encode(wfs); err != nil { + return err + } + } else { + for _, wf := range wfs { + fmt.Println(wf.Name) + } } return nil }