From 688be43811007d33b9c70dec93b43782a4f71c06 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 23 Jun 2013 21:47:56 -0700 Subject: [PATCH] builder/virtualbox: Copy ISO because VirtualBox can't recognize --- builder/virtualbox/step_download_iso.go | 46 ++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/builder/virtualbox/step_download_iso.go b/builder/virtualbox/step_download_iso.go index 124e30c19..442c25b83 100644 --- a/builder/virtualbox/step_download_iso.go +++ b/builder/virtualbox/step_download_iso.go @@ -7,7 +7,11 @@ import ( "github.com/mitchellh/multistep" "github.com/mitchellh/packer/builder/common" "github.com/mitchellh/packer/packer" + "io" + "io/ioutil" "log" + "os" + "path/filepath" "time" ) @@ -20,9 +24,11 @@ import ( // // Produces: // iso_path string -type stepDownloadISO struct{} +type stepDownloadISO struct { + isoCopyDir string +} -func (s stepDownloadISO) Run(state map[string]interface{}) multistep.StepAction { +func (s *stepDownloadISO) Run(state map[string]interface{}) multistep.StepAction { cache := state["cache"].(packer.Cache) config := state["config"].(*config) ui := state["ui"].(packer.Ui) @@ -81,10 +87,42 @@ DownloadWaitLoop: } } + // VirtualBox is really dumb and can't figure out that the file is an + // ISO unless it has a ".iso" extension. We can't modify the cache + // filenames so we just do a copy. + tempdir, err := ioutil.TempDir("", "packer") + if err != nil { + state["error"] = fmt.Errorf("Error copying ISO: %s", err) + return multistep.ActionHalt + } + s.isoCopyDir = tempdir + + f, err := os.Create(filepath.Join(tempdir, "image.iso")) + if err != nil { + state["error"] = fmt.Errorf("Error copying ISO: %s", err) + return multistep.ActionHalt + } + defer f.Close() + + sourceF, err := os.Open(cachePath) + if err != nil { + state["error"] = fmt.Errorf("Error copying ISO: %s", err) + return multistep.ActionHalt + } + + if _, err := io.Copy(f, sourceF); err != nil { + state["error"] = fmt.Errorf("Error copying ISO: %s", err) + return multistep.ActionHalt + } + log.Printf("Path to ISO on disk: %s", cachePath) - state["iso_path"] = cachePath + state["iso_path"] = f.Name() return multistep.ActionContinue } -func (stepDownloadISO) Cleanup(map[string]interface{}) {} +func (s *stepDownloadISO) Cleanup(map[string]interface{}) { + if s.isoCopyDir != "" { + os.RemoveAll(s.isoCopyDir) + } +}