vagrant 0.8.10 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +77 -1
- data/Gemfile +0 -14
- data/LICENSE +1 -1
- data/bin/vagrant +47 -20
- data/config/default.rb +6 -14
- data/lib/vagrant.rb +132 -5
- data/lib/vagrant/action.rb +45 -123
- data/lib/vagrant/action/box/destroy.rb +7 -3
- data/lib/vagrant/action/box/download.rb +8 -8
- data/lib/vagrant/action/box/package.rb +2 -2
- data/lib/vagrant/action/box/unpackage.rb +13 -7
- data/lib/vagrant/action/box/verify.rb +5 -5
- data/lib/vagrant/action/builder.rb +23 -19
- data/lib/vagrant/action/builtin.rb +117 -79
- data/lib/vagrant/action/env/set.rb +7 -4
- data/lib/vagrant/action/environment.rb +3 -41
- data/lib/vagrant/action/general/package.rb +14 -29
- data/lib/vagrant/action/general/validate.rb +2 -2
- data/lib/vagrant/action/runner.rb +53 -0
- data/lib/vagrant/action/vm/boot.rb +9 -9
- data/lib/vagrant/action/vm/check_accessible.rb +2 -2
- data/lib/vagrant/action/vm/check_box.rb +10 -12
- data/lib/vagrant/action/vm/check_guest_additions.rb +8 -8
- data/lib/vagrant/action/vm/check_port_collisions.rb +85 -0
- data/lib/vagrant/action/vm/clean_machine_folder.rb +4 -4
- data/lib/vagrant/action/vm/clear_forwarded_ports.rb +3 -11
- data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
- data/lib/vagrant/action/vm/clear_shared_folders.rb +2 -11
- data/lib/vagrant/action/vm/customize.rb +19 -9
- data/lib/vagrant/action/vm/destroy.rb +4 -4
- data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +2 -12
- data/lib/vagrant/action/vm/discard_state.rb +4 -4
- data/lib/vagrant/action/vm/export.rb +13 -8
- data/lib/vagrant/action/vm/forward_ports.rb +55 -102
- data/lib/vagrant/action/vm/halt.rb +9 -6
- data/lib/vagrant/action/vm/host_name.rb +4 -4
- data/lib/vagrant/action/vm/import.rb +19 -10
- data/lib/vagrant/action/vm/match_mac_address.rb +4 -9
- data/lib/vagrant/action/vm/network.rb +300 -94
- data/lib/vagrant/action/vm/nfs.rb +41 -26
- data/lib/vagrant/action/vm/package.rb +1 -1
- data/lib/vagrant/action/vm/package_vagrantfile.rb +5 -2
- data/lib/vagrant/action/vm/provision.rb +42 -13
- data/lib/vagrant/action/vm/provisioner_cleanup.rb +2 -2
- data/lib/vagrant/action/vm/{clear_nfs_exports.rb → prune_nfs_exports.rb} +7 -7
- data/lib/vagrant/action/vm/resume.rb +4 -4
- data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
- data/lib/vagrant/action/vm/share_folders.rb +63 -39
- data/lib/vagrant/action/vm/suspend.rb +4 -4
- data/lib/vagrant/action/warden.rb +13 -6
- data/lib/vagrant/box.rb +9 -55
- data/lib/vagrant/box_collection.rb +22 -17
- data/lib/vagrant/cli.rb +62 -47
- data/lib/vagrant/command.rb +18 -20
- data/lib/vagrant/command/base.rb +135 -90
- data/lib/vagrant/command/box.rb +46 -21
- data/lib/vagrant/command/box_add.rb +33 -0
- data/lib/vagrant/command/box_list.rb +25 -0
- data/lib/vagrant/command/box_remove.rb +23 -0
- data/lib/vagrant/command/box_repackage.rb +23 -0
- data/lib/vagrant/command/destroy.rb +16 -5
- data/lib/vagrant/command/halt.rb +25 -7
- data/lib/vagrant/command/init.rb +30 -7
- data/lib/vagrant/command/package.rb +49 -18
- data/lib/vagrant/command/provision.rb +22 -9
- data/lib/vagrant/command/reload.rb +18 -5
- data/lib/vagrant/command/resume.rb +18 -5
- data/lib/vagrant/command/ssh.rb +69 -31
- data/lib/vagrant/command/ssh_config.rb +37 -22
- data/lib/vagrant/command/status.rb +22 -20
- data/lib/vagrant/command/suspend.rb +18 -5
- data/lib/vagrant/command/up.rb +41 -8
- data/lib/vagrant/communication.rb +7 -0
- data/lib/vagrant/communication/base.rb +56 -0
- data/lib/vagrant/communication/ssh.rb +200 -0
- data/lib/vagrant/config.rb +29 -103
- data/lib/vagrant/config/base.rb +18 -26
- data/lib/vagrant/config/container.rb +37 -0
- data/lib/vagrant/config/error_recorder.rb +1 -1
- data/lib/vagrant/config/loader.rb +125 -0
- data/lib/vagrant/config/nfs.rb +1 -3
- data/lib/vagrant/config/package.rb +1 -3
- data/lib/vagrant/config/ssh.rb +31 -16
- data/lib/vagrant/config/top.rb +36 -25
- data/lib/vagrant/config/vagrant.rb +2 -5
- data/lib/vagrant/config/vm.rb +115 -56
- data/lib/vagrant/config/vm/provisioner.rb +16 -20
- data/lib/vagrant/config/vm/sub_vm.rb +1 -1
- data/lib/vagrant/data_store.rb +23 -15
- data/lib/vagrant/downloaders/base.rb +7 -5
- data/lib/vagrant/downloaders/file.rb +4 -4
- data/lib/vagrant/downloaders/http.rb +4 -5
- data/lib/vagrant/driver.rb +7 -0
- data/lib/vagrant/driver/virtualbox.rb +121 -0
- data/lib/vagrant/driver/virtualbox_4_0.rb +411 -0
- data/lib/vagrant/driver/virtualbox_4_1.rb +411 -0
- data/lib/vagrant/driver/virtualbox_base.rb +284 -0
- data/lib/vagrant/environment.rb +221 -240
- data/lib/vagrant/errors.rb +74 -25
- data/lib/vagrant/guest.rb +16 -0
- data/lib/vagrant/guest/arch.rb +48 -0
- data/lib/vagrant/{systems → guest}/base.rb +30 -18
- data/lib/vagrant/guest/debian.rb +61 -0
- data/lib/vagrant/{systems → guest}/freebsd.rb +11 -18
- data/lib/vagrant/guest/gentoo.rb +32 -0
- data/lib/vagrant/guest/linux.rb +78 -0
- data/lib/vagrant/{systems → guest}/linux/config.rb +2 -4
- data/lib/vagrant/guest/linux/error.rb +9 -0
- data/lib/vagrant/guest/redhat.rb +66 -0
- data/lib/vagrant/guest/solaris.rb +114 -0
- data/lib/vagrant/{systems → guest}/suse.rb +2 -2
- data/lib/vagrant/guest/ubuntu.rb +23 -0
- data/lib/vagrant/hosts.rb +23 -6
- data/lib/vagrant/hosts/arch.rb +7 -3
- data/lib/vagrant/hosts/base.rb +36 -46
- data/lib/vagrant/hosts/bsd.rb +53 -16
- data/lib/vagrant/hosts/fedora.rb +14 -0
- data/lib/vagrant/hosts/freebsd.rb +6 -36
- data/lib/vagrant/hosts/linux.rb +45 -20
- data/lib/vagrant/hosts/windows.rb +16 -0
- data/lib/vagrant/provisioners.rb +10 -7
- data/lib/vagrant/provisioners/base.rb +11 -34
- data/lib/vagrant/provisioners/chef.rb +30 -26
- data/lib/vagrant/provisioners/chef_client.rb +37 -23
- data/lib/vagrant/provisioners/chef_solo.rb +61 -16
- data/lib/vagrant/provisioners/puppet.rb +70 -38
- data/lib/vagrant/provisioners/puppet_server.rb +12 -13
- data/lib/vagrant/provisioners/shell.rb +24 -24
- data/lib/vagrant/registry.rb +49 -0
- data/lib/vagrant/ssh.rb +82 -153
- data/lib/vagrant/ui.rb +118 -50
- data/lib/vagrant/util/busy.rb +1 -1
- data/lib/vagrant/util/file_mode.rb +12 -0
- data/lib/vagrant/util/network_ip.rb +28 -0
- data/lib/vagrant/util/platform.rb +1 -0
- data/lib/vagrant/util/subprocess.rb +227 -0
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +111 -97
- data/tasks/acceptance.rake +3 -3
- data/tasks/test.rake +7 -2
- data/templates/commands/init/Vagrantfile.erb +11 -4
- data/templates/{ssh_config.erb → commands/ssh_config/config.erb} +0 -0
- data/templates/guests/arch/network_dhcp.erb +7 -0
- data/templates/guests/arch/network_static.erb +7 -0
- data/templates/guests/debian/network_dhcp.erb +6 -0
- data/templates/guests/debian/network_static.erb +7 -0
- data/templates/guests/gentoo/network_dhcp.erb +4 -0
- data/templates/guests/gentoo/network_static.erb +4 -0
- data/templates/guests/redhat/network_dhcp.erb +6 -0
- data/templates/guests/redhat/network_static.erb +7 -0
- data/templates/locales/en.yml +241 -122
- data/templates/{chef_server_client.erb → provisioners/chef_client/client.erb} +0 -0
- data/templates/{chef_solo_solo.erb → provisioners/chef_solo/solo.erb} +0 -0
- data/test/acceptance/base.rb +10 -10
- data/test/acceptance/box_test.rb +28 -6
- data/test/acceptance/destroy_test.rb +1 -1
- data/test/acceptance/halt_test.rb +4 -4
- data/test/acceptance/init_test.rb +3 -3
- data/test/acceptance/networking/host_only_test.rb +37 -0
- data/test/acceptance/networking/port_forward_test.rb +125 -0
- data/test/acceptance/package_test.rb +46 -0
- data/test/acceptance/provisioning/basic_test.rb +61 -0
- data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
- data/test/acceptance/provisioning/shell_test.rb +53 -0
- data/test/acceptance/resume_test.rb +1 -1
- data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
- data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
- data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
- data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
- data/test/acceptance/ssh_test.rb +7 -2
- data/test/acceptance/support/config.rb +1 -1
- data/test/acceptance/support/isolated_environment.rb +41 -150
- data/test/acceptance/support/matchers/match_output.rb +1 -1
- data/test/acceptance/support/matchers/succeed.rb +14 -0
- data/test/acceptance/support/network_tests.rb +29 -0
- data/test/acceptance/support/output.rb +9 -1
- data/test/acceptance/support/shared/base_context.rb +16 -9
- data/test/acceptance/support/shared/command_examples.rb +4 -4
- data/test/acceptance/suspend_test.rb +1 -1
- data/test/acceptance/up_basic_test.rb +26 -7
- data/test/acceptance/up_with_box_url.rb +1 -1
- data/test/acceptance/vagrant_test.rb +1 -1
- data/test/acceptance/version_test.rb +0 -5
- data/test/support/isolated_environment.rb +46 -0
- data/test/{acceptance/support → support}/tempdir.rb +0 -0
- data/test/unit/base.rb +21 -0
- data/test/unit/support/isolated_environment.rb +39 -0
- data/test/unit/support/shared/base_context.rb +30 -0
- data/test/unit/vagrant/action/builder_test.rb +126 -177
- data/test/unit/vagrant/action/environment_test.rb +10 -21
- data/test/unit/vagrant/action/runner_test.rb +65 -0
- data/test/unit/vagrant/action/warden_test.rb +64 -97
- data/test/unit/vagrant/box_collection_test.rb +44 -33
- data/test/unit/vagrant/box_test.rb +25 -65
- data/test/unit/vagrant/command/base_test.rb +141 -14
- data/test/unit/vagrant/config/base_test.rb +16 -43
- data/test/unit/vagrant/config/loader_test.rb +79 -0
- data/test/unit/vagrant/config/top_test.rb +69 -0
- data/test/unit/vagrant/config/vm_test.rb +62 -47
- data/test/unit/vagrant/config_test.rb +16 -151
- data/test/unit/vagrant/data_store_test.rb +43 -61
- data/test/unit/vagrant/downloaders/base_test.rb +12 -22
- data/test/unit/vagrant/downloaders/file_test.rb +58 -31
- data/test/unit/vagrant/downloaders/http_test.rb +12 -86
- data/test/unit/vagrant/environment_test.rb +107 -536
- data/test/unit/vagrant/hosts_test.rb +36 -0
- data/test/unit/vagrant/registry_test.rb +56 -0
- data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
- data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +23 -24
- data/test/unit/vagrant/util/network_ip_test.rb +17 -0
- data/test/unit/vagrant/util/retryable_test.rb +90 -34
- data/test/unit/vagrant_test.rb +27 -0
- data/test/{unit → unit_legacy}/locales/en.yml +0 -0
- data/test/{unit → unit_legacy}/test_helper.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/destroy_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/download_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/package_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/unpackage_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/box/verify_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/env/set_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/general/package_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/general/validate_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/boot_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/check_accessible_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/check_box_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/check_guest_additions_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clean_machine_folder_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clear_forwarded_ports_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clear_nfs_exports_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/clear_shared_folders_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/customize_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/discard_state_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/export_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_helpers_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/halt_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/host_name_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/import_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/match_mac_address_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/modify_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/network_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_helpers_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/package_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/package_vagrantfile_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/provision_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/provisioner_cleanup_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/resume_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/share_folders_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action/vm/suspend_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/action_test.rb +0 -0
- data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
- data/test/unit_legacy/vagrant/box_test.rb +74 -0
- data/test/{unit → unit_legacy}/vagrant/cli_test.rb +0 -0
- data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
- data/test/{unit → unit_legacy}/vagrant/command/group_base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/command/helpers_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/command/init_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/command/package_test.rb +0 -0
- data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
- data/test/{unit → unit_legacy}/vagrant/config/error_recorder_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/config/ssh_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/config/vagrant_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/config/vm/provisioner_test.rb +0 -0
- data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
- data/test/unit_legacy/vagrant/config_test.rb +148 -0
- data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
- data/test/unit_legacy/vagrant/environment_test.rb +539 -0
- data/test/{unit → unit_legacy}/vagrant/errors_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/hosts/base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/hosts/bsd_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/hosts/linux_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/plugin_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/chef_client_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/chef_solo_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/chef_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_server_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/provisioners/shell_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/ssh/session_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/ssh_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/systems/base_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/systems/linux_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/busy_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/counter_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/platform_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/stacked_proc_runner_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/util/template_renderer_test.rb +0 -0
- data/test/{unit → unit_legacy}/vagrant/vm_test.rb +0 -0
- data/vagrant.gemspec +7 -9
- metadata +214 -216
- data/keys/vagrant.ppk +0 -26
- data/lib/vagrant/action/box.rb +0 -11
- data/lib/vagrant/action/env.rb +0 -7
- data/lib/vagrant/action/general.rb +0 -8
- data/lib/vagrant/action/vm.rb +0 -34
- data/lib/vagrant/action/vm/forward_ports_helpers.rb +0 -28
- data/lib/vagrant/action/vm/modify.rb +0 -37
- data/lib/vagrant/action/vm/nfs_helpers.rb +0 -11
- data/lib/vagrant/command/group_base.rb +0 -107
- data/lib/vagrant/command/helpers.rb +0 -33
- data/lib/vagrant/command/named_base.rb +0 -14
- data/lib/vagrant/command/upgrade_to_060.rb +0 -45
- data/lib/vagrant/command/version.rb +0 -13
- data/lib/vagrant/ssh/session.rb +0 -136
- data/lib/vagrant/systems.rb +0 -13
- data/lib/vagrant/systems/arch.rb +0 -34
- data/lib/vagrant/systems/debian.rb +0 -36
- data/lib/vagrant/systems/gentoo.rb +0 -27
- data/lib/vagrant/systems/linux.rb +0 -82
- data/lib/vagrant/systems/linux/error.rb +0 -9
- data/lib/vagrant/systems/redhat.rb +0 -48
- data/lib/vagrant/systems/solaris.rb +0 -113
- data/lib/vagrant/systems/ubuntu.rb +0 -17
- data/templates/network_entry_arch.erb +0 -9
- data/templates/network_entry_debian.erb +0 -8
- data/templates/network_entry_gentoo.erb +0 -5
- data/templates/network_entry_redhat.erb +0 -9
- data/test/unit/vagrant/ui_test.rb +0 -29
@@ -1,14 +1,27 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Command
|
3
|
-
class
|
4
|
-
register "resume", "Resume a suspended Vagrant environment."
|
5
|
-
|
5
|
+
class Resume < Base
|
6
6
|
def execute
|
7
|
-
|
7
|
+
options = {}
|
8
|
+
|
9
|
+
opts = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: vagrant resume [vm-name]"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Parse the options
|
14
|
+
argv = parse_options(opts)
|
15
|
+
return if !argv
|
16
|
+
|
17
|
+
@logger.debug("'resume' each target VM...")
|
18
|
+
with_target_vms(argv[0]) do |vm|
|
8
19
|
if vm.created?
|
20
|
+
@logger.info("Resume: #{vm.name}")
|
9
21
|
vm.resume
|
10
22
|
else
|
11
|
-
|
23
|
+
@logger.info("Not created: #{vm.name}. Not resuming.")
|
24
|
+
vm.ui.info I18n.t("vagrant.commands.common.vm_not_created")
|
12
25
|
end
|
13
26
|
end
|
14
27
|
end
|
data/lib/vagrant/command/ssh.rb
CHANGED
@@ -1,49 +1,87 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Command
|
3
|
-
class
|
4
|
-
class_option :command, :type => :string, :default => false, :aliases => "-c"
|
5
|
-
register "ssh", "SSH into the currently running Vagrant environment."
|
6
|
-
|
5
|
+
class SSH < Base
|
7
6
|
def execute
|
8
|
-
|
9
|
-
ssh_execute
|
10
|
-
else
|
11
|
-
ssh_connect
|
12
|
-
end
|
13
|
-
end
|
7
|
+
options = {}
|
14
8
|
|
15
|
-
|
9
|
+
opts = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: vagrant ssh [vm-name] [-c command] [-- extra ssh args]"
|
11
|
+
|
12
|
+
opts.separator ""
|
16
13
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
# force a new line so that the output is properly preserved
|
23
|
-
ssh_vm.env.ui.info(data.to_s, :prefix => false, :new_line => false)
|
24
|
-
end
|
14
|
+
opts.on("-c", "--command COMMAND", "Execute an SSH command directly.") do |c|
|
15
|
+
options[:command] = c
|
16
|
+
end
|
17
|
+
opts.on("-p", "--plain", "Plain mode, leaves authentication up to user.") do |p|
|
18
|
+
options[:plain_mode] = p
|
25
19
|
end
|
26
20
|
end
|
27
|
-
end
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
22
|
+
# Parse the options and return if we don't have any target.
|
23
|
+
argv = parse_options(opts)
|
24
|
+
return if !argv
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
26
|
+
# Parse out the extra args to send to SSH, which is everything
|
27
|
+
# after the "--"
|
28
|
+
ssh_args = ARGV.drop_while { |i| i != "--" }
|
29
|
+
ssh_args = ssh_args[1..-1]
|
30
|
+
options[:ssh_args] = ssh_args
|
38
31
|
|
32
|
+
# If the remaining arguments ARE the SSH arguments, then just
|
33
|
+
# clear it out. This happens because optparse returns what is
|
34
|
+
# after the "--" as remaining ARGV, and Vagrant can think it is
|
35
|
+
# a multi-vm name (wrong!)
|
36
|
+
argv = [] if argv == ssh_args
|
37
|
+
|
38
|
+
# Execute the actual SSH
|
39
|
+
with_target_vms(argv[0], true) do |vm|
|
39
40
|
# Basic checks that are required for proper SSH
|
40
41
|
raise Errors::VMNotCreatedError if !vm.created?
|
41
|
-
raise Errors::VMInaccessible if !vm.
|
42
|
-
raise Errors::VMNotRunningError if
|
42
|
+
raise Errors::VMInaccessible if !vm.state == :inaccessible
|
43
|
+
raise Errors::VMNotRunningError if vm.state != :running
|
44
|
+
|
45
|
+
if options[:command]
|
46
|
+
ssh_execute(vm, options[:command])
|
47
|
+
else
|
48
|
+
opts = {
|
49
|
+
:plain_mode => options[:plain_mode],
|
50
|
+
:extra_args => options[:ssh_args]
|
51
|
+
}
|
43
52
|
|
44
|
-
|
53
|
+
ssh_connect(vm, opts)
|
54
|
+
end
|
45
55
|
end
|
46
56
|
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def ssh_execute(vm, command=nil)
|
61
|
+
exit_status = 0
|
62
|
+
|
63
|
+
@logger.debug("Executing command: #{command}")
|
64
|
+
exit_status = vm.channel.execute(command, :error_check => false) do |type, data|
|
65
|
+
# Determine the proper channel to send the output onto depending
|
66
|
+
# on the type of data we are receiving.
|
67
|
+
channel = type == :stdout ? :out : :error
|
68
|
+
|
69
|
+
# Print the SSH output as it comes in, but don't prefix it and don't
|
70
|
+
# force a new line so that the output is properly preserved
|
71
|
+
vm.ui.info(data.to_s,
|
72
|
+
:prefix => false,
|
73
|
+
:new_line => false,
|
74
|
+
:channel => channel)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Exit with the exit status we got from executing the command
|
78
|
+
exit exit_status
|
79
|
+
end
|
80
|
+
|
81
|
+
def ssh_connect(vm, opts)
|
82
|
+
@logger.debug("`exec` into ssh prompt")
|
83
|
+
vm.ssh.exec(opts)
|
84
|
+
end
|
47
85
|
end
|
48
86
|
end
|
49
87
|
end
|
@@ -1,28 +1,43 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Command
|
3
|
-
class
|
4
|
-
class_option :host, :type => :string, :default => nil, :aliases => "-h"
|
5
|
-
register "ssh_config", "outputs .ssh/config valid syntax for connecting to this environment via ssh"
|
6
|
-
|
5
|
+
class SSHConfig < Base
|
7
6
|
def execute
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
7
|
+
options = {}
|
8
|
+
|
9
|
+
opts = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: vagrant ssh-config [vm-name] [-h name]"
|
11
|
+
|
12
|
+
opts.separator ""
|
13
|
+
|
14
|
+
opts.on("-h", "--host COMMAND", "Name the host for the config..") do |h|
|
15
|
+
options[:host] = h
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
argv = parse_options(opts)
|
20
|
+
return if !argv
|
21
|
+
|
22
|
+
with_target_vms(argv[0], true) do |vm|
|
23
|
+
raise Errors::VMNotCreatedError if !vm.created?
|
24
|
+
raise Errors::VMInaccessible if !vm.state == :inaccessible
|
25
|
+
|
26
|
+
ssh_info = vm.ssh.info
|
27
|
+
variables = {
|
28
|
+
:host_key => options[:host] || vm.name || "vagrant",
|
29
|
+
:ssh_host => ssh_info[:host],
|
30
|
+
:ssh_port => ssh_info[:port],
|
31
|
+
:ssh_user => ssh_info[:username],
|
32
|
+
:private_key_path => ssh_info[:private_key_path],
|
33
|
+
:forward_agent => ssh_info[:forward_agent],
|
34
|
+
:forward_x11 => ssh_info[:forward_x11]
|
35
|
+
}
|
36
|
+
|
37
|
+
# Render the template and output directly to STDOUT
|
38
|
+
template = "commands/ssh_config/config"
|
39
|
+
$stdout.puts(Util::TemplateRenderer.render(template, variables))
|
40
|
+
end
|
26
41
|
end
|
27
42
|
end
|
28
43
|
end
|
@@ -1,30 +1,32 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Command
|
3
|
-
class
|
4
|
-
register "status", "Shows the status of the current Vagrant environment."
|
5
|
-
|
5
|
+
class Status < Base
|
6
6
|
def execute
|
7
|
-
|
8
|
-
results = target_vms.collect do |vm|
|
9
|
-
if vm.created?
|
10
|
-
if vm.vm.accessible?
|
11
|
-
state = vm.vm.state.to_s
|
12
|
-
else
|
13
|
-
state = "inaccessible"
|
14
|
-
end
|
15
|
-
else
|
16
|
-
state = "not_created"
|
17
|
-
end
|
7
|
+
options = {}
|
18
8
|
|
19
|
-
|
9
|
+
opts = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: vagrant status [vm-name]"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Parse the options
|
14
|
+
argv = parse_options(opts)
|
15
|
+
return if !argv
|
16
|
+
|
17
|
+
state = nil
|
18
|
+
results = []
|
19
|
+
with_target_vms(argv[0]) do |vm|
|
20
|
+
state = vm.state.to_s if !state
|
21
|
+
results << "#{vm.name.to_s.ljust(25)}#{vm.state.to_s.gsub("_", " ")}"
|
20
22
|
end
|
21
23
|
|
22
|
-
state =
|
24
|
+
state = results.length == 1 ? state : "listing"
|
23
25
|
|
24
|
-
env.ui.info(I18n.t("vagrant.commands.status.output",
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
@env.ui.info(I18n.t("vagrant.commands.status.output",
|
27
|
+
:states => results.join("\n"),
|
28
|
+
:message => I18n.t("vagrant.commands.status.#{state}")),
|
29
|
+
:prefix => false)
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
@@ -1,14 +1,27 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Command
|
3
|
-
class
|
4
|
-
register "suspend", "Suspend a running Vagrant environment."
|
5
|
-
|
5
|
+
class Suspend < Base
|
6
6
|
def execute
|
7
|
-
|
7
|
+
options = {}
|
8
|
+
|
9
|
+
opts = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: vagrant suspend [vm-name]"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Parse the options
|
14
|
+
argv = parse_options(opts)
|
15
|
+
return if !argv
|
16
|
+
|
17
|
+
@logger.debug("'suspend' each target VM...")
|
18
|
+
with_target_vms(argv[0]) do |vm|
|
8
19
|
if vm.created?
|
20
|
+
@logger.info("Suspending: #{vm.name}")
|
9
21
|
vm.suspend
|
10
22
|
else
|
11
|
-
|
23
|
+
@logger.info("Not created: #{vm.name}. Not suspending.")
|
24
|
+
vm.ui.info I18n.t("vagrant.commands.common.vm_not_created")
|
12
25
|
end
|
13
26
|
end
|
14
27
|
end
|
data/lib/vagrant/command/up.rb
CHANGED
@@ -1,16 +1,49 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Vagrant
|
2
4
|
module Command
|
3
|
-
class
|
4
|
-
class_option :provision, :type => :boolean, :default => true
|
5
|
-
register "up", "Creates the Vagrant environment"
|
6
|
-
|
5
|
+
class Up < Base
|
7
6
|
def execute
|
8
|
-
|
7
|
+
options = {
|
8
|
+
:provision => true,
|
9
|
+
:provisioners => nil
|
10
|
+
}
|
11
|
+
|
12
|
+
opts = OptionParser.new do |opts|
|
13
|
+
opts.banner = "Usage: vagrant up [vm-name] [--[no-]provision] [-h]"
|
14
|
+
|
15
|
+
opts.separator ""
|
16
|
+
|
17
|
+
opts.on("--[no-]provision", "Enable or disable provisioning") do |p|
|
18
|
+
options[:provision] = p
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.on("--provision-with x,y,z", Array,
|
22
|
+
"Enable only certain provisioners, by type.") do |list|
|
23
|
+
options[:provisioners] = list
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Parse the options
|
28
|
+
argv = parse_options(opts)
|
29
|
+
return if !argv
|
30
|
+
|
31
|
+
# Parameters to send to actions
|
32
|
+
action_params = {
|
33
|
+
"provision.enabled" => options[:provision],
|
34
|
+
"provision.types" => options[:provisioners]
|
35
|
+
}
|
36
|
+
|
37
|
+
# Go over each VM and bring it up
|
38
|
+
@logger.debug("'Up' each target VM...")
|
39
|
+
with_target_vms(argv[0]) do |vm|
|
9
40
|
if vm.created?
|
10
|
-
|
11
|
-
vm.
|
41
|
+
@logger.info("Booting: #{vm.name}")
|
42
|
+
vm.ui.info I18n.t("vagrant.commands.up.vm_created")
|
43
|
+
vm.start(action_params)
|
12
44
|
else
|
13
|
-
|
45
|
+
@logger.info("Creating: #{vm.name}")
|
46
|
+
vm.up(action_params)
|
14
47
|
end
|
15
48
|
end
|
16
49
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Communication
|
3
|
+
# The base class for any classes that provide an API for communicating
|
4
|
+
# with the virtual machine.
|
5
|
+
#
|
6
|
+
# There are various stages that require Vagrant to copy files or
|
7
|
+
# run commands on the target system, and communication classes provide
|
8
|
+
# the abstraction necessary to perform these tasks, via SSH or some
|
9
|
+
# other mechanism.
|
10
|
+
#
|
11
|
+
# Any subclasses of this class **must** implement all of the methods
|
12
|
+
# below.
|
13
|
+
class Base
|
14
|
+
# Checks if the target machine is ready for communication.
|
15
|
+
#
|
16
|
+
# @return [Boolean]
|
17
|
+
def ready?
|
18
|
+
end
|
19
|
+
|
20
|
+
# Upload a file to the virtual machine.
|
21
|
+
#
|
22
|
+
# @param [String] from Path to a file to upload.
|
23
|
+
# @param [String] to Path to where to save this file.
|
24
|
+
def upload(from, to)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Execute a command on the remote machine.
|
28
|
+
#
|
29
|
+
# @param [String] command Command to execute.
|
30
|
+
# @yield [type, data] Realtime output of the command being executed.
|
31
|
+
# @yieldparam [String] type Type of the output, `:stdout`, `:stderr`, etc.
|
32
|
+
# @yieldparam [String] data Data for the given output.
|
33
|
+
# @return [Integer] Exit code of the command.
|
34
|
+
def execute(command, opts=nil)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Execute a comand with super user privileges.
|
38
|
+
#
|
39
|
+
# See #execute for parameter information.
|
40
|
+
def sudo(command, opts=nil)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Executes a command and returns a boolean statement if it was successful
|
44
|
+
# or not.
|
45
|
+
#
|
46
|
+
# This is implemented by default as expecting `execute` to return 0.
|
47
|
+
def test(command, opts=nil)
|
48
|
+
# Disable error checking no matter what
|
49
|
+
opts = (opts || {}).merge(:error_check => false)
|
50
|
+
|
51
|
+
# Successful if the exit status is 0
|
52
|
+
execute(command, opts) == 0
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'net/ssh'
|
5
|
+
require 'net/scp'
|
6
|
+
|
7
|
+
require 'vagrant/util/file_mode'
|
8
|
+
require 'vagrant/util/platform'
|
9
|
+
require 'vagrant/util/retryable'
|
10
|
+
|
11
|
+
module Vagrant
|
12
|
+
module Communication
|
13
|
+
# Provides communication with the VM via SSH.
|
14
|
+
class SSH < Base
|
15
|
+
include Util::Retryable
|
16
|
+
|
17
|
+
def initialize(vm)
|
18
|
+
@vm = vm
|
19
|
+
@logger = Log4r::Logger.new("vagrant::communication::ssh")
|
20
|
+
@connection = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def ready?
|
24
|
+
@logger.debug("Checking whether SSH is ready...")
|
25
|
+
|
26
|
+
Timeout.timeout(@vm.config.ssh.timeout) do
|
27
|
+
connect
|
28
|
+
end
|
29
|
+
|
30
|
+
# If we reached this point then we successfully connected
|
31
|
+
@logger.info("SSH is ready!")
|
32
|
+
true
|
33
|
+
rescue Timeout::Error, Errors::SSHConnectionRefused, Net::SSH::Disconnect => e
|
34
|
+
# The above errors represent various reasons that SSH may not be
|
35
|
+
# ready yet. Return false.
|
36
|
+
@logger.info("SSH not up: #{e.inspect}")
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
|
40
|
+
def execute(command, opts=nil, &block)
|
41
|
+
opts = {
|
42
|
+
:error_check => true,
|
43
|
+
:error_class => Errors::VagrantError,
|
44
|
+
:error_key => :ssh_bad_exit_status,
|
45
|
+
:command => command,
|
46
|
+
:sudo => false
|
47
|
+
}.merge(opts || {})
|
48
|
+
|
49
|
+
# Connect via SSH and execute the command in the shell.
|
50
|
+
exit_status = connect do |connection|
|
51
|
+
shell_execute(connection, command, opts[:sudo], &block)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Check for any errors
|
55
|
+
if opts[:error_check] && exit_status != 0
|
56
|
+
# The error classes expect the translation key to be _key,
|
57
|
+
# but that makes for an ugly configuration parameter, so we
|
58
|
+
# set it here from `error_key`
|
59
|
+
error_opts = opts.merge(:_key => opts[:error_key])
|
60
|
+
raise opts[:error_class], error_opts
|
61
|
+
end
|
62
|
+
|
63
|
+
# Return the exit status
|
64
|
+
exit_status
|
65
|
+
end
|
66
|
+
|
67
|
+
def sudo(command, opts=nil, &block)
|
68
|
+
# Run `execute` but with the `sudo` option.
|
69
|
+
opts = { :sudo => true }.merge(opts || {})
|
70
|
+
execute(command, opts, &block)
|
71
|
+
end
|
72
|
+
|
73
|
+
def upload(from, to)
|
74
|
+
# Do an SCP-based upload...
|
75
|
+
connect do |connection|
|
76
|
+
scp = Net::SCP.new(connection)
|
77
|
+
scp.upload!(from, to)
|
78
|
+
end
|
79
|
+
rescue Net::SCP::Error => e
|
80
|
+
# If we get the exit code of 127, then this means SCP is unavailable.
|
81
|
+
raise Errors::SCPUnavailable if e.message =~ /\(127\)/
|
82
|
+
|
83
|
+
# Otherwise, just raise the error up
|
84
|
+
raise
|
85
|
+
end
|
86
|
+
|
87
|
+
protected
|
88
|
+
|
89
|
+
# Opens an SSH connection and yields it to a block.
|
90
|
+
def connect
|
91
|
+
if @connection && !@connection.closed?
|
92
|
+
# There is a chance that the socket is closed despite us checking
|
93
|
+
# 'closed?' above. To test this we need to send data through the
|
94
|
+
# socket.
|
95
|
+
begin
|
96
|
+
@connection.exec!("")
|
97
|
+
rescue IOError
|
98
|
+
@logger.info("Connection has been closed. Not re-using.")
|
99
|
+
@connection = nil
|
100
|
+
end
|
101
|
+
|
102
|
+
# If the @connection is still around, then it is valid,
|
103
|
+
# and we use it.
|
104
|
+
if @connection
|
105
|
+
@logger.info("Re-using SSH connection.")
|
106
|
+
return yield @connection if block_given?
|
107
|
+
return
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
ssh_info = @vm.ssh.info
|
112
|
+
|
113
|
+
# Build the options we'll use to initiate the connection via Net::SSH
|
114
|
+
opts = {
|
115
|
+
:port => ssh_info[:port],
|
116
|
+
:keys => [ssh_info[:private_key_path]],
|
117
|
+
:keys_only => true,
|
118
|
+
:user_known_hosts_file => [],
|
119
|
+
:paranoid => false,
|
120
|
+
:config => false,
|
121
|
+
:forward_agent => ssh_info[:forward_agent]
|
122
|
+
}
|
123
|
+
|
124
|
+
# Check that the private key permissions are valid
|
125
|
+
@vm.ssh.check_key_permissions(ssh_info[:private_key_path])
|
126
|
+
|
127
|
+
# Connect to SSH, giving it a few tries
|
128
|
+
@logger.info("Connecting to SSH: #{ssh_info[:host]}:#{ssh_info[:port]}")
|
129
|
+
exceptions = [Errno::ECONNREFUSED, Net::SSH::Disconnect]
|
130
|
+
connection = retryable(:tries => @vm.config.ssh.max_tries, :on => exceptions) do
|
131
|
+
Net::SSH.start(ssh_info[:host], ssh_info[:username], opts)
|
132
|
+
end
|
133
|
+
|
134
|
+
@connection = connection
|
135
|
+
|
136
|
+
# This is hacky but actually helps with some issues where
|
137
|
+
# Net::SSH is simply not robust enough to handle... see
|
138
|
+
# issue #391, #455, etc.
|
139
|
+
sleep 4
|
140
|
+
|
141
|
+
# Yield the connection that is ready to be used and
|
142
|
+
# return the value of the block
|
143
|
+
return yield connection if block_given?
|
144
|
+
rescue Net::SSH::AuthenticationFailed
|
145
|
+
# This happens if authentication failed. We wrap the error in our
|
146
|
+
# own exception.
|
147
|
+
raise Errors::SSHAuthenticationFailed
|
148
|
+
rescue Errno::ECONNREFUSED
|
149
|
+
# This is raised if we failed to connect the max amount of times
|
150
|
+
raise Errors::SSHConnectionRefused
|
151
|
+
ensure
|
152
|
+
# Be sure the connection is always closed
|
153
|
+
# connection.close if connection && !connection.closed?
|
154
|
+
end
|
155
|
+
|
156
|
+
# Executes the command on an SSH connection within a login shell.
|
157
|
+
def shell_execute(connection, command, sudo=false)
|
158
|
+
exit_status = nil
|
159
|
+
|
160
|
+
# Determine the shell to execute. If we are using `sudo` then we
|
161
|
+
# need to wrap the shell in a `sudo` call.
|
162
|
+
shell = "#{@vm.config.ssh.shell} -l"
|
163
|
+
shell = "sudo -H #{shell}" if sudo
|
164
|
+
|
165
|
+
# Open the channel so we can execute or command
|
166
|
+
channel = connection.open_channel do |ch|
|
167
|
+
ch.exec(shell) do |ch2, _|
|
168
|
+
# Setup the channel callbacks so we can get data and exit status
|
169
|
+
ch2.on_data do |ch3, data|
|
170
|
+
yield :stdout, data if block_given?
|
171
|
+
end
|
172
|
+
|
173
|
+
ch2.on_extended_data do |ch3, type, data|
|
174
|
+
yield :stderr, data if block_given?
|
175
|
+
end
|
176
|
+
|
177
|
+
ch2.on_request("exit-status") do |ch3, data|
|
178
|
+
exit_status = data.read_long
|
179
|
+
end
|
180
|
+
|
181
|
+
# Set the terminal
|
182
|
+
ch2.send_data "export TERM=vt100\n"
|
183
|
+
|
184
|
+
# Output the command
|
185
|
+
ch2.send_data "#{command}\n"
|
186
|
+
|
187
|
+
# Remember to exit or this channel will hang open
|
188
|
+
ch2.send_data "exit\n"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# Wait for the channel to complete
|
193
|
+
channel.wait
|
194
|
+
|
195
|
+
# Return the final exit status
|
196
|
+
return exit_status
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|