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 }