github.com/vmware/govmomi@v0.51.0/cli/device/serial/connect.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 serial
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"path"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/cli/flags"
    15  	"github.com/vmware/govmomi/vim25/mo"
    16  )
    17  
    18  type connect struct {
    19  	*flags.VirtualMachineFlag
    20  
    21  	proxy  string
    22  	device string
    23  	client bool
    24  }
    25  
    26  func init() {
    27  	cli.Register("device.serial.connect", &connect{})
    28  }
    29  
    30  func (cmd *connect) Register(ctx context.Context, f *flag.FlagSet) {
    31  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    32  	cmd.VirtualMachineFlag.Register(ctx, f)
    33  
    34  	f.StringVar(&cmd.proxy, "vspc-proxy", "", "vSPC proxy URI")
    35  	f.StringVar(&cmd.device, "device", "", "serial port device name")
    36  	f.BoolVar(&cmd.client, "client", false, "Use client direction")
    37  }
    38  
    39  func (cmd *connect) Usage() string {
    40  	return "URI"
    41  }
    42  
    43  func (cmd *connect) Description() string {
    44  	return `Connect service URI to serial port.
    45  
    46  If "-" is given as URI, connects file backed device with file name of
    47  device name + .log suffix in the VM Config.Files.LogDirectory.
    48  
    49  Defaults to the first serial port if no DEVICE is given.
    50  
    51  Examples:
    52    govc device.ls | grep serialport-
    53    govc device.serial.connect -vm $vm -device serialport-8000 telnet://:33233
    54    govc device.info -vm $vm serialport-*
    55    govc device.serial.connect -vm $vm "[datastore1] $vm/console.log"
    56    govc device.serial.connect -vm $vm -
    57    govc datastore.tail -f $vm/serialport-8000.log`
    58  }
    59  
    60  func (cmd *connect) Process(ctx context.Context) error {
    61  	if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
    62  		return err
    63  	}
    64  	return nil
    65  }
    66  
    67  func (cmd *connect) Run(ctx context.Context, f *flag.FlagSet) error {
    68  	if f.NArg() != 1 {
    69  		return flag.ErrHelp
    70  	}
    71  
    72  	vm, err := cmd.VirtualMachine()
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	if vm == nil {
    78  		return flag.ErrHelp
    79  	}
    80  
    81  	devices, err := vm.Device(ctx)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	d, err := devices.FindSerialPort(cmd.device)
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	uri := f.Arg(0)
    92  
    93  	if uri == "-" {
    94  		var mvm mo.VirtualMachine
    95  		err = vm.Properties(ctx, vm.Reference(), []string{"config.files.logDirectory"}, &mvm)
    96  		if err != nil {
    97  			return err
    98  		}
    99  
   100  		uri = path.Join(mvm.Config.Files.LogDirectory, fmt.Sprintf("%s.log", devices.Name(d)))
   101  	}
   102  
   103  	return vm.EditDevice(ctx, devices.ConnectSerialPort(d, uri, cmd.client, cmd.proxy))
   104  }