github.com/vmware/govmomi@v0.51.0/cli/vm/guest/start.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  	"strings"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/vim25/types"
    15  )
    16  
    17  type start struct {
    18  	*GuestFlag
    19  
    20  	dir  string
    21  	vars env
    22  }
    23  
    24  type env []string
    25  
    26  func (e *env) String() string {
    27  	return fmt.Sprint(*e)
    28  }
    29  
    30  func (e *env) Set(value string) error {
    31  	*e = append(*e, value)
    32  	return nil
    33  }
    34  
    35  func init() {
    36  	cli.Register("guest.start", &start{})
    37  }
    38  
    39  func (cmd *start) Register(ctx context.Context, f *flag.FlagSet) {
    40  	cmd.GuestFlag, ctx = newGuestProcessFlag(ctx)
    41  	cmd.GuestFlag.Register(ctx, f)
    42  
    43  	f.StringVar(&cmd.dir, "C", "", "The absolute path of the working directory for the program to start")
    44  	f.Var(&cmd.vars, "e", "Set environment variable (key=val)")
    45  }
    46  
    47  func (cmd *start) Process(ctx context.Context) error {
    48  	if err := cmd.GuestFlag.Process(ctx); err != nil {
    49  		return err
    50  	}
    51  	return nil
    52  }
    53  
    54  func (cmd *start) Usage() string {
    55  	return "PATH [ARG]..."
    56  }
    57  
    58  func (cmd *start) Description() string {
    59  	return `Start program in VM.
    60  
    61  The process can have its status queried with govc guest.ps.
    62  When the process completes, its exit code and end time will be available for 5 minutes after completion.
    63  
    64  Examples:
    65    govc guest.start -vm $name /bin/mount /dev/hdb1 /data
    66    pid=$(govc guest.start -vm $name /bin/long-running-thing)
    67    govc guest.ps -vm $name -p $pid -X`
    68  }
    69  
    70  func (cmd *start) Run(ctx context.Context, f *flag.FlagSet) error {
    71  	m, err := cmd.ProcessManager()
    72  	if err != nil {
    73  		return err
    74  	}
    75  
    76  	spec := types.GuestProgramSpec{
    77  		ProgramPath:      f.Arg(0),
    78  		Arguments:        strings.Join(f.Args()[1:], " "),
    79  		WorkingDirectory: cmd.dir,
    80  		EnvVariables:     cmd.vars,
    81  	}
    82  
    83  	pid, err := m.StartProgram(ctx, cmd.Auth(), &spec)
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	fmt.Printf("%d\n", pid)
    89  
    90  	return nil
    91  }