github.com/mitchellh/packer@v1.3.2/builder/vmware/common/driver_fusion5.go (about) 1 package common 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "os" 9 "os/exec" 10 "path/filepath" 11 "strings" 12 13 "github.com/hashicorp/packer/helper/multistep" 14 ) 15 16 // Fusion5Driver is a driver that can run VMware Fusion 5. 17 type Fusion5Driver struct { 18 VmwareDriver 19 20 // This is the path to the "VMware Fusion.app" 21 AppPath string 22 23 // SSHConfig are the SSH settings for the Fusion VM 24 SSHConfig *SSHConfig 25 } 26 27 func (d *Fusion5Driver) Clone(dst, src string, linked bool) error { 28 return errors.New("Cloning is not supported with Fusion 5. Please use Fusion 6+.") 29 } 30 31 func (d *Fusion5Driver) CompactDisk(diskPath string) error { 32 defragCmd := exec.Command(d.vdiskManagerPath(), "-d", diskPath) 33 if _, _, err := runAndLog(defragCmd); err != nil { 34 return err 35 } 36 37 shrinkCmd := exec.Command(d.vdiskManagerPath(), "-k", diskPath) 38 if _, _, err := runAndLog(shrinkCmd); err != nil { 39 return err 40 } 41 42 return nil 43 } 44 45 func (d *Fusion5Driver) CreateDisk(output string, size string, adapter_type string, type_id string) error { 46 cmd := exec.Command(d.vdiskManagerPath(), "-c", "-s", size, "-a", adapter_type, "-t", type_id, output) 47 if _, _, err := runAndLog(cmd); err != nil { 48 return err 49 } 50 51 return nil 52 } 53 54 func (d *Fusion5Driver) IsRunning(vmxPath string) (bool, error) { 55 vmxPath, err := filepath.Abs(vmxPath) 56 if err != nil { 57 return false, err 58 } 59 60 cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "list") 61 stdout, _, err := runAndLog(cmd) 62 if err != nil { 63 return false, err 64 } 65 66 for _, line := range strings.Split(stdout, "\n") { 67 if line == vmxPath { 68 return true, nil 69 } 70 } 71 72 return false, nil 73 } 74 75 func (d *Fusion5Driver) CommHost(state multistep.StateBag) (string, error) { 76 return CommHost(d.SSHConfig)(state) 77 } 78 79 func (d *Fusion5Driver) Start(vmxPath string, headless bool) error { 80 guiArgument := "gui" 81 if headless == true { 82 guiArgument = "nogui" 83 } 84 85 cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "start", vmxPath, guiArgument) 86 if _, _, err := runAndLog(cmd); err != nil { 87 return err 88 } 89 90 return nil 91 } 92 93 func (d *Fusion5Driver) Stop(vmxPath string) error { 94 cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "stop", vmxPath, "hard") 95 if _, _, err := runAndLog(cmd); err != nil { 96 // Check if the VM is running. If its not, it was already stopped 97 running, rerr := d.IsRunning(vmxPath) 98 if rerr == nil && !running { 99 return nil 100 } 101 102 return err 103 } 104 105 return nil 106 } 107 108 func (d *Fusion5Driver) SuppressMessages(vmxPath string) error { 109 dir := filepath.Dir(vmxPath) 110 base := filepath.Base(vmxPath) 111 base = strings.Replace(base, ".vmx", "", -1) 112 113 plistPath := filepath.Join(dir, base+".plist") 114 return ioutil.WriteFile(plistPath, []byte(fusionSuppressPlist), 0644) 115 } 116 117 func (d *Fusion5Driver) Verify() error { 118 if _, err := os.Stat(d.AppPath); err != nil { 119 if os.IsNotExist(err) { 120 return fmt.Errorf("Fusion application not found at path: %s", d.AppPath) 121 } 122 123 return err 124 } 125 126 if _, err := os.Stat(d.vmrunPath()); err != nil { 127 if os.IsNotExist(err) { 128 return fmt.Errorf( 129 "Critical application 'vmrun' not found at path: %s", d.vmrunPath()) 130 } 131 132 return err 133 } 134 135 if _, err := os.Stat(d.vdiskManagerPath()); err != nil { 136 if os.IsNotExist(err) { 137 return fmt.Errorf( 138 "Critical application vdisk manager not found at path: %s", 139 d.vdiskManagerPath()) 140 } 141 142 return err 143 } 144 145 libpath := filepath.Join("/", "Library", "Preferences", "VMware Fusion") 146 147 d.VmwareDriver.DhcpLeasesPath = func(device string) string { 148 return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases" 149 } 150 d.VmwareDriver.DhcpConfPath = func(device string) string { 151 return filepath.Join(libpath, device, "dhcpd.conf") 152 } 153 d.VmwareDriver.VmnetnatConfPath = func(device string) string { 154 return filepath.Join(libpath, device, "nat.conf") 155 } 156 d.VmwareDriver.NetworkMapper = func() (NetworkNameMapper, error) { 157 pathNetworking := filepath.Join(libpath, "networking") 158 if _, err := os.Stat(pathNetworking); err != nil { 159 return nil, fmt.Errorf("Could not find networking conf file: %s", pathNetworking) 160 } 161 log.Printf("Located networkmapper configuration file using Fusion5: %s", pathNetworking) 162 163 fd, err := os.Open(pathNetworking) 164 if err != nil { 165 return nil, err 166 } 167 defer fd.Close() 168 169 return ReadNetworkingConfig(fd) 170 } 171 172 return nil 173 } 174 175 func (d *Fusion5Driver) vdiskManagerPath() string { 176 return filepath.Join(d.AppPath, "Contents", "Library", "vmware-vdiskmanager") 177 } 178 179 func (d *Fusion5Driver) vmrunPath() string { 180 return filepath.Join(d.AppPath, "Contents", "Library", "vmrun") 181 } 182 183 func (d *Fusion5Driver) ToolsIsoPath(k string) string { 184 return filepath.Join(d.AppPath, "Contents", "Library", "isoimages", k+".iso") 185 } 186 187 func (d *Fusion5Driver) ToolsInstall() error { 188 return nil 189 } 190 191 const fusionSuppressPlist = `<?xml version="1.0" encoding="UTF-8"?> 192 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 193 <plist version="1.0"> 194 <dict> 195 <key>disallowUpgrade</key> 196 <true/> 197 </dict> 198 </plist>` 199 200 func (d *Fusion5Driver) GetVmwareDriver() VmwareDriver { 201 return d.VmwareDriver 202 }