github.com/vmware/govmomi@v0.51.0/cli/vm/guest/touch.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 "bytes" 9 "context" 10 "flag" 11 "time" 12 13 "github.com/vmware/govmomi/cli" 14 "github.com/vmware/govmomi/fault" 15 "github.com/vmware/govmomi/vim25/soap" 16 "github.com/vmware/govmomi/vim25/types" 17 ) 18 19 type touch struct { 20 *GuestFlag 21 22 nocreate bool 23 atime bool 24 date string 25 } 26 27 func init() { 28 cli.Register("guest.touch", &touch{}) 29 } 30 31 func (cmd *touch) Register(ctx context.Context, f *flag.FlagSet) { 32 cmd.GuestFlag, ctx = newGuestFlag(ctx) 33 cmd.GuestFlag.Register(ctx, f) 34 35 f.BoolVar(&cmd.atime, "a", false, "Change only the access time") 36 f.BoolVar(&cmd.nocreate, "c", false, "Do not create any files") 37 f.StringVar(&cmd.date, "d", "", "Use DATE instead of current time") 38 } 39 40 func (cmd *touch) Process(ctx context.Context) error { 41 if err := cmd.GuestFlag.Process(ctx); err != nil { 42 return err 43 } 44 return nil 45 } 46 47 func (cmd *touch) Usage() string { 48 return "FILE" 49 } 50 51 func (cmd *touch) Description() string { 52 return `Change FILE times on VM. 53 54 Examples: 55 govc guest.touch -vm $name /var/log/foo.log 56 govc guest.touch -vm $name -d "$(date -d '1 day ago')" /var/log/foo.log` 57 } 58 59 func (cmd *touch) Run(ctx context.Context, f *flag.FlagSet) error { 60 if f.NArg() != 1 { 61 return flag.ErrHelp 62 } 63 64 m, err := cmd.FileManager() 65 if err != nil { 66 return err 67 } 68 69 name := f.Arg(0) 70 71 var attr types.GuestFileAttributes 72 now := time.Now() 73 74 if cmd.date != "" { 75 now, err = time.Parse(time.UnixDate, cmd.date) 76 if err != nil { 77 return err 78 } 79 } 80 81 if cmd.atime { 82 attr.AccessTime = &now 83 } else { 84 attr.ModificationTime = &now 85 } 86 87 err = m.ChangeFileAttributes(ctx, cmd.Auth(), name, &attr) 88 if err != nil && !cmd.nocreate { 89 if fault.Is(err, &types.FileNotFound{}) { 90 // create a new empty file 91 url, cerr := m.InitiateFileTransferToGuest(ctx, cmd.Auth(), name, &attr, 0, false) 92 if cerr != nil { 93 return cerr 94 } 95 96 u, cerr := cmd.ParseURL(url) 97 if cerr != nil { 98 return cerr 99 } 100 101 c, cerr := cmd.Client() 102 if cerr != nil { 103 return cerr 104 } 105 106 err = c.Client.Upload(ctx, new(bytes.Buffer), u, &soap.DefaultUpload) 107 if err == nil && cmd.date != "" { 108 err = m.ChangeFileAttributes(ctx, cmd.Auth(), name, &attr) 109 } 110 } 111 } 112 113 return err 114 }