github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/package_stemcell/ovftool/ovftool_windows.go (about)

     1  package ovftool
     2  
     3  import (
     4  	"fmt"
     5  	"golang.org/x/sys/windows/registry"
     6  	"os/exec"
     7  )
     8  
     9  var keypaths = []string{
    10  	`SOFTWARE\Wow6432Node\VMware, Inc.\VMware Workstation`,
    11  	`SOFTWARE\Wow6432Node\VMware, Inc.\VMware OVF Tool`,
    12  	`SOFTWARE\VMware, Inc.\VMware Workstation`,
    13  	`SOFTWARE\VMware, Inc.\VMware OVF Tool`,
    14  }
    15  
    16  // vmwareInstallPaths, returns the install paths of VMware Workstation and
    17  // OVF Tool, which can be installed separately.
    18  func vmwareInstallPaths(keypaths []string) ([]string, error) {
    19  	const regKey = registry.LOCAL_MACHINE
    20  	const access = registry.QUERY_VALUE
    21  
    22  	var key registry.Key
    23  	var err error
    24  	for _, path := range keypaths {
    25  		key, err = registry.OpenKey(regKey, path, access)
    26  		if err == nil {
    27  			break
    28  		}
    29  	}
    30  	if err != nil {
    31  		return nil, fmt.Errorf("opening VMware Workstation and OVF Tool registry keys: %s", err)
    32  	}
    33  	defer key.Close()
    34  
    35  	var paths []string
    36  	for _, k := range []string{"InstallPath64", "InstallPath"} {
    37  		var s string
    38  		s, _, err = key.GetStringValue(k)
    39  		if err == nil {
    40  			paths = append(paths, s)
    41  		}
    42  	}
    43  
    44  	if len(paths) == 0 {
    45  		return nil, fmt.Errorf("could not find VMware Workstation install path in registry: %s", err)
    46  	}
    47  	return paths, nil
    48  }
    49  
    50  func SearchPaths() ([]string, error) {
    51  	return vmwareInstallPaths(keypaths)
    52  }
    53  
    54  func Ovftool(installPaths []string) (string, error) {
    55  	const name = "ovftool.exe"
    56  	if path, err := exec.LookPath(name); err == nil {
    57  		return path, nil
    58  	}
    59  
    60  	for _, dir := range installPaths {
    61  		if path, err := findExecutable(dir, name); err == nil {
    62  			return path, nil
    63  		}
    64  	}
    65  	return "", &exec.Error{Name: name, Err: exec.ErrNotFound}
    66  }