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  }