github.com/jbronn/packer@v0.1.6-0.20140120165540-8a1364dbd817/builder/vmware/common/driver_fusion5.go (about) 1 package common 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "strings" 11 12 "github.com/mitchellh/multistep" 13 ) 14 15 // Fusion5Driver is a driver that can run VMWare Fusion 5. 16 type Fusion5Driver struct { 17 // This is the path to the "VMware Fusion.app" 18 AppPath string 19 20 // SSHConfig are the SSH settings for the Fusion VM 21 SSHConfig *SSHConfig 22 } 23 24 func (d *Fusion5Driver) Clone(dst, src string) error { 25 return errors.New("Cloning is not supported with Fusion 5. Please use Fusion 6+.") 26 } 27 28 func (d *Fusion5Driver) CompactDisk(diskPath string) error { 29 defragCmd := exec.Command(d.vdiskManagerPath(), "-d", diskPath) 30 if _, _, err := runAndLog(defragCmd); err != nil { 31 return err 32 } 33 34 shrinkCmd := exec.Command(d.vdiskManagerPath(), "-k", diskPath) 35 if _, _, err := runAndLog(shrinkCmd); err != nil { 36 return err 37 } 38 39 return nil 40 } 41 42 func (d *Fusion5Driver) CreateDisk(output string, size string, type_id string) error { 43 cmd := exec.Command(d.vdiskManagerPath(), "-c", "-s", size, "-a", "lsilogic", "-t", type_id, output) 44 if _, _, err := runAndLog(cmd); err != nil { 45 return err 46 } 47 48 return nil 49 } 50 51 func (d *Fusion5Driver) IsRunning(vmxPath string) (bool, error) { 52 vmxPath, err := filepath.Abs(vmxPath) 53 if err != nil { 54 return false, err 55 } 56 57 cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "list") 58 stdout, _, err := runAndLog(cmd) 59 if err != nil { 60 return false, err 61 } 62 63 for _, line := range strings.Split(stdout, "\n") { 64 if line == vmxPath { 65 return true, nil 66 } 67 } 68 69 return false, nil 70 } 71 72 func (d *Fusion5Driver) SSHAddress(state multistep.StateBag) (string, error) { 73 return SSHAddressFunc(d.SSHConfig)(state) 74 } 75 76 func (d *Fusion5Driver) Start(vmxPath string, headless bool) error { 77 guiArgument := "gui" 78 if headless == true { 79 guiArgument = "nogui" 80 } 81 82 cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "start", vmxPath, guiArgument) 83 if _, _, err := runAndLog(cmd); err != nil { 84 return err 85 } 86 87 return nil 88 } 89 90 func (d *Fusion5Driver) Stop(vmxPath string) error { 91 cmd := exec.Command(d.vmrunPath(), "-T", "fusion", "stop", vmxPath, "hard") 92 if _, _, err := runAndLog(cmd); err != nil { 93 return err 94 } 95 96 return nil 97 } 98 99 func (d *Fusion5Driver) SuppressMessages(vmxPath string) error { 100 dir := filepath.Dir(vmxPath) 101 base := filepath.Base(vmxPath) 102 base = strings.Replace(base, ".vmx", "", -1) 103 104 plistPath := filepath.Join(dir, base+".plist") 105 return ioutil.WriteFile(plistPath, []byte(fusionSuppressPlist), 0644) 106 } 107 108 func (d *Fusion5Driver) Verify() error { 109 if _, err := os.Stat(d.AppPath); err != nil { 110 if os.IsNotExist(err) { 111 return fmt.Errorf("Fusion application not found at path: %s", d.AppPath) 112 } 113 114 return err 115 } 116 117 if _, err := os.Stat(d.vmrunPath()); err != nil { 118 if os.IsNotExist(err) { 119 return fmt.Errorf( 120 "Critical application 'vmrun' not found at path: %s", d.vmrunPath()) 121 } 122 123 return err 124 } 125 126 if _, err := os.Stat(d.vdiskManagerPath()); err != nil { 127 if os.IsNotExist(err) { 128 return fmt.Errorf( 129 "Critical application vdisk manager not found at path: %s", 130 d.vdiskManagerPath()) 131 } 132 133 return err 134 } 135 136 return nil 137 } 138 139 func (d *Fusion5Driver) vdiskManagerPath() string { 140 return filepath.Join(d.AppPath, "Contents", "Library", "vmware-vdiskmanager") 141 } 142 143 func (d *Fusion5Driver) vmrunPath() string { 144 return filepath.Join(d.AppPath, "Contents", "Library", "vmrun") 145 } 146 147 func (d *Fusion5Driver) ToolsIsoPath(k string) string { 148 return filepath.Join(d.AppPath, "Contents", "Library", "isoimages", k+".iso") 149 } 150 151 func (d *Fusion5Driver) DhcpLeasesPath(device string) string { 152 return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases" 153 } 154 155 const fusionSuppressPlist = `<?xml version="1.0" encoding="UTF-8"?> 156 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 157 <plist version="1.0"> 158 <dict> 159 <key>disallowUpgrade</key> 160 <true/> 161 </dict> 162 </plist>`