tnargav 1.2.2
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/.gitignore +31 -0
- data/.gitsetup.yml +5 -0
- data/.travis.yml +7 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +1067 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +89 -0
- data/Rakefile +18 -0
- data/bin/vagrant +106 -0
- data/config/default.rb +36 -0
- data/contrib/README.md +12 -0
- data/contrib/bash/completion.sh +3 -0
- data/contrib/emacs/vagrant.el +8 -0
- data/contrib/vim/vagrantfile.vim +9 -0
- data/keys/README.md +17 -0
- data/keys/vagrant +27 -0
- data/keys/vagrant.pub +1 -0
- data/lib/vagrant/action/builder.rb +174 -0
- data/lib/vagrant/action/builtin/box_add.rb +81 -0
- data/lib/vagrant/action/builtin/call.rb +67 -0
- data/lib/vagrant/action/builtin/config_validate.rb +30 -0
- data/lib/vagrant/action/builtin/confirm.rb +38 -0
- data/lib/vagrant/action/builtin/destroy_confirm.rb +21 -0
- data/lib/vagrant/action/builtin/env_set.rb +24 -0
- data/lib/vagrant/action/builtin/graceful_halt.rb +73 -0
- data/lib/vagrant/action/builtin/handle_box_url.rb +77 -0
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +134 -0
- data/lib/vagrant/action/builtin/lock.rb +57 -0
- data/lib/vagrant/action/builtin/nfs.rb +118 -0
- data/lib/vagrant/action/builtin/provision.rb +70 -0
- data/lib/vagrant/action/builtin/set_hostname.rb +27 -0
- data/lib/vagrant/action/builtin/ssh_exec.rb +42 -0
- data/lib/vagrant/action/builtin/ssh_run.rb +43 -0
- data/lib/vagrant/action/general/package.rb +103 -0
- data/lib/vagrant/action/hook.rb +107 -0
- data/lib/vagrant/action/runner.rb +69 -0
- data/lib/vagrant/action/warden.rb +103 -0
- data/lib/vagrant/action.rb +43 -0
- data/lib/vagrant/batch_action.rb +113 -0
- data/lib/vagrant/box.rb +97 -0
- data/lib/vagrant/box_collection.rb +375 -0
- data/lib/vagrant/cli.rb +82 -0
- data/lib/vagrant/config/loader.rb +222 -0
- data/lib/vagrant/config/v1/dummy_config.rb +13 -0
- data/lib/vagrant/config/v1/loader.rb +105 -0
- data/lib/vagrant/config/v1/root.rb +60 -0
- data/lib/vagrant/config/v1.rb +9 -0
- data/lib/vagrant/config/v2/dummy_config.rb +13 -0
- data/lib/vagrant/config/v2/loader.rb +141 -0
- data/lib/vagrant/config/v2/root.rb +105 -0
- data/lib/vagrant/config/v2/util.rb +21 -0
- data/lib/vagrant/config/v2.rb +9 -0
- data/lib/vagrant/config/version_base.rb +80 -0
- data/lib/vagrant/config.rb +61 -0
- data/lib/vagrant/environment.rb +843 -0
- data/lib/vagrant/errors.rb +570 -0
- data/lib/vagrant/guest.rb +163 -0
- data/lib/vagrant/hosts.rb +28 -0
- data/lib/vagrant/machine.rb +325 -0
- data/lib/vagrant/machine_state.rb +45 -0
- data/lib/vagrant/plugin/v1/command.rb +169 -0
- data/lib/vagrant/plugin/v1/communicator.rb +98 -0
- data/lib/vagrant/plugin/v1/config.rb +112 -0
- data/lib/vagrant/plugin/v1/errors.rb +15 -0
- data/lib/vagrant/plugin/v1/guest.rb +92 -0
- data/lib/vagrant/plugin/v1/host.rb +66 -0
- data/lib/vagrant/plugin/v1/manager.rb +131 -0
- data/lib/vagrant/plugin/v1/plugin.rb +229 -0
- data/lib/vagrant/plugin/v1/provider.rb +68 -0
- data/lib/vagrant/plugin/v1/provisioner.rb +50 -0
- data/lib/vagrant/plugin/v1.rb +19 -0
- data/lib/vagrant/plugin/v2/command.rb +234 -0
- data/lib/vagrant/plugin/v2/communicator.rb +98 -0
- data/lib/vagrant/plugin/v2/components.rb +47 -0
- data/lib/vagrant/plugin/v2/config.rb +136 -0
- data/lib/vagrant/plugin/v2/errors.rb +15 -0
- data/lib/vagrant/plugin/v2/guest.rb +78 -0
- data/lib/vagrant/plugin/v2/host.rb +66 -0
- data/lib/vagrant/plugin/v2/manager.rb +173 -0
- data/lib/vagrant/plugin/v2/plugin.rb +226 -0
- data/lib/vagrant/plugin/v2/provider.rb +69 -0
- data/lib/vagrant/plugin/v2/provisioner.rb +47 -0
- data/lib/vagrant/plugin/v2.rb +22 -0
- data/lib/vagrant/plugin.rb +6 -0
- data/lib/vagrant/registry.rb +78 -0
- data/lib/vagrant/ui.rb +215 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
- data/lib/vagrant/util/busy.rb +59 -0
- data/lib/vagrant/util/counter.rb +24 -0
- data/lib/vagrant/util/downloader.rb +146 -0
- data/lib/vagrant/util/file_checksum.rb +38 -0
- data/lib/vagrant/util/file_mode.rb +12 -0
- data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
- data/lib/vagrant/util/is_port_open.rb +38 -0
- data/lib/vagrant/util/line_ending_helpers.rb +14 -0
- data/lib/vagrant/util/network_ip.rb +28 -0
- data/lib/vagrant/util/platform.rb +58 -0
- data/lib/vagrant/util/retryable.rb +31 -0
- data/lib/vagrant/util/safe_chdir.rb +33 -0
- data/lib/vagrant/util/safe_exec.rb +36 -0
- data/lib/vagrant/util/safe_puts.rb +31 -0
- data/lib/vagrant/util/scoped_hash_override.rb +45 -0
- data/lib/vagrant/util/ssh.rb +150 -0
- data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
- data/lib/vagrant/util/string_block_editor.rb +77 -0
- data/lib/vagrant/util/subprocess.rb +273 -0
- data/lib/vagrant/util/template_renderer.rb +83 -0
- data/lib/vagrant/util/which.rb +43 -0
- data/lib/vagrant/util.rb +12 -0
- data/lib/vagrant/version.rb +6 -0
- data/lib/vagrant.rb +258 -0
- data/plugins/README.md +5 -0
- data/plugins/commands/box/command/add.rb +51 -0
- data/plugins/commands/box/command/list.rb +41 -0
- data/plugins/commands/box/command/remove.rb +37 -0
- data/plugins/commands/box/command/repackage.rb +43 -0
- data/plugins/commands/box/command/root.rb +75 -0
- data/plugins/commands/box/plugin.rb +15 -0
- data/plugins/commands/destroy/command.rb +31 -0
- data/plugins/commands/destroy/plugin.rb +18 -0
- data/plugins/commands/halt/command.rb +33 -0
- data/plugins/commands/halt/plugin.rb +18 -0
- data/plugins/commands/init/command.rb +40 -0
- data/plugins/commands/init/plugin.rb +18 -0
- data/plugins/commands/package/command.rb +83 -0
- data/plugins/commands/package/plugin.rb +18 -0
- data/plugins/commands/plugin/action/bundler_check.rb +25 -0
- data/plugins/commands/plugin/action/install_gem.rb +81 -0
- data/plugins/commands/plugin/action/license_plugin.rb +54 -0
- data/plugins/commands/plugin/action/list_plugins.rb +54 -0
- data/plugins/commands/plugin/action/prune_gems.rb +149 -0
- data/plugins/commands/plugin/action/uninstall_plugin.rb +23 -0
- data/plugins/commands/plugin/action.rb +52 -0
- data/plugins/commands/plugin/command/base.rb +22 -0
- data/plugins/commands/plugin/command/install.rb +58 -0
- data/plugins/commands/plugin/command/license.rb +31 -0
- data/plugins/commands/plugin/command/list.rb +28 -0
- data/plugins/commands/plugin/command/root.rb +75 -0
- data/plugins/commands/plugin/command/uninstall.rb +28 -0
- data/plugins/commands/plugin/gem_helper.rb +74 -0
- data/plugins/commands/plugin/plugin.rb +22 -0
- data/plugins/commands/plugin/state_file.rb +57 -0
- data/plugins/commands/provision/command.rb +34 -0
- data/plugins/commands/provision/plugin.rb +18 -0
- data/plugins/commands/reload/command.rb +37 -0
- data/plugins/commands/reload/plugin.rb +18 -0
- data/plugins/commands/resume/command.rb +25 -0
- data/plugins/commands/resume/plugin.rb +17 -0
- data/plugins/commands/ssh/command.rb +63 -0
- data/plugins/commands/ssh/plugin.rb +17 -0
- data/plugins/commands/ssh_config/command.rb +49 -0
- data/plugins/commands/ssh_config/plugin.rb +18 -0
- data/plugins/commands/status/command.rb +39 -0
- data/plugins/commands/status/plugin.rb +18 -0
- data/plugins/commands/suspend/command.rb +25 -0
- data/plugins/commands/suspend/plugin.rb +18 -0
- data/plugins/commands/up/command.rb +57 -0
- data/plugins/commands/up/plugin.rb +17 -0
- data/plugins/commands/up/start_mixins.rb +26 -0
- data/plugins/communicators/ssh/communicator.rb +342 -0
- data/plugins/communicators/ssh/plugin.rb +19 -0
- data/plugins/guests/arch/cap/change_host_name.rb +18 -0
- data/plugins/guests/arch/cap/configure_networks.rb +23 -0
- data/plugins/guests/arch/guest.rb +11 -0
- data/plugins/guests/arch/plugin.rb +25 -0
- data/plugins/guests/debian/cap/change_host_name.rb +18 -0
- data/plugins/guests/debian/cap/configure_networks.rb +61 -0
- data/plugins/guests/debian/guest.rb +9 -0
- data/plugins/guests/debian/plugin.rb +25 -0
- data/plugins/guests/fedora/cap/configure_networks.rb +59 -0
- data/plugins/guests/fedora/cap/network_scripts_dir.rb +15 -0
- data/plugins/guests/fedora/guest.rb +11 -0
- data/plugins/guests/fedora/plugin.rb +25 -0
- data/plugins/guests/freebsd/cap/change_host_name.rb +14 -0
- data/plugins/guests/freebsd/cap/configure_networks.rb +39 -0
- data/plugins/guests/freebsd/cap/halt.rb +16 -0
- data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +14 -0
- data/plugins/guests/freebsd/guest.rb +14 -0
- data/plugins/guests/freebsd/plugin.rb +35 -0
- data/plugins/guests/gentoo/cap/change_host_name.rb +17 -0
- data/plugins/guests/gentoo/cap/configure_networks.rb +43 -0
- data/plugins/guests/gentoo/guest.rb +9 -0
- data/plugins/guests/gentoo/plugin.rb +25 -0
- data/plugins/guests/linux/cap/halt.rb +16 -0
- data/plugins/guests/linux/cap/mount_nfs.rb +30 -0
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +40 -0
- data/plugins/guests/linux/cap/read_ip_address.rb +17 -0
- data/plugins/guests/linux/cap/shell_expand_guest_path.rb +26 -0
- data/plugins/guests/linux/guest.rb +11 -0
- data/plugins/guests/linux/plugin.rb +40 -0
- data/plugins/guests/openbsd/cap/halt.rb +16 -0
- data/plugins/guests/openbsd/guest.rb +11 -0
- data/plugins/guests/openbsd/plugin.rb +20 -0
- data/plugins/guests/pld/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/pld/guest.rb +11 -0
- data/plugins/guests/pld/plugin.rb +20 -0
- data/plugins/guests/redhat/cap/change_host_name.rb +18 -0
- data/plugins/guests/redhat/cap/configure_networks.rb +60 -0
- data/plugins/guests/redhat/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/redhat/guest.rb +11 -0
- data/plugins/guests/redhat/plugin.rb +30 -0
- data/plugins/guests/solaris/cap/change_host_name.rb +17 -0
- data/plugins/guests/solaris/cap/configure_networks.rb +25 -0
- data/plugins/guests/solaris/cap/halt.rb +21 -0
- data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +28 -0
- data/plugins/guests/solaris/config.rb +18 -0
- data/plugins/guests/solaris/guest.rb +14 -0
- data/plugins/guests/solaris/plugin.rb +40 -0
- data/plugins/guests/suse/cap/change_host_name.rb +18 -0
- data/plugins/guests/suse/cap/network_scripts_dir.rb +11 -0
- data/plugins/guests/suse/guest.rb +11 -0
- data/plugins/guests/suse/plugin.rb +25 -0
- data/plugins/guests/ubuntu/cap/change_host_name.rb +23 -0
- data/plugins/guests/ubuntu/guest.rb +32 -0
- data/plugins/guests/ubuntu/plugin.rb +20 -0
- data/plugins/hosts/arch/host.rb +68 -0
- data/plugins/hosts/arch/plugin.rb +15 -0
- data/plugins/hosts/bsd/host.rb +102 -0
- data/plugins/hosts/bsd/plugin.rb +15 -0
- data/plugins/hosts/fedora/host.rb +51 -0
- data/plugins/hosts/fedora/plugin.rb +15 -0
- data/plugins/hosts/freebsd/host.rb +43 -0
- data/plugins/hosts/freebsd/plugin.rb +15 -0
- data/plugins/hosts/gentoo/host.rb +24 -0
- data/plugins/hosts/gentoo/plugin.rb +15 -0
- data/plugins/hosts/linux/host.rb +95 -0
- data/plugins/hosts/linux/plugin.rb +15 -0
- data/plugins/hosts/opensuse/host.rb +34 -0
- data/plugins/hosts/opensuse/plugin.rb +15 -0
- data/plugins/hosts/windows/host.rb +17 -0
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v1/config/nfs.rb +20 -0
- data/plugins/kernel_v1/config/package.rb +17 -0
- data/plugins/kernel_v1/config/ssh.rb +46 -0
- data/plugins/kernel_v1/config/vagrant.rb +31 -0
- data/plugins/kernel_v1/config/vm.rb +184 -0
- data/plugins/kernel_v1/plugin.rb +44 -0
- data/plugins/kernel_v2/config/nfs.rb +14 -0
- data/plugins/kernel_v2/config/package.rb +13 -0
- data/plugins/kernel_v2/config/ssh.rb +76 -0
- data/plugins/kernel_v2/config/ssh_connect.rb +40 -0
- data/plugins/kernel_v2/config/vagrant.rb +13 -0
- data/plugins/kernel_v2/config/vm.rb +416 -0
- data/plugins/kernel_v2/config/vm_provisioner.rb +55 -0
- data/plugins/kernel_v2/config/vm_subvm.rb +30 -0
- data/plugins/kernel_v2/plugin.rb +44 -0
- data/plugins/providers/virtualbox/action/boot.rb +49 -0
- data/plugins/providers/virtualbox/action/check_accessible.rb +23 -0
- data/plugins/providers/virtualbox/action/check_created.rb +21 -0
- data/plugins/providers/virtualbox/action/check_guest_additions.rb +45 -0
- data/plugins/providers/virtualbox/action/check_running.rb +21 -0
- data/plugins/providers/virtualbox/action/check_virtualbox.rb +22 -0
- data/plugins/providers/virtualbox/action/clean_machine_folder.rb +43 -0
- data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +18 -0
- data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +31 -0
- data/plugins/providers/virtualbox/action/clear_shared_folders.rb +17 -0
- data/plugins/providers/virtualbox/action/created.rb +20 -0
- data/plugins/providers/virtualbox/action/customize.rb +36 -0
- data/plugins/providers/virtualbox/action/destroy.rb +19 -0
- data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +16 -0
- data/plugins/providers/virtualbox/action/discard_state.rb +20 -0
- data/plugins/providers/virtualbox/action/export.rb +57 -0
- data/plugins/providers/virtualbox/action/forced_halt.rb +25 -0
- data/plugins/providers/virtualbox/action/forward_ports.rb +87 -0
- data/plugins/providers/virtualbox/action/import.rb +51 -0
- data/plugins/providers/virtualbox/action/is_paused.rb +20 -0
- data/plugins/providers/virtualbox/action/is_running.rb +20 -0
- data/plugins/providers/virtualbox/action/is_saved.rb +20 -0
- data/plugins/providers/virtualbox/action/match_mac_address.rb +21 -0
- data/plugins/providers/virtualbox/action/message_already_running.rb +16 -0
- data/plugins/providers/virtualbox/action/message_not_created.rb +16 -0
- data/plugins/providers/virtualbox/action/message_not_running.rb +16 -0
- data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +17 -0
- data/plugins/providers/virtualbox/action/network.rb +410 -0
- data/plugins/providers/virtualbox/action/package.rb +20 -0
- data/plugins/providers/virtualbox/action/package_vagrantfile.rb +33 -0
- data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +35 -0
- data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +64 -0
- data/plugins/providers/virtualbox/action/prune_nfs_exports.rb +20 -0
- data/plugins/providers/virtualbox/action/resume.rb +25 -0
- data/plugins/providers/virtualbox/action/sane_defaults.rb +91 -0
- data/plugins/providers/virtualbox/action/set_name.rb +40 -0
- data/plugins/providers/virtualbox/action/setup_package_files.rb +51 -0
- data/plugins/providers/virtualbox/action/share_folders.rb +128 -0
- data/plugins/providers/virtualbox/action/suspend.rb +20 -0
- data/plugins/providers/virtualbox/action.rb +311 -0
- data/plugins/providers/virtualbox/config.rb +86 -0
- data/plugins/providers/virtualbox/driver/base.rb +360 -0
- data/plugins/providers/virtualbox/driver/meta.rb +142 -0
- data/plugins/providers/virtualbox/driver/version_4_0.rb +485 -0
- data/plugins/providers/virtualbox/driver/version_4_1.rb +485 -0
- data/plugins/providers/virtualbox/driver/version_4_2.rb +482 -0
- data/plugins/providers/virtualbox/model/forwarded_port.rb +58 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +92 -0
- data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +31 -0
- data/plugins/provisioners/ansible/config.rb +72 -0
- data/plugins/provisioners/ansible/plugin.rb +23 -0
- data/plugins/provisioners/ansible/provisioner.rb +45 -0
- data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +19 -0
- data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +14 -0
- data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +34 -0
- data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +24 -0
- data/plugins/provisioners/cfengine/config.rb +120 -0
- data/plugins/provisioners/cfengine/plugin.rb +42 -0
- data/plugins/provisioners/cfengine/provisioner.rb +136 -0
- data/plugins/provisioners/chef/config/base.rb +85 -0
- data/plugins/provisioners/chef/config/chef_client.rb +57 -0
- data/plugins/provisioners/chef/config/chef_solo.rb +87 -0
- data/plugins/provisioners/chef/plugin.rb +33 -0
- data/plugins/provisioners/chef/provisioner/base.rb +93 -0
- data/plugins/provisioners/chef/provisioner/chef_client.rb +107 -0
- data/plugins/provisioners/chef/provisioner/chef_solo.rb +192 -0
- data/plugins/provisioners/puppet/config/puppet.rb +70 -0
- data/plugins/provisioners/puppet/config/puppet_server.rb +16 -0
- data/plugins/provisioners/puppet/plugin.rb +33 -0
- data/plugins/provisioners/puppet/provisioner/puppet.rb +117 -0
- data/plugins/provisioners/puppet/provisioner/puppet_server.rb +67 -0
- data/plugins/provisioners/shell/config.rb +56 -0
- data/plugins/provisioners/shell/plugin.rb +23 -0
- data/plugins/provisioners/shell/provisioner.rb +86 -0
- data/tasks/acceptance.rake +113 -0
- data/tasks/bundler.rake +3 -0
- data/tasks/test.rake +20 -0
- data/templates/commands/init/Vagrantfile.erb +111 -0
- data/templates/commands/ssh_config/config.erb +16 -0
- data/templates/config/messages.erb +14 -0
- data/templates/config/validation_failed.erb +7 -0
- data/templates/guests/arch/network_dhcp.erb +4 -0
- data/templates/guests/arch/network_static.erb +6 -0
- data/templates/guests/debian/network_dhcp.erb +11 -0
- data/templates/guests/debian/network_static.erb +7 -0
- data/templates/guests/fedora/network_dhcp.erb +6 -0
- data/templates/guests/fedora/network_static.erb +13 -0
- data/templates/guests/freebsd/network_dhcp.erb +3 -0
- data/templates/guests/freebsd/network_static.erb +3 -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 +8 -0
- data/templates/locales/en.yml +1126 -0
- data/templates/nfs/exports.erb +5 -0
- data/templates/nfs/exports_freebsd.erb +5 -0
- data/templates/nfs/exports_linux.erb +5 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/templates/provisioners/chef_client/client.erb +32 -0
- data/templates/provisioners/chef_solo/solo.erb +25 -0
- data/templates/rgloader.rb +9 -0
- data/test/acceptance/base.rb +48 -0
- data/test/acceptance/box_test.rb +99 -0
- data/test/acceptance/destroy_test.rb +37 -0
- data/test/acceptance/halt_test.rb +72 -0
- data/test/acceptance/init_test.rb +33 -0
- 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 +17 -0
- data/test/acceptance/shared_folders_test.rb +84 -0
- 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 +46 -0
- data/test/acceptance/support/config.rb +42 -0
- data/test/acceptance/support/isolated_environment.rb +118 -0
- data/test/acceptance/support/matchers/have_color.rb +9 -0
- data/test/acceptance/support/matchers/match_output.rb +14 -0
- data/test/acceptance/support/matchers/succeed.rb +14 -0
- data/test/acceptance/support/network_tests.rb +29 -0
- data/test/acceptance/support/output.rb +95 -0
- data/test/acceptance/support/shared/base_context.rb +72 -0
- data/test/acceptance/support/shared/command_examples.rb +33 -0
- data/test/acceptance/support/virtualbox.rb +36 -0
- data/test/acceptance/suspend_test.rb +56 -0
- data/test/acceptance/up_basic_test.rb +33 -0
- data/test/acceptance/up_with_box_url.rb +40 -0
- data/test/acceptance/vagrant_test.rb +47 -0
- data/test/acceptance/version_test.rb +15 -0
- data/test/config/acceptance_boxes.yml +7 -0
- data/test/support/isolated_environment.rb +46 -0
- data/test/support/tempdir.rb +43 -0
- data/test/unit/base.rb +27 -0
- data/test/unit/support/dummy_provider.rb +16 -0
- data/test/unit/support/isolated_environment.rb +179 -0
- data/test/unit/support/shared/base_context.rb +104 -0
- data/test/unit/vagrant/action/builder_test.rb +242 -0
- data/test/unit/vagrant/action/builtin/call_test.rb +145 -0
- data/test/unit/vagrant/action/builtin/confirm_test.rb +36 -0
- data/test/unit/vagrant/action/builtin/env_set_test.rb +20 -0
- data/test/unit/vagrant/action/builtin/graceful_halt_test.rb +61 -0
- data/test/unit/vagrant/action/builtin/lock_test.rb +98 -0
- data/test/unit/vagrant/action/builtin/ssh_exec_test.rb +57 -0
- data/test/unit/vagrant/action/hook_test.rb +120 -0
- data/test/unit/vagrant/action/runner_test.rb +71 -0
- data/test/unit/vagrant/action/warden_test.rb +92 -0
- data/test/unit/vagrant/batch_action_test.rb +36 -0
- data/test/unit/vagrant/box_collection_test.rb +237 -0
- data/test/unit/vagrant/box_test.rb +122 -0
- data/test/unit/vagrant/cli_test.rb +27 -0
- data/test/unit/vagrant/config/loader_test.rb +184 -0
- data/test/unit/vagrant/config/v1/dummy_config_test.rb +24 -0
- data/test/unit/vagrant/config/v1/loader_test.rb +145 -0
- data/test/unit/vagrant/config/v1/root_test.rb +40 -0
- data/test/unit/vagrant/config/v2/dummy_config_test.rb +24 -0
- data/test/unit/vagrant/config/v2/loader_test.rb +151 -0
- data/test/unit/vagrant/config/v2/root_test.rb +97 -0
- data/test/unit/vagrant/config/v2/util_test.rb +21 -0
- data/test/unit/vagrant/config_test.rb +66 -0
- data/test/unit/vagrant/environment_test.rb +721 -0
- data/test/unit/vagrant/guest_test.rb +166 -0
- data/test/unit/vagrant/hosts_test.rb +37 -0
- data/test/unit/vagrant/machine_state_test.rb +26 -0
- data/test/unit/vagrant/machine_test.rb +384 -0
- data/test/unit/vagrant/plugin/v1/command_test.rb +143 -0
- data/test/unit/vagrant/plugin/v1/communicator_test.rb +9 -0
- data/test/unit/vagrant/plugin/v1/config_test.rb +50 -0
- data/test/unit/vagrant/plugin/v1/host_test.rb +5 -0
- data/test/unit/vagrant/plugin/v1/manager_test.rb +114 -0
- data/test/unit/vagrant/plugin/v1/plugin_test.rb +267 -0
- data/test/unit/vagrant/plugin/v1/provider_test.rb +18 -0
- data/test/unit/vagrant/plugin/v2/command_test.rb +238 -0
- data/test/unit/vagrant/plugin/v2/communicator_test.rb +9 -0
- data/test/unit/vagrant/plugin/v2/components_test.rb +17 -0
- data/test/unit/vagrant/plugin/v2/config_test.rb +60 -0
- data/test/unit/vagrant/plugin/v2/host_test.rb +5 -0
- data/test/unit/vagrant/plugin/v2/manager_test.rb +174 -0
- data/test/unit/vagrant/plugin/v2/plugin_test.rb +305 -0
- data/test/unit/vagrant/plugin/v2/provider_test.rb +18 -0
- data/test/unit/vagrant/registry_test.rb +128 -0
- data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
- data/test/unit/vagrant/util/downloader_test.rb +57 -0
- data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
- data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
- data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
- data/test/unit/vagrant/util/network_ip_test.rb +17 -0
- data/test/unit/vagrant/util/retryable_test.rb +106 -0
- data/test/unit/vagrant/util/safe_chdir_test.rb +43 -0
- data/test/unit/vagrant/util/scoped_hash_override_test.rb +48 -0
- data/test/unit/vagrant/util/ssh_test.rb +30 -0
- data/test/unit/vagrant/util/string_block_editor_test.rb +106 -0
- data/test/unit/vagrant/util/which_test.rb +43 -0
- data/test/unit/vagrant_test.rb +56 -0
- data/tnargav.gemspec +69 -0
- data/vagrant.gemspec +69 -0
- metadata +730 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
# Utility class which allows blocks of code to be marked as "busy"
|
|
4
|
+
# with a specified interrupt handler. During busy areas of code, it
|
|
5
|
+
# is often undesirable for SIGINTs to immediately kill the application.
|
|
6
|
+
# This class is a helper to cleanly register callbacks to handle this
|
|
7
|
+
# situation.
|
|
8
|
+
class Busy
|
|
9
|
+
@@registered = []
|
|
10
|
+
@@mutex = Mutex.new
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
# Mark a given block of code as a "busy" block of code, which will
|
|
14
|
+
# register a SIGINT handler for the duration of the block. When a
|
|
15
|
+
# SIGINT occurs, the `sig_callback` proc will be called. It is up
|
|
16
|
+
# to the callback to behave properly and exit the application.
|
|
17
|
+
def busy(sig_callback)
|
|
18
|
+
register(sig_callback)
|
|
19
|
+
return yield
|
|
20
|
+
ensure
|
|
21
|
+
unregister(sig_callback)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Registers a SIGINT handler. This typically is called from {busy}.
|
|
25
|
+
# Callbacks are only registered once, so calling this multiple times
|
|
26
|
+
# with the same callback has no consequence.
|
|
27
|
+
def register(sig_callback)
|
|
28
|
+
@@mutex.synchronize do
|
|
29
|
+
registered << sig_callback
|
|
30
|
+
registered.uniq!
|
|
31
|
+
|
|
32
|
+
# Register the handler if this is our first callback.
|
|
33
|
+
Signal.trap("INT") { fire_callbacks } if registered.length == 1
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Unregisters a SIGINT handler.
|
|
38
|
+
def unregister(sig_callback)
|
|
39
|
+
@@mutex.synchronize do
|
|
40
|
+
registered.delete(sig_callback)
|
|
41
|
+
|
|
42
|
+
# Remove the signal trap if no more registered callbacks exist
|
|
43
|
+
Signal.trap("INT", "DEFAULT") if registered.empty?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Fires all the registered callbacks.
|
|
48
|
+
def fire_callbacks
|
|
49
|
+
registered.reverse.each { |r| r.call }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Helper method to get access to the class variable. This is mostly
|
|
53
|
+
# exposed for tests. This shouldn't be mucked with directly, since it's
|
|
54
|
+
# structure may change at any time.
|
|
55
|
+
def registered; @@registered; end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Util
|
|
5
|
+
# Atomic counter implementation. This is useful for incrementing
|
|
6
|
+
# a counter which is guaranteed to only be used once in its class.
|
|
7
|
+
module Counter
|
|
8
|
+
def get_and_update_counter(name=nil)
|
|
9
|
+
name ||= :global
|
|
10
|
+
|
|
11
|
+
mutex.synchronize do
|
|
12
|
+
@__counter ||= Hash.new(1)
|
|
13
|
+
result = @__counter[name]
|
|
14
|
+
@__counter[name] += 1
|
|
15
|
+
result
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def mutex
|
|
20
|
+
@__counter_mutex ||= Mutex.new
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
require "vagrant/util/busy"
|
|
4
|
+
require "vagrant/util/subprocess"
|
|
5
|
+
|
|
6
|
+
module Vagrant
|
|
7
|
+
module Util
|
|
8
|
+
# This class downloads files using various protocols by subprocessing
|
|
9
|
+
# to cURL. cURL is a much more capable and complete download tool than
|
|
10
|
+
# a hand-rolled Ruby library, so we defer to it's expertise.
|
|
11
|
+
class Downloader
|
|
12
|
+
def initialize(source, destination, options=nil)
|
|
13
|
+
@logger = Log4r::Logger.new("vagrant::util::downloader")
|
|
14
|
+
@source = source.to_s
|
|
15
|
+
@destination = destination.to_s
|
|
16
|
+
|
|
17
|
+
# Get the various optional values
|
|
18
|
+
options ||= {}
|
|
19
|
+
@insecure = options[:insecure]
|
|
20
|
+
@ui = options[:ui]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# This executes the actual download, downloading the source file
|
|
24
|
+
# to the destination with the given opens used to initialize this
|
|
25
|
+
# class.
|
|
26
|
+
#
|
|
27
|
+
# If this method returns without an exception, the download
|
|
28
|
+
# succeeded. An exception will be raised if the download failed.
|
|
29
|
+
def download!
|
|
30
|
+
# Build the list of parameters to execute with cURL
|
|
31
|
+
options = [
|
|
32
|
+
"--fail",
|
|
33
|
+
"--location",
|
|
34
|
+
"--max-redirs", "10",
|
|
35
|
+
"--output", @destination
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
options << "--insecure" if @insecure
|
|
39
|
+
options << @source
|
|
40
|
+
|
|
41
|
+
# Specify some options for the subprocess
|
|
42
|
+
subprocess_options = {}
|
|
43
|
+
|
|
44
|
+
# If we're in Vagrant, then we use the packaged CA bundle
|
|
45
|
+
if Vagrant.in_installer?
|
|
46
|
+
subprocess_options[:env] ||= {}
|
|
47
|
+
subprocess_options[:env]["CURL_CA_BUNDLE"] =
|
|
48
|
+
File.expand_path("cacert.pem", ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"])
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# This variable can contain the proc that'll be sent to
|
|
52
|
+
# the subprocess execute.
|
|
53
|
+
data_proc = nil
|
|
54
|
+
|
|
55
|
+
if @ui
|
|
56
|
+
# If we're outputting progress, then setup the subprocess to
|
|
57
|
+
# tell us output so we can parse it out.
|
|
58
|
+
subprocess_options[:notify] = :stderr
|
|
59
|
+
|
|
60
|
+
progress_data = ""
|
|
61
|
+
progress_regexp = /(\r(.+?))\r/
|
|
62
|
+
|
|
63
|
+
# Setup the proc that'll receive the real-time data from
|
|
64
|
+
# the downloader.
|
|
65
|
+
data_proc = Proc.new do |type, data|
|
|
66
|
+
# Type will always be "stderr" because that is the only
|
|
67
|
+
# type of data we're subscribed for notifications.
|
|
68
|
+
|
|
69
|
+
# Accumulate progress_data
|
|
70
|
+
progress_data << data
|
|
71
|
+
|
|
72
|
+
while true
|
|
73
|
+
# If we have a full amount of column data (two "\r") then
|
|
74
|
+
# we report new progress reports. Otherwise, just keep
|
|
75
|
+
# accumulating.
|
|
76
|
+
match = progress_regexp.match(progress_data)
|
|
77
|
+
break if !match
|
|
78
|
+
data = match[2]
|
|
79
|
+
progress_data.gsub!(match[1], "")
|
|
80
|
+
|
|
81
|
+
# Ignore the first \r and split by whitespace to grab the columns
|
|
82
|
+
columns = data.strip.split(/\s+/)
|
|
83
|
+
|
|
84
|
+
# COLUMN DATA:
|
|
85
|
+
#
|
|
86
|
+
# 0 - % total
|
|
87
|
+
# 1 - Total size
|
|
88
|
+
# 2 - % received
|
|
89
|
+
# 3 - Received size
|
|
90
|
+
# 4 - % transferred
|
|
91
|
+
# 5 - Transferred size
|
|
92
|
+
# 6 - Average download speed
|
|
93
|
+
# 7 - Average upload speed
|
|
94
|
+
# 9 - Total time
|
|
95
|
+
# 9 - Time spent
|
|
96
|
+
# 10 - Time left
|
|
97
|
+
# 11 - Current speed
|
|
98
|
+
|
|
99
|
+
output = "Progress: #{columns[0]}% (Rate: #{columns[11]}/s, Estimated time remaining: #{columns[10]})"
|
|
100
|
+
@ui.clear_line
|
|
101
|
+
@ui.info(output, :new_line => false)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Add the subprocess options onto the options we'll execute with
|
|
107
|
+
options << subprocess_options
|
|
108
|
+
|
|
109
|
+
# Create the callback that is called if we are interrupted
|
|
110
|
+
interrupted = false
|
|
111
|
+
int_callback = Proc.new do
|
|
112
|
+
@logger.info("Downloader interrupted!")
|
|
113
|
+
interrupted = true
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
@logger.info("Downloader starting download: ")
|
|
117
|
+
@logger.info(" -- Source: #{@source}")
|
|
118
|
+
@logger.info(" -- Destination: #{@destination}")
|
|
119
|
+
|
|
120
|
+
# Execute!
|
|
121
|
+
result = Busy.busy(int_callback) do
|
|
122
|
+
Subprocess.execute("curl", *options, &data_proc)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# If the download was interrupted, then raise a specific error
|
|
126
|
+
raise Errors::DownloaderInterrupted if interrupted
|
|
127
|
+
|
|
128
|
+
# If we're outputting to the UI, clear the output to
|
|
129
|
+
# avoid lingering progress meters.
|
|
130
|
+
@ui.clear_line if @ui
|
|
131
|
+
|
|
132
|
+
# If it didn't exit successfully, we need to parse the data and
|
|
133
|
+
# show an error message.
|
|
134
|
+
if result.exit_code != 0
|
|
135
|
+
@logger.warn("Downloader exit code: #{result.exit_code}")
|
|
136
|
+
parts = result.stderr.split(/\n*curl:\s+\(\d+\)\s*/, 2)
|
|
137
|
+
parts[1] ||= ""
|
|
138
|
+
raise Errors::DownloaderError, :message => parts[1].chomp
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Everything succeeded
|
|
142
|
+
true
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# This is an "interface" that should be implemented by any digest class
|
|
2
|
+
# passed into FileChecksum. Note that this isn't strictly enforced at
|
|
3
|
+
# the moment, and this class isn't directly used. It is merely here for
|
|
4
|
+
# documentation of structure of the class.
|
|
5
|
+
class DigestClass
|
|
6
|
+
def update(string); end
|
|
7
|
+
def hexdigest; end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class FileChecksum
|
|
11
|
+
BUFFER_SIZE = 1024
|
|
12
|
+
|
|
13
|
+
# Initializes an object to calculate the checksum of a file. The given
|
|
14
|
+
# ``digest_klass`` should implement the ``DigestClass`` interface. Note
|
|
15
|
+
# that the built-in Ruby digest classes duck type this properly:
|
|
16
|
+
# Digest::MD5, Digest::SHA1, etc.
|
|
17
|
+
def initialize(path, digest_klass)
|
|
18
|
+
@digest_klass = digest_klass
|
|
19
|
+
@path = path
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# This calculates the checksum of the file and returns it as a
|
|
23
|
+
# string.
|
|
24
|
+
#
|
|
25
|
+
# @return [String]
|
|
26
|
+
def checksum
|
|
27
|
+
digest= @digest_klass.new
|
|
28
|
+
|
|
29
|
+
File.open(@path, "r") do |f|
|
|
30
|
+
while !f.eof
|
|
31
|
+
buf = f.readpartial(BUFFER_SIZE)
|
|
32
|
+
digest.update(buf)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
return digest.hexdigest
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
# A hash with indifferent access. Mostly taken from Thor/Rails (thanks).
|
|
4
|
+
# Normally I'm not a fan of using an indifferent access hash since Symbols
|
|
5
|
+
# are basically memory leaks in Ruby, but since Vagrant is typically a quick
|
|
6
|
+
# one-off binary run and it doesn't use too many hash keys where this is
|
|
7
|
+
# used, the effect should be minimal.
|
|
8
|
+
#
|
|
9
|
+
# hash[:foo] #=> 'bar'
|
|
10
|
+
# hash['foo'] #=> 'bar'
|
|
11
|
+
#
|
|
12
|
+
class HashWithIndifferentAccess < ::Hash
|
|
13
|
+
def initialize(hash={}, &block)
|
|
14
|
+
super(&block)
|
|
15
|
+
|
|
16
|
+
hash.each do |key, value|
|
|
17
|
+
self[convert_key(key)] = value
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def [](key)
|
|
22
|
+
super(convert_key(key))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def []=(key, value)
|
|
26
|
+
super(convert_key(key), value)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def delete(key)
|
|
30
|
+
super(convert_key(key))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def values_at(*indices)
|
|
34
|
+
indices.collect { |key| self[convert_key(key)] }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def merge(other)
|
|
38
|
+
dup.merge!(other)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def merge!(other)
|
|
42
|
+
other.each do |key, value|
|
|
43
|
+
self[convert_key(key)] = value
|
|
44
|
+
end
|
|
45
|
+
self
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def key?(key)
|
|
49
|
+
super(convert_key(key))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
alias_method :include?, :key?
|
|
53
|
+
alias_method :has_key?, :key?
|
|
54
|
+
alias_method :member?, :key?
|
|
55
|
+
|
|
56
|
+
protected
|
|
57
|
+
|
|
58
|
+
def convert_key(key)
|
|
59
|
+
key.is_a?(Symbol) ? key.to_s : key
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require "socket"
|
|
2
|
+
require "timeout"
|
|
3
|
+
|
|
4
|
+
module Vagrant
|
|
5
|
+
module Util
|
|
6
|
+
# Contains the method {#is_ruby_open?} to check if a port is open
|
|
7
|
+
# (listening) or closed (not in use). This method isn't completely
|
|
8
|
+
# fool-proof, but it works enough of the time to be useful.
|
|
9
|
+
module IsPortOpen
|
|
10
|
+
# Checks if a port is open (listening) on a given host and port.
|
|
11
|
+
#
|
|
12
|
+
# @param [String] host Hostname or IP address.
|
|
13
|
+
# @param [Integer] port Port to check.
|
|
14
|
+
# @return [Boolean] `true` if the port is open (listening), `false`
|
|
15
|
+
# otherwise.
|
|
16
|
+
def is_port_open?(host, port)
|
|
17
|
+
# We wrap this in a timeout because once in awhile the TCPSocket
|
|
18
|
+
# _will_ hang, but this signals that the port is closed.
|
|
19
|
+
Timeout.timeout(1) do
|
|
20
|
+
# Attempt to make a connection
|
|
21
|
+
s = TCPSocket.new(host, port)
|
|
22
|
+
|
|
23
|
+
# A connection was made! Properly clean up the socket, not caring
|
|
24
|
+
# at all if any exception is raised, because we already know the
|
|
25
|
+
# result.
|
|
26
|
+
s.close rescue nil
|
|
27
|
+
|
|
28
|
+
# The port is open if we reached this point, since we were able
|
|
29
|
+
# to connect.
|
|
30
|
+
return true
|
|
31
|
+
end
|
|
32
|
+
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH
|
|
33
|
+
# Any of the above exceptions signal that the port is closed.
|
|
34
|
+
return false
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
module LineEndingHelpers
|
|
4
|
+
# Converts line endings to unix-style line endings in the
|
|
5
|
+
# given string.
|
|
6
|
+
#
|
|
7
|
+
# @param [String] string Original string
|
|
8
|
+
# @return [String] The fixed string
|
|
9
|
+
def dos_to_unix(string)
|
|
10
|
+
string.gsub("\r\n", "\n")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
module NetworkIP
|
|
4
|
+
# Returns the network address of the given IP and subnet.
|
|
5
|
+
#
|
|
6
|
+
# @return [String]
|
|
7
|
+
def network_address(ip, subnet)
|
|
8
|
+
ip = ip_parts(ip)
|
|
9
|
+
netmask = ip_parts(subnet)
|
|
10
|
+
|
|
11
|
+
# Bitwise-AND each octet to get the network address
|
|
12
|
+
# in octets and join each part with a period to get
|
|
13
|
+
# the resulting network address.
|
|
14
|
+
ip.map { |part| part & netmask.shift }.join(".")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
# Splits an IP into the four octets and returns each as an
|
|
20
|
+
# integer in an array.
|
|
21
|
+
#
|
|
22
|
+
# @return [Array<Integer>]
|
|
23
|
+
def ip_parts(ip)
|
|
24
|
+
ip.split(".").map { |i| i.to_i }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'rbconfig'
|
|
2
|
+
|
|
3
|
+
require "vagrant/util/subprocess"
|
|
4
|
+
|
|
5
|
+
module Vagrant
|
|
6
|
+
module Util
|
|
7
|
+
# This class just contains some platform checking code.
|
|
8
|
+
class Platform
|
|
9
|
+
class << self
|
|
10
|
+
def cygwin?
|
|
11
|
+
return true if ENV["VAGRANT_DETECTED_OS"] &&
|
|
12
|
+
ENV["VAGRANT_DETECTED_OS"].downcase.include?("cygwin")
|
|
13
|
+
|
|
14
|
+
platform.include?("cygwin")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
[:darwin, :bsd, :freebsd, :linux, :solaris].each do |type|
|
|
18
|
+
define_method("#{type}?") do
|
|
19
|
+
platform.include?(type.to_s)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def windows?
|
|
24
|
+
%W[mingw mswin].each do |text|
|
|
25
|
+
return true if platform.include?(text)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# This takes any path and converts it to a full-length Windows
|
|
32
|
+
# path on Windows machines in Cygwin.
|
|
33
|
+
#
|
|
34
|
+
# @return [String]
|
|
35
|
+
def cygwin_windows_path(path)
|
|
36
|
+
return path if !cygwin?
|
|
37
|
+
|
|
38
|
+
process = Subprocess.execute("cygpath", "-w", "-l", "-a", path.to_s)
|
|
39
|
+
process.stdout.chomp
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Returns a boolean noting whether the terminal supports color.
|
|
43
|
+
# output.
|
|
44
|
+
def terminal_supports_colors?
|
|
45
|
+
if windows?
|
|
46
|
+
return ENV.has_key?("ANSICON") || cygwin?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def platform
|
|
53
|
+
RbConfig::CONFIG["host_os"].downcase
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "log4r"
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Util
|
|
5
|
+
module Retryable
|
|
6
|
+
# Retries a given block a specified number of times in the
|
|
7
|
+
# event the specified exception is raised. If the retries
|
|
8
|
+
# run out, the final exception is raised.
|
|
9
|
+
#
|
|
10
|
+
# This code is adapted slightly from the following blog post:
|
|
11
|
+
# http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/
|
|
12
|
+
def retryable(opts=nil)
|
|
13
|
+
logger = nil
|
|
14
|
+
opts = { :tries => 1, :on => Exception }.merge(opts || {})
|
|
15
|
+
|
|
16
|
+
begin
|
|
17
|
+
return yield
|
|
18
|
+
rescue *opts[:on] => e
|
|
19
|
+
if (opts[:tries] -= 1) > 0
|
|
20
|
+
logger = Log4r::Logger.new("vagrant::util::retryable")
|
|
21
|
+
logger.info("Retryable exception raised: #{e.inspect}")
|
|
22
|
+
|
|
23
|
+
sleep opts[:sleep].to_f if opts[:sleep]
|
|
24
|
+
retry
|
|
25
|
+
end
|
|
26
|
+
raise
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
3
|
+
module Vagrant
|
|
4
|
+
module Util
|
|
5
|
+
class SafeChdir
|
|
6
|
+
@@chdir_lock = Mutex.new
|
|
7
|
+
|
|
8
|
+
# Safely changes directory of this process by putting a lock around
|
|
9
|
+
# it so that it is thread safe. This will yield a block and when the
|
|
10
|
+
# block exits it changes back to the original directory.
|
|
11
|
+
#
|
|
12
|
+
# @param [String] dir Dir to change to temporarily
|
|
13
|
+
def self.safe_chdir(dir)
|
|
14
|
+
lock = @@chdir_lock
|
|
15
|
+
|
|
16
|
+
begin
|
|
17
|
+
@@chdir_lock.synchronize {}
|
|
18
|
+
rescue ThreadError
|
|
19
|
+
# If we already hold the lock, just create a new lock so we
|
|
20
|
+
# definitely don't block and don't get an error.
|
|
21
|
+
lock = Mutex.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
lock.synchronize do
|
|
25
|
+
Dir.chdir(dir) do
|
|
26
|
+
return yield
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
# This module provies a `safe_exec` method which is a drop-in
|
|
4
|
+
# replacement for `Kernel.exec` which addresses a specific issue
|
|
5
|
+
# which manifests on OS X 10.5 (GH-51) and perhaps other operating systems.
|
|
6
|
+
# This issue causes `exec` to fail if there is more than one system
|
|
7
|
+
# thread. In that case, `safe_exec` automatically falls back to
|
|
8
|
+
# forking.
|
|
9
|
+
class SafeExec
|
|
10
|
+
def self.exec(command, *args)
|
|
11
|
+
# Create a list of things to rescue from. Since this is OS
|
|
12
|
+
# specific, we need to do some defined? checks here to make
|
|
13
|
+
# sure they exist.
|
|
14
|
+
rescue_from = []
|
|
15
|
+
rescue_from << Errno::EOPNOTSUPP if defined?(Errno::EOPNOTSUPP)
|
|
16
|
+
rescue_from << Errno::E045 if defined?(Errno::E045)
|
|
17
|
+
rescue_from << SystemCallError
|
|
18
|
+
|
|
19
|
+
fork_instead = false
|
|
20
|
+
begin
|
|
21
|
+
pid = nil
|
|
22
|
+
pid = fork if fork_instead
|
|
23
|
+
Kernel.exec(command, *args) if pid.nil?
|
|
24
|
+
Process.wait(pid) if pid
|
|
25
|
+
rescue *rescue_from
|
|
26
|
+
# We retried already, raise the issue and be done
|
|
27
|
+
raise if fork_instead
|
|
28
|
+
|
|
29
|
+
# The error manifested itself, retry with a fork.
|
|
30
|
+
fork_instead = true
|
|
31
|
+
retry
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
# This module provides a `safe_puts` method which outputs to
|
|
4
|
+
# the given IO object, and rescues any broken pipe errors and
|
|
5
|
+
# ignores them. This is useful in cases where you're outputting
|
|
6
|
+
# to stdout, for example, and the stdout is closed, but you want to
|
|
7
|
+
# keep running.
|
|
8
|
+
module SafePuts
|
|
9
|
+
# Uses `puts` on the given IO object and safely ignores any
|
|
10
|
+
# Errno::EPIPE.
|
|
11
|
+
#
|
|
12
|
+
# @param [String] message Message to output.
|
|
13
|
+
# @param [Hash] opts Options hash.
|
|
14
|
+
def safe_puts(message=nil, opts=nil)
|
|
15
|
+
message ||= ""
|
|
16
|
+
opts = {
|
|
17
|
+
:io => $stdout,
|
|
18
|
+
:printer => :puts
|
|
19
|
+
}.merge(opts || {})
|
|
20
|
+
|
|
21
|
+
begin
|
|
22
|
+
opts[:io].send(opts[:printer], message)
|
|
23
|
+
rescue Errno::EPIPE
|
|
24
|
+
# This is what makes this a `safe` puts.
|
|
25
|
+
return
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Vagrant
|
|
2
|
+
module Util
|
|
3
|
+
# This allows for hash options to be overridden by a scope key
|
|
4
|
+
# prefix. An example speaks best here. Imagine the following hash:
|
|
5
|
+
#
|
|
6
|
+
# original = {
|
|
7
|
+
# :id => "foo",
|
|
8
|
+
# :mitchellh__id => "bar",
|
|
9
|
+
# :mitchellh__other => "foo"
|
|
10
|
+
# }
|
|
11
|
+
#
|
|
12
|
+
# scoped = scoped_hash_override(original, "mitchellh")
|
|
13
|
+
#
|
|
14
|
+
# scoped == {
|
|
15
|
+
# :id => "bar",
|
|
16
|
+
# :other => "foo"
|
|
17
|
+
# }
|
|
18
|
+
#
|
|
19
|
+
module ScopedHashOverride
|
|
20
|
+
def scoped_hash_override(original, scope)
|
|
21
|
+
# Convert the scope to a string in case a symbol was given since
|
|
22
|
+
# we use string comparisons for everything.
|
|
23
|
+
scope = scope.to_s
|
|
24
|
+
|
|
25
|
+
# Shallow copy the hash for the result
|
|
26
|
+
result = original.dup
|
|
27
|
+
|
|
28
|
+
original.each do |key, value|
|
|
29
|
+
parts = key.to_s.split("__", 2)
|
|
30
|
+
|
|
31
|
+
# If we don't have the proper parts, then bail
|
|
32
|
+
next if parts.length != 2
|
|
33
|
+
|
|
34
|
+
# If this is our scope, then override
|
|
35
|
+
if parts[0] == scope
|
|
36
|
+
result[parts[1].to_sym] = value
|
|
37
|
+
result.delete(key)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
result
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|