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
         |