github.com/vmware/govmomi@v0.51.0/cli/vm/guest/download.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package guest 6 7 import ( 8 "context" 9 "flag" 10 "io" 11 "os" 12 13 "github.com/vmware/govmomi/cli" 14 "github.com/vmware/govmomi/vim25/progress" 15 ) 16 17 type download struct { 18 *GuestFlag 19 20 overwrite bool 21 } 22 23 func init() { 24 cli.Register("guest.download", &download{}) 25 } 26 27 func (cmd *download) Register(ctx context.Context, f *flag.FlagSet) { 28 cmd.GuestFlag, ctx = newGuestFlag(ctx) 29 cmd.GuestFlag.Register(ctx, f) 30 31 f.BoolVar(&cmd.overwrite, "f", false, "If set, the local destination file is clobbered") 32 } 33 34 func (cmd *download) Usage() string { 35 return "SOURCE DEST" 36 } 37 38 func (cmd *download) Description() string { 39 return `Copy SOURCE from the guest VM to DEST on the local system. 40 41 If DEST name is "-", source is written to stdout. 42 43 Examples: 44 govc guest.download -l user:pass -vm=my-vm /var/log/my.log ./local.log 45 govc guest.download -l user:pass -vm=my-vm /etc/motd - 46 tar -cf- foo/ | govc guest.run -d - tar -C /tmp -xf- 47 govc guest.run tar -C /tmp -cf- foo/ | tar -C /tmp -xf- # download directory` 48 } 49 50 func (cmd *download) Process(ctx context.Context) error { 51 if err := cmd.GuestFlag.Process(ctx); err != nil { 52 return err 53 } 54 return nil 55 } 56 57 func (cmd *download) Run(ctx context.Context, f *flag.FlagSet) error { 58 if f.NArg() != 2 { 59 return flag.ErrHelp 60 } 61 62 src := f.Arg(0) 63 dst := f.Arg(1) 64 65 _, err := os.Stat(dst) 66 if err == nil && !cmd.overwrite { 67 return os.ErrExist 68 } 69 70 c, err := cmd.Toolbox(ctx) 71 if err != nil { 72 return err 73 } 74 75 s, n, err := c.Download(ctx, src) 76 if err != nil { 77 return err 78 } 79 80 if dst == "-" { 81 _, err = io.Copy(os.Stdout, s) 82 return err 83 } 84 85 var p progress.Sinker 86 87 if cmd.OutputFlag.TTY { 88 logger := cmd.ProgressLogger("Downloading... ") 89 p = logger 90 defer logger.Wait() 91 } 92 93 return c.ProcessManager.Client().WriteFile(ctx, dst, s, n, p, nil) 94 }