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.
Files changed (324) hide show
  1. data/CHANGELOG.md +77 -1
  2. data/Gemfile +0 -14
  3. data/LICENSE +1 -1
  4. data/bin/vagrant +47 -20
  5. data/config/default.rb +6 -14
  6. data/lib/vagrant.rb +132 -5
  7. data/lib/vagrant/action.rb +45 -123
  8. data/lib/vagrant/action/box/destroy.rb +7 -3
  9. data/lib/vagrant/action/box/download.rb +8 -8
  10. data/lib/vagrant/action/box/package.rb +2 -2
  11. data/lib/vagrant/action/box/unpackage.rb +13 -7
  12. data/lib/vagrant/action/box/verify.rb +5 -5
  13. data/lib/vagrant/action/builder.rb +23 -19
  14. data/lib/vagrant/action/builtin.rb +117 -79
  15. data/lib/vagrant/action/env/set.rb +7 -4
  16. data/lib/vagrant/action/environment.rb +3 -41
  17. data/lib/vagrant/action/general/package.rb +14 -29
  18. data/lib/vagrant/action/general/validate.rb +2 -2
  19. data/lib/vagrant/action/runner.rb +53 -0
  20. data/lib/vagrant/action/vm/boot.rb +9 -9
  21. data/lib/vagrant/action/vm/check_accessible.rb +2 -2
  22. data/lib/vagrant/action/vm/check_box.rb +10 -12
  23. data/lib/vagrant/action/vm/check_guest_additions.rb +8 -8
  24. data/lib/vagrant/action/vm/check_port_collisions.rb +85 -0
  25. data/lib/vagrant/action/vm/clean_machine_folder.rb +4 -4
  26. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +3 -11
  27. data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
  28. data/lib/vagrant/action/vm/clear_shared_folders.rb +2 -11
  29. data/lib/vagrant/action/vm/customize.rb +19 -9
  30. data/lib/vagrant/action/vm/destroy.rb +4 -4
  31. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +2 -12
  32. data/lib/vagrant/action/vm/discard_state.rb +4 -4
  33. data/lib/vagrant/action/vm/export.rb +13 -8
  34. data/lib/vagrant/action/vm/forward_ports.rb +55 -102
  35. data/lib/vagrant/action/vm/halt.rb +9 -6
  36. data/lib/vagrant/action/vm/host_name.rb +4 -4
  37. data/lib/vagrant/action/vm/import.rb +19 -10
  38. data/lib/vagrant/action/vm/match_mac_address.rb +4 -9
  39. data/lib/vagrant/action/vm/network.rb +300 -94
  40. data/lib/vagrant/action/vm/nfs.rb +41 -26
  41. data/lib/vagrant/action/vm/package.rb +1 -1
  42. data/lib/vagrant/action/vm/package_vagrantfile.rb +5 -2
  43. data/lib/vagrant/action/vm/provision.rb +42 -13
  44. data/lib/vagrant/action/vm/provisioner_cleanup.rb +2 -2
  45. data/lib/vagrant/action/vm/{clear_nfs_exports.rb → prune_nfs_exports.rb} +7 -7
  46. data/lib/vagrant/action/vm/resume.rb +4 -4
  47. data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
  48. data/lib/vagrant/action/vm/share_folders.rb +63 -39
  49. data/lib/vagrant/action/vm/suspend.rb +4 -4
  50. data/lib/vagrant/action/warden.rb +13 -6
  51. data/lib/vagrant/box.rb +9 -55
  52. data/lib/vagrant/box_collection.rb +22 -17
  53. data/lib/vagrant/cli.rb +62 -47
  54. data/lib/vagrant/command.rb +18 -20
  55. data/lib/vagrant/command/base.rb +135 -90
  56. data/lib/vagrant/command/box.rb +46 -21
  57. data/lib/vagrant/command/box_add.rb +33 -0
  58. data/lib/vagrant/command/box_list.rb +25 -0
  59. data/lib/vagrant/command/box_remove.rb +23 -0
  60. data/lib/vagrant/command/box_repackage.rb +23 -0
  61. data/lib/vagrant/command/destroy.rb +16 -5
  62. data/lib/vagrant/command/halt.rb +25 -7
  63. data/lib/vagrant/command/init.rb +30 -7
  64. data/lib/vagrant/command/package.rb +49 -18
  65. data/lib/vagrant/command/provision.rb +22 -9
  66. data/lib/vagrant/command/reload.rb +18 -5
  67. data/lib/vagrant/command/resume.rb +18 -5
  68. data/lib/vagrant/command/ssh.rb +69 -31
  69. data/lib/vagrant/command/ssh_config.rb +37 -22
  70. data/lib/vagrant/command/status.rb +22 -20
  71. data/lib/vagrant/command/suspend.rb +18 -5
  72. data/lib/vagrant/command/up.rb +41 -8
  73. data/lib/vagrant/communication.rb +7 -0
  74. data/lib/vagrant/communication/base.rb +56 -0
  75. data/lib/vagrant/communication/ssh.rb +200 -0
  76. data/lib/vagrant/config.rb +29 -103
  77. data/lib/vagrant/config/base.rb +18 -26
  78. data/lib/vagrant/config/container.rb +37 -0
  79. data/lib/vagrant/config/error_recorder.rb +1 -1
  80. data/lib/vagrant/config/loader.rb +125 -0
  81. data/lib/vagrant/config/nfs.rb +1 -3
  82. data/lib/vagrant/config/package.rb +1 -3
  83. data/lib/vagrant/config/ssh.rb +31 -16
  84. data/lib/vagrant/config/top.rb +36 -25
  85. data/lib/vagrant/config/vagrant.rb +2 -5
  86. data/lib/vagrant/config/vm.rb +115 -56
  87. data/lib/vagrant/config/vm/provisioner.rb +16 -20
  88. data/lib/vagrant/config/vm/sub_vm.rb +1 -1
  89. data/lib/vagrant/data_store.rb +23 -15
  90. data/lib/vagrant/downloaders/base.rb +7 -5
  91. data/lib/vagrant/downloaders/file.rb +4 -4
  92. data/lib/vagrant/downloaders/http.rb +4 -5
  93. data/lib/vagrant/driver.rb +7 -0
  94. data/lib/vagrant/driver/virtualbox.rb +121 -0
  95. data/lib/vagrant/driver/virtualbox_4_0.rb +411 -0
  96. data/lib/vagrant/driver/virtualbox_4_1.rb +411 -0
  97. data/lib/vagrant/driver/virtualbox_base.rb +284 -0
  98. data/lib/vagrant/environment.rb +221 -240
  99. data/lib/vagrant/errors.rb +74 -25
  100. data/lib/vagrant/guest.rb +16 -0
  101. data/lib/vagrant/guest/arch.rb +48 -0
  102. data/lib/vagrant/{systems → guest}/base.rb +30 -18
  103. data/lib/vagrant/guest/debian.rb +61 -0
  104. data/lib/vagrant/{systems → guest}/freebsd.rb +11 -18
  105. data/lib/vagrant/guest/gentoo.rb +32 -0
  106. data/lib/vagrant/guest/linux.rb +78 -0
  107. data/lib/vagrant/{systems → guest}/linux/config.rb +2 -4
  108. data/lib/vagrant/guest/linux/error.rb +9 -0
  109. data/lib/vagrant/guest/redhat.rb +66 -0
  110. data/lib/vagrant/guest/solaris.rb +114 -0
  111. data/lib/vagrant/{systems → guest}/suse.rb +2 -2
  112. data/lib/vagrant/guest/ubuntu.rb +23 -0
  113. data/lib/vagrant/hosts.rb +23 -6
  114. data/lib/vagrant/hosts/arch.rb +7 -3
  115. data/lib/vagrant/hosts/base.rb +36 -46
  116. data/lib/vagrant/hosts/bsd.rb +53 -16
  117. data/lib/vagrant/hosts/fedora.rb +14 -0
  118. data/lib/vagrant/hosts/freebsd.rb +6 -36
  119. data/lib/vagrant/hosts/linux.rb +45 -20
  120. data/lib/vagrant/hosts/windows.rb +16 -0
  121. data/lib/vagrant/provisioners.rb +10 -7
  122. data/lib/vagrant/provisioners/base.rb +11 -34
  123. data/lib/vagrant/provisioners/chef.rb +30 -26
  124. data/lib/vagrant/provisioners/chef_client.rb +37 -23
  125. data/lib/vagrant/provisioners/chef_solo.rb +61 -16
  126. data/lib/vagrant/provisioners/puppet.rb +70 -38
  127. data/lib/vagrant/provisioners/puppet_server.rb +12 -13
  128. data/lib/vagrant/provisioners/shell.rb +24 -24
  129. data/lib/vagrant/registry.rb +49 -0
  130. data/lib/vagrant/ssh.rb +82 -153
  131. data/lib/vagrant/ui.rb +118 -50
  132. data/lib/vagrant/util/busy.rb +1 -1
  133. data/lib/vagrant/util/file_mode.rb +12 -0
  134. data/lib/vagrant/util/network_ip.rb +28 -0
  135. data/lib/vagrant/util/platform.rb +1 -0
  136. data/lib/vagrant/util/subprocess.rb +227 -0
  137. data/lib/vagrant/version.rb +1 -1
  138. data/lib/vagrant/vm.rb +111 -97
  139. data/tasks/acceptance.rake +3 -3
  140. data/tasks/test.rake +7 -2
  141. data/templates/commands/init/Vagrantfile.erb +11 -4
  142. data/templates/{ssh_config.erb → commands/ssh_config/config.erb} +0 -0
  143. data/templates/guests/arch/network_dhcp.erb +7 -0
  144. data/templates/guests/arch/network_static.erb +7 -0
  145. data/templates/guests/debian/network_dhcp.erb +6 -0
  146. data/templates/guests/debian/network_static.erb +7 -0
  147. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  148. data/templates/guests/gentoo/network_static.erb +4 -0
  149. data/templates/guests/redhat/network_dhcp.erb +6 -0
  150. data/templates/guests/redhat/network_static.erb +7 -0
  151. data/templates/locales/en.yml +241 -122
  152. data/templates/{chef_server_client.erb → provisioners/chef_client/client.erb} +0 -0
  153. data/templates/{chef_solo_solo.erb → provisioners/chef_solo/solo.erb} +0 -0
  154. data/test/acceptance/base.rb +10 -10
  155. data/test/acceptance/box_test.rb +28 -6
  156. data/test/acceptance/destroy_test.rb +1 -1
  157. data/test/acceptance/halt_test.rb +4 -4
  158. data/test/acceptance/init_test.rb +3 -3
  159. data/test/acceptance/networking/host_only_test.rb +37 -0
  160. data/test/acceptance/networking/port_forward_test.rb +125 -0
  161. data/test/acceptance/package_test.rb +46 -0
  162. data/test/acceptance/provisioning/basic_test.rb +61 -0
  163. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  164. data/test/acceptance/provisioning/shell_test.rb +53 -0
  165. data/test/acceptance/resume_test.rb +1 -1
  166. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  167. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  168. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  169. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  170. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  171. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  172. data/test/acceptance/ssh_test.rb +7 -2
  173. data/test/acceptance/support/config.rb +1 -1
  174. data/test/acceptance/support/isolated_environment.rb +41 -150
  175. data/test/acceptance/support/matchers/match_output.rb +1 -1
  176. data/test/acceptance/support/matchers/succeed.rb +14 -0
  177. data/test/acceptance/support/network_tests.rb +29 -0
  178. data/test/acceptance/support/output.rb +9 -1
  179. data/test/acceptance/support/shared/base_context.rb +16 -9
  180. data/test/acceptance/support/shared/command_examples.rb +4 -4
  181. data/test/acceptance/suspend_test.rb +1 -1
  182. data/test/acceptance/up_basic_test.rb +26 -7
  183. data/test/acceptance/up_with_box_url.rb +1 -1
  184. data/test/acceptance/vagrant_test.rb +1 -1
  185. data/test/acceptance/version_test.rb +0 -5
  186. data/test/support/isolated_environment.rb +46 -0
  187. data/test/{acceptance/support → support}/tempdir.rb +0 -0
  188. data/test/unit/base.rb +21 -0
  189. data/test/unit/support/isolated_environment.rb +39 -0
  190. data/test/unit/support/shared/base_context.rb +30 -0
  191. data/test/unit/vagrant/action/builder_test.rb +126 -177
  192. data/test/unit/vagrant/action/environment_test.rb +10 -21
  193. data/test/unit/vagrant/action/runner_test.rb +65 -0
  194. data/test/unit/vagrant/action/warden_test.rb +64 -97
  195. data/test/unit/vagrant/box_collection_test.rb +44 -33
  196. data/test/unit/vagrant/box_test.rb +25 -65
  197. data/test/unit/vagrant/command/base_test.rb +141 -14
  198. data/test/unit/vagrant/config/base_test.rb +16 -43
  199. data/test/unit/vagrant/config/loader_test.rb +79 -0
  200. data/test/unit/vagrant/config/top_test.rb +69 -0
  201. data/test/unit/vagrant/config/vm_test.rb +62 -47
  202. data/test/unit/vagrant/config_test.rb +16 -151
  203. data/test/unit/vagrant/data_store_test.rb +43 -61
  204. data/test/unit/vagrant/downloaders/base_test.rb +12 -22
  205. data/test/unit/vagrant/downloaders/file_test.rb +58 -31
  206. data/test/unit/vagrant/downloaders/http_test.rb +12 -86
  207. data/test/unit/vagrant/environment_test.rb +107 -536
  208. data/test/unit/vagrant/hosts_test.rb +36 -0
  209. data/test/unit/vagrant/registry_test.rb +56 -0
  210. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  211. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +23 -24
  212. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  213. data/test/unit/vagrant/util/retryable_test.rb +90 -34
  214. data/test/unit/vagrant_test.rb +27 -0
  215. data/test/{unit → unit_legacy}/locales/en.yml +0 -0
  216. data/test/{unit → unit_legacy}/test_helper.rb +0 -0
  217. data/test/{unit → unit_legacy}/vagrant/action/box/destroy_test.rb +0 -0
  218. data/test/{unit → unit_legacy}/vagrant/action/box/download_test.rb +0 -0
  219. data/test/{unit → unit_legacy}/vagrant/action/box/package_test.rb +0 -0
  220. data/test/{unit → unit_legacy}/vagrant/action/box/unpackage_test.rb +0 -0
  221. data/test/{unit → unit_legacy}/vagrant/action/box/verify_test.rb +0 -0
  222. data/test/{unit → unit_legacy}/vagrant/action/env/set_test.rb +0 -0
  223. data/test/{unit → unit_legacy}/vagrant/action/general/package_test.rb +0 -0
  224. data/test/{unit → unit_legacy}/vagrant/action/general/validate_test.rb +0 -0
  225. data/test/{unit → unit_legacy}/vagrant/action/vm/boot_test.rb +0 -0
  226. data/test/{unit → unit_legacy}/vagrant/action/vm/check_accessible_test.rb +0 -0
  227. data/test/{unit → unit_legacy}/vagrant/action/vm/check_box_test.rb +0 -0
  228. data/test/{unit → unit_legacy}/vagrant/action/vm/check_guest_additions_test.rb +0 -0
  229. data/test/{unit → unit_legacy}/vagrant/action/vm/clean_machine_folder_test.rb +0 -0
  230. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_forwarded_ports_test.rb +0 -0
  231. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_nfs_exports_test.rb +0 -0
  232. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_shared_folders_test.rb +0 -0
  233. data/test/{unit → unit_legacy}/vagrant/action/vm/customize_test.rb +0 -0
  234. data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_test.rb +0 -0
  235. data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +0 -0
  236. data/test/{unit → unit_legacy}/vagrant/action/vm/discard_state_test.rb +0 -0
  237. data/test/{unit → unit_legacy}/vagrant/action/vm/export_test.rb +0 -0
  238. data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_helpers_test.rb +0 -0
  239. data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_test.rb +0 -0
  240. data/test/{unit → unit_legacy}/vagrant/action/vm/halt_test.rb +0 -0
  241. data/test/{unit → unit_legacy}/vagrant/action/vm/host_name_test.rb +0 -0
  242. data/test/{unit → unit_legacy}/vagrant/action/vm/import_test.rb +0 -0
  243. data/test/{unit → unit_legacy}/vagrant/action/vm/match_mac_address_test.rb +0 -0
  244. data/test/{unit → unit_legacy}/vagrant/action/vm/modify_test.rb +0 -0
  245. data/test/{unit → unit_legacy}/vagrant/action/vm/network_test.rb +0 -0
  246. data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_helpers_test.rb +0 -0
  247. data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_test.rb +0 -0
  248. data/test/{unit → unit_legacy}/vagrant/action/vm/package_test.rb +0 -0
  249. data/test/{unit → unit_legacy}/vagrant/action/vm/package_vagrantfile_test.rb +0 -0
  250. data/test/{unit → unit_legacy}/vagrant/action/vm/provision_test.rb +0 -0
  251. data/test/{unit → unit_legacy}/vagrant/action/vm/provisioner_cleanup_test.rb +0 -0
  252. data/test/{unit → unit_legacy}/vagrant/action/vm/resume_test.rb +0 -0
  253. data/test/{unit → unit_legacy}/vagrant/action/vm/share_folders_test.rb +0 -0
  254. data/test/{unit → unit_legacy}/vagrant/action/vm/suspend_test.rb +0 -0
  255. data/test/{unit → unit_legacy}/vagrant/action_test.rb +0 -0
  256. data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
  257. data/test/unit_legacy/vagrant/box_test.rb +74 -0
  258. data/test/{unit → unit_legacy}/vagrant/cli_test.rb +0 -0
  259. data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
  260. data/test/{unit → unit_legacy}/vagrant/command/group_base_test.rb +0 -0
  261. data/test/{unit → unit_legacy}/vagrant/command/helpers_test.rb +0 -0
  262. data/test/{unit → unit_legacy}/vagrant/command/init_test.rb +0 -0
  263. data/test/{unit → unit_legacy}/vagrant/command/package_test.rb +0 -0
  264. data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
  265. data/test/{unit → unit_legacy}/vagrant/config/error_recorder_test.rb +0 -0
  266. data/test/{unit → unit_legacy}/vagrant/config/ssh_test.rb +0 -0
  267. data/test/{unit → unit_legacy}/vagrant/config/vagrant_test.rb +0 -0
  268. data/test/{unit → unit_legacy}/vagrant/config/vm/provisioner_test.rb +0 -0
  269. data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
  270. data/test/unit_legacy/vagrant/config_test.rb +148 -0
  271. data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
  272. data/test/unit_legacy/vagrant/environment_test.rb +539 -0
  273. data/test/{unit → unit_legacy}/vagrant/errors_test.rb +0 -0
  274. data/test/{unit → unit_legacy}/vagrant/hosts/base_test.rb +0 -0
  275. data/test/{unit → unit_legacy}/vagrant/hosts/bsd_test.rb +0 -0
  276. data/test/{unit → unit_legacy}/vagrant/hosts/linux_test.rb +0 -0
  277. data/test/{unit → unit_legacy}/vagrant/plugin_test.rb +0 -0
  278. data/test/{unit → unit_legacy}/vagrant/provisioners/base_test.rb +0 -0
  279. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_client_test.rb +0 -0
  280. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_solo_test.rb +0 -0
  281. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_test.rb +0 -0
  282. data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_server_test.rb +0 -0
  283. data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_test.rb +0 -0
  284. data/test/{unit → unit_legacy}/vagrant/provisioners/shell_test.rb +0 -0
  285. data/test/{unit → unit_legacy}/vagrant/ssh/session_test.rb +0 -0
  286. data/test/{unit → unit_legacy}/vagrant/ssh_test.rb +0 -0
  287. data/test/{unit → unit_legacy}/vagrant/systems/base_test.rb +0 -0
  288. data/test/{unit → unit_legacy}/vagrant/systems/linux_test.rb +0 -0
  289. data/test/{unit → unit_legacy}/vagrant/util/busy_test.rb +0 -0
  290. data/test/{unit → unit_legacy}/vagrant/util/counter_test.rb +0 -0
  291. data/test/{unit → unit_legacy}/vagrant/util/platform_test.rb +0 -0
  292. data/test/{unit → unit_legacy}/vagrant/util/stacked_proc_runner_test.rb +0 -0
  293. data/test/{unit → unit_legacy}/vagrant/util/template_renderer_test.rb +0 -0
  294. data/test/{unit → unit_legacy}/vagrant/vm_test.rb +0 -0
  295. data/vagrant.gemspec +7 -9
  296. metadata +214 -216
  297. data/keys/vagrant.ppk +0 -26
  298. data/lib/vagrant/action/box.rb +0 -11
  299. data/lib/vagrant/action/env.rb +0 -7
  300. data/lib/vagrant/action/general.rb +0 -8
  301. data/lib/vagrant/action/vm.rb +0 -34
  302. data/lib/vagrant/action/vm/forward_ports_helpers.rb +0 -28
  303. data/lib/vagrant/action/vm/modify.rb +0 -37
  304. data/lib/vagrant/action/vm/nfs_helpers.rb +0 -11
  305. data/lib/vagrant/command/group_base.rb +0 -107
  306. data/lib/vagrant/command/helpers.rb +0 -33
  307. data/lib/vagrant/command/named_base.rb +0 -14
  308. data/lib/vagrant/command/upgrade_to_060.rb +0 -45
  309. data/lib/vagrant/command/version.rb +0 -13
  310. data/lib/vagrant/ssh/session.rb +0 -136
  311. data/lib/vagrant/systems.rb +0 -13
  312. data/lib/vagrant/systems/arch.rb +0 -34
  313. data/lib/vagrant/systems/debian.rb +0 -36
  314. data/lib/vagrant/systems/gentoo.rb +0 -27
  315. data/lib/vagrant/systems/linux.rb +0 -82
  316. data/lib/vagrant/systems/linux/error.rb +0 -9
  317. data/lib/vagrant/systems/redhat.rb +0 -48
  318. data/lib/vagrant/systems/solaris.rb +0 -113
  319. data/lib/vagrant/systems/ubuntu.rb +0 -17
  320. data/templates/network_entry_arch.erb +0 -9
  321. data/templates/network_entry_debian.erb +0 -8
  322. data/templates/network_entry_gentoo.erb +0 -5
  323. data/templates/network_entry_redhat.erb +0 -9
  324. 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 ResumeCommand < NamedBase
