github.com/vmware/govmomi@v0.51.0/cli/vm/guest/ls.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 "fmt" 11 "os" 12 "text/tabwriter" 13 14 "github.com/vmware/govmomi/cli" 15 "github.com/vmware/govmomi/units" 16 "github.com/vmware/govmomi/vim25/types" 17 ) 18 19 type ls struct { 20 *GuestFlag 21 22 simple bool 23 } 24 25 func init() { 26 cli.Register("guest.ls", &ls{}) 27 } 28 29 func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) { 30 cmd.GuestFlag, ctx = newGuestFlag(ctx) 31 cmd.GuestFlag.Register(ctx, f) 32 33 f.BoolVar(&cmd.simple, "s", false, "Simple path only listing") // sadly we used '-l' for guest login 34 } 35 36 func (cmd *ls) Process(ctx context.Context) error { 37 if err := cmd.GuestFlag.Process(ctx); err != nil { 38 return err 39 } 40 return nil 41 } 42 43 func (cmd *ls) Usage() string { 44 return "PATH" 45 } 46 47 func (cmd *ls) Description() string { 48 return `List PATH files in VM. 49 50 Examples: 51 govc guest.ls -vm $name /tmp` 52 } 53 54 func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error { 55 m, err := cmd.FileManager() 56 if err != nil { 57 return err 58 } 59 60 var offset int32 61 tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0) 62 63 for { 64 info, err := m.ListFiles(ctx, cmd.Auth(), f.Arg(0), offset, 0, f.Arg(1)) 65 if err != nil { 66 return err 67 } 68 69 for _, f := range info.Files { 70 if cmd.simple { 71 fmt.Fprintln(tw, f.Path) 72 continue 73 } 74 75 var kind byte 76 77 switch types.GuestFileType(f.Type) { 78 case types.GuestFileTypeDirectory: 79 kind = 'd' 80 if f.Size == 0 { 81 f.Size = 4092 82 } 83 case types.GuestFileTypeSymlink: 84 kind = 'l' 85 case types.GuestFileTypeFile: 86 kind = '-' 87 } 88 89 switch x := f.Attributes.(type) { 90 case *types.GuestPosixFileAttributes: 91 perm := os.FileMode(x.Permissions).Perm().String()[1:] 92 fmt.Fprintf(tw, "%c%s\t%d\t%d\t", kind, perm, *x.OwnerId, *x.GroupId) 93 } 94 95 attr := f.Attributes.GetGuestFileAttributes() 96 97 fmt.Fprintf(tw, "%s\t%s\t%s", units.FileSize(f.Size), attr.ModificationTime.Format("Jan 2 15:04 2006"), f.Path) 98 if attr.SymlinkTarget != "" { 99 fmt.Fprintf(tw, " -> %s", attr.SymlinkTarget) 100 } 101 fmt.Fprintln(tw) 102 } 103 104 err = tw.Flush() 105 if err != nil { 106 return err 107 } 108 109 if info.Remaining == 0 { 110 break 111 } 112 offset += int32(len(info.Files)) 113 } 114 115 return nil 116 }