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  }