github.com/rothwerx/packer@v0.9.0/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) CommHost(state multistep.StateBag) (string, error) { 73 return CommHost(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 // Check if the VM is running. If its not, it was already stopped 94 running, rerr := d.IsRunning(vmxPath) 95 if rerr == nil && !running { 96 return nil 97 } 98 99 return err 100 } 101 102 return nil 103 } 104 105 func (d *Fusion5Driver) SuppressMessages(vmxPath string) error { 106 dir := filepath.Dir(vmxPath) 107 base := filepath.Base(vmxPath) 108 base = strings.Replace(base, ".vmx", "", -1) 109 110 plistPath := filepath.Join(dir, base+".plist") 111 return ioutil.WriteFile(plistPath, []byte(fusionSuppressPlist), 0644) 112 } 113 114 func (d *Fusion5Driver) Verify() error { 115 if _, err := os.Stat(d.AppPath); err != nil { 116 if os.IsNotExist(err) { 117 return fmt.Errorf("Fusion application not found at path: %s", d.AppPath) 118 } 119 120 return err 121 } 122 123 if _, err := os.Stat(d.vmrunPath()); err != nil { 124 if os.IsNotExist(err) { 125 return fmt.Errorf( 126 "Critical application 'vmrun' not found at path: %s", d.vmrunPath()) 127 } 128 129 return err 130 } 131 132 if _, err := os.Stat(d.vdiskManagerPath()); err != nil { 133 if os.IsNotExist(err) { 134 return fmt.Errorf( 135 "Critical application vdisk manager not found at path: %s", 136 d.vdiskManagerPath()) 137 } 138 139 return err 140 } 141 142 return nil 143 } 144 145 func (d *Fusion5Driver) vdiskManagerPath() string { 146 return filepath.Join(d.AppPath, "Contents", "Library", "vmware-vdiskmanager") 147 } 148 149 func (d *Fusion5Driver) vmrunPath() string { 150 return filepath.Join(d.AppPath, "Contents", "Library", "vmrun") 151 } 152 153 func (d *Fusion5Driver) ToolsIsoPath(k string) string { 154 return filepath.Join(d.AppPath, "Contents", "Library", "isoimages", k+".iso") 155 } 156 157 func (d *Fusion5Driver) ToolsInstall() error { 158 return nil 159 } 160 161 func (d *Fusion5Driver) DhcpLeasesPath(device string) string { 162 return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases" 163 } 164 165 const fusionSuppressPlist = `<?xml version="1.0" encoding="UTF-8"?> 166 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 167 <plist version="1.0"> 168 <dict> 169 <key>disallowUpgrade</key> 170 <true/> 171 </dict> 172 </plist>`