github.com/vmware/govmomi@v0.51.0/cli/vm/guest/upload.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 "path/filepath" 13 14 "github.com/vmware/govmomi/cli" 15 "github.com/vmware/govmomi/vim25/soap" 16 ) 17 18 type upload struct { 19 *GuestFlag 20 *FileAttrFlag 21 22 overwrite bool 23 } 24 25 func init() { 26 cli.Register("guest.upload", &upload{}) 27 } 28 29 func (cmd *upload) Register(ctx context.Context, f *flag.FlagSet) { 30 cmd.GuestFlag, ctx = newGuestFlag(ctx) 31 cmd.GuestFlag.Register(ctx, f) 32 cmd.FileAttrFlag, ctx = newFileAttrFlag(ctx) 33 cmd.FileAttrFlag.Register(ctx, f) 34 35 f.BoolVar(&cmd.overwrite, "f", false, "If set, the guest destination file is clobbered") 36 } 37 38 func (cmd *upload) Usage() string { 39 return "SOURCE DEST" 40 } 41 42 func (cmd *upload) Description() string { 43 return `Copy SOURCE from the local system to DEST in the guest VM. 44 45 If SOURCE name is "-", read source from stdin. 46 47 Examples: 48 govc guest.upload -l user:pass -vm=my-vm ~/.ssh/id_rsa.pub /home/$USER/.ssh/authorized_keys 49 cowsay "have a great day" | govc guest.upload -l user:pass -vm=my-vm - /etc/motd 50 tar -cf- foo/ | govc guest.run -d - tar -C /tmp -xf- # upload a directory` 51 } 52 53 func (cmd *upload) Process(ctx context.Context) error { 54 if err := cmd.GuestFlag.Process(ctx); err != nil { 55 return err 56 } 57 if err := cmd.FileAttrFlag.Process(ctx); err != nil { 58 return err 59 } 60 return nil 61 } 62 63 func (cmd *upload) Run(ctx context.Context, f *flag.FlagSet) error { 64 if f.NArg() != 2 { 65 return flag.ErrHelp 66 } 67 68 c, err := cmd.Toolbox(ctx) 69 if err != nil { 70 return err 71 } 72 73 src := f.Arg(0) 74 dst := f.Arg(1) 75 76 p := soap.DefaultUpload 77 78 var r io.Reader = os.Stdin 79 80 if src != "-" { 81 f, err := os.Open(filepath.Clean(src)) 82 if err != nil { 83 return err 84 } 85 defer f.Close() 86 87 r = f 88 89 if cmd.OutputFlag.TTY { 90 logger := cmd.ProgressLogger("Uploading... ") 91 p.Progress = logger 92 defer logger.Wait() 93 } 94 } 95 96 return c.Upload(ctx, r, dst, p, cmd.Attr(), cmd.overwrite) 97 }