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
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Guest
|
5
|
+
class Gentoo < Linux
|
6
|
+
def configure_networks(networks)
|
7
|
+
# Remove any previous host only network additions to the interface file
|
8
|
+
vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/conf.d/net > /tmp/vagrant-network-interfaces")
|
9
|
+
vm.channel.sudo("cat /tmp/vagrant-network-interfaces > /etc/conf.d/net")
|
10
|
+
|
11
|
+
# Configure each network interface
|
12
|
+
networks.each do |network|
|
13
|
+
entry = TemplateRenderer.render("guests/gentoo/network_#{network[:type]}",
|
14
|
+
:options => network)
|
15
|
+
|
16
|
+
# Upload the entry to a temporary location
|
17
|
+
temp = Tempfile.new("vagrant")
|
18
|
+
temp.write(entry)
|
19
|
+
temp.close
|
20
|
+
|
21
|
+
vm.channel.upload(temp.path, "/tmp/vagrant-network-entry")
|
22
|
+
|
23
|
+
# Configure the interface
|
24
|
+
vm.channel.sudo("ln -fs /etc/init.d/net.lo /etc/init.d/net.eth#{network[:interface]}")
|
25
|
+
vm.channel.sudo("/etc/init.d/net.eth#{network[:interface]} stop 2> /dev/null")
|
26
|
+
vm.channel.sudo("cat /tmp/vagrant-network-entry >> /etc/conf.d/net")
|
27
|
+
vm.channel.sudo("/etc/init.d/net.eth#{network[:interface]} start")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'vagrant/guest/linux/error'
|
2
|
+
require 'vagrant/guest/linux/config'
|
3
|
+
|
4
|
+
module Vagrant
|
5
|
+
module Guest
|
6
|
+
class Linux < Base
|
7
|
+
def distro_dispatch
|
8
|
+
if @vm.channel.test("cat /etc/debian_version")
|
9
|
+
return :debian if @vm.channel.test("cat /proc/version | grep 'Debian'")
|
10
|
+
return :ubuntu if @vm.channel.test("cat /proc/version | grep 'Ubuntu'")
|
11
|
+
end
|
12
|
+
|
13
|
+
return :gentoo if @vm.channel.test("cat /etc/gentoo-release")
|
14
|
+
return :redhat if @vm.channel.test("cat /etc/redhat-release")
|
15
|
+
return :suse if @vm.channel.test("cat /etc/SuSE-release")
|
16
|
+
return :arch if @vm.channel.test("cat /etc/arch-release")
|
17
|
+
|
18
|
+
# Can't detect the distro, assume vanilla linux
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def halt
|
23
|
+
vm.channel.sudo("shutdown -h now")
|
24
|
+
|
25
|
+
# Wait until the VM's state is actually powered off. If this doesn't
|
26
|
+
# occur within a reasonable amount of time (15 seconds by default),
|
27
|
+
# then simply return and allow Vagrant to kill the machine.
|
28
|
+
count = 0
|
29
|
+
while vm.state != :poweroff
|
30
|
+
count += 1
|
31
|
+
|
32
|
+
return if count >= vm.config.linux.halt_timeout
|
33
|
+
sleep vm.config.linux.halt_check_interval
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def mount_shared_folder(name, guestpath, options)
|
38
|
+
@vm.channel.sudo("mkdir -p #{guestpath}")
|
39
|
+
mount_folder(name, guestpath, options)
|
40
|
+
@vm.channel.sudo("chown `id -u #{options[:owner]}`:`id -g #{options[:group]}` #{guestpath}")
|
41
|
+
end
|
42
|
+
|
43
|
+
def mount_nfs(ip, folders)
|
44
|
+
# TODO: Maybe check for nfs support on the guest, since its often
|
45
|
+
# not installed by default
|
46
|
+
folders.each do |name, opts|
|
47
|
+
vm.channel.sudo("mkdir -p #{opts[:guestpath]}")
|
48
|
+
vm.channel.sudo("mount #{ip}:'#{opts[:hostpath]}' #{opts[:guestpath]}",
|
49
|
+
:error_class => LinuxError,
|
50
|
+
:error_key => :mount_nfs_fail)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#-------------------------------------------------------------------
|
55
|
+
# "Private" methods which assist above methods
|
56
|
+
#-------------------------------------------------------------------
|
57
|
+
def mount_folder(name, guestpath, options)
|
58
|
+
# Determine the permission string to attach to the mount command
|
59
|
+
mount_options = "-o uid=`id -u #{options[:owner]}`,gid=`id -g #{options[:group]}`"
|
60
|
+
mount_options += ",#{options[:extra]}" if options[:extra]
|
61
|
+
|
62
|
+
attempts = 0
|
63
|
+
while true
|
64
|
+
success = true
|
65
|
+
@vm.channel.sudo("mount -t vboxsf #{mount_options} #{name} #{guestpath}") do |type, data|
|
66
|
+
success = false if type == :stderr && data =~ /No such device/i
|
67
|
+
end
|
68
|
+
|
69
|
+
break if success
|
70
|
+
|
71
|
+
attempts += 1
|
72
|
+
raise LinuxError, :mount_fail if attempts >= 10
|
73
|
+
sleep 5
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
module Vagrant
|
2
|
-
module
|
3
|
-
class Linux < Vagrant::
|
2
|
+
module Guest
|
3
|
+
class Linux < Vagrant::Guest::Base
|
4
4
|
# A custom config class which will be made accessible via `config.linux`
|
5
5
|
# This is not necessary for all system implementers, of course. However,
|
6
6
|
# generally, Vagrant tries to make almost every aspect of its execution
|
7
7
|
# configurable, and this assists that goal.
|
8
8
|
class LinuxConfig < Vagrant::Config::Base
|
9
|
-
configures :linux
|
10
|
-
|
11
9
|
attr_accessor :halt_timeout
|
12
10
|
attr_accessor :halt_check_interval
|
13
11
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
require 'vagrant/util/template_renderer'
|
5
|
+
|
6
|
+
module Vagrant
|
7
|
+
module Guest
|
8
|
+
class Redhat < Linux
|
9
|
+
# Make the TemplateRenderer top-level
|
10
|
+
include Vagrant::Util
|
11
|
+
|
12
|
+
def configure_networks(networks)
|
13
|
+
# Accumulate the configurations to add to the interfaces file as
|
14
|
+
# well as what interfaces we're actually configuring since we use that
|
15
|
+
# later.
|
16
|
+
interfaces = Set.new
|
17
|
+
networks.each do |network|
|
18
|
+
interfaces.add(network[:interface])
|
19
|
+
|
20
|
+
# Remove any previous vagrant configuration in this network interface's
|
21
|
+
# configuration files.
|
22
|
+
vm.channel.sudo("touch #{network_scripts_dir}/ifcfg-eth#{network[:interface]}")
|
23
|
+
vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-eth#{network[:interface]} > /tmp/vagrant-ifcfg-eth#{network[:interface]}")
|
24
|
+
vm.channel.sudo("cat /tmp/vagrant-ifcfg-eth#{network[:interface]} > #{network_scripts_dir}/ifcfg-eth#{network[:interface]}")
|
25
|
+
|
26
|
+
# Render and upload the network entry file to a deterministic
|
27
|
+
# temporary location.
|
28
|
+
entry = TemplateRenderer.render("guests/redhat/network_#{network[:type]}",
|
29
|
+
:options => network)
|
30
|
+
|
31
|
+
temp = Tempfile.new("vagrant")
|
32
|
+
temp.write(entry)
|
33
|
+
temp.close
|
34
|
+
|
35
|
+
vm.channel.upload(temp.path, "/tmp/vagrant-network-entry_#{network[:interface]}")
|
36
|
+
end
|
37
|
+
|
38
|
+
# Bring down all the interfaces we're reconfiguring. By bringing down
|
39
|
+
# each specifically, we avoid reconfiguring eth0 (the NAT interface) so
|
40
|
+
# SSH never dies.
|
41
|
+
interfaces.each do |interface|
|
42
|
+
vm.channel.sudo("/sbin/ifdown eth#{interface} 2> /dev/null")
|
43
|
+
vm.channel.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-eth#{interface}")
|
44
|
+
vm.channel.sudo("/sbin/ifup eth#{interface}")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# The path to the directory with the network configuration scripts.
|
49
|
+
# This is pulled out into its own directory since there are other
|
50
|
+
# operating systems (SuSE) which behave similarly but with a different
|
51
|
+
# path to the network scripts.
|
52
|
+
def network_scripts_dir
|
53
|
+
'/etc/sysconfig/network-scripts'
|
54
|
+
end
|
55
|
+
|
56
|
+
def change_host_name(name)
|
57
|
+
# Only do this if the hostname is not already set
|
58
|
+
if !vm.channel.test("sudo hostname | grep '#{name}'")
|
59
|
+
vm.channel.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
|
60
|
+
vm.channel.sudo("hostname #{name}")
|
61
|
+
vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Guest
|
3
|
+
# A general Vagrant system implementation for "solaris".
|
4
|
+
#
|
5
|
+
# Contributed by Blake Irvin <b.irvin@modcloth.com>
|
6
|
+
class Solaris < Base
|
7
|
+
# A custom config class which will be made accessible via `config.solaris`
|
8
|
+
# This is not necessary for all system implementers, of course. However,
|
9
|
+
# generally, Vagrant tries to make almost every aspect of its execution
|
10
|
+
# configurable, and this assists that goal.
|
11
|
+
class SolarisConfig < Vagrant::Config::Base
|
12
|
+
attr_accessor :halt_timeout
|
13
|
+
attr_accessor :halt_check_interval
|
14
|
+
# This sets the command to use to execute items as a superuser. sudo is default
|
15
|
+
attr_accessor :suexec_cmd
|
16
|
+
attr_accessor :device
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@halt_timeout = 30
|
20
|
+
@halt_check_interval = 1
|
21
|
+
@suexec_cmd = 'sudo'
|
22
|
+
@device = "e1000g"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Here for whenever it may be used.
|
27
|
+
class SolarisError < Errors::VagrantError
|
28
|
+
error_namespace("vagrant.guest.solaris")
|
29
|
+
end
|
30
|
+
|
31
|
+
def configure_networks(networks)
|
32
|
+
networks.each do |network|
|
33
|
+
device = "#{vm.config.solaris.device}#{network[:interface]}"
|
34
|
+
su_cmd = vm.config.solaris.suexec_cmd
|
35
|
+
ifconfig_cmd = "#{su_cmd} /sbin/ifconfig #{device}"
|
36
|
+
|
37
|
+
vm.channel.execute("#{ifconfig_cmd} plumb")
|
38
|
+
|
39
|
+
if network[:type].to_sym == :static
|
40
|
+
vm.channel.execute("#{ifconfig_cmd} inet #{network[:ip]} netmask #{network[:netmask]}")
|
41
|
+
vm.channel.execute("#{ifconfig_cmd} up")
|
42
|
+
vm.channel.execute("#{su_cmd} sh -c \"echo '#{network[:ip]}' > /etc/hostname.#{device}\"")
|
43
|
+
elsif network[:type].to_sym == :dhcp
|
44
|
+
vm.channel.execute("#{ifconfig_cmd} dhcp start")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def change_host_name(name)
|
50
|
+
su_cmd = vm.config.solaris.suexec_cmd
|
51
|
+
|
52
|
+
# Only do this if the hostname is not already set
|
53
|
+
if !vm.channel.test("#{su_cmd} hostname | grep '#{name}'")
|
54
|
+
vm.channel.execute("#{su_cmd} sh -c \"echo '#{name}' > /etc/nodename\"")
|
55
|
+
vm.channel.execute("#{su_cmd} uname -S #{name}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# There should be an exception raised if the line
|
60
|
+
#
|
61
|
+
# vagrant::::profiles=Primary Administrator
|
62
|
+
#
|
63
|
+
# does not exist in /etc/user_attr. TODO
|
64
|
+
def halt
|
65
|
+
# Wait until the VM's state is actually powered off. If this doesn't
|
66
|
+
# occur within a reasonable amount of time (15 seconds by default),
|
67
|
+
# then simply return and allow Vagrant to kill the machine.
|
68
|
+
count = 0
|
69
|
+
last_error = nil
|
70
|
+
while vm.state != :poweroff
|
71
|
+
begin
|
72
|
+
vm.channel.execute("#{vm.config.solaris.suexec_cmd} /usr/sbin/poweroff")
|
73
|
+
rescue IOError => e
|
74
|
+
# Save the last error; if it's not shutdown in a reasonable amount
|
75
|
+
# of attempts we will re-raise the error so it's not hidden for
|
76
|
+
# all time
|
77
|
+
last_error = e
|
78
|
+
end
|
79
|
+
|
80
|
+
count += 1
|
81
|
+
if count >= vm.config.solaris.halt_timeout
|
82
|
+
# Check for last error and re-raise it
|
83
|
+
if last_error != nil
|
84
|
+
raise last_error
|
85
|
+
else
|
86
|
+
# Otherwise, just return
|
87
|
+
return
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Still opportunities remaining; sleep and loop
|
92
|
+
sleep vm.config.solaris.halt_check_interval
|
93
|
+
end # while
|
94
|
+
end
|
95
|
+
|
96
|
+
def mount_shared_folder(name, guestpath, options)
|
97
|
+
# These are just far easier to use than the full options syntax
|
98
|
+
owner = options[:owner]
|
99
|
+
group = options[:group]
|
100
|
+
|
101
|
+
# Create the shared folder
|
102
|
+
vm.channel.execute("#{vm.config.solaris.suexec_cmd} mkdir -p #{guestpath}")
|
103
|
+
|
104
|
+
# Mount the folder with the proper owner/group
|
105
|
+
mount_options = "-o uid=`id -u #{owner}`,gid=`id -g #{group}`"
|
106
|
+
mount_options += ",#{options[:extra]}" if options[:extra]
|
107
|
+
vm.channel.execute("#{vm.config.solaris.suexec_cmd} /sbin/mount -F vboxfs #{mount_options} #{name} #{guestpath}")
|
108
|
+
|
109
|
+
# chown the folder to the proper owner/group
|
110
|
+
vm.channel.execute("#{vm.config.solaris.suexec_cmd} chown `id -u #{owner}`:`id -g #{group}` #{guestpath}")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'vagrant/guest/debian'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Guest
|
5
|
+
class Ubuntu < Debian
|
6
|
+
def mount_shared_folder(name, guestpath, options)
|
7
|
+
# Mount it like normal
|
8
|
+
super
|
9
|
+
|
10
|
+
# Emit an upstart event if upstart is available
|
11
|
+
@vm.channel.sudo("[ -x /sbin/initctl ] && /sbin/initctl emit vagrant-mounted MOUNTPOINT=#{guestpath}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def change_host_name(name)
|
15
|
+
if !vm.channel.test("sudo hostname | grep '#{name}'")
|
16
|
+
vm.channel.sudo("sed -i 's/.*$/#{name}/' /etc/hostname")
|
17
|
+
vm.channel.sudo("sed -i 's@^\\(127[.]0[.]1[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
|
18
|
+
vm.channel.sudo("service hostname start")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/vagrant/hosts.rb
CHANGED
@@ -1,10 +1,27 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Hosts
|
3
|
-
autoload :Base,
|
4
|
-
autoload :Arch,
|
5
|
-
autoload :BSD,
|
6
|
-
autoload :FreeBSD,'vagrant/hosts/freebsd'
|
7
|
-
autoload :Fedora,
|
8
|
-
autoload :Linux,
|
3
|
+
autoload :Base, 'vagrant/hosts/base'
|
4
|
+
autoload :Arch, 'vagrant/hosts/arch'
|
5
|
+
autoload :BSD, 'vagrant/hosts/bsd'
|
6
|
+
autoload :FreeBSD, 'vagrant/hosts/freebsd'
|
7
|
+
autoload :Fedora, 'vagrant/hosts/fedora'
|
8
|
+
autoload :Linux, 'vagrant/hosts/linux'
|
9
|
+
autoload :Windows, 'vagrant/hosts/windows'
|
10
|
+
|
11
|
+
# This method detects the correct host based on the `match?` methods
|
12
|
+
# implemented in the registered hosts.
|
13
|
+
def self.detect(registry)
|
14
|
+
# Sort the hosts by their precedence
|
15
|
+
host_klasses = registry.to_hash.values
|
16
|
+
host_klasses = host_klasses.sort_by { |a| a.precedence }.reverse
|
17
|
+
|
18
|
+
# Test for matches and return the host class that matches
|
19
|
+
host_klasses.each do |klass|
|
20
|
+
return klass if klass.match?
|
21
|
+
end
|
22
|
+
|
23
|
+
# No matches found...
|
24
|
+
return nil
|
25
|
+
end
|
9
26
|
end
|
10
27
|
end
|
data/lib/vagrant/hosts/arch.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Hosts
|
3
3
|
class Arch < Linux
|
4
|
-
def
|
4
|
+
def self.match?
|
5
|
+
File.exist?("/etc/rc.conf") && File.exist?("/etc/pacman.conf")
|
6
|
+
end
|
7
|
+
|
8
|
+
def nfs_export(id, ip, folders)
|
5
9
|
output = TemplateRenderer.render('nfs/exports_linux',
|
6
|
-
:uuid =>
|
10
|
+
:uuid => id,
|
7
11
|
:ip => ip,
|
8
12
|
:folders => folders)
|
9
13
|
|
10
|
-
|
14
|
+
@ui.info I18n.t("vagrant.hosts.arch.nfs_export.prepare")
|
11
15
|
sleep 0.5
|
12
16
|
|
13
17
|
output.split("\n").each do |line|
|
data/lib/vagrant/hosts/base.rb
CHANGED
@@ -1,54 +1,39 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Hosts
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# default
|
3
|
+
# Interface for classes which house behavior that is specific
|
4
|
+
# to the host OS that is running Vagrant.
|
5
|
+
#
|
6
|
+
# By default, Vagrant will attempt to choose the best option
|
7
|
+
# for your machine, but the host may also be explicitly set
|
8
|
+
# via the `config.vagrant.host` parameter.
|
7
9
|
class Base
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
# Loads the proper host for the given value. If the value is nil
|
12
|
-
# or is the symbol `:detect`, then the host class will be detected
|
13
|
-
# using the `RUBY_PLATFORM` constant.
|
14
|
-
#
|
15
|
-
# @param [Environment] env
|
16
|
-
# @param [String] klass
|
17
|
-
# @return [Base]
|
18
|
-
def self.load(env, klass)
|
19
|
-
klass = detect if klass.nil? || klass == :detect
|
20
|
-
return nil if !klass
|
21
|
-
return klass.new(env)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Detects the proper host class for current platform and returns
|
25
|
-
# the class.
|
10
|
+
# This returns true/false depending on if the current running system
|
11
|
+
# matches the host class.
|
26
12
|
#
|
27
|
-
# @return [
|
28
|
-
def self.
|
29
|
-
[BSD, Linux].each do |type|
|
30
|
-
result = type.distro_dispatch
|
31
|
-
return result if result
|
32
|
-
end
|
33
|
-
|
34
|
-
nil
|
35
|
-
rescue Exception
|
13
|
+
# @return [Boolean]
|
14
|
+
def self.match?
|
36
15
|
nil
|
37
16
|
end
|
38
17
|
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
|
43
|
-
|
18
|
+
# The precedence of the host when checking for matches. This is to
|
19
|
+
# allow certain host such as generic OS's ("Linux", "BSD", etc.)
|
20
|
+
# to be specified last.
|
21
|
+
#
|
22
|
+
# The hosts with the higher numbers will be checked first.
|
23
|
+
#
|
24
|
+
# If you're implementing a basic host, you can probably ignore this.
|
25
|
+
def self.precedence
|
26
|
+
5
|
44
27
|
end
|
45
28
|
|
46
|
-
#
|
47
|
-
#
|
29
|
+
# Initializes a new host class.
|
30
|
+
#
|
31
|
+
# The only required parameter is a UI object so that the host
|
32
|
+
# objects have some way to communicate with the outside world.
|
48
33
|
#
|
49
|
-
# @param [
|
50
|
-
def initialize(
|
51
|
-
@
|
34
|
+
# @param [UI] ui UI for the hosts to output to.
|
35
|
+
def initialize(ui)
|
36
|
+
@ui = ui
|
52
37
|
end
|
53
38
|
|
54
39
|
# Returns true of false denoting whether or not this host supports
|
@@ -60,16 +45,21 @@ module Vagrant
|
|
60
45
|
false
|
61
46
|
end
|
62
47
|
|
63
|
-
# Exports the given hash of folders via NFS.
|
64
|
-
# an {Vagrant::Action::ActionException} if anything goes wrong.
|
48
|
+
# Exports the given hash of folders via NFS.
|
65
49
|
#
|
50
|
+
# @param [String] id A unique ID that is guaranteed to be unique to
|
51
|
+
# match these sets of folders.
|
66
52
|
# @param [String] ip IP of the guest machine.
|
67
53
|
# @param [Hash] folders Shared folders to sync.
|
68
|
-
def nfs_export(ip, folders)
|
54
|
+
def nfs_export(id, ip, folders)
|
69
55
|
end
|
70
56
|
|
71
|
-
#
|
72
|
-
|
57
|
+
# Prunes any NFS exports made by Vagrant which aren't in the set
|
58
|
+
# of valid ids given.
|
59
|
+
#
|
60
|
+
# @param [Array<String>] valid_ids Valid IDs that should not be
|
61
|
+
# pruned.
|
62
|
+
def nfs_prune(valid_ids)
|
73
63
|
end
|
74
64
|
end
|
75
65
|
end
|