github.com/mitchellh/packer@v1.3.2/builder/vmware/common/driver_fusion6.go (about)

     1  package common
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"regexp"
    11  	"strings"
    12  )
    13  
    14  const VMWARE_FUSION_VERSION = "6"
    15  
    16  // Fusion6Driver is a driver that can run VMware Fusion 6.
    17  type Fusion6Driver struct {
    18  	Fusion5Driver
    19  }
    20  
    21  func (d *Fusion6Driver) Clone(dst, src string, linked bool) error {
    22  
    23  	var cloneType string
    24  	if linked {
    25  		cloneType = "linked"
    26  	} else {
    27  		cloneType = "full"
    28  	}
    29  
    30  	cmd := exec.Command(d.vmrunPath(),
    31  		"-T", "fusion",
    32  		"clone", src, dst,
    33  		cloneType)
    34  	if _, _, err := runAndLog(cmd); err != nil {
    35  		if strings.Contains(err.Error(), "parameters was invalid") {
    36  			return fmt.Errorf(
    37  				"Clone is not supported with your version of Fusion. Packer "+
    38  					"only works with Fusion %s Professional or above. Please verify your version.", VMWARE_FUSION_VERSION)
    39  		}
    40  
    41  		return err
    42  	}
    43  
    44  	return nil
    45  }
    46  
    47  func (d *Fusion6Driver) Verify() error {
    48  	if err := d.Fusion5Driver.Verify(); err != nil {
    49  		return err
    50  	}
    51  
    52  	vmxpath := filepath.Join(d.AppPath, "Contents", "Library", "vmware-vmx")
    53  	if _, err := os.Stat(vmxpath); err != nil {
    54  		if os.IsNotExist(err) {
    55  			return fmt.Errorf("vmware-vmx could not be found at path: %s",
    56  				vmxpath)
    57  		}
    58  
    59  		return err
    60  	}
    61  
    62  	var stderr bytes.Buffer
    63  	cmd := exec.Command(vmxpath, "-v")
    64  	cmd.Stderr = &stderr
    65  	if err := cmd.Run(); err != nil {
    66  		return err
    67  	}
    68  
    69  	versionRe := regexp.MustCompile(`(?i)VMware [a-z0-9-]+ (\d+)\.`)
    70  	matches := versionRe.FindStringSubmatch(stderr.String())
    71  	if matches == nil {
    72  		return fmt.Errorf(
    73  			"Couldn't find VMware version in output: %s", stderr.String())
    74  	}
    75  	log.Printf("Detected VMware version: %s", matches[1])
    76  
    77  	libpath := filepath.Join("/", "Library", "Preferences", "VMware Fusion")
    78  
    79  	d.VmwareDriver.DhcpLeasesPath = func(device string) string {
    80  		return "/var/db/vmware/vmnet-dhcpd-" + device + ".leases"
    81  	}
    82  	d.VmwareDriver.DhcpConfPath = func(device string) string {
    83  		return filepath.Join(libpath, device, "dhcpd.conf")
    84  	}
    85  
    86  	d.VmwareDriver.VmnetnatConfPath = func(device string) string {
    87  		return filepath.Join(libpath, device, "nat.conf")
    88  	}
    89  	d.VmwareDriver.NetworkMapper = func() (NetworkNameMapper, error) {
    90  		pathNetworking := filepath.Join(libpath, "networking")
    91  		if _, err := os.Stat(pathNetworking); err != nil {
    92  			return nil, fmt.Errorf("Could not find networking conf file: %s", pathNetworking)
    93  		}
    94  		log.Printf("Located networkmapper configuration file using Fusion6: %s", pathNetworking)
    95  
    96  		fd, err := os.Open(pathNetworking)
    97  		if err != nil {
    98  			return nil, err
    99  		}
   100  		defer fd.Close()
   101  
   102  		return ReadNetworkingConfig(fd)
   103  	}
   104  
   105  	return compareVersions(matches[1], VMWARE_FUSION_VERSION, "Fusion Professional")
   106  }
   107  
   108  func (d *Fusion6Driver) GetVmwareDriver() VmwareDriver {
   109  	return d.Fusion5Driver.VmwareDriver
   110  }