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  }