github.com/rothwerx/packer@v0.9.0/builder/vmware/common/step_upload_tools.go (about) 1 package common 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/mitchellh/multistep" 8 "github.com/mitchellh/packer/packer" 9 "github.com/mitchellh/packer/template/interpolate" 10 ) 11 12 type toolsUploadPathTemplate struct { 13 Flavor string 14 } 15 16 type StepUploadTools struct { 17 RemoteType string 18 ToolsUploadFlavor string 19 ToolsUploadPath string 20 Ctx interpolate.Context 21 } 22 23 func (c *StepUploadTools) Run(state multistep.StateBag) multistep.StepAction { 24 driver := state.Get("driver").(Driver) 25 26 if c.ToolsUploadFlavor == "" { 27 return multistep.ActionContinue 28 } 29 30 if c.RemoteType == "esx5" { 31 if err := driver.ToolsInstall(); err != nil { 32 state.Put("error", fmt.Errorf("Couldn't mount VMware tools ISO. Please check the 'guest_os_type' in your template.json.")) 33 } 34 return multistep.ActionContinue 35 } 36 37 comm := state.Get("communicator").(packer.Communicator) 38 tools_source := state.Get("tools_upload_source").(string) 39 ui := state.Get("ui").(packer.Ui) 40 41 ui.Say(fmt.Sprintf("Uploading the '%s' VMware Tools", c.ToolsUploadFlavor)) 42 f, err := os.Open(tools_source) 43 if err != nil { 44 state.Put("error", fmt.Errorf("Error opening VMware Tools ISO: %s", err)) 45 return multistep.ActionHalt 46 } 47 defer f.Close() 48 49 c.Ctx.Data = &toolsUploadPathTemplate{ 50 Flavor: c.ToolsUploadFlavor, 51 } 52 c.ToolsUploadPath, err = interpolate.Render(c.ToolsUploadPath, &c.Ctx) 53 if err != nil { 54 err := fmt.Errorf("Error preparing upload path: %s", err) 55 state.Put("error", err) 56 ui.Error(err.Error()) 57 return multistep.ActionHalt 58 } 59 60 if err := comm.Upload(c.ToolsUploadPath, f, nil); err != nil { 61 err := fmt.Errorf("Error uploading VMware Tools: %s", err) 62 state.Put("error", err) 63 ui.Error(err.Error()) 64 return multistep.ActionHalt 65 } 66 67 return multistep.ActionContinue 68 } 69 70 func (c *StepUploadTools) Cleanup(multistep.StateBag) {}