From d08ee4adfd4942525b7dfd915636513deab5a8b3 Mon Sep 17 00:00:00 2001 From: Rickard von Essen Date: Wed, 30 Apr 2014 08:03:52 +0200 Subject: [PATCH] Added support for Parallels Desktop for Mac [GH-233] in the vagrant post-processor. Fixes https://github.com/rickard-von-essen/packer-parallels/issues/3 --- post-processor/vagrant/parallels.go | 42 +++---------------- post-processor/vagrant/util.go | 8 ++++ .../post-processors/vagrant.html.markdown | 2 +- 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/post-processor/vagrant/parallels.go b/post-processor/vagrant/parallels.go index 0e501c3ce..f5c291490 100644 --- a/post-processor/vagrant/parallels.go +++ b/post-processor/vagrant/parallels.go @@ -2,18 +2,15 @@ package vagrant import ( "fmt" - "os" "path/filepath" "regexp" - "strings" - "github.com/going/toolkit/xmlpath" "github.com/mitchellh/packer/packer" ) -// These are the extensions of files that are unnecessary for the function +// These are the extensions of files and directories that are unnecessary for the function // of a Parallels virtual machine. -var UnnecessaryFileExtensions = []string{".log", ".backup", ".Backup"} +var UnnecessaryFilesPatterns = []string{"\\.log$", "\\.backup$", "\\.Backup$", "\\.app/"} type ParallelsProvider struct{} @@ -24,18 +21,14 @@ func (p *ParallelsProvider) KeepInputArtifact() bool { func (p *ParallelsProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { // Create the metadata metadata = map[string]interface{}{"provider": "parallels"} - var configPath string // Copy all of the original contents into the temporary directory for _, path := range artifact.Files() { // If the file isn't critical to the function of the // virtual machine, we get rid of it. - // It's done by the builder, but we need one more time - // because unregistering a vm creates config.pvs.backup again. unnecessary := false - ext := filepath.Ext(path) - for _, unnecessaryExt := range UnnecessaryFileExtensions { - if unnecessaryExt == ext { + for _, unnecessaryPat := range UnnecessaryFilesPatterns { + if matched, _ := regexp.MatchString(unnecessaryPat, path); matched { unnecessary = true break } @@ -59,40 +52,15 @@ func (p *ParallelsProvider) Process(ui packer.Ui, artifact packer.Artifact, dir if err = CopyContents(dstPath, path); err != nil { return } - if strings.HasSuffix(dstPath, "/config.pvs") { - configPath = dstPath - } } // Create the Vagrantfile from the template - var baseMacAddress string - baseMacAddress, err = findBaseMacAddress(configPath) - if err != nil { - ui.Message(fmt.Sprintf("Problem determining Vagarant Box MAC address: %s", err)) - } - - vagrantfile = fmt.Sprintf(parallelsVagrantfile, baseMacAddress) + vagrantfile = fmt.Sprintf(parallelsVagrantfile) return } -func findBaseMacAddress(path string) (string, error) { - xpath := "/ParallelsVirtualMachine/Hardware/NetworkAdapter[@id='0']/MAC" - file, err := os.Open(path) - if err != nil { - return "", err - } - xpathComp := xmlpath.MustCompile(xpath) - root, err := xmlpath.Parse(file) - if err != nil { - return "", err - } - value, _ := xpathComp.String(root) - return value, nil -} - var parallelsVagrantfile = ` Vagrant.configure("2") do |config| - config.vm.base_mac = "%s" end ` diff --git a/post-processor/vagrant/util.go b/post-processor/vagrant/util.go index 3cce14a82..db695289a 100644 --- a/post-processor/vagrant/util.go +++ b/post-processor/vagrant/util.go @@ -21,6 +21,14 @@ func CopyContents(dst, src string) error { } defer srcF.Close() + dstDir, _ := filepath.Split(dst) + if dstDir != "" { + err := os.MkdirAll(dstDir, os.ModePerm) + if err != nil { + return err + } + } + dstF, err := os.Create(dst) if err != nil { return err diff --git a/website/source/docs/post-processors/vagrant.html.markdown b/website/source/docs/post-processors/vagrant.html.markdown index 72501d5ed..ed7f7708b 100644 --- a/website/source/docs/post-processors/vagrant.html.markdown +++ b/website/source/docs/post-processors/vagrant.html.markdown @@ -97,7 +97,7 @@ In the example above, the compression level will be set to 1 except for VMware, where it will be set to 0. The available provider names are: `aws`, `digitalocean`, `virtualbox`, -and `vmware`. +`vmware`, and `parallels`. ## Input Artifacts