4
- register "resume", "Resume a suspended Vagrant environment."
5
-
5
+ class Resume < Base
6
6
  def execute
7
- target_vms.each do |vm|
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
- vm.env.ui.info I18n.t("vagrant.commands.common.vm_not_created")
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
@@ -1,49 +1,87 @@
1
+ require 'optparse'
2
+
1
3
  module Vagrant
2
4
  module Command
3
- class SSHCommand < NamedBase
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
- if options[:command]
9
- ssh_execute
10
- else
11
- ssh_connect
12
- end
13
- end
7
+ options = {}
14
8
 
15
- protected
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
- def ssh_execute
18
- ssh_vm.ssh.execute do |ssh|
19
- ssh.exec!(options[:command]) do |channel, type, data|
20
- if type != :exit_status
21
- # Print the SSH output as it comes in, but don't prefix it and don't
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
- def ssh_connect
30
- ssh_vm.ssh.connect
31
- end
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
- def ssh_vm
34
- @ssh_vm ||= begin
35
- vm = self.name.nil? && env.multivm? ? env.primary_vm : nil
36
- raise Errors::MultiVMTargetRequired, :command => "ssh" if !vm && target_vms.length > 1
37
- vm = target_vms.first if !vm
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.vm.accessible?
42
- raise Errors::VMNotRunningError if !vm.vm.running?
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
- vm
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 SSHConfigCommand < NamedBase
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
- raise Errors::MultiVMTargetRequired, :command => "ssh_config" if target_vms.length > 1
9
- vm = target_vms.first
10
- raise Errors::VMNotCreatedError if !vm.created?
11
- raise Errors::VMInaccessible if !vm.vm.accessible?
12
-
13
- # We need to fix the file permissions of the key if they aren't set
14
- # properly, otherwise if the user attempts to SSH in, it won't work!
15
- vm.ssh.check_key_permissions(vm.env.config.ssh.private_key_path)
16
-
17
- $stdout.puts(Util::TemplateRenderer.render("ssh_config", {
18
- :host_key => options[:host] || vm.name || "vagrant",
19
- :ssh_host => vm.env.config.ssh.host,
20
- :ssh_user => vm.env.config.ssh.username,
21
- :ssh_port => vm.ssh.port,
22
- :private_key_path => vm.env.config.ssh.private_key_path,
23
- :forward_agent => vm.env.config.ssh.forward_agent,
24
- :forward_x11 => vm.env.config.ssh.forward_x11
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 StatusCommand < NamedBase
4
- register "status", "Shows the status of the current Vagrant environment."
5
-
5
+ class Status < Base
6
6
  def execute
7
- state = nil
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
- "#{vm.name.to_s.ljust(25)}#{state.gsub("_", " ")}"
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 = target_vms.length == 1 ? state : "listing"
24
+ state = results.length == 1 ? state : "listing"
23
25
 
24
- env.ui.info(I18n.t("vagrant.commands.status.output",
25
- :states => results.join("\n"),
26
- :message => I18n.t("vagrant.commands.status.#{state}")),
27
- :prefix => false)
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 SuspendCommand < NamedBase
4
- register "suspend", "Suspend a running Vagrant environment."
5
-
5
+ class Suspend < Base
6
6
  def execute
7
- target_vms.each do |vm|
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
- vm.env.ui.info I18n.t("vagrant.commands.common.vm_not_created")
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
@@ -1,16 +1,49 @@
1
+ require 'optparse'
2
+
1
3
  module Vagrant
2
4
  module Command
3
- class UpCommand < NamedBase
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
- target_vms.each do |vm|
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
- vm.env.ui.info I18n.t("vagrant.commands.up.vm_created")
11
- vm.start("provision.enabled" => options[:provision])
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
- vm.up("provision.enabled" => options[:provision])
45
+ @logger.info("Creating: #{vm.name}")
46
+ vm.up(action_params)
14
47
  end
15
48
  end
16
49
  end
@@ -0,0 +1,7 @@
1
+ module Vagrant
2
+ module Communication
3
+ autoload :Base, 'vagrant/communication/base'
4
+
5
+ autoload :SSH, 'vagrant/communication/ssh'
6
+ end
7
+ 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