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,18 @@
|
|
|
1
|
+
require "vagrant"
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module CommandSuspend
|
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
|
6
|
+
name "suspend command"
|
|
7
|
+
description <<-DESC
|
|
8
|
+
The `suspend` command suspends execution and puts it to sleep.
|
|
9
|
+
The command `resume` returns it to running status.
|
|
10
|
+
DESC
|
|
11
|
+
|
|
12
|
+
command("suspend") do
|
|
13
|
+
require File.expand_path("../command", __FILE__)
|
|
14
|
+
Command
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
|
|
3
|
+
require "vagrant"
|
|
4
|
+
|
|
5
|
+
require File.expand_path("../start_mixins", __FILE__)
|
|
6
|
+
|
|
7
|
+
module VagrantPlugins
|
|
8
|
+
module CommandUp
|
|
9
|
+
class Command < Vagrant.plugin("2", :command)
|
|
10
|
+
include StartMixins
|
|
11
|
+
|
|
12
|
+
def execute
|
|
13
|
+
options = {}
|
|
14
|
+
options[:parallel] = true
|
|
15
|
+
|
|
16
|
+
opts = OptionParser.new do |o|
|
|
17
|
+
o.banner = "Usage: vagrant up [vm-name] [options] [-h]"
|
|
18
|
+
o.separator ""
|
|
19
|
+
|
|
20
|
+
build_start_options(o, options)
|
|
21
|
+
|
|
22
|
+
o.on("--[no-]parallel",
|
|
23
|
+
"Enable or disable parallelism if provider supports it.") do |parallel|
|
|
24
|
+
options[:parallel] = parallel
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
o.on("--provider provider", String,
|
|
28
|
+
"Back the machine with a specific provider.") do |provider|
|
|
29
|
+
options[:provider] = provider
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Parse the options
|
|
34
|
+
argv = parse_options(opts)
|
|
35
|
+
return if !argv
|
|
36
|
+
|
|
37
|
+
# Go over each VM and bring it up
|
|
38
|
+
@logger.debug("'Up' each target VM...")
|
|
39
|
+
|
|
40
|
+
# Build up the batch job of what we'll do
|
|
41
|
+
@env.batch(options[:parallel]) do |batch|
|
|
42
|
+
with_target_vms(argv, :provider => options[:provider]) do |machine|
|
|
43
|
+
@env.ui.info(I18n.t(
|
|
44
|
+
"vagrant.commands.up.upping",
|
|
45
|
+
:name => machine.name,
|
|
46
|
+
:provider => machine.provider_name))
|
|
47
|
+
|
|
48
|
+
batch.action(machine, :up, options)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Success, exit status 0
|
|
53
|
+
0
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require "vagrant"
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module CommandUp
|
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
|
6
|
+
name "up command"
|
|
7
|
+
description <<-DESC
|
|
8
|
+
The `up` command brings the virtual environment up and running.
|
|
9
|
+
DESC
|
|
10
|
+
|
|
11
|
+
command("up") do
|
|
12
|
+
require File.expand_path("../command", __FILE__)
|
|
13
|
+
Command
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module VagrantPlugins
|
|
2
|
+
module CommandUp
|
|
3
|
+
module StartMixins
|
|
4
|
+
# This adds the standard `start` command line flags to the given
|
|
5
|
+
# OptionParser, storing the result in the `options` dictionary.
|
|
6
|
+
#
|
|
7
|
+
# @param [OptionParser] parser
|
|
8
|
+
# @param [Hash] options
|
|
9
|
+
def build_start_options(parser, options)
|
|
10
|
+
# Setup the defaults
|
|
11
|
+
options[:provision_enabled] = true
|
|
12
|
+
options[:provision_types] = nil
|
|
13
|
+
|
|
14
|
+
# Add the options
|
|
15
|
+
parser.on("--[no-]provision", "Enable or disable provisioning") do |p|
|
|
16
|
+
options[:provision_enabled] = p
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
parser.on("--provision-with x,y,z", Array,
|
|
20
|
+
"Enable only certain provisioners, by type.") do |list|
|
|
21
|
+
options[:provision_types] = list.map { |type| type.to_sym }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
require 'logger'
|
|
2
|
+
require 'pathname'
|
|
3
|
+
require 'stringio'
|
|
4
|
+
require 'timeout'
|
|
5
|
+
|
|
6
|
+
require 'log4r'
|
|
7
|
+
require 'net/ssh'
|
|
8
|
+
require 'net/scp'
|
|
9
|
+
|
|
10
|
+
require 'vagrant/util/ansi_escape_code_remover'
|
|
11
|
+
require 'vagrant/util/file_mode'
|
|
12
|
+
require 'vagrant/util/platform'
|
|
13
|
+
require 'vagrant/util/retryable'
|
|
14
|
+
require 'vagrant/util/ssh'
|
|
15
|
+
|
|
16
|
+
module VagrantPlugins
|
|
17
|
+
module CommunicatorSSH
|
|
18
|
+
# This class provides communication with the VM via SSH.
|
|
19
|
+
class Communicator < Vagrant.plugin("2", :communicator)
|
|
20
|
+
include Vagrant::Util::ANSIEscapeCodeRemover
|
|
21
|
+
include Vagrant::Util::Retryable
|
|
22
|
+
|
|
23
|
+
def self.match?(machine)
|
|
24
|
+
# All machines are currently expected to have SSH.
|
|
25
|
+
true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def initialize(machine)
|
|
29
|
+
@machine = machine
|
|
30
|
+
@logger = Log4r::Logger.new("vagrant::communication::ssh")
|
|
31
|
+
@connection = nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def ready?
|
|
35
|
+
@logger.debug("Checking whether SSH is ready...")
|
|
36
|
+
|
|
37
|
+
# Attempt to connect. This will raise an exception if it fails.
|
|
38
|
+
connect
|
|
39
|
+
|
|
40
|
+
# If we reached this point then we successfully connected
|
|
41
|
+
@logger.info("SSH is ready!")
|
|
42
|
+
true
|
|
43
|
+
rescue Vagrant::Errors::VagrantError => e
|
|
44
|
+
# We catch a `VagrantError` which would signal that something went
|
|
45
|
+
# wrong expectedly in the `connect`, which means we didn't connect.
|
|
46
|
+
@logger.info("SSH not up: #{e.inspect}")
|
|
47
|
+
return false
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def execute(command, opts=nil, &block)
|
|
51
|
+
opts = {
|
|
52
|
+
:error_check => true,
|
|
53
|
+
:error_class => Vagrant::Errors::VagrantError,
|
|
54
|
+
:error_key => :ssh_bad_exit_status,
|
|
55
|
+
:command => command,
|
|
56
|
+
:sudo => false
|
|
57
|
+
}.merge(opts || {})
|
|
58
|
+
|
|
59
|
+
# Connect via SSH and execute the command in the shell.
|
|
60
|
+
exit_status = connect do |connection|
|
|
61
|
+
shell_execute(connection, command, opts[:sudo], &block)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Check for any errors
|
|
65
|
+
if opts[:error_check] && exit_status != 0
|
|
66
|
+
# The error classes expect the translation key to be _key,
|
|
67
|
+
# but that makes for an ugly configuration parameter, so we
|
|
68
|
+
# set it here from `error_key`
|
|
69
|
+
error_opts = opts.merge(:_key => opts[:error_key])
|
|
70
|
+
raise opts[:error_class], error_opts
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Return the exit status
|
|
74
|
+
exit_status
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def sudo(command, opts=nil, &block)
|
|
78
|
+
# Run `execute` but with the `sudo` option.
|
|
79
|
+
opts = { :sudo => true }.merge(opts || {})
|
|
80
|
+
execute(command, opts, &block)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def download(from, to=nil)
|
|
84
|
+
@logger.debug("Downloading: #{from} to #{to}")
|
|
85
|
+
|
|
86
|
+
scp_connect do |scp|
|
|
87
|
+
scp.download!(from, to)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test(command, opts=nil)
|
|
92
|
+
opts = { :error_check => false }.merge(opts || {})
|
|
93
|
+
execute(command, opts) == 0
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def upload(from, to)
|
|
97
|
+
@logger.debug("Uploading: #{from} to #{to}")
|
|
98
|
+
|
|
99
|
+
scp_connect do |scp|
|
|
100
|
+
if File.directory?(from)
|
|
101
|
+
# Recurisvely upload directories
|
|
102
|
+
scp.upload!(from, to, :recursive => true)
|
|
103
|
+
else
|
|
104
|
+
# Open file read only to fix issue [GH-1036]
|
|
105
|
+
scp.upload!(File.open(from, "r"), to)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
rescue RuntimeError => e
|
|
109
|
+
# Net::SCP raises a runtime error for this so the only way we have
|
|
110
|
+
# to really catch this exception is to check the message to see if
|
|
111
|
+
# it is something we care about. If it isn't, we re-raise.
|
|
112
|
+
raise if e.message !~ /Permission denied/
|
|
113
|
+
|
|
114
|
+
# Otherwise, it is a permission denied, so let's raise a proper
|
|
115
|
+
# exception
|
|
116
|
+
raise Vagrant::Errors::SCPPermissionDenied, :path => from.to_s
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
protected
|
|
120
|
+
|
|
121
|
+
# Opens an SSH connection and yields it to a block.
|
|
122
|
+
def connect
|
|
123
|
+
if @connection && !@connection.closed?
|
|
124
|
+
# There is a chance that the socket is closed despite us checking
|
|
125
|
+
# 'closed?' above. To test this we need to send data through the
|
|
126
|
+
# socket.
|
|
127
|
+
begin
|
|
128
|
+
@connection.exec!("")
|
|
129
|
+
rescue Exception => e
|
|
130
|
+
@logger.info("Connection errored, not re-using. Will reconnect.")
|
|
131
|
+
@logger.debug(e.inspect)
|
|
132
|
+
@connection = nil
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# If the @connection is still around, then it is valid,
|
|
136
|
+
# and we use it.
|
|
137
|
+
if @connection
|
|
138
|
+
@logger.debug("Re-using SSH connection.")
|
|
139
|
+
return yield @connection if block_given?
|
|
140
|
+
return
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Get the SSH info for the machine, raise an exception if the
|
|
145
|
+
# provider is saying that SSH is not ready.
|
|
146
|
+
ssh_info = @machine.ssh_info
|
|
147
|
+
raise Vagrant::Errors::SSHNotReady if ssh_info.nil?
|
|
148
|
+
|
|
149
|
+
# Build the options we'll use to initiate the connection via Net::SSH
|
|
150
|
+
opts = {
|
|
151
|
+
:auth_methods => ["none", "publickey", "hostbased", "password"],
|
|
152
|
+
:config => false,
|
|
153
|
+
:forward_agent => ssh_info[:forward_agent],
|
|
154
|
+
:keys => [ssh_info[:private_key_path]],
|
|
155
|
+
:keys_only => true,
|
|
156
|
+
:paranoid => false,
|
|
157
|
+
:port => ssh_info[:port],
|
|
158
|
+
:user_known_hosts_file => []
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Check that the private key permissions are valid
|
|
162
|
+
Vagrant::Util::SSH.check_key_permissions(Pathname.new(ssh_info[:private_key_path]))
|
|
163
|
+
|
|
164
|
+
# Connect to SSH, giving it a few tries
|
|
165
|
+
connection = nil
|
|
166
|
+
begin
|
|
167
|
+
# These are the exceptions that we retry because they represent
|
|
168
|
+
# errors that are generally fixed from a retry and don't
|
|
169
|
+
# necessarily represent immediate failure cases.
|
|
170
|
+
exceptions = [
|
|
171
|
+
Errno::EACCES,
|
|
172
|
+
Errno::EADDRINUSE,
|
|
173
|
+
Errno::ECONNREFUSED,
|
|
174
|
+
Errno::ECONNRESET,
|
|
175
|
+
Errno::EHOSTUNREACH,
|
|
176
|
+
Net::SSH::Disconnect,
|
|
177
|
+
Timeout::Error
|
|
178
|
+
]
|
|
179
|
+
|
|
180
|
+
retries = @machine.config.ssh.max_tries
|
|
181
|
+
timeout = @machine.config.ssh.timeout
|
|
182
|
+
|
|
183
|
+
@logger.info("Attempting SSH. Retries: #{retries}. Timeout: #{timeout}")
|
|
184
|
+
connection = retryable(:tries => retries, :on => exceptions) do
|
|
185
|
+
Timeout.timeout(timeout) do
|
|
186
|
+
begin
|
|
187
|
+
# This logger will get the Net-SSH log data for us.
|
|
188
|
+
ssh_logger_io = StringIO.new
|
|
189
|
+
ssh_logger = Logger.new(ssh_logger_io)
|
|
190
|
+
|
|
191
|
+
# Setup logging for connections
|
|
192
|
+
connect_opts = opts.merge({
|
|
193
|
+
:logger => ssh_logger,
|
|
194
|
+
:verbose => :debug
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
@logger.info("Attempting to connect to SSH...")
|
|
198
|
+
@logger.info(" - Host: #{ssh_info[:host]}")
|
|
199
|
+
@logger.info(" - Port: #{ssh_info[:port]}")
|
|
200
|
+
@logger.info(" - Username: #{ssh_info[:username]}")
|
|
201
|
+
@logger.info(" - Key Path: #{ssh_info[:private_key_path]}")
|
|
202
|
+
|
|
203
|
+
Net::SSH.start(ssh_info[:host], ssh_info[:username], connect_opts)
|
|
204
|
+
ensure
|
|
205
|
+
# Make sure we output the connection log
|
|
206
|
+
@logger.debug("== Net-SSH connection debug-level log START ==")
|
|
207
|
+
@logger.debug(ssh_logger_io.string)
|
|
208
|
+
@logger.debug("== Net-SSH connection debug-level log END ==")
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
rescue Errno::EACCES
|
|
213
|
+
# This happens on connect() for unknown reasons yet...
|
|
214
|
+
raise Vagrant::Errors::SSHConnectEACCES
|
|
215
|
+
rescue Errno::ETIMEDOUT, Timeout::Error
|
|
216
|
+
# This happens if we continued to timeout when attempting to connect.
|
|
217
|
+
raise Vagrant::Errors::SSHConnectionTimeout
|
|
218
|
+
rescue Net::SSH::AuthenticationFailed
|
|
219
|
+
# This happens if authentication failed. We wrap the error in our
|
|
220
|
+
# own exception.
|
|
221
|
+
raise Vagrant::Errors::SSHAuthenticationFailed
|
|
222
|
+
rescue Net::SSH::Disconnect
|
|
223
|
+
# This happens if the remote server unexpectedly closes the
|
|
224
|
+
# connection. This is usually raised when SSH is running on the
|
|
225
|
+
# other side but can't properly setup a connection. This is
|
|
226
|
+
# usually a server-side issue.
|
|
227
|
+
raise Vagrant::Errors::SSHDisconnected
|
|
228
|
+
rescue Errno::ECONNREFUSED
|
|
229
|
+
# This is raised if we failed to connect the max amount of times
|
|
230
|
+
raise Vagrant::Errors::SSHConnectionRefused
|
|
231
|
+
rescue Errno::ECONNRESET
|
|
232
|
+
# This is raised if we failed to connect the max number of times
|
|
233
|
+
# due to an ECONNRESET.
|
|
234
|
+
raise Vagrant::Errors::SSHConnectionReset
|
|
235
|
+
rescue Errno::EHOSTDOWN
|
|
236
|
+
# This is raised if we get an ICMP DestinationUnknown error.
|
|
237
|
+
raise Vagrant::Errors::SSHHostDown
|
|
238
|
+
rescue NotImplementedError
|
|
239
|
+
# This is raised if a private key type that Net-SSH doesn't support
|
|
240
|
+
# is used. Show a nicer error.
|
|
241
|
+
raise Vagrant::Errors::SSHKeyTypeNotSupported
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
@connection = connection
|
|
245
|
+
|
|
246
|
+
# Yield the connection that is ready to be used and
|
|
247
|
+
# return the value of the block
|
|
248
|
+
return yield connection if block_given?
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Executes the command on an SSH connection within a login shell.
|
|
252
|
+
def shell_execute(connection, command, sudo=false)
|
|
253
|
+
@logger.info("Execute: #{command} (sudo=#{sudo.inspect})")
|
|
254
|
+
exit_status = nil
|
|
255
|
+
|
|
256
|
+
# Determine the shell to execute. If we are using `sudo` then we
|
|
257
|
+
# need to wrap the shell in a `sudo` call.
|
|
258
|
+
shell = @machine.config.ssh.shell
|
|
259
|
+
shell = "sudo -H #{shell}" if sudo
|
|
260
|
+
|
|
261
|
+
# Open the channel so we can execute or command
|
|
262
|
+
channel = connection.open_channel do |ch|
|
|
263
|
+
ch.exec(shell) do |ch2, _|
|
|
264
|
+
# Setup the channel callbacks so we can get data and exit status
|
|
265
|
+
ch2.on_data do |ch3, data|
|
|
266
|
+
# Filter out the clear screen command
|
|
267
|
+
data = remove_ansi_escape_codes(data)
|
|
268
|
+
@logger.debug("stdout: #{data}")
|
|
269
|
+
yield :stdout, data if block_given?
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
ch2.on_extended_data do |ch3, type, data|
|
|
273
|
+
# Filter out the clear screen command
|
|
274
|
+
data = remove_ansi_escape_codes(data)
|
|
275
|
+
@logger.debug("stderr: #{data}")
|
|
276
|
+
yield :stderr, data if block_given?
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
ch2.on_request("exit-status") do |ch3, data|
|
|
280
|
+
exit_status = data.read_long
|
|
281
|
+
@logger.debug("Exit status: #{exit_status}")
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Set the terminal
|
|
285
|
+
ch2.send_data "export TERM=vt100\n"
|
|
286
|
+
|
|
287
|
+
# Output the command
|
|
288
|
+
ch2.send_data "#{command}\n"
|
|
289
|
+
|
|
290
|
+
# Remember to exit or this channel will hang open
|
|
291
|
+
ch2.send_data "exit\n"
|
|
292
|
+
|
|
293
|
+
# Send eof to let server know we're done
|
|
294
|
+
ch2.eof!
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
begin
|
|
299
|
+
keep_alive = nil
|
|
300
|
+
|
|
301
|
+
if @machine.config.ssh.keep_alive
|
|
302
|
+
# Begin sending keep-alive packets while we wait for the script
|
|
303
|
+
# to complete. This avoids connections closing on long-running
|
|
304
|
+
# scripts.
|
|
305
|
+
keep_alive = Thread.new do
|
|
306
|
+
loop do
|
|
307
|
+
sleep 5
|
|
308
|
+
@logger.debug("Sending SSH keep-alive...")
|
|
309
|
+
connection.send_global_request("keep-alive@openssh.com")
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# Wait for the channel to complete
|
|
315
|
+
channel.wait
|
|
316
|
+
ensure
|
|
317
|
+
# Kill the keep-alive thread
|
|
318
|
+
keep_alive.kill if keep_alive
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
# Return the final exit status
|
|
322
|
+
return exit_status
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
# Opens an SCP connection and yields it so that you can download
|
|
326
|
+
# and upload files.
|
|
327
|
+
def scp_connect
|
|
328
|
+
# Connect to SCP and yield the SCP object
|
|
329
|
+
connect do |connection|
|
|
330
|
+
scp = Net::SCP.new(connection)
|
|
331
|
+
return yield scp
|
|
332
|
+
end
|
|
333
|
+
rescue Net::SCP::Error => e
|
|
334
|
+
# If we get the exit code of 127, then this means SCP is unavailable.
|
|
335
|
+
raise Vagrant::Errors::SCPUnavailable if e.message =~ /\(127\)/
|
|
336
|
+
|
|
337
|
+
# Otherwise, just raise the error up
|
|
338
|
+
raise
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "vagrant"
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module CommunicatorSSH
|
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
|
6
|
+
name "ssh communicator"
|
|
7
|
+
description <<-DESC
|
|
8
|
+
This plugin allows Vagrant to communicate with remote machines using
|
|
9
|
+
SSH as the underlying protocol, powered internally by Ruby's
|
|
10
|
+
net-ssh library.
|
|
11
|
+
DESC
|
|
12
|
+
|
|
13
|
+
communicator("ssh") do
|
|
14
|
+
require File.expand_path("../communicator", __FILE__)
|
|
15
|
+
Communicator
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module VagrantPlugins
|
|
2
|
+
module GuestArch
|
|
3
|
+
module Cap
|
|
4
|
+
class ChangeHostName
|
|
5
|
+
def self.change_host_name(machine, name)
|
|
6
|
+
machine.communicate.tap do |comm|
|
|
7
|
+
# Only do this if the hostname is not already set
|
|
8
|
+
if !comm.test("sudo hostname | grep '#{name}'")
|
|
9
|
+
comm.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/rc.conf")
|
|
10
|
+
comm.sudo("hostname #{name}")
|
|
11
|
+
comm.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} @' /etc/hosts")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module VagrantPlugins
|
|
2
|
+
module GuestArch
|
|
3
|
+
module Cap
|
|
4
|
+
class ConfigureNetworks
|
|
5
|
+
def self.configure_networks(machine, networks)
|
|
6
|
+
networks.each do |network|
|
|
7
|
+
entry = TemplateRenderer.render("guests/arch/network_#{network[:type]}",
|
|
8
|
+
:options => network)
|
|
9
|
+
|
|
10
|
+
temp = Tempfile.new("vagrant")
|
|
11
|
+
temp.binmode
|
|
12
|
+
temp.write(entry)
|
|
13
|
+
temp.close
|
|
14
|
+
|
|
15
|
+
machine.communicate.upload(temp.path, "/tmp/vagrant_network")
|
|
16
|
+
machine.communicate.sudo("mv /tmp/vagrant_network /etc/network.d/interfaces/eth#{network[:interface]}")
|
|
17
|
+
machine.communicate.sudo("netcfg interfaces/eth#{network[:interface]}")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require "vagrant"
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module GuestArch
|
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
|
6
|
+
name "Arch guest"
|
|
7
|
+
description "Arch guest support."
|
|
8
|
+
|
|
9
|
+
guest("arch", "linux") do
|
|
10
|
+
require File.expand_path("../guest", __FILE__)
|
|
11
|
+
Guest
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
guest_capability("arch", "change_host_name") do
|
|
15
|
+
require_relative "cap/change_host_name"
|
|
16
|
+
Cap::ChangeHostName
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
guest_capability("arch", "configure_networks") do
|
|
20
|
+
require_relative "cap/configure_networks"
|
|
21
|
+
Cap::ConfigureNetworks
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module VagrantPlugins
|
|
2
|
+
module GuestDebian
|
|
3
|
+
module Cap
|
|
4
|
+
class ChangeHostName
|
|
5
|
+
def self.change_host_name(machine, name)
|
|
6
|
+
machine.communicate.tap do |comm|
|
|
7
|
+
if !comm.test("hostname --fqdn | grep '^#{name}$' || hostname --short | grep '^#{name}$'")
|
|
8
|
+
comm.sudo("sed -r -i 's/^(127[.]0[.]1[.]1[[:space:]]+).*$/\\1#{name} #{name.split('.')[0]}/' /etc/hosts")
|
|
9
|
+
comm.sudo("sed -i 's/.*$/#{name.split('.')[0]}/' /etc/hostname")
|
|
10
|
+
comm.sudo("hostname -F /etc/hostname")
|
|
11
|
+
comm.sudo("hostname --fqdn > /etc/mailname")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
require 'tempfile'
|
|
3
|
+
|
|
4
|
+
require "vagrant/util/template_renderer"
|
|
5
|
+
|
|
6
|
+
module VagrantPlugins
|
|
7
|
+
module GuestDebian
|
|
8
|
+
module Cap
|
|
9
|
+
class ConfigureNetworks
|
|
10
|
+
include Vagrant::Util
|
|
11
|
+
|
|
12
|
+
def self.configure_networks(machine, networks)
|
|
13
|
+
machine.communicate.tap do |comm|
|
|
14
|
+
# First, remove any previous network modifications
|
|
15
|
+
# from the interface file.
|
|
16
|
+
comm.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/network/interfaces > /tmp/vagrant-network-interfaces")
|
|
17
|
+
comm.sudo("su -c 'cat /tmp/vagrant-network-interfaces > /etc/network/interfaces'")
|
|
18
|
+
comm.sudo("rm /tmp/vagrant-network-interfaces")
|
|
19
|
+
|
|
20
|
+
# Accumulate the configurations to add to the interfaces file as
|
|
21
|
+
# well as what interfaces we're actually configuring since we use that
|
|
22
|
+
# later.
|
|
23
|
+
interfaces = Set.new
|
|
24
|
+
entries = []
|
|
25
|
+
networks.each do |network|
|
|
26
|
+
interfaces.add(network[:interface])
|
|
27
|
+
entry = TemplateRenderer.render("guests/debian/network_#{network[:type]}",
|
|
28
|
+
:options => network)
|
|
29
|
+
|
|
30
|
+
entries << entry
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Perform the careful dance necessary to reconfigure
|
|
34
|
+
# the network interfaces
|
|
35
|
+
temp = Tempfile.new("vagrant")
|
|
36
|
+
temp.binmode
|
|
37
|
+
temp.write(entries.join("\n"))
|
|
38
|
+
temp.close
|
|
39
|
+
|
|
40
|
+
comm.upload(temp.path, "/tmp/vagrant-network-entry")
|
|
41
|
+
|
|
42
|
+
# Bring down all the interfaces we're reconfiguring. By bringing down
|
|
43
|
+
# each specifically, we avoid reconfiguring eth0 (the NAT interface) so
|
|
44
|
+
# SSH never dies.
|
|
45
|
+
interfaces.each do |interface|
|
|
46
|
+
comm.sudo("/sbin/ifdown eth#{interface} 2> /dev/null")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
comm.sudo("cat /tmp/vagrant-network-entry >> /etc/network/interfaces")
|
|
50
|
+
comm.sudo("rm /tmp/vagrant-network-entry")
|
|
51
|
+
|
|
52
|
+
# Bring back up each network interface, reconfigured
|
|
53
|
+
interfaces.each do |interface|
|
|
54
|
+
comm.sudo("/sbin/ifup eth#{interface}")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require "vagrant"
|
|
2
|
+
|
|
3
|
+
module VagrantPlugins
|
|
4
|
+
module GuestDebian
|
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
|
6
|
+
name "Debian guest"
|
|
7
|
+
description "Debian guest support."
|
|
8
|
+
|
|
9
|
+
guest("debian", "linux") do
|
|
10
|
+
require File.expand_path("../guest", __FILE__)
|
|
11
|
+
Guest
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
guest_capability("debian", "configure_networks") do
|
|
15
|
+
require_relative "cap/configure_networks"
|
|
16
|
+
Cap::ConfigureNetworks
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
guest_capability("debian", "change_host_name") do
|
|
20
|
+
require_relative "cap/change_host_name"
|
|
21
|
+
Cap::ChangeHostName
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|