pull/3050/merge
mattn 2023-06-19 08:58:18 -04:00 committed by GitHub
commit 6a0d0dc920
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 59 additions and 3 deletions

View File

@ -6,6 +6,7 @@ package cli
import ( import (
"bytes" "bytes"
"context" "context"
"encoding/json"
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
@ -36,11 +37,12 @@ import (
var fileCmd = &ffcli.Command{ var fileCmd = &ffcli.Command{
Name: "file", Name: "file",
ShortUsage: "file <cp|get> ...", ShortUsage: "file <cp|get|ls> ...",
ShortHelp: "Send or receive files", ShortHelp: "Send or receive files",
Subcommands: []*ffcli.Command{ Subcommands: []*ffcli.Command{
fileCpCmd, fileCpCmd,
fileGetCmd, fileGetCmd,
fileLsCmd,
}, },
Exec: func(context.Context, []string) error { Exec: func(context.Context, []string) error {
// TODO(bradfitz): is there a better ffcli way to // TODO(bradfitz): is there a better ffcli way to
@ -65,7 +67,7 @@ var fileCpCmd = &ffcli.Command{
Name: "cp", Name: "cp",
ShortUsage: "file cp <files...> <target>:", ShortUsage: "file cp <files...> <target>:",
ShortHelp: "Copy file(s) to a host", ShortHelp: "Copy file(s) to a host",
Exec: runCp, Exec: runFileCp,
FlagSet: (func() *flag.FlagSet { FlagSet: (func() *flag.FlagSet {
fs := newFlagSet("cp") fs := newFlagSet("cp")
fs.StringVar(&cpArgs.name, "name", "", "alternate filename to use, especially useful when <file> is \"-\" (stdin)") fs.StringVar(&cpArgs.name, "name", "", "alternate filename to use, especially useful when <file> is \"-\" (stdin)")
@ -81,7 +83,7 @@ var cpArgs struct {
targets bool targets bool
} }
func runCp(ctx context.Context, args []string) error { func runFileCp(ctx context.Context, args []string) error {
if cpArgs.targets { if cpArgs.targets {
return runCpTargets(ctx, args) return runCpTargets(ctx, args)
} }
@ -614,3 +616,57 @@ func waitForFile(ctx context.Context) error {
} }
} }
} }
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.asJson, "json", false, "output JSON")
fs.BoolVar(&lsArgs.verbose, "verbose", false, "verbose output")
return fs
})(),
}
var lsArgs struct {
verbose bool
asJson 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
}
}
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
}