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