github.phpd.cn/hashicorp/packer@v1.3.2/builder/vmware/common/driver_player5.go (about) 1 package common 2 3 import ( 4 "errors" 5 "fmt" 6 "log" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "strings" 11 12 "github.com/hashicorp/packer/helper/multistep" 13 ) 14 15 // Player5Driver is a driver that can run VMware Player 5 on Linux. 16 type Player5Driver struct { 17 VmwareDriver 18 19 AppPath string 20 VdiskManagerPath string 21 QemuImgPath string 22 VmrunPath string 23 24 // SSHConfig are the SSH settings for the Fusion VM 25 SSHConfig *SSHConfig 26 } 27 28 func (d *Player5Driver) Clone(dst, src string, linked bool) error { 29 return errors.New("Cloning is not supported with VMWare Player version 5. Please use VMWare Player version 6, or greater.") 30 } 31 32 func (d *Player5Driver) CompactDisk(diskPath string) error { 33 if d.QemuImgPath != "" { 34 return d.qemuCompactDisk(diskPath) 35 } 36 37 defragCmd := exec.Command(d.VdiskManagerPath, "-d", diskPath) 38 if _, _, err := runAndLog(defragCmd); err != nil { 39 return err 40 } 41 42 shrinkCmd := exec.Command(d.VdiskManagerPath, "-k", diskPath) 43 if _, _, err := runAndLog(shrinkCmd); err != nil { 44 return err 45 } 46 47 return nil 48 } 49 50 func (d *Player5Driver) qemuCompactDisk(diskPath string) error { 51 cmd := exec.Command(d.QemuImgPath, "convert", "-f", "vmdk", "-O", "vmdk", "-o", "compat6", diskPath, diskPath+".new") 52 if _, _, err := runAndLog(cmd); err != nil { 53 return err 54 } 55 56 if err := os.Remove(diskPath); err != nil { 57 return err 58 } 59 60 if err := os.Rename(diskPath+".new", diskPath); err != nil { 61 return err 62 } 63 64 return nil 65 } 66 67 func (d *Player5Driver) CreateDisk(output string, size string, adapter_type string, type_id string) error { 68 var cmd *exec.Cmd 69 if d.QemuImgPath != "" { 70 cmd = exec.Command(d.QemuImgPath, "create", "-f", "vmdk", "-o", "compat6", output, size) 71 } else { 72 cmd = exec.Command(d.VdiskManagerPath, "-c", "-s", size, "-a", adapter_type, "-t", type_id, output) 73 } 74 if _, _, err := runAndLog(cmd); err != nil { 75 return err 76 } 77 78 return nil 79 } 80 81 func (d *Player5Driver) IsRunning(vmxPath string) (bool, error) { 82 vmxPath, err := filepath.Abs(vmxPath) 83 if err != nil { 84 return false, err 85 } 86 87 cmd := exec.Command(d.VmrunPath, "-T", "player", "list") 88 stdout, _, err := runAndLog(cmd) 89 if err != nil { 90 return false, err 91 } 92 93 for _, line := range strings.Split(stdout, "\n") { 94 if line == vmxPath { 95 return true, nil 96 } 97 } 98 99 return false, nil 100 } 101 102 func (d *Player5Driver) CommHost(state multistep.StateBag) (string, error) { 103 return CommHost(d.SSHConfig)(state) 104 } 105 106 func (d *Player5Driver) Start(vmxPath string, headless bool) error { 107 guiArgument := "gui" 108 if headless { 109 guiArgument = "nogui" 110 } 111 112 cmd := exec.Command(d.VmrunPath, "-T", "player", "start", vmxPath, guiArgument) 113 if _, _, err := runAndLog(cmd); err != nil { 114 return err 115 } 116 117 return nil 118 } 119 120 func (d *Player5Driver) Stop(vmxPath string) error { 121 cmd := exec.Command(d.VmrunPath, "-T", "player", "stop", vmxPath, "hard") 122 if _, _, err := runAndLog(cmd); err != nil { 123 return err 124 } 125 126 return nil 127 } 128 129 func (d *Player5Driver) SuppressMessages(vmxPath string) error { 130 return nil 131 } 132 133 func (d *Player5Driver) Verify() error { 134 var err error 135 if d.AppPath == "" { 136 if d.AppPath, err = playerFindVMware(); err != nil { 137 return err 138 } 139 } 140 141 if d.VmrunPath == "" { 142 if d.VmrunPath, err = playerFindVmrun(); err != nil { 143 return err 144 } 145 } 146 147 if d.VdiskManagerPath == "" { 148 d.VdiskManagerPath, err = playerFindVdiskManager() 149 } 150 151 if d.VdiskManagerPath == "" && d.QemuImgPath == "" { 152 d.QemuImgPath, err = playerFindQemuImg() 153 } 154 155 if err != nil { 156 return fmt.Errorf( 157 "Neither 'vmware-vdiskmanager', nor 'qemu-img' found in path.\n" + 158 "One of these is required to configure disks for VMware Player.") 159 } 160 161 log.Printf("VMware app path: %s", d.AppPath) 162 log.Printf("vmrun path: %s", d.VmrunPath) 163 log.Printf("vdisk-manager path: %s", d.VdiskManagerPath) 164 log.Printf("qemu-img path: %s", d.QemuImgPath) 165 166 if _, err := os.Stat(d.AppPath); err != nil { 167 return fmt.Errorf("VMware application not found: %s", d.AppPath) 168 } 169 170 if _, err := os.Stat(d.VmrunPath); err != nil { 171 return fmt.Errorf("'vmrun' application not found: %s", d.VmrunPath) 172 } 173 174 if d.VdiskManagerPath != "" { 175 _, err = os.Stat(d.VdiskManagerPath) 176 } else { 177 _, err = os.Stat(d.QemuImgPath) 178 } 179 180 if err != nil { 181 return fmt.Errorf( 182 "Neither 'vmware-vdiskmanager', nor 'qemu-img' found in path.\n" + 183 "One of these is required to configure disks for VMware Player.") 184 } 185 186 // Assigning the path callbacks to VmwareDriver 187 d.VmwareDriver.DhcpLeasesPath = func(device string) string { 188 return playerDhcpLeasesPath(device) 189 } 190 191 d.VmwareDriver.DhcpConfPath = func(device string) string { 192 return playerVmDhcpConfPath(device) 193 } 194 195 d.VmwareDriver.VmnetnatConfPath = func(device string) string { 196 return playerVmnetnatConfPath(device) 197 } 198 199 d.VmwareDriver.NetworkMapper = func() (NetworkNameMapper, error) { 200 pathNetmap := playerNetmapConfPath() 201 if _, err := os.Stat(pathNetmap); err != nil { 202 return nil, fmt.Errorf("Could not find netmap conf file: %s", pathNetmap) 203 } 204 log.Printf("Located networkmapper configuration file using Player: %s", pathNetmap) 205 206 return ReadNetmapConfig(pathNetmap) 207 } 208 return nil 209 } 210 211 func (d *Player5Driver) ToolsIsoPath(flavor string) string { 212 return playerToolsIsoPath(flavor) 213 } 214 215 func (d *Player5Driver) ToolsInstall() error { 216 return nil 217 } 218 219 func (d *Player5Driver) GetVmwareDriver() VmwareDriver { 220 return d.VmwareDriver 221 }