Commit fc2d695b authored by Mikhail Zholobov's avatar Mikhail Zholobov

builder/parallels: Added compatibility with Parallels Desktop 10

parent 10be7e27
package common package common
import ( import (
"fmt"
"log" "log"
"os/exec" "os/exec"
"runtime"
"strings"
) )
// A driver is able to talk to Parallels and perform certain // A driver is able to talk to Parallels and perform certain
...@@ -43,7 +46,9 @@ type Driver interface { ...@@ -43,7 +46,9 @@ type Driver interface {
} }
func NewDriver() (Driver, error) { func NewDriver() (Driver, error) {
var drivers map[string]Driver
var prlctlPath string var prlctlPath string
var supportedVersions []string
if runtime.GOOS != "darwin" { if runtime.GOOS != "darwin" {
return nil, fmt.Errorf( return nil, fmt.Errorf(
...@@ -59,10 +64,27 @@ func NewDriver() (Driver, error) { ...@@ -59,10 +64,27 @@ func NewDriver() (Driver, error) {
} }
log.Printf("prlctl path: %s", prlctlPath) log.Printf("prlctl path: %s", prlctlPath)
driver := &Parallels9Driver{prlctlPath}
if err := driver.Verify(); err != nil { drivers = map[string]Driver{
return nil, err "10": &Parallels10Driver{
Parallels9Driver: Parallels9Driver{
PrlctlPath: prlctlPath,
},
},
"9": &Parallels9Driver{
PrlctlPath: prlctlPath,
},
}
for v, d := range drivers {
version, _ := d.Version()
if strings.HasPrefix(version, v) {
return d, nil
}
supportedVersions = append(supportedVersions, v)
} }
return driver, nil return nil, fmt.Errorf(
"Unable to initialize any driver. Supported Parallels Desktop versions: "+
"%s\n", strings.Join(supportedVersions, ", "))
} }
package common
// Parallels10Driver are inherited from Parallels9Driver.
type Parallels10Driver struct {
Parallels9Driver
}
...@@ -13,7 +13,6 @@ import ( ...@@ -13,7 +13,6 @@ import (
"github.com/going/toolkit/xmlpath" "github.com/going/toolkit/xmlpath"
) )
// Driver supporting Parallels Desktop for Mac v. 9 & 10
type Parallels9Driver struct { type Parallels9Driver struct {
// This is the path to the "prlctl" application. // This is the path to the "prlctl" application.
PrlctlPath string PrlctlPath string
...@@ -72,6 +71,20 @@ func getConfigValueFromXpath(path, xpath string) (string, error) { ...@@ -72,6 +71,20 @@ func getConfigValueFromXpath(path, xpath string) (string, error) {
return value, nil return value, nil
} }
// Finds an application bundle by identifier (for "darwin" platform only)
func getAppPath(bundleId string) (string, error) {
cmd := exec.Command("mdfind", "kMDItemCFBundleIdentifier ==", bundleId)
out, err := cmd.Output()
if err != nil {
return "", err
}
if string(out) == "" {
return "", fmt.Errorf(
"Could not detect Parallels Desktop! Make sure it is properly installed.")
}
return string(out), nil
}
func (d *Parallels9Driver) IsRunning(name string) (bool, error) { func (d *Parallels9Driver) IsRunning(name string) (bool, error) {
var stdout bytes.Buffer var stdout bytes.Buffer
...@@ -136,32 +149,24 @@ func (d *Parallels9Driver) Prlctl(args ...string) error { ...@@ -136,32 +149,24 @@ func (d *Parallels9Driver) Prlctl(args ...string) error {
} }
func (d *Parallels9Driver) Verify() error { func (d *Parallels9Driver) Verify() error {
version, _ := d.Version()
if !(strings.HasPrefix(version, "9.") || strings.HasPrefix(version, "10.")) {
return fmt.Errorf("The packer-parallels builder plugin only supports Parallels Desktop v. 9 & 10. You have: %s!\n", version)
}
return nil return nil
} }
func (d *Parallels9Driver) Version() (string, error) { func (d *Parallels9Driver) Version() (string, error) {
var stdout bytes.Buffer out, err := exec.Command(d.PrlctlPath, "--version").Output()
if err != nil {
cmd := exec.Command(d.PrlctlPath, "--version")
cmd.Stdout = &stdout
if err := cmd.Run(); err != nil {
return "", err return "", err
} }
versionOutput := strings.TrimSpace(stdout.String()) versionRe := regexp.MustCompile(`prlctl version (\d+\.\d+.\d+)`)
re := regexp.MustCompile("prlctl version ([0-9\\.]+)") matches := versionRe.FindStringSubmatch(string(out))
verMatch := re.FindAllStringSubmatch(versionOutput, 1) if matches == nil {
return "", fmt.Errorf(
if len(verMatch) != 1 { "Could not find Parallels Desktop version in output:\n%s", string(out))
return "", fmt.Errorf("prlctl version not found!\n")
} }
version := verMatch[0][1] version := matches[1]
log.Printf("prlctl version: %s\n", version) log.Printf("Parallels Desktop version: %s", version)
return version, nil return version, nil
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment