providers/virtualbox: more robust lookup for VBoxManage on Win

This commit is contained in:
Mitchell Hashimoto 2015-11-20 15:56:14 -08:00
parent c471f37955
commit 3c2fab9d0d
2 changed files with 25 additions and 7 deletions

View File

@ -2,6 +2,7 @@ require "pathname"
require "tempfile"
require "vagrant/util/downloader"
require "vagrant/util/powershell"
require "vagrant/util/subprocess"
module VagrantPlugins
@ -35,7 +36,7 @@ module VagrantPlugins
ui.detail(I18n.t(
"vagrant.hosts.windows.virtualbox_install_install_detail"))
script = File.expand_path("../../scripts/install_virtualbox.ps1", __FILE__)
result = Vagrant::Util::Powershell.execute(script, tf.path)
result = Vagrant::Util::PowerShell.execute(script, tf.path)
if result.exit_code != 0
raise Vagrant::Errors::ProviderInstallFailed,
provider: "virtualbox",

View File

@ -4,6 +4,7 @@ require 'vagrant/util/busy'
require 'vagrant/util/platform'
require 'vagrant/util/retryable'
require 'vagrant/util/subprocess'
require 'vagrant/util/which'
module VagrantPlugins
module ProviderVirtualBox
@ -22,16 +23,16 @@ module VagrantPlugins
# This flag is used to keep track of interrupted state (SIGINT)
@interrupted = false
# Set the path to VBoxManage
@vboxmanage_path = "VBoxManage"
if Vagrant::Util::Platform.windows? || Vagrant::Util::Platform.cygwin?
@logger.debug("Windows. Trying VBOX_INSTALL_PATH for VBoxManage")
@logger.debug("Windows, checking for VBoxManage on PATH first")
@vboxmanage_path = Vagrant::Util::Which.which("VBoxManage")
# On Windows, we use the VBOX_INSTALL_PATH environmental
# variable to find VBoxManage.
if ENV.key?("VBOX_INSTALL_PATH") ||
ENV.key?("VBOX_MSI_INSTALL_PATH")
if !@vboxmanage_path && (ENV.key?("VBOX_INSTALL_PATH") ||
ENV.key?("VBOX_MSI_INSTALL_PATH"))
@logger.debug("Windows. Trying VBOX_INSTALL_PATH for VBoxManage")
# Get the path.
path = ENV["VBOX_INSTALL_PATH"] || ENV["VBOX_MSI_INSTALL_PATH"]
@logger.debug("VBOX_INSTALL_PATH value: #{path}")
@ -51,8 +52,24 @@ module VagrantPlugins
end
end
end
# If we still don't have one, try to find it using common locations
drive = ENV["SYSTEMDRIVE"] || "C:"
[
"#{drive}/Program Files/Oracle/VirtualBox",
"#{drive}/Program Files (x86)/Oracle/VirtualBox",
"#{ENV["PROGRAMFILES"]}/Oracle/VirtualBox"
].each do |maybe|
path = File.join(maybe, "VBoxManage.exe")
if File.file?(path)
@vboxmanage_path = path
break
end
end
end
# Fall back to hoping for the PATH to work out
@vboxmanage_path ||= "VBoxManage"
@logger.info("VBoxManage path: #{@vboxmanage_path}")
end