github.phpd.cn/hashicorp/packer@v1.3.2/builder/virtualbox/common/step_vboxmanage.go (about) 1 package common 2 3 import ( 4 "context" 5 "fmt" 6 "strings" 7 8 "github.com/hashicorp/packer/helper/multistep" 9 "github.com/hashicorp/packer/packer" 10 "github.com/hashicorp/packer/template/interpolate" 11 ) 12 13 type commandTemplate struct { 14 Name string 15 } 16 17 // This step executes additional VBoxManage commands as specified by the 18 // template. 19 // 20 // Uses: 21 // driver Driver 22 // ui packer.Ui 23 // vmName string 24 // 25 // Produces: 26 type StepVBoxManage struct { 27 Commands [][]string 28 Ctx interpolate.Context 29 } 30 31 func (s *StepVBoxManage) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 32 driver := state.Get("driver").(Driver) 33 ui := state.Get("ui").(packer.Ui) 34 vmName := state.Get("vmName").(string) 35 36 if len(s.Commands) > 0 { 37 ui.Say("Executing custom VBoxManage commands...") 38 } 39 40 s.Ctx.Data = &commandTemplate{ 41 Name: vmName, 42 } 43 44 for _, originalCommand := range s.Commands { 45 command := make([]string, len(originalCommand)) 46 copy(command, originalCommand) 47 48 for i, arg := range command { 49 var err error 50 command[i], err = interpolate.Render(arg, &s.Ctx) 51 if err != nil { 52 err := fmt.Errorf("Error preparing vboxmanage command: %s", err) 53 state.Put("error", err) 54 ui.Error(err.Error()) 55 return multistep.ActionHalt 56 } 57 } 58 59 ui.Message(fmt.Sprintf("Executing: %s", strings.Join(command, " "))) 60 if err := driver.VBoxManage(command...); err != nil { 61 err := fmt.Errorf("Error executing command: %s", err) 62 state.Put("error", err) 63 ui.Error(err.Error()) 64 return multistep.ActionHalt 65 } 66 } 67 68 return multistep.ActionContinue 69 } 70 71 func (s *StepVBoxManage) Cleanup(state multistep.StateBag) {}