vagrant 0.8.10 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +77 -1
- data/Gemfile +0 -14
- data/LICENSE +1 -1
- data/bin/vagrant +47 -20
- data/config/default.rb +6 -14
- data/lib/vagrant.rb +132 -5
- data/lib/vagrant/action.rb +45 -123
- data/lib/vagrant/action/box/destroy.rb +7 -3
- data/lib/vagrant/action/box/download.rb +8 -8
- data/lib/vagrant/action/box/package.rb +2 -2
- data/lib/vagrant/action/box/unpackage.rb +13 -7
- data/lib/vagrant/action/box/verify.rb +5 -5
- data/lib/vagrant/action/builder.rb +23 -19
- data/lib/vagrant/action/builtin.rb +117 -79
- data/lib/vagrant/action/env/set.rb +7 -4
- data/lib/vagrant/action/environment.rb +3 -41
- data/lib/vagrant/action/general/package.rb +14 -29
- data/lib/vagrant/action/general/validate.rb +2 -2
- data/lib/vagrant/action/runner.rb +53 -0
- data/lib/vagrant/action/vm/boot.rb +9 -9
- data/lib/vagrant/action/vm/check_accessible.rb +2 -2
- data/lib/vagrant/action/vm/check_box.rb +10 -12
- data/lib/vagrant/action/vm/check_guest_additions.rb +8 -8
- data/lib/vagrant/action/vm/check_port_collisions.rb +85 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +4 -4
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +3 -11
- data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +2 -11
- data/lib/vagrant/action/vm/customize.rb +19 -9
- data/lib/vagrant/action/vm/destroy.rb +4 -4
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +2 -12
- data/lib/vagrant/action/vm/discard_state.rb +4 -4
- data/lib/vagrant/action/vm/export.rb +13 -8
- data/lib/vagrant/action/vm/forward_ports.rb +55 -102
- data/lib/vagrant/action/vm/halt.rb +9 -6
- data/lib/vagrant/action/vm/host_name.rb +4 -4
- data/lib/vagrant/action/vm/import.rb +19 -10
- data/lib/vagrant/action/vm/match_mac_address.rb +4 -9
- data/lib/vagrant/action/vm/network.rb +300 -94
- data/lib/vagrant/action/vm/nfs.rb +41 -26
- data/lib/vagrant/action/vm/package.rb +1 -1
- data/lib/vagrant/action/vm/package_vagrantfile.rb +5 -2
- data/lib/vagrant/action/vm/provision.rb +42 -13
- data/lib/vagrant/action/vm/provisioner_cleanup.rb +2 -2
- data/lib/vagrant/action/vm/{clear_nfs_exports.rb → prune_nfs_exports.rb} +7 -7
- data/lib/vagrant/action/vm/resume.rb +4 -4
- data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
- data/lib/vagrant/action/vm/share_folders.rb +63 -39
- data/lib/vagrant/action/vm/suspend.rb +4 -4
- data/lib/vagrant/action/warden.rb +13 -6
- data/lib/vagrant/box.rb +9 -55
- data/lib/vagrant/box_collection.rb +22 -17
- data/lib/vagrant/cli.rb +62 -47
- data/lib/vagrant/command.rb +18 -20
- data/lib/vagrant/command/base.rb +135 -90
- data/lib/vagrant/command/box.rb +46 -21
- data/lib/vagrant/command/box_add.rb +33 -0
- data/lib/vagrant/command/box_list.rb +25 -0
- data/lib/vagrant/command/box_remove.rb +23 -0
- data/lib/vagrant/command/box_repackage.rb +23 -0
- data/lib/vagrant/command/destroy.rb +16 -5
- data/lib/vagrant/command/halt.rb +25 -7
- data/lib/vagrant/command/init.rb +30 -7
- data/lib/vagrant/command/package.rb +49 -18
- data/lib/vagrant/command/provision.rb +22 -9
- data/lib/vagrant/command/reload.rb +18 -5
- data/lib/vagrant/command/resume.rb +18 -5
- data/lib/vagrant/command/ssh.rb +69 -31
- data/lib/vagrant/command/ssh_config.rb +37 -22
- data/lib/vagrant/command/status.rb +22 -20
- data/lib/vagrant/command/suspend.rb +18 -5
- data/lib/vagrant/command/up.rb +41 -8
- data/lib/vagrant/communication.rb +7 -0
- data/lib/vagrant/communication/base.rb +56 -0
- data/lib/vagrant/communication/ssh.rb +200 -0
- data/lib/vagrant/config.rb +29 -103
- data/lib/vagrant/config/base.rb +18 -26
- data/lib/vagrant/config/container.rb +37 -0
- data/lib/vagrant/config/error_recorder.rb +1 -1
- data/lib/vagrant/config/loader.rb +125 -0
- data/lib/vagrant/config/nfs.rb +1 -3
- data/lib/vagrant/config/package.rb +1 -3
- data/lib/vagrant/config/ssh.rb +31 -16
- data/lib/vagrant/config/top.rb +36 -25
- data/lib/vagrant/config/vagrant.rb +2 -5
- data/lib/vagrant/config/vm.rb +115 -56
- data/lib/vagrant/config/vm/provisioner.rb +16 -20
- data/lib/vagrant/config/vm/sub_vm.rb +1 -1
- data/lib/vagrant/data_store.rb +23 -15
- data/lib/vagrant/downloaders/base.rb +7 -5
- data/lib/vagrant/downloaders/file.rb +4 -4
- data/lib/vagrant/downloaders/http.rb +4 -5
- data/lib/vagrant/driver.rb +7 -0
- data/lib/vagrant/driver/virtualbox.rb +121 -0
- data/lib/vagrant/driver/virtualbox_4_0.rb +411 -0
- data/lib/vagrant/driver/virtualbox_4_1.rb +411 -0
- data/lib/vagrant/driver/virtualbox_base.rb +284 -0
- data/lib/vagrant/environment.rb +221 -240
- data/lib/vagrant/errors.rb +74 -25
- data/lib/vagrant/guest.rb +16 -0
- data/lib/vagrant/guest/arch.rb +48 -0
- data/lib/vagrant/{systems → guest}/base.rb +30 -18
- data/lib/vagrant/guest/debian.rb +61 -0
- data/lib/vagrant/{systems → guest}/freebsd.rb +11 -18
- data/lib/vagrant/guest/gentoo.rb +32 -0
- data/lib/vagrant/guest/linux.rb +78 -0
- data/lib/vagrant/{systems → guest}/linux/config.rb +2 -4
- data/lib/vagrant/guest/linux/error.rb +9 -0
- data/lib/vagrant/guest/redhat.rb +66 -0
- data/lib/vagrant/guest/solaris.rb +114 -0
- data/lib/vagrant/{systems → guest}/suse.rb +2 -2
- data/lib/vagrant/guest/ubuntu.rb +23 -0
- data/lib/vagrant/hosts.rb +23 -6
- data/lib/vagrant/hosts/arch.rb +7 -3
- data/lib/vagrant/hosts/base.rb +36 -46
- data/lib/vagrant/hosts/bsd.rb +53 -16
- data/lib/vagrant/hosts/fedora.rb +14 -0
- data/lib/vagrant/hosts/freebsd.rb +6 -36
- data/lib/vagrant/hosts/linux.rb +45 -20
- data/lib/vagrant/hosts/windows.rb +16 -0
- data/lib/vagrant/provisioners.rb +10 -7
- data/lib/vagrant/provisioners/base.rb +11 -34
- data/lib/vagrant/provisioners/chef.rb +30 -26
- data/lib/vagrant/provisioners/chef_client.rb +37 -23
- data/lib/vagrant/provisioners/chef_solo.rb +61 -16
- data/lib/vagrant/provisioners/puppet.rb +70 -38
- data/lib/vagrant/provisioners/puppet_server.rb +12 -13
- data/lib/vagrant/provisioners/shell.rb +24 -24
- data/lib/vagrant/registry.rb +49 -0
- data/lib/vagrant/ssh.rb +82 -153
- data/lib/vagrant/ui.rb +118 -50
- data/lib/vagrant/util/busy.rb +1 -1
- data/lib/vagrant/util/file_mode.rb +12 -0
- data/lib/vagrant/util/network_ip.rb +28 -0
- data/lib/vagrant/util/platform.rb +1 -0
- data/lib/vagrant/util/subprocess.rb +227 -0
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +111 -97
- data/tasks/acceptance.rake +3 -3
- data/tasks/test.rake +7 -2
- data/templates/commands/init/Vagrantfile.erb +11 -4
- data/templates/{ssh_config.erb → commands/ssh_config/config.erb} +0 -0
- data/templates/guests/arch/network_dhcp.erb +7 -0
- data/templates/guests/arch/network_static.erb +7 -0
- data/templates/guests/debian/network_dhcp.erb +6 -0
- data/templates/guests/debian/network_static.erb +7 -0
- data/templates/guests/gentoo/network_dhcp.erb +4 -0
- data/templates/guests/gentoo/network_static.erb +4 -0
- data/templates/guests/redhat/network_dhcp.erb +6 -0
- data/templates/guests/redhat/network_static.erb +7 -0
- data/templates/locales/en.yml +241 -122
- data/templates/{chef_server_client.erb → provisioners/chef_client/client.erb} +0 -0
- data/templates/{chef_solo_solo.erb → provisioners/chef_solo/solo.erb} +0 -0
- data/test/acceptance/base.rb +10 -10
- data/test/acceptance/box_test.rb +28 -6
- data/test/acceptance/destroy_test.rb +1 -1
- data/test/acceptance/halt_test.rb +4 -4
- data/test/acceptance/init_test.rb +3 -3
- data/test/acceptance/networking/host_only_test.rb +37 -0
- data/test/acceptance/networking/port_forward_test.rb +125 -0
- data/test/acceptance/package_test.rb +46 -0
- data/test/acceptance/provisioning/basic_test.rb +61 -0
- data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
- data/test/acceptance/provisioning/shell_test.rb +53 -0
- data/test/acceptance/resume_test.rb +1 -1
- data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
- data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
- data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/ssh_test.rb +7 -2
- data/test/acceptance/support/config.rb +1 -1
- data/test/acceptance/support/isolated_environment.rb +41 -150
- data/test/acceptance/support/matchers/match_output.rb +1 -1
- data/test/acceptance/support/matchers/succeed.rb +14 -0
- data/test/acceptance/support/network_tests.rb +29 -0
- data/test/acceptance/support/output.rb +9 -1
- data/test/acceptance/support/shared/base_context.rb +16 -9
- data/test/acceptance/support/shared/command_examples.rb +4 -4
- data/test/acceptance/suspend_test.rb +1 -1
- data/test/acceptance/up_basic_test.rb +26 -7
- data/test/acceptance/up_with_box_url.rb +1 -1
- data/test/acceptance/vagrant_test.rb +1 -1
- data/test/acceptance/version_test.rb +0 -5
- data/test/support/isolated_environment.rb +46 -0
- data/test/{acceptance/support → support}/tempdir.rb +0 -0
- data/test/unit/base.rb +21 -0
- data/test/unit/support/isolated_environment.rb +39 -0
- data/test/unit/support/shared/base_context.rb +30 -0
- data/test/unit/vagrant/action/builder_test.rb +126 -177
- data/test/unit/vagrant/action/environment_test.rb +10 -21
- data/test/unit/vagrant/action/runner_test.rb +65 -0
- data/test/unit/vagrant/action/warden_test.rb +64 -97
- data/test/unit/vagrant/box_collection_test.rb +44 -33
- data/test/unit/vagrant/box_test.rb +25 -65
- data/test/unit/vagrant/command/base_test.rb +141 -14
- data/test/unit/vagrant/config/base_test.rb +16 -43
- data/test/unit/vagrant/config/loader_test.rb +79 -0
- data/test/unit/vagrant/config/top_test.rb +69 -0
- data/test/unit/vagrant/config/vm_test.rb +62 -47
- data/test/unit/vagrant/config_test.rb +16 -151
- data/test/unit/vagrant/data_store_test.rb +43 -61
- data/test/unit/vagrant/downloaders/base_test.rb +12 -22
- data/test/unit/vagrant/downloaders/file_test.rb +58 -31
- data/test/unit/vagrant/downloaders/http_test.rb +12 -86
- data/test/unit/vagrant/environment_test.rb +107 -536
- data/test/unit/vagrant/hosts_test.rb +36 -0
- data/test/unit/vagrant/registry_test.rb +56 -0
- data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +23 -24
- data/test/unit/vagrant/util/network_ip_test.rb +17 -0
- data/test/unit/vagrant/util/retryable_test.rb +90 -34
- data/test/unit/vagrant_test.rb +27 -0
- data/test/{unit → unit_legacy}/locales/en.yml +0 -0
- data/test/{unit → unit_legacy}/test_helper.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/destroy_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/download_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/package_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/unpackage_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/verify_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/env/set_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/general/package_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/general/validate_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/boot_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/check_accessible_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/check_box_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/check_guest_additions_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clean_machine_folder_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clear_forwarded_ports_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clear_nfs_exports_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clear_shared_folders_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/customize_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/discard_state_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/export_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_helpers_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/halt_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/host_name_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/import_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/match_mac_address_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/modify_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/network_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_helpers_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/package_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/package_vagrantfile_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/provision_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/provisioner_cleanup_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/resume_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/share_folders_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/suspend_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action_test.rb +0 -0
- data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
- data/test/unit_legacy/vagrant/box_test.rb +74 -0
- data/test/{unit → unit_legacy}/vagrant/cli_test.rb +0 -0
- data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
- data/test/{unit → unit_legacy}/vagrant/command/group_base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/command/helpers_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/command/init_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/command/package_test.rb +0 -0
- data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
- data/test/{unit → unit_legacy}/vagrant/config/error_recorder_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/config/ssh_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/config/vagrant_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/config/vm/provisioner_test.rb +0 -0
- data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
- data/test/unit_legacy/vagrant/config_test.rb +148 -0
- data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
- data/test/unit_legacy/vagrant/environment_test.rb +539 -0
- data/test/{unit → unit_legacy}/vagrant/errors_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/hosts/base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/hosts/bsd_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/hosts/linux_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/plugin_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/chef_client_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/chef_solo_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/chef_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_server_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/shell_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/ssh/session_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/ssh_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/systems/base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/systems/linux_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/busy_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/counter_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/platform_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/stacked_proc_runner_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/template_renderer_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/vm_test.rb +0 -0
- data/vagrant.gemspec +7 -9
- metadata +214 -216
- data/keys/vagrant.ppk +0 -26
- data/lib/vagrant/action/box.rb +0 -11
- data/lib/vagrant/action/env.rb +0 -7
- data/lib/vagrant/action/general.rb +0 -8
- data/lib/vagrant/action/vm.rb +0 -34
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +0 -28
- data/lib/vagrant/action/vm/modify.rb +0 -37
- data/lib/vagrant/action/vm/nfs_helpers.rb +0 -11
- data/lib/vagrant/command/group_base.rb +0 -107
- data/lib/vagrant/command/helpers.rb +0 -33
- data/lib/vagrant/command/named_base.rb +0 -14
- data/lib/vagrant/command/upgrade_to_060.rb +0 -45
- data/lib/vagrant/command/version.rb +0 -13
- data/lib/vagrant/ssh/session.rb +0 -136
- data/lib/vagrant/systems.rb +0 -13
- data/lib/vagrant/systems/arch.rb +0 -34
- data/lib/vagrant/systems/debian.rb +0 -36
- data/lib/vagrant/systems/gentoo.rb +0 -27
- data/lib/vagrant/systems/linux.rb +0 -82
- data/lib/vagrant/systems/linux/error.rb +0 -9
- data/lib/vagrant/systems/redhat.rb +0 -48
- data/lib/vagrant/systems/solaris.rb +0 -113
- data/lib/vagrant/systems/ubuntu.rb +0 -17
- data/templates/network_entry_arch.erb +0 -9
- data/templates/network_entry_debian.erb +0 -8
- data/templates/network_entry_gentoo.erb +0 -5
- data/templates/network_entry_redhat.erb +0 -9
- data/test/unit/vagrant/ui_test.rb +0 -29
@@ -5,13 +5,15 @@ module Vagrant
|
|
5
5
|
class Base
|
6
6
|
include Vagrant::Util
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(env)
|
12
|
-
@env = env
|
8
|
+
def initialize(ui)
|
9
|
+
@ui = ui
|
13
10
|
end
|
14
11
|
|
12
|
+
# Tests whether a URL matches this download. Subclasses must
|
13
|
+
# override this and return `true` for any URLs they wish to
|
14
|
+
# handle.
|
15
|
+
def self.match?(url); false; end
|
16
|
+
|
15
17
|
# Called prior to execution so any error checks can be done
|
16
18
|
def prepare(source_url); end
|
17
19
|
|
@@ -6,16 +6,16 @@ module Vagrant
|
|
6
6
|
# simply does a file copy.
|
7
7
|
class File < Base
|
8
8
|
def self.match?(uri)
|
9
|
-
::File.
|
9
|
+
::File.file?(::File.expand_path(uri))
|
10
10
|
end
|
11
11
|
|
12
12
|
def prepare(source_url)
|
13
|
-
raise Errors::DownloaderFileDoesntExist if !::File.file?(source_url)
|
13
|
+
raise Errors::DownloaderFileDoesntExist if !::File.file?(::File.expand_path(source_url))
|
14
14
|
end
|
15
15
|
|
16
16
|
def download!(source_url, destination_file)
|
17
|
-
|
18
|
-
FileUtils.cp(source_url, destination_file.path)
|
17
|
+
@ui.info I18n.t("vagrant.downloaders.file.download")
|
18
|
+
FileUtils.cp(::File.expand_path(source_url), destination_file.path)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'net/https'
|
3
|
-
require 'open-uri'
|
4
3
|
require 'uri'
|
5
4
|
require 'base64'
|
6
5
|
|
@@ -27,7 +26,7 @@ module Vagrant
|
|
27
26
|
end
|
28
27
|
|
29
28
|
http.start do |h|
|
30
|
-
|
29
|
+
@ui.info I18n.t("vagrant.downloaders.http.download", :url => source_url)
|
31
30
|
|
32
31
|
headers = nil
|
33
32
|
if uri.user && uri.password
|
@@ -56,8 +55,8 @@ module Vagrant
|
|
56
55
|
# Progress reporting is limited to every 25 segments just so
|
57
56
|
# we're not constantly updating
|
58
57
|
if segment_count % 25 == 0
|
59
|
-
|
60
|
-
|
58
|
+
@ui.clear_line
|
59
|
+
@ui.report_progress(progress, total)
|
61
60
|
segment_count = 0
|
62
61
|
end
|
63
62
|
|
@@ -66,7 +65,7 @@ module Vagrant
|
|
66
65
|
end
|
67
66
|
|
68
67
|
# Clear the line one last time so that the progress meter disappears
|
69
|
-
|
68
|
+
@ui.clear_line
|
70
69
|
end
|
71
70
|
end
|
72
71
|
rescue SocketError
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
|
5
|
+
require 'vagrant/driver/virtualbox_base'
|
6
|
+
|
7
|
+
module Vagrant
|
8
|
+
module Driver
|
9
|
+
# This class contains the logic to drive VirtualBox.
|
10
|
+
#
|
11
|
+
# Read the VirtualBoxBase source for documentation on each method.
|
12
|
+
class VirtualBox < VirtualBoxBase
|
13
|
+
# This is raised if the VM is not found when initializing a driver
|
14
|
+
# with a UUID.
|
15
|
+
class VMNotFound < StandardError; end
|
16
|
+
|
17
|
+
# We use forwardable to do all our driver forwarding
|
18
|
+
extend Forwardable
|
19
|
+
|
20
|
+
# The UUID of the virtual machine we represent
|
21
|
+
attr_reader :uuid
|
22
|
+
|
23
|
+
# The version of virtualbox that is running.
|
24
|
+
attr_reader :version
|
25
|
+
|
26
|
+
def initialize(uuid)
|
27
|
+
# Setup the base
|
28
|
+
super()
|
29
|
+
|
30
|
+
@logger = Log4r::Logger.new("vagrant::driver::virtualbox")
|
31
|
+
@uuid = uuid
|
32
|
+
|
33
|
+
# Read and assign the version of VirtualBox we know which
|
34
|
+
# specific driver to instantiate.
|
35
|
+
begin
|
36
|
+
@version = read_version
|
37
|
+
rescue Subprocess::LaunchError
|
38
|
+
# This means that VirtualBox was not found, so we raise this
|
39
|
+
# error here.
|
40
|
+
raise Errors::VirtualBoxNotDetected
|
41
|
+
end
|
42
|
+
|
43
|
+
# Instantiate the proper version driver for VirtualBox
|
44
|
+
@logger.debug("Finding driver for VirtualBox version: #{@version}")
|
45
|
+
driver_map = {
|
46
|
+
"4.0" => VirtualBox_4_0,
|
47
|
+
"4.1" => VirtualBox_4_1
|
48
|
+
}
|
49
|
+
|
50
|
+
driver_klass = nil
|
51
|
+
driver_map.each do |key, klass|
|
52
|
+
if @version.start_with?(key)
|
53
|
+
driver_klass = klass
|
54
|
+
break
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if !driver_klass
|
59
|
+
supported_versions = driver_map.keys.sort.join(", ")
|
60
|
+
raise Errors::VirtualBoxInvalidVersion, :supported_versions => supported_versions
|
61
|
+
end
|
62
|
+
|
63
|
+
@logger.info("Using VirtualBox driver: #{driver_klass}")
|
64
|
+
@driver = driver_klass.new(@uuid)
|
65
|
+
|
66
|
+
if @uuid
|
67
|
+
# Verify the VM exists, and if it doesn't, then don't worry
|
68
|
+
# about it (mark the UUID as nil)
|
69
|
+
raise VMNotFound if !@driver.vm_exists?(@uuid)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def_delegators :@driver, :clear_forwarded_ports,
|
74
|
+
:clear_shared_folders,
|
75
|
+
:create_dhcp_server,
|
76
|
+
:create_host_only_network,
|
77
|
+
:delete,
|
78
|
+
:delete_unused_host_only_networks,
|
79
|
+
:discard_saved_state,
|
80
|
+
:enable_adapters,
|
81
|
+
:execute_command,
|
82
|
+
:export,
|
83
|
+
:forward_ports,
|
84
|
+
:halt,
|
85
|
+
:import,
|
86
|
+
:read_forwarded_ports,
|
87
|
+
:read_bridged_interfaces,
|
88
|
+
:read_guest_additions_version,
|
89
|
+
:read_host_only_interfaces,
|
90
|
+
:read_mac_address,
|
91
|
+
:read_machine_folder,
|
92
|
+
:read_network_interfaces,
|
93
|
+
:read_state,
|
94
|
+
:read_used_ports,
|
95
|
+
:read_vms,
|
96
|
+
:set_mac_address,
|
97
|
+
:share_folders,
|
98
|
+
:ssh_port,
|
99
|
+
:start,
|
100
|
+
:suspend,
|
101
|
+
:verify_image,
|
102
|
+
:vm_exists?
|
103
|
+
|
104
|
+
protected
|
105
|
+
|
106
|
+
# This returns the version of VirtualBox that is running.
|
107
|
+
#
|
108
|
+
# @return [String]
|
109
|
+
def read_version
|
110
|
+
# The version string is usually in one of the following formats:
|
111
|
+
#
|
112
|
+
# * 4.1.8r1234
|
113
|
+
# * 4.1.8r1234_OSE
|
114
|
+
# * 4.1.8_MacPortsr1234
|
115
|
+
#
|
116
|
+
# Below accounts for all of these:
|
117
|
+
execute("--version").split("_")[0].split("r")[0]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,411 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
require 'vagrant/driver/virtualbox_base'
|
4
|
+
|
5
|
+
module Vagrant
|
6
|
+
module Driver
|
7
|
+
# Driver for VirtualBox 4.0.x
|
8
|
+
class VirtualBox_4_0 < VirtualBoxBase
|
9
|
+
def initialize(uuid)
|
10
|
+
super()
|
11
|
+
|
12
|
+
@logger = Log4r::Logger.new("vagrant::driver::virtualbox_4_1")
|
13
|
+
@uuid = uuid
|
14
|
+
end
|
15
|
+
|
16
|
+
def clear_forwarded_ports
|
17
|
+
args = []
|
18
|
+
read_forwarded_ports(@uuid).each do |nic, name, _, _|
|
19
|
+
args.concat(["--natpf#{nic}", "delete", name])
|
20
|
+
end
|
21
|
+
|
22
|
+
execute("modifyvm", @uuid, *args) if !args.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
def clear_shared_folders
|
26
|
+
execute("showvminfo", @uuid, "--machinereadable").split("\n").each do |line|
|
27
|
+
if line =~ /^SharedFolderNameMachineMapping\d+="(.+?)"$/
|
28
|
+
execute("sharedfolder", "remove", @uuid, "--name", $1.to_s)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_dhcp_server(network, options)
|
34
|
+
execute("dhcpserver", "add", "--ifname", network,
|
35
|
+
"--ip", options[:dhcp_ip],
|
36
|
+
"--netmask", options[:netmask],
|
37
|
+
"--lowerip", options[:dhcp_lower],
|
38
|
+
"--upperip", options[:dhcp_upper],
|
39
|
+
"--enable")
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_host_only_network(options)
|
43
|
+
# Create the interface
|
44
|
+
execute("hostonlyif", "create") =~ /^Interface '(.+?)' was successfully created$/
|
45
|
+
name = $1.to_s
|
46
|
+
|
47
|
+
# Configure it
|
48
|
+
execute("hostonlyif", "ipconfig", name,
|
49
|
+
"--ip", options[:adapter_ip],
|
50
|
+
"--netmask", options[:netmask])
|
51
|
+
|
52
|
+
# Return the details
|
53
|
+
return {
|
54
|
+
:name => name,
|
55
|
+
:ip => options[:adapter_ip],
|
56
|
+
:netmask => options[:netmask],
|
57
|
+
:dhcp => nil
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete
|
62
|
+
execute("unregistervm", @uuid, "--delete")
|
63
|
+
end
|
64
|
+
|
65
|
+
def delete_unused_host_only_networks
|
66
|
+
networks = []
|
67
|
+
execute("list", "hostonlyifs").split("\n").each do |line|
|
68
|
+
networks << $1.to_s if line =~ /^Name:\s+(.+?)$/
|
69
|
+
end
|
70
|
+
|
71
|
+
execute("list", "vms").split("\n").each do |line|
|
72
|
+
if line =~ /^".+?"\s+\{(.+?)\}$/
|
73
|
+
execute("showvminfo", $1.to_s, "--machinereadable").split("\n").each do |info|
|
74
|
+
if info =~ /^hostonlyadapter\d+="(.+?)"$/
|
75
|
+
networks.delete($1.to_s)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
networks.each do |name|
|
82
|
+
# First try to remove any DHCP servers attached. We use `raw` because
|
83
|
+
# it is okay if this fails. It usually means that a DHCP server was
|
84
|
+
# never attached.
|
85
|
+
raw("dhcpserver", "remove", "--ifname", name)
|
86
|
+
|
87
|
+
# Delete the actual host only network interface.
|
88
|
+
execute("hostonlyif", "remove", name)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def discard_saved_state
|
93
|
+
execute("discardstate", @uuid)
|
94
|
+
end
|
95
|
+
|
96
|
+
def enable_adapters(adapters)
|
97
|
+
args = []
|
98
|
+
adapters.each do |adapter|
|
99
|
+
args.concat(["--nic#{adapter[:adapter]}", adapter[:type].to_s])
|
100
|
+
|
101
|
+
if adapter[:bridge]
|
102
|
+
args.concat(["--bridgeadapter#{adapter[:adapter]}",
|
103
|
+
adapter[:bridge]])
|
104
|
+
end
|
105
|
+
|
106
|
+
if adapter[:hostonly]
|
107
|
+
args.concat(["--hostonlyadapter#{adapter[:adapter]}",
|
108
|
+
adapter[:hostonly]])
|
109
|
+
end
|
110
|
+
|
111
|
+
if adapter[:mac_address]
|
112
|
+
args.concat(["--macaddress#{adapter[:adapter]}",
|
113
|
+
adapter[:mac_address]])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
execute("modifyvm", @uuid, *args)
|
118
|
+
end
|
119
|
+
|
120
|
+
def execute_command(command)
|
121
|
+
raw(*command)
|
122
|
+
end
|
123
|
+
|
124
|
+
def export(path)
|
125
|
+
# TODO: Progress
|
126
|
+
execute("export", @uuid, "--output", path.to_s)
|
127
|
+
end
|
128
|
+
|
129
|
+
def forward_ports(ports)
|
130
|
+
args = []
|
131
|
+
ports.each do |options|
|
132
|
+
pf_builder = [options[:name],
|
133
|
+
options[:protocol] || "tcp",
|
134
|
+
"",
|
135
|
+
options[:hostport],
|
136
|
+
"",
|
137
|
+
options[:guestport]]
|
138
|
+
|
139
|
+
args.concat(["--natpf#{options[:adapter] || 1}",
|
140
|
+
pf_builder.join(",")])
|
141
|
+
end
|
142
|
+
|
143
|
+
execute("modifyvm", @uuid, *args)
|
144
|
+
end
|
145
|
+
|
146
|
+
def halt
|
147
|
+
execute("controlvm", @uuid, "poweroff")
|
148
|
+
end
|
149
|
+
|
150
|
+
def import(ovf, name)
|
151
|
+
total = ""
|
152
|
+
last = 0
|
153
|
+
execute("import", ovf, "--vsys", "0", "--vmname", name) do |type, data|
|
154
|
+
if type == :stderr
|
155
|
+
# Append the data so we can see the full view
|
156
|
+
total << data
|
157
|
+
|
158
|
+
# Break up the lines. We can't get the progress until we see an "OK"
|
159
|
+
lines = total.split("\n")
|
160
|
+
if lines.include?("OK.")
|
161
|
+
# The progress of the import will be in the last line. Do a greedy
|
162
|
+
# regular expression to find what we're looking for.
|
163
|
+
if lines.last =~ /.+(\d{2})%/
|
164
|
+
current = $1.to_i
|
165
|
+
if current > last
|
166
|
+
last = current
|
167
|
+
yield current if block_given?
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
output = execute("list", "vms")
|
175
|
+
if output =~ /^"#{name}" \{(.+?)\}$/
|
176
|
+
return $1.to_s
|
177
|
+
end
|
178
|
+
|
179
|
+
nil
|
180
|
+
end
|
181
|
+
|
182
|
+
def read_forwarded_ports(uuid=nil, active_only=false)
|
183
|
+
uuid ||= @uuid
|
184
|
+
|
185
|
+
@logger.debug("read_forward_ports: uuid=#{uuid} active_only=#{active_only}")
|
186
|
+
|
187
|
+
results = []
|
188
|
+
current_nic = nil
|
189
|
+
execute("showvminfo", uuid, "--machinereadable").split("\n").each do |line|
|
190
|
+
# This is how we find the nic that a FP is attached to,
|
191
|
+
# since this comes first.
|
192
|
+
current_nic = $1.to_i if line =~ /^nic(\d+)=".+?"$/
|
193
|
+
|
194
|
+
# If we care about active VMs only, then we check the state
|
195
|
+
# to verify the VM is running.
|
196
|
+
if active_only && line =~ /^VMState="(.+?)"$/ && $1.to_s != "running"
|
197
|
+
return []
|
198
|
+
end
|
199
|
+
|
200
|
+
# Parse out the forwarded port information
|
201
|
+
if line =~ /^Forwarding.+?="(.+?),.+?,.*?,(.+?),.*?,(.+?)"$/
|
202
|
+
result = [current_nic, $1.to_s, $2.to_i, $3.to_i]
|
203
|
+
@logger.debug(" - #{result.inspect}")
|
204
|
+
results << result
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
results
|
209
|
+
end
|
210
|
+
|
211
|
+
def read_bridged_interfaces
|
212
|
+
execute("list", "bridgedifs").split("\n\n").collect do |block|
|
213
|
+
info = {}
|
214
|
+
|
215
|
+
block.split("\n").each do |line|
|
216
|
+
if line =~ /^Name:\s+(.+?)$/
|
217
|
+
info[:name] = $1.to_s
|
218
|
+
elsif line =~ /^IPAddress:\s+(.+?)$/
|
219
|
+
info[:ip] = $1.to_s
|
220
|
+
elsif line =~ /^NetworkMask:\s+(.+?)$/
|
221
|
+
info[:netmask] = $1.to_s
|
222
|
+
elsif line =~ /^Status:\s+(.+?)$/
|
223
|
+
info[:status] = $1.to_s
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# Return the info to build up the results
|
228
|
+
info
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def read_guest_additions_version
|
233
|
+
output = execute("guestproperty", "get", @uuid, "/VirtualBox/GuestAdd/Version")
|
234
|
+
if output =~ /^Value: (.+?)$/
|
235
|
+
# Split the version by _ since some distro versions modify it
|
236
|
+
# to look like this: 4.1.2_ubuntu, and the distro part isn't
|
237
|
+
# too important.
|
238
|
+
value = $1.to_s
|
239
|
+
return value.split("_").first
|
240
|
+
end
|
241
|
+
|
242
|
+
return nil
|
243
|
+
end
|
244
|
+
|
245
|
+
def read_host_only_interfaces
|
246
|
+
dhcp = {}
|
247
|
+
execute("list", "dhcpservers").split("\n\n").each do |block|
|
248
|
+
info = {}
|
249
|
+
|
250
|
+
block.split("\n").each do |line|
|
251
|
+
if line =~ /^NetworkName:\s+HostInterfaceNetworking-(.+?)$/
|
252
|
+
info[:network] = $1.to_s
|
253
|
+
elsif line =~ /^IP:\s+(.+?)$/
|
254
|
+
info[:ip] = $1.to_s
|
255
|
+
elsif line =~ /^lowerIPAddress:\s+(.+?)$/
|
256
|
+
info[:lower] = $1.to_s
|
257
|
+
elsif line =~ /^upperIPAddress:\s+(.+?)$/
|
258
|
+
info[:upper] = $1.to_s
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
# Set the DHCP info
|
263
|
+
dhcp[info[:network]] = info
|
264
|
+
end
|
265
|
+
|
266
|
+
execute("list", "hostonlyifs").split("\n\n").collect do |block|
|
267
|
+
info = {}
|
268
|
+
|
269
|
+
block.split("\n").each do |line|
|
270
|
+
if line =~ /^Name:\s+(.+?)$/
|
271
|
+
info[:name] = $1.to_s
|
272
|
+
elsif line =~ /^IPAddress:\s+(.+?)$/
|
273
|
+
info[:ip] = $1.to_s
|
274
|
+
elsif line =~ /^NetworkMask:\s+(.+?)$/
|
275
|
+
info[:netmask] = $1.to_s
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
# Set the DHCP info if it exists
|
280
|
+
info[:dhcp] = dhcp[info[:name]] if dhcp[info[:name]]
|
281
|
+
|
282
|
+
info
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def read_mac_address
|
287
|
+
execute("showvminfo", @uuid, "--machinereadable").split("\n").each do |line|
|
288
|
+
return $1.to_s if line =~ /^macaddress1="(.+?)"$/
|
289
|
+
end
|
290
|
+
|
291
|
+
nil
|
292
|
+
end
|
293
|
+
|
294
|
+
def read_machine_folder
|
295
|
+
execute("list", "systemproperties").split("\n").each do |line|
|
296
|
+
if line =~ /^Default machine folder:\s+(.+?)$/i
|
297
|
+
return $1.to_s
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
nil
|
302
|
+
end
|
303
|
+
|
304
|
+
def read_network_interfaces
|
305
|
+
nics = {}
|
306
|
+
execute("showvminfo", @uuid, "--machinereadable").split("\n").each do |line|
|
307
|
+
if line =~ /^nic(\d+)="(.+?)"$/
|
308
|
+
adapter = $1.to_i
|
309
|
+
type = $2.to_sym
|
310
|
+
|
311
|
+
nics[adapter] ||= {}
|
312
|
+
nics[adapter][:type] = type
|
313
|
+
elsif line =~ /^hostonlyadapter(\d+)="(.+?)"$/
|
314
|
+
adapter = $1.to_i
|
315
|
+
network = $2.to_s
|
316
|
+
|
317
|
+
nics[adapter] ||= {}
|
318
|
+
nics[adapter][:hostonly] = network
|
319
|
+
elsif line =~ /^bridgeadapter(\d+)="(.+?)"$/
|
320
|
+
adapter = $1.to_i
|
321
|
+
network = $2.to_s
|
322
|
+
|
323
|
+
nics[adapter] ||= {}
|
324
|
+
nics[adapter][:bridge] = network
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
nics
|
329
|
+
end
|
330
|
+
|
331
|
+
def read_state
|
332
|
+
output = execute("showvminfo", @uuid, "--machinereadable")
|
333
|
+
if output =~ /^name="<inaccessible>"$/
|
334
|
+
return :inaccessible
|
335
|
+
elsif output =~ /^VMState="(.+?)"$/
|
336
|
+
return $1.to_sym
|
337
|
+
end
|
338
|
+
|
339
|
+
nil
|
340
|
+
end
|
341
|
+
|
342
|
+
def read_used_ports
|
343
|
+
ports = []
|
344
|
+
execute("list", "vms").split("\n").each do |line|
|
345
|
+
if line =~ /^".+?" \{(.+?)\}$/
|
346
|
+
uuid = $1.to_s
|
347
|
+
|
348
|
+
# Ignore our own used ports
|
349
|
+
next if uuid == @uuid
|
350
|
+
|
351
|
+
read_forwarded_ports(uuid, true).each do |_, _, hostport, _|
|
352
|
+
ports << hostport
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
ports
|
358
|
+
end
|
359
|
+
|
360
|
+
def read_vms
|
361
|
+
results = []
|
362
|
+
execute("list", "vms").split("\n").each do |line|
|
363
|
+
if line =~ /^".+?" \{(.+?)\}$/
|
364
|
+
results << $1.to_s
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
results
|
369
|
+
end
|
370
|
+
|
371
|
+
def set_mac_address(mac)
|
372
|
+
execute("modifyvm", @uuid, "--macaddress1", mac)
|
373
|
+
end
|
374
|
+
|
375
|
+
def share_folders(folders)
|
376
|
+
folders.each do |folder|
|
377
|
+
execute("sharedfolder", "add", @uuid, "--name",
|
378
|
+
folder[:name], "--hostpath", folder[:hostpath])
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
def ssh_port(expected_port)
|
383
|
+
@logger.debug("Searching for SSH port: #{expected_port.inspect}")
|
384
|
+
|
385
|
+
# Look for the forwarded port only by comparing the guest port
|
386
|
+
read_forwarded_ports.each do |_, _, hostport, guestport|
|
387
|
+
return hostport if guestport == expected_port
|
388
|
+
end
|
389
|
+
|
390
|
+
nil
|
391
|
+
end
|
392
|
+
|
393
|
+
def start(mode)
|
394
|
+
execute("startvm", @uuid, "--type", mode.to_s)
|
395
|
+
end
|
396
|
+
|
397
|
+
def suspend
|
398
|
+
execute("controlvm", @uuid, "savestate")
|
399
|
+
end
|
400
|
+
|
401
|
+
def verify_image(path)
|
402
|
+
r = raw("import", path.to_s, "--dry-run")
|
403
|
+
return r.exit_code == 0
|
404
|
+
end
|
405
|
+
|
406
|
+
def vm_exists?(uuid)
|
407
|
+
raw("showvminfo", uuid).exit_code == 0
|
408
|
+
end
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|