github.com/mitchellh/packer@v1.3.2/builder/vmware/common/driver_fusion6.go (about) 1 package common 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "regexp" 11 "strings" 12 ) 13 14 const VMWARE_FUSION_VERSION = "6" 15 16 // Fusion6Driver is a driver that can run VMware Fusion 6. 17 type Fusion6Driver struct { 18 Fusion5Driver 19 } 20 21 func (d *Fusion6Driver) Clone(dst, src string, linked bool) error { 22 23 var cloneType string 24 if linked { 25 cloneType = "linked" 26 } else { 27 cloneType = "full" 28 } 29 30 cmd := exec.Command(d.vmrunPath(), 31 "-T", "fusion", 32 "clone", src, dst, 33 cloneType) 34 if _, _, err := runAndLog(cmd); err != nil { 35 if strings.Contains(err.Error(), "parameters was invalid") { 36 return fmt.Errorf( 37 "Clone is not supported with your version of Fusion. Packer "+ 38 "only works with Fusion %s Professional or above. Please verify your version.", VMWARE_FUSION_VERSION) 39 } 40 41 return err 42 } 43 44 return nil 45 } 46 47 func (d *Fusion6Driver) Verify() error { 48 if err := d.Fusion5Driver.Verify(); err != nil { 49 return err 50 } 51 52 vmxpath := filepath.Join(d.AppPath, "Contents", "Library", "vmware-vmx") 53 if _, err := os.Stat(vmxpath); err != nil { 54 if os.IsNotExist(err) { 55 return fmt.Errorf("vmware-vmx could not be found at path: %s", 56 vmxpath) 57 } 58 59 return err 60 } 61 62 var stderr bytes.Buffer 63 cmd := exec.Command(vmxpath, "-v") 64 cmd.Stderr = &stderr 65 if err := cmd.Run(); err != nil { 66 return err 67 } 68 69 versionRe := regexp.MustCompile(`(?i)VMware [a-z0-9-]+ (\d+)\.`) 70 matches := versionRe.FindStringSubmatch(stderr.String()) 71 if matches == nil { 72 return fmt.Errorf( 73 "Couldn't find VMware version in output: %s", stderr.String()) 74 } 75 log.Printf("Detected VMware version: %s", matches[1]) 76 77 libpath := filepath.Join("/", "Library", "Preferences", "VMware Fusion") 78 79 d.VmwareDriver.DhcpLeasesPath = func(device string) string { 80 return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases" 81 } 82 d.VmwareDriver.DhcpConfPath = func(device string) string { 83 return filepath.Join(libpath, device, "dhcpd.conf") 84 } 85 86 d.VmwareDriver.VmnetnatConfPath = func(device string) string { 87 return filepath.Join(libpath, device, "nat.conf") 88 } 89 d.VmwareDriver.NetworkMapper = func() (NetworkNameMapper, error) { 90 pathNetworking := filepath.Join(libpath, "networking") 91 if _, err := os.Stat(pathNetworking); err != nil { 92 return nil, fmt.Errorf("Could not find networking conf file: %s", pathNetworking) 93 } 94 log.Printf("Located networkmapper configuration file using Fusion6: %s", pathNetworking) 95 96 fd, err := os.Open(pathNetworking) 97 if err != nil { 98 return nil, err 99 } 100 defer fd.Close() 101 102 return ReadNetworkingConfig(fd) 103 } 104 105 return compareVersions(matches[1], VMWARE_FUSION_VERSION, "Fusion Professional") 106 } 107 108 func (d *Fusion6Driver) GetVmwareDriver() VmwareDriver { 109 return d.Fusion5Driver.VmwareDriver 110 }