tnargav 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. data/.gitignore +31 -0
  2. data/.gitsetup.yml +5 -0
  3. data/.travis.yml +7 -0
  4. data/.yardopts +1 -0
  5. data/CHANGELOG.md +1067 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +21 -0
  8. data/README.md +89 -0
  9. data/Rakefile +18 -0
  10. data/bin/vagrant +106 -0
  11. data/config/default.rb +36 -0
  12. data/contrib/README.md +12 -0
  13. data/contrib/bash/completion.sh +3 -0
  14. data/contrib/emacs/vagrant.el +8 -0
  15. data/contrib/vim/vagrantfile.vim +9 -0
  16. data/keys/README.md +17 -0
  17. data/keys/vagrant +27 -0
  18. data/keys/vagrant.pub +1 -0
  19. data/lib/vagrant/action/builder.rb +174 -0
  20. data/lib/vagrant/action/builtin/box_add.rb +81 -0
  21. data/lib/vagrant/action/builtin/call.rb +67 -0
  22. data/lib/vagrant/action/builtin/config_validate.rb +30 -0
  23. data/lib/vagrant/action/builtin/confirm.rb +38 -0
  24. data/lib/vagrant/action/builtin/destroy_confirm.rb +21 -0
  25. data/lib/vagrant/action/builtin/env_set.rb +24 -0
  26. data/lib/vagrant/action/builtin/graceful_halt.rb +73 -0
  27. data/lib/vagrant/action/builtin/handle_box_url.rb +77 -0
  28. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +134 -0
  29. data/lib/vagrant/action/builtin/lock.rb +57 -0
  30. data/lib/vagrant/action/builtin/nfs.rb +118 -0
  31. data/lib/vagrant/action/builtin/provision.rb +70 -0
  32. data/lib/vagrant/action/builtin/set_hostname.rb +27 -0
  33. data/lib/vagrant/action/builtin/ssh_exec.rb +42 -0
  34. data/lib/vagrant/action/builtin/ssh_run.rb +43 -0
  35. data/lib/vagrant/action/general/package.rb +103 -0
  36. data/lib/vagrant/action/hook.rb +107 -0
  37. data/lib/vagrant/action/runner.rb +69 -0
  38. data/lib/vagrant/action/warden.rb +103 -0
  39. data/lib/vagrant/action.rb +43 -0
  40. data/lib/vagrant/batch_action.rb +113 -0
  41. data/lib/vagrant/box.rb +97 -0
  42. data/lib/vagrant/box_collection.rb +375 -0
  43. data/lib/vagrant/cli.rb +82 -0
  44. data/lib/vagrant/config/loader.rb +222 -0
  45. data/lib/vagrant/config/v1/dummy_config.rb +13 -0
  46. data/lib/vagrant/config/v1/loader.rb +105 -0
  47. data/lib/vagrant/config/v1/root.rb +60 -0
  48. data/lib/vagrant/config/v1.rb +9 -0
  49. data/lib/vagrant/config/v2/dummy_config.rb +13 -0
  50. data/lib/vagrant/config/v2/loader.rb +141 -0
  51. data/lib/vagrant/config/v2/root.rb +105 -0
  52. data/lib/vagrant/config/v2/util.rb +21 -0
  53. data/lib/vagrant/config/v2.rb +9 -0
  54. data/lib/vagrant/config/version_base.rb +80 -0
  55. data/lib/vagrant/config.rb +61 -0
  56. data/lib/vagrant/environment.rb +843 -0
  57. data/lib/vagrant/errors.rb +570 -0
  58. data/lib/vagrant/guest.rb +163 -0
  59. data/lib/vagrant/hosts.rb +28 -0
  60. data/lib/vagrant/machine.rb +325 -0
  61. data/lib/vagrant/machine_state.rb +45 -0
  62. data/lib/vagrant/plugin/v1/command.rb +169 -0
  63. data/lib/vagrant/plugin/v1/communicator.rb +98 -0
  64. data/lib/vagrant/plugin/v1/config.rb +112 -0
  65. data/lib/vagrant/plugin/v1/errors.rb +15 -0
  66. data/lib/vagrant/plugin/v1/guest.rb +92 -0
  67. data/lib/vagrant/plugin/v1/host.rb +66 -0
  68. data/lib/vagrant/plugin/v1/manager.rb +131 -0
  69. data/lib/vagrant/plugin/v1/plugin.rb +229 -0
  70. data/lib/vagrant/plugin/v1/provider.rb +68 -0
  71. data/lib/vagrant/plugin/v1/provisioner.rb +50 -0
  72. data/lib/vagrant/plugin/v1.rb +19 -0
  73. data/lib/vagrant/plugin/v2/command.rb +234 -0
  74. data/lib/vagrant/plugin/v2/communicator.rb +98 -0
  75. data/lib/vagrant/plugin/v2/components.rb +47 -0
  76. data/lib/vagrant/plugin/v2/config.rb +136 -0
  77. data/lib/vagrant/plugin/v2/errors.rb +15 -0
  78. data/lib/vagrant/plugin/v2/guest.rb +78 -0
  79. data/lib/vagrant/plugin/v2/host.rb +66 -0
  80. data/lib/vagrant/plugin/v2/manager.rb +173 -0
  81. data/lib/vagrant/plugin/v2/plugin.rb +226 -0
  82. data/lib/vagrant/plugin/v2/provider.rb +69 -0
  83. data/lib/vagrant/plugin/v2/provisioner.rb +47 -0
  84. data/lib/vagrant/plugin/v2.rb +22 -0
  85. data/lib/vagrant/plugin.rb +6 -0
  86. data/lib/vagrant/registry.rb +78 -0
  87. data/lib/vagrant/ui.rb +215 -0
  88. data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
  89. data/lib/vagrant/util/busy.rb +59 -0
  90. data/lib/vagrant/util/counter.rb +24 -0
  91. data/lib/vagrant/util/downloader.rb +146 -0
  92. data/lib/vagrant/util/file_checksum.rb +38 -0
  93. data/lib/vagrant/util/file_mode.rb +12 -0
  94. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  95. data/lib/vagrant/util/is_port_open.rb +38 -0
  96. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  97. data/lib/vagrant/util/network_ip.rb +28 -0
  98. data/lib/vagrant/util/platform.rb +58 -0
  99. data/lib/vagrant/util/retryable.rb +31 -0
  100. data/lib/vagrant/util/safe_chdir.rb +33 -0
  101. data/lib/vagrant/util/safe_exec.rb +36 -0
  102. data/lib/vagrant/util/safe_puts.rb +31 -0
  103. data/lib/vagrant/util/scoped_hash_override.rb +45 -0
  104. data/lib/vagrant/util/ssh.rb +150 -0
  105. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  106. data/lib/vagrant/util/string_block_editor.rb +77 -0
  107. data/lib/vagrant/util/subprocess.rb +273 -0
  108. data/lib/vagrant/util/template_renderer.rb +83 -0
  109. data/lib/vagrant/util/which.rb +43 -0
  110. data/lib/vagrant/util.rb +12 -0
  111. data/lib/vagrant/version.rb +6 -0
  112. data/lib/vagrant.rb +258 -0
  113. data/plugins/README.md +5 -0
  114. data/plugins/commands/box/command/add.rb +51 -0
  115. data/plugins/commands/box/command/list.rb +41 -0
  116. data/plugins/commands/box/command/remove.rb +37 -0
  117. data/plugins/commands/box/command/repackage.rb +43 -0
  118. data/plugins/commands/box/command/root.rb +75 -0
  119. data/plugins/commands/box/plugin.rb +15 -0
  120. data/plugins/commands/destroy/command.rb +31 -0
  121. data/plugins/commands/destroy/plugin.rb +18 -0
  122. data/plugins/commands/halt/command.rb +33 -0
  123. data/plugins/commands/halt/plugin.rb +18 -0
  124. data/plugins/commands/init/command.rb +40 -0
  125. data/plugins/commands/init/plugin.rb +18 -0
  126. data/plugins/commands/package/command.rb +83 -0
  127. data/plugins/commands/package/plugin.rb +18 -0
  128. data/plugins/commands/plugin/action/bundler_check.rb +25 -0
  129. data/plugins/commands/plugin/action/install_gem.rb +81 -0
  130. data/plugins/commands/plugin/action/license_plugin.rb +54 -0
  131. data/plugins/commands/plugin/action/list_plugins.rb +54 -0
  132. data/plugins/commands/plugin/action/prune_gems.rb +149 -0
  133. data/plugins/commands/plugin/action/uninstall_plugin.rb +23 -0
  134. data/plugins/commands/plugin/action.rb +52 -0
  135. data/plugins/commands/plugin/command/base.rb +22 -0
  136. data/plugins/commands/plugin/command/install.rb +58 -0
  137. data/plugins/commands/plugin/command/license.rb +31 -0
  138. data/plugins/commands/plugin/command/list.rb +28 -0
  139. data/plugins/commands/plugin/command/root.rb +75 -0
  140. data/plugins/commands/plugin/command/uninstall.rb +28 -0
  141. data/plugins/commands/plugin/gem_helper.rb +74 -0
  142. data/plugins/commands/plugin/plugin.rb +22 -0
  143. data/plugins/commands/plugin/state_file.rb +57 -0
  144. data/plugins/commands/provision/command.rb +34 -0
  145. data/plugins/commands/provision/plugin.rb +18 -0
  146. data/plugins/commands/reload/command.rb +37 -0
  147. data/plugins/commands/reload/plugin.rb +18 -0
  148. data/plugins/commands/resume/command.rb +25 -0
  149. data/plugins/commands/resume/plugin.rb +17 -0
  150. data/plugins/commands/ssh/command.rb +63 -0
  151. data/plugins/commands/ssh/plugin.rb +17 -0
  152. data/plugins/commands/ssh_config/command.rb +49 -0
  153. data/plugins/commands/ssh_config/plugin.rb +18 -0
  154. data/plugins/commands/status/command.rb +39 -0
  155. data/plugins/commands/status/plugin.rb +18 -0
  156. data/plugins/commands/suspend/command.rb +25 -0
  157. data/plugins/commands/suspend/plugin.rb +18 -0
  158. data/plugins/commands/up/command.rb +57 -0
  159. data/plugins/commands/up/plugin.rb +17 -0
  160. data/plugins/commands/up/start_mixins.rb +26 -0
  161. data/plugins/communicators/ssh/communicator.rb +342 -0
  162. data/plugins/communicators/ssh/plugin.rb +19 -0
  163. data/plugins/guests/arch/cap/change_host_name.rb +18 -0
  164. data/plugins/guests/arch/cap/configure_networks.rb +23 -0
  165. data/plugins/guests/arch/guest.rb +11 -0
  166. data/plugins/guests/arch/plugin.rb +25 -0
  167. data/plugins/guests/debian/cap/change_host_name.rb +18 -0
  168. data/plugins/guests/debian/cap/configure_networks.rb +61 -0
  169. data/plugins/guests/debian/guest.rb +9 -0
  170. data/plugins/guests/debian/plugin.rb +25 -0
  171. data/plugins/guests/fedora/cap/configure_networks.rb +59 -0
  172. data/plugins/guests/fedora/cap/network_scripts_dir.rb +15 -0
  173. data/plugins/guests/fedora/guest.rb +11 -0
  174. data/plugins/guests/fedora/plugin.rb +25 -0
  175. data/plugins/guests/freebsd/cap/change_host_name.rb +14 -0
  176. data/plugins/guests/freebsd/cap/configure_networks.rb +39 -0
  177. data/plugins/guests/freebsd/cap/halt.rb +16 -0
  178. data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +14 -0
  179. data/plugins/guests/freebsd/guest.rb +14 -0
  180. data/plugins/guests/freebsd/plugin.rb +35 -0
  181. data/plugins/guests/gentoo/cap/change_host_name.rb +17 -0
  182. data/plugins/guests/gentoo/cap/configure_networks.rb +43 -0
  183. data/plugins/guests/gentoo/guest.rb +9 -0
  184. data/plugins/guests/gentoo/plugin.rb +25 -0
  185. data/plugins/guests/linux/cap/halt.rb +16 -0
  186. data/plugins/guests/linux/cap/mount_nfs.rb +30 -0
  187. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +40 -0
  188. data/plugins/guests/linux/cap/read_ip_address.rb +17 -0
  189. data/plugins/guests/linux/cap/shell_expand_guest_path.rb +26 -0
  190. data/plugins/guests/linux/guest.rb +11 -0
  191. data/plugins/guests/linux/plugin.rb +40 -0
  192. data/plugins/guests/openbsd/cap/halt.rb +16 -0
  193. data/plugins/guests/openbsd/guest.rb +11 -0
  194. data/plugins/guests/openbsd/plugin.rb +20 -0
  195. data/plugins/guests/pld/cap/network_scripts_dir.rb +11 -0
  196. data/plugins/guests/pld/guest.rb +11 -0
  197. data/plugins/guests/pld/plugin.rb +20 -0
  198. data/plugins/guests/redhat/cap/change_host_name.rb +18 -0
  199. data/plugins/guests/redhat/cap/configure_networks.rb +60 -0
  200. data/plugins/guests/redhat/cap/network_scripts_dir.rb +11 -0
  201. data/plugins/guests/redhat/guest.rb +11 -0
  202. data/plugins/guests/redhat/plugin.rb +30 -0
  203. data/plugins/guests/solaris/cap/change_host_name.rb +17 -0
  204. data/plugins/guests/solaris/cap/configure_networks.rb +25 -0
  205. data/plugins/guests/solaris/cap/halt.rb +21 -0
  206. data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +28 -0
  207. data/plugins/guests/solaris/config.rb +18 -0
  208. data/plugins/guests/solaris/guest.rb +14 -0
  209. data/plugins/guests/solaris/plugin.rb +40 -0
  210. data/plugins/guests/suse/cap/change_host_name.rb +18 -0
  211. data/plugins/guests/suse/cap/network_scripts_dir.rb +11 -0
  212. data/plugins/guests/suse/guest.rb +11 -0
  213. data/plugins/guests/suse/plugin.rb +25 -0
  214. data/plugins/guests/ubuntu/cap/change_host_name.rb +23 -0
  215. data/plugins/guests/ubuntu/guest.rb +32 -0
  216. data/plugins/guests/ubuntu/plugin.rb +20 -0
  217. data/plugins/hosts/arch/host.rb +68 -0
  218. data/plugins/hosts/arch/plugin.rb +15 -0
  219. data/plugins/hosts/bsd/host.rb +102 -0
  220. data/plugins/hosts/bsd/plugin.rb +15 -0
  221. data/plugins/hosts/fedora/host.rb +51 -0
  222. data/plugins/hosts/fedora/plugin.rb +15 -0
  223. data/plugins/hosts/freebsd/host.rb +43 -0
  224. data/plugins/hosts/freebsd/plugin.rb +15 -0
  225. data/plugins/hosts/gentoo/host.rb +24 -0
  226. data/plugins/hosts/gentoo/plugin.rb +15 -0
  227. data/plugins/hosts/linux/host.rb +95 -0
  228. data/plugins/hosts/linux/plugin.rb +15 -0
  229. data/plugins/hosts/opensuse/host.rb +34 -0
  230. data/plugins/hosts/opensuse/plugin.rb +15 -0
  231. data/plugins/hosts/windows/host.rb +17 -0
  232. data/plugins/hosts/windows/plugin.rb +15 -0
  233. data/plugins/kernel_v1/config/nfs.rb +20 -0
  234. data/plugins/kernel_v1/config/package.rb +17 -0
  235. data/plugins/kernel_v1/config/ssh.rb +46 -0
  236. data/plugins/kernel_v1/config/vagrant.rb +31 -0
  237. data/plugins/kernel_v1/config/vm.rb +184 -0
  238. data/plugins/kernel_v1/plugin.rb +44 -0
  239. data/plugins/kernel_v2/config/nfs.rb +14 -0
  240. data/plugins/kernel_v2/config/package.rb +13 -0
  241. data/plugins/kernel_v2/config/ssh.rb +76 -0
  242. data/plugins/kernel_v2/config/ssh_connect.rb +40 -0
  243. data/plugins/kernel_v2/config/vagrant.rb +13 -0
  244. data/plugins/kernel_v2/config/vm.rb +416 -0
  245. data/plugins/kernel_v2/config/vm_provisioner.rb +55 -0
  246. data/plugins/kernel_v2/config/vm_subvm.rb +30 -0
  247. data/plugins/kernel_v2/plugin.rb +44 -0
  248. data/plugins/providers/virtualbox/action/boot.rb +49 -0
  249. data/plugins/providers/virtualbox/action/check_accessible.rb +23 -0
  250. data/plugins/providers/virtualbox/action/check_created.rb +21 -0
  251. data/plugins/providers/virtualbox/action/check_guest_additions.rb +45 -0
  252. data/plugins/providers/virtualbox/action/check_running.rb +21 -0
  253. data/plugins/providers/virtualbox/action/check_virtualbox.rb +22 -0
  254. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +43 -0
  255. data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +18 -0
  256. data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +31 -0
  257. data/plugins/providers/virtualbox/action/clear_shared_folders.rb +17 -0
  258. data/plugins/providers/virtualbox/action/created.rb +20 -0
  259. data/plugins/providers/virtualbox/action/customize.rb +36 -0
  260. data/plugins/providers/virtualbox/action/destroy.rb +19 -0
  261. data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +16 -0
  262. data/plugins/providers/virtualbox/action/discard_state.rb +20 -0
  263. data/plugins/providers/virtualbox/action/export.rb +57 -0
  264. data/plugins/providers/virtualbox/action/forced_halt.rb +25 -0
  265. data/plugins/providers/virtualbox/action/forward_ports.rb +87 -0
  266. data/plugins/providers/virtualbox/action/import.rb +51 -0
  267. data/plugins/providers/virtualbox/action/is_paused.rb +20 -0
  268. data/plugins/providers/virtualbox/action/is_running.rb +20 -0
  269. data/plugins/providers/virtualbox/action/is_saved.rb +20 -0
  270. data/plugins/providers/virtualbox/action/match_mac_address.rb +21 -0
  271. data/plugins/providers/virtualbox/action/message_already_running.rb +16 -0
  272. data/plugins/providers/virtualbox/action/message_not_created.rb +16 -0
  273. data/plugins/providers/virtualbox/action/message_not_running.rb +16 -0
  274. data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +17 -0
  275. data/plugins/providers/virtualbox/action/network.rb +410 -0
  276. data/plugins/providers/virtualbox/action/package.rb +20 -0
  277. data/plugins/providers/virtualbox/action/package_vagrantfile.rb +33 -0
  278. data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +35 -0
  279. data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +64 -0
  280. data/plugins/providers/virtualbox/action/prune_nfs_exports.rb +20 -0
  281. data/plugins/providers/virtualbox/action/resume.rb +25 -0
  282. data/plugins/providers/virtualbox/action/sane_defaults.rb +91 -0
  283. data/plugins/providers/virtualbox/action/set_name.rb +40 -0
  284. data/plugins/providers/virtualbox/action/setup_package_files.rb +51 -0
  285. data/plugins/providers/virtualbox/action/share_folders.rb +128 -0
  286. data/plugins/providers/virtualbox/action/suspend.rb +20 -0
  287. data/plugins/providers/virtualbox/action.rb +311 -0
  288. data/plugins/providers/virtualbox/config.rb +86 -0
  289. data/plugins/providers/virtualbox/driver/base.rb +360 -0
  290. data/plugins/providers/virtualbox/driver/meta.rb +142 -0
  291. data/plugins/providers/virtualbox/driver/version_4_0.rb +485 -0
  292. data/plugins/providers/virtualbox/driver/version_4_1.rb +485 -0
  293. data/plugins/providers/virtualbox/driver/version_4_2.rb +482 -0
  294. data/plugins/providers/virtualbox/model/forwarded_port.rb +58 -0
  295. data/plugins/providers/virtualbox/plugin.rb +42 -0
  296. data/plugins/providers/virtualbox/provider.rb +92 -0
  297. data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +31 -0
  298. data/plugins/provisioners/ansible/config.rb +72 -0
  299. data/plugins/provisioners/ansible/plugin.rb +23 -0
  300. data/plugins/provisioners/ansible/provisioner.rb +45 -0
  301. data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +19 -0
  302. data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +14 -0
  303. data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +34 -0
  304. data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +24 -0
  305. data/plugins/provisioners/cfengine/config.rb +120 -0
  306. data/plugins/provisioners/cfengine/plugin.rb +42 -0
  307. data/plugins/provisioners/cfengine/provisioner.rb +136 -0
  308. data/plugins/provisioners/chef/config/base.rb +85 -0
  309. data/plugins/provisioners/chef/config/chef_client.rb +57 -0
  310. data/plugins/provisioners/chef/config/chef_solo.rb +87 -0
  311. data/plugins/provisioners/chef/plugin.rb +33 -0
  312. data/plugins/provisioners/chef/provisioner/base.rb +93 -0
  313. data/plugins/provisioners/chef/provisioner/chef_client.rb +107 -0
  314. data/plugins/provisioners/chef/provisioner/chef_solo.rb +192 -0
  315. data/plugins/provisioners/puppet/config/puppet.rb +70 -0
  316. data/plugins/provisioners/puppet/config/puppet_server.rb +16 -0
  317. data/plugins/provisioners/puppet/plugin.rb +33 -0
  318. data/plugins/provisioners/puppet/provisioner/puppet.rb +117 -0
  319. data/plugins/provisioners/puppet/provisioner/puppet_server.rb +67 -0
  320. data/plugins/provisioners/shell/config.rb +56 -0
  321. data/plugins/provisioners/shell/plugin.rb +23 -0
  322. data/plugins/provisioners/shell/provisioner.rb +86 -0
  323. data/tasks/acceptance.rake +113 -0
  324. data/tasks/bundler.rake +3 -0
  325. data/tasks/test.rake +20 -0
  326. data/templates/commands/init/Vagrantfile.erb +111 -0
  327. data/templates/commands/ssh_config/config.erb +16 -0
  328. data/templates/config/messages.erb +14 -0
  329. data/templates/config/validation_failed.erb +7 -0
  330. data/templates/guests/arch/network_dhcp.erb +4 -0
  331. data/templates/guests/arch/network_static.erb +6 -0
  332. data/templates/guests/debian/network_dhcp.erb +11 -0
  333. data/templates/guests/debian/network_static.erb +7 -0
  334. data/templates/guests/fedora/network_dhcp.erb +6 -0
  335. data/templates/guests/fedora/network_static.erb +13 -0
  336. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  337. data/templates/guests/freebsd/network_static.erb +3 -0
  338. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  339. data/templates/guests/gentoo/network_static.erb +4 -0
  340. data/templates/guests/redhat/network_dhcp.erb +6 -0
  341. data/templates/guests/redhat/network_static.erb +8 -0
  342. data/templates/locales/en.yml +1126 -0
  343. data/templates/nfs/exports.erb +5 -0
  344. data/templates/nfs/exports_freebsd.erb +5 -0
  345. data/templates/nfs/exports_linux.erb +5 -0
  346. data/templates/package_Vagrantfile.erb +11 -0
  347. data/templates/provisioners/chef_client/client.erb +32 -0
  348. data/templates/provisioners/chef_solo/solo.erb +25 -0
  349. data/templates/rgloader.rb +9 -0
  350. data/test/acceptance/base.rb +48 -0
  351. data/test/acceptance/box_test.rb +99 -0
  352. data/test/acceptance/destroy_test.rb +37 -0
  353. data/test/acceptance/halt_test.rb +72 -0
  354. data/test/acceptance/init_test.rb +33 -0
  355. data/test/acceptance/networking/host_only_test.rb +37 -0
  356. data/test/acceptance/networking/port_forward_test.rb +125 -0
  357. data/test/acceptance/package_test.rb +46 -0
  358. data/test/acceptance/provisioning/basic_test.rb +61 -0
  359. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  360. data/test/acceptance/provisioning/shell_test.rb +53 -0
  361. data/test/acceptance/resume_test.rb +17 -0
  362. data/test/acceptance/shared_folders_test.rb +84 -0
  363. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  364. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  365. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  366. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  367. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  368. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  369. data/test/acceptance/ssh_test.rb +46 -0
  370. data/test/acceptance/support/config.rb +42 -0
  371. data/test/acceptance/support/isolated_environment.rb +118 -0
  372. data/test/acceptance/support/matchers/have_color.rb +9 -0
  373. data/test/acceptance/support/matchers/match_output.rb +14 -0
  374. data/test/acceptance/support/matchers/succeed.rb +14 -0
  375. data/test/acceptance/support/network_tests.rb +29 -0
  376. data/test/acceptance/support/output.rb +95 -0
  377. data/test/acceptance/support/shared/base_context.rb +72 -0
  378. data/test/acceptance/support/shared/command_examples.rb +33 -0
  379. data/test/acceptance/support/virtualbox.rb +36 -0
  380. data/test/acceptance/suspend_test.rb +56 -0
  381. data/test/acceptance/up_basic_test.rb +33 -0
  382. data/test/acceptance/up_with_box_url.rb +40 -0
  383. data/test/acceptance/vagrant_test.rb +47 -0
  384. data/test/acceptance/version_test.rb +15 -0
  385. data/test/config/acceptance_boxes.yml +7 -0
  386. data/test/support/isolated_environment.rb +46 -0
  387. data/test/support/tempdir.rb +43 -0
  388. data/test/unit/base.rb +27 -0
  389. data/test/unit/support/dummy_provider.rb +16 -0
  390. data/test/unit/support/isolated_environment.rb +179 -0
  391. data/test/unit/support/shared/base_context.rb +104 -0
  392. data/test/unit/vagrant/action/builder_test.rb +242 -0
  393. data/test/unit/vagrant/action/builtin/call_test.rb +145 -0
  394. data/test/unit/vagrant/action/builtin/confirm_test.rb +36 -0
  395. data/test/unit/vagrant/action/builtin/env_set_test.rb +20 -0
  396. data/test/unit/vagrant/action/builtin/graceful_halt_test.rb +61 -0
  397. data/test/unit/vagrant/action/builtin/lock_test.rb +98 -0
  398. data/test/unit/vagrant/action/builtin/ssh_exec_test.rb +57 -0
  399. data/test/unit/vagrant/action/hook_test.rb +120 -0
  400. data/test/unit/vagrant/action/runner_test.rb +71 -0
  401. data/test/unit/vagrant/action/warden_test.rb +92 -0
  402. data/test/unit/vagrant/batch_action_test.rb +36 -0
  403. data/test/unit/vagrant/box_collection_test.rb +237 -0
  404. data/test/unit/vagrant/box_test.rb +122 -0
  405. data/test/unit/vagrant/cli_test.rb +27 -0
  406. data/test/unit/vagrant/config/loader_test.rb +184 -0
  407. data/test/unit/vagrant/config/v1/dummy_config_test.rb +24 -0
  408. data/test/unit/vagrant/config/v1/loader_test.rb +145 -0
  409. data/test/unit/vagrant/config/v1/root_test.rb +40 -0
  410. data/test/unit/vagrant/config/v2/dummy_config_test.rb +24 -0
  411. data/test/unit/vagrant/config/v2/loader_test.rb +151 -0
  412. data/test/unit/vagrant/config/v2/root_test.rb +97 -0
  413. data/test/unit/vagrant/config/v2/util_test.rb +21 -0
  414. data/test/unit/vagrant/config_test.rb +66 -0
  415. data/test/unit/vagrant/environment_test.rb +721 -0
  416. data/test/unit/vagrant/guest_test.rb +166 -0
  417. data/test/unit/vagrant/hosts_test.rb +37 -0
  418. data/test/unit/vagrant/machine_state_test.rb +26 -0
  419. data/test/unit/vagrant/machine_test.rb +384 -0
  420. data/test/unit/vagrant/plugin/v1/command_test.rb +143 -0
  421. data/test/unit/vagrant/plugin/v1/communicator_test.rb +9 -0
  422. data/test/unit/vagrant/plugin/v1/config_test.rb +50 -0
  423. data/test/unit/vagrant/plugin/v1/host_test.rb +5 -0
  424. data/test/unit/vagrant/plugin/v1/manager_test.rb +114 -0
  425. data/test/unit/vagrant/plugin/v1/plugin_test.rb +267 -0
  426. data/test/unit/vagrant/plugin/v1/provider_test.rb +18 -0
  427. data/test/unit/vagrant/plugin/v2/command_test.rb +238 -0
  428. data/test/unit/vagrant/plugin/v2/communicator_test.rb +9 -0
  429. data/test/unit/vagrant/plugin/v2/components_test.rb +17 -0
  430. data/test/unit/vagrant/plugin/v2/config_test.rb +60 -0
  431. data/test/unit/vagrant/plugin/v2/host_test.rb +5 -0
  432. data/test/unit/vagrant/plugin/v2/manager_test.rb +174 -0
  433. data/test/unit/vagrant/plugin/v2/plugin_test.rb +305 -0
  434. data/test/unit/vagrant/plugin/v2/provider_test.rb +18 -0
  435. data/test/unit/vagrant/registry_test.rb +128 -0
  436. data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
  437. data/test/unit/vagrant/util/downloader_test.rb +57 -0
  438. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  439. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
  440. data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
  441. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  442. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  443. data/test/unit/vagrant/util/retryable_test.rb +106 -0
  444. data/test/unit/vagrant/util/safe_chdir_test.rb +43 -0
  445. data/test/unit/vagrant/util/scoped_hash_override_test.rb +48 -0
  446. data/test/unit/vagrant/util/ssh_test.rb +30 -0
  447. data/test/unit/vagrant/util/string_block_editor_test.rb +106 -0
  448. data/test/unit/vagrant/util/which_test.rb +43 -0
  449. data/test/unit/vagrant_test.rb +56 -0
  450. data/tnargav.gemspec +69 -0
  451. data/vagrant.gemspec +69 -0
  452. metadata +730 -0
@@ -0,0 +1,70 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ module Action
5
+ module Builtin
6
+ # This class will run the configured provisioners against the
7
+ # machine.
8
+ #
9
+ # This action should be placed BEFORE the machine is booted so it
10
+ # can do some setup, and then run again (on the return path) against
11
+ # a running machine.
12
+ class Provision
13
+ def initialize(app, env)
14
+ @app = app
15
+ @logger = Log4r::Logger.new("vagrant::action::builtin::provision")
16
+ end
17
+
18
+ def call(env)
19
+ # Check if we're even provisioning things.
20
+ enabled = true
21
+ enabled = env[:provision_enabled] if env.has_key?(:provision_enabled)
22
+
23
+ # This keeps track of a mapping between provisioner and type
24
+ type_map = {}
25
+
26
+ # Get all the configured provisioners
27
+ provisioners = env[:machine].config.vm.provisioners.map do |provisioner|
28
+ # Instantiate the provisioner
29
+ klass = Vagrant.plugin("2").manager.provisioners[provisioner.name]
30
+ result = klass.new(env[:machine], provisioner.config)
31
+
32
+ # Store in the type map so that --provision-with works properly
33
+ type_map[result] = provisioner.name
34
+
35
+ # Return the result
36
+ result
37
+ end
38
+
39
+ # Ask the provisioners to modify the configuration if needed
40
+ provisioners.each do |p|
41
+ p.configure(env[:machine].config)
42
+ end
43
+
44
+ # Continue, we need the VM to be booted.
45
+ @app.call(env)
46
+
47
+ # Actually provision if we enabled it
48
+ if enabled
49
+ provisioners.each do |p|
50
+ next if env[:provision_types] && \
51
+ !env[:provision_types].include?(type_map[p])
52
+
53
+ run_provisioner(env, type_map[p].to_s, p)
54
+ end
55
+ end
56
+ end
57
+
58
+ # This is pulled out into a seperate method so that users can
59
+ # subclass and implement custom behavior if they'd like around
60
+ # this step.
61
+ def run_provisioner(env, name, p)
62
+ env[:ui].info(I18n.t("vagrant.actions.vm.provision.beginning",
63
+ :provisioner => name))
64
+
65
+ p.provision
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,27 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ module Action
5
+ module Builtin
6
+ # This middleware sets the hostname of the guest according to the
7
+ # "vm.hostname" configuration parameter if it is set. This middleware
8
+ # should be placed such that the after the @app.call, a booted machine
9
+ # is available (this generally means BEFORE the boot middleware).
10
+ class SetHostname
11
+ def initialize(app, env)
12
+ @app = app
13
+ end
14
+
15
+ def call(env)
16
+ @app.call(env)
17
+
18
+ hostname = env[:machine].config.vm.hostname
19
+ if !hostname.nil?
20
+ env[:ui].info I18n.t("vagrant.actions.vm.hostname.setting")
21
+ env[:machine].guest.capability(:change_host_name, hostname)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,42 @@
1
+ require "pathname"
2
+
3
+ require "vagrant/util/ssh"
4
+
5
+ module Vagrant
6
+ module Action
7
+ module Builtin
8
+ # This class will exec into a full fledged SSH console into the
9
+ # remote machine. This middleware assumes that the VM is running and
10
+ # ready for SSH, and uses the {Machine#ssh_info} method to retrieve
11
+ # SSH information necessary to connect.
12
+ #
13
+ # Note: If there are any middleware after `SSHExec`, they will **not**
14
+ # run, since exec replaces the currently running process.
15
+ class SSHExec
16
+ # For quick access to the `SSH` class.
17
+ include Vagrant::Util
18
+
19
+ def initialize(app, env)
20
+ @app = app
21
+ end
22
+
23
+ def call(env)
24
+ # Grab the SSH info from the machine
25
+ info = env[:machine].ssh_info
26
+
27
+ # If the result is nil, then the machine is telling us that it is
28
+ # not yet ready for SSH, so we raise this exception.
29
+ raise Errors::SSHNotReady if info.nil?
30
+
31
+ if info[:private_key_path]
32
+ # Check the SSH key permissions
33
+ SSH.check_key_permissions(Pathname.new(info[:private_key_path]))
34
+ end
35
+
36
+ # Exec!
37
+ SSH.exec(info, env[:ssh_opts])
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ module Action
5
+ module Builtin
6
+ # This class will run a single command on the remote machine and will
7
+ # mirror the output to the UI. The resulting exit status of the command
8
+ # will exist in the `:ssh_run_exit_status` key in the environment.
9
+ class SSHRun
10
+ def initialize(app, env)
11
+ @app = app
12
+ @logger = Log4r::Logger.new("vagrant::action::builtin::ssh_run")
13
+ end
14
+
15
+ def call(env)
16
+ command = env[:ssh_run_command]
17
+
18
+ @logger.debug("Executing command: #{command}")
19
+ exit_status = 0
20
+ exit_status = env[:machine].communicate.execute(command, :error_check => false) do |type, data|
21
+ # Determine the proper channel to send the output onto depending
22
+ # on the type of data we are receiving.
23
+ channel = type == :stdout ? :out : :error
24
+
25
+ # Print the output as it comes in, but don't prefix it and don't
26
+ # force a new line so that the output is properly preserved however
27
+ # it may be formatted.
28
+ env[:ui].info(data.to_s,
29
+ :prefix => false,
30
+ :new_line => false,
31
+ :channel => channel)
32
+ end
33
+
34
+ # Set the exit status on a known environmental variable
35
+ env[:ssh_run_exit_status] = exit_status
36
+
37
+ # Call the next middleware
38
+ @app.call(env)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,103 @@
1
+ require 'fileutils'
2
+
3
+ require 'vagrant/util/safe_chdir'
4
+ require 'vagrant/util/subprocess'
5
+
6
+ module Vagrant
7
+ module Action
8
+ module General
9
+ # A general packaging (tar) middleware. Given the following options,
10
+ # it will do the right thing:
11
+ #
12
+ # * package.output - The filename of the outputted package.
13
+ # * package.include - An array of files to include in the package.
14
+ # * package.directory - The directory which contains the contents to
15
+ # compress into the package.
16
+ #
17
+ # This middleware always produces the final file in the current working
18
+ # directory (FileUtils.pwd)
19
+ class Package
20
+ include Util
21
+
22
+ def initialize(app, env)
23
+ @app = app
24
+
25
+ env["package.files"] ||= {}
26
+ env["package.output"] ||= env[:global_config].package.name
27
+ end
28
+
29
+ def call(env)
30
+ @env = env
31
+
32
+ raise Errors::PackageOutputDirectory if File.directory?(tar_path)
33
+ raise Errors::PackageOutputExists if File.exist?(tar_path)
34
+ raise Errors::PackageRequiresDirectory if !env["package.directory"] ||
35
+ !File.directory?(env["package.directory"])
36
+
37
+ compress
38
+
39
+ @app.call(env)
40
+ end
41
+
42
+ def recover(env)
43
+ # There are certain exceptions that we don't delete the file for.
44
+ ignore_exc = [Errors::PackageOutputDirectory, Errors::PackageOutputExists]
45
+ ignore_exc.each do |exc|
46
+ return if env["vagrant.error"].is_a?(exc)
47
+ end
48
+
49
+ # Cleanup any packaged files if the packaging failed at some point.
50
+ File.delete(tar_path) if File.exist?(tar_path)
51
+ end
52
+
53
+ # This method copies the include files (passed in via command line)
54
+ # to the temporary directory so they are included in a sub-folder within
55
+ # the actual box
56
+ def copy_include_files
57
+ include_directory = Pathname.new(@env["package.directory"]).join("include")
58
+
59
+ @env["package.files"].each do |from, dest|
60
+ # We place the file in the include directory
61
+ to = include_directory.join(dest)
62
+
63
+ @env[:ui].info I18n.t("vagrant.actions.general.package.packaging", :file => from)
64
+ FileUtils.mkdir_p(to.parent)
65
+
66
+ # Copy direcotry contents recursively.
67
+ if File.directory?(from)
68
+ FileUtils.cp_r(Dir.glob(from), to.parent, :preserve => true)
69
+ else
70
+ FileUtils.cp(from, to, :preserve => true)
71
+ end
72
+ end
73
+ end
74
+
75
+ # Compress the exported file into a package
76
+ def compress
77
+ @env[:ui].info I18n.t("vagrant.actions.general.package.compressing", :tar_path => tar_path)
78
+
79
+ # Copy over the included files
80
+ copy_include_files
81
+
82
+ # Get the output path. We have to do this up here so that the
83
+ # pwd returns the proper thing.
84
+ output_path = tar_path.to_s
85
+
86
+ # Switch into that directory and package everything up
87
+ Util::SafeChdir.safe_chdir(@env["package.directory"]) do
88
+ # Find all the files in our current directory and tar it up!
89
+ files = Dir.glob(File.join(".", "**", "*"))
90
+
91
+ # Package!
92
+ Util::Subprocess.execute("bsdtar", "-czf", output_path, *files)
93
+ end
94
+ end
95
+
96
+ # Path to the final box output file
97
+ def tar_path
98
+ File.expand_path(@env["package.output"], FileUtils.pwd)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,107 @@
1
+ module Vagrant
2
+ module Action
3
+ # This class manages hooks into existing {Builder} stacks, and lets you
4
+ # add and remove middleware classes. This is the primary method by which
5
+ # plugins can hook into built-in middleware stacks.
6
+ class Hook
7
+ # This is a hash of the middleware to prepend to a certain
8
+ # other middleware.
9
+ #
10
+ # @return [Hash<Class, Array<Class>>]
11
+ attr_reader :before_hooks
12
+
13
+ # This is a hash of the middleware to append to a certain other
14
+ # middleware.
15
+ #
16
+ # @return [Hash<Class, Array<Class>>]
17
+ attr_reader :after_hooks
18
+
19
+ # This is a list of the hooks to just prepend to the beginning
20
+ #
21
+ # @return [Array<Class>]
22
+ attr_reader :prepend_hooks
23
+
24
+ # This is a list of the hooks to just append to the end
25
+ #
26
+ # @return [Array<Class>]
27
+ attr_reader :append_hooks
28
+
29
+ def initialize
30
+ @before_hooks = Hash.new { |h, k| h[k] = [] }
31
+ @after_hooks = Hash.new { |h, k| h[k] = [] }
32
+ @prepend_hooks = []
33
+ @append_hooks = []
34
+ end
35
+
36
+ # Add a middleware before an existing middleware.
37
+ #
38
+ # @param [Class] existing The existing middleware.
39
+ # @param [Class] new The new middleware.
40
+ def before(existing, new, *args, &block)
41
+ @before_hooks[existing] << [new, args, block]
42
+ end
43
+
44
+ # Add a middleware after an existing middleware.
45
+ #
46
+ # @param [Class] existing The existing middleware.
47
+ # @param [Class] new The new middleware.
48
+ def after(existing, new, *args, &block)
49
+ @after_hooks[existing] << [new, args, block]
50
+ end
51
+
52
+ # Append a middleware to the end of the stack. Note that if the
53
+ # middleware sequence ends early, then the new middleware won't
54
+ # be run.
55
+ #
56
+ # @param [Class] new The middleware to append.
57
+ def append(new, *args, &block)
58
+ @append_hooks << [new, args, block]
59
+ end
60
+
61
+ # Prepend a middleware to the beginning of the stack.
62
+ #
63
+ # @param [Class] new The new middleware to prepend.
64
+ def prepend(new, *args, &block)
65
+ @prepend_hooks << [new, args, block]
66
+ end
67
+
68
+ # This applies the given hook to a builder. This should not be
69
+ # called directly.
70
+ #
71
+ # @param [Builder] builder
72
+ def apply(builder, options=nil)
73
+ options ||= {}
74
+
75
+ if !options[:no_prepend_or_append]
76
+ # Prepends first
77
+ @prepend_hooks.each do |klass, args, block|
78
+ builder.insert(0, klass, *args, &block)
79
+ end
80
+
81
+ # Appends
82
+ @append_hooks.each do |klass, args, block|
83
+ builder.use(klass, *args, &block)
84
+ end
85
+ end
86
+
87
+ # Before hooks
88
+ @before_hooks.each do |key, list|
89
+ next if !builder.index(key)
90
+
91
+ list.each do |klass, args, block|
92
+ builder.insert_before(key, klass, *args, &block)
93
+ end
94
+ end
95
+
96
+ # After hooks
97
+ @after_hooks.each do |key, list|
98
+ next if !builder.index(key)
99
+
100
+ list.each do |klass, args, block|
101
+ builder.insert_after(key, klass, *args, &block)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,69 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/action/hook'
4
+ require 'vagrant/util/busy'
5
+
6
+ # TODO:
7
+ # * env.lock
8
+
9
+ module Vagrant
10
+ module Action
11
+ class Runner
12
+ @@reported_interrupt = false
13
+
14
+ def initialize(globals=nil, &block)
15
+ @globals = globals || {}
16
+ @lazy_globals = block
17
+ @logger = Log4r::Logger.new("vagrant::action::runner")
18
+ end
19
+
20
+ def run(callable_id, options=nil)
21
+ callable = callable_id
22
+ callable = Builder.build(callable_id) if callable_id.kind_of?(Class)
23
+ raise ArgumentError, "Argument to run must be a callable object or registered action." if !callable || !callable.respond_to?(:call)
24
+
25
+ # Create the initial environment with the options given
26
+ environment = {}
27
+ environment.merge!(@globals)
28
+ environment.merge!(@lazy_globals.call) if @lazy_globals
29
+ environment.merge!(options || {})
30
+
31
+ # Setup the action hooks
32
+ hooks = Vagrant.plugin("2").manager.action_hooks(environment[:action_name])
33
+ if !hooks.empty?
34
+ @logger.info("Preparing hooks for middleware sequence...")
35
+ environment[:action_hooks] = hooks.map do |hook_proc|
36
+ Hook.new.tap do |h|
37
+ hook_proc.call(h)
38
+ end
39
+ end
40
+
41
+ @logger.info("#{environment[:action_hooks].length} hooks defined.")
42
+ end
43
+
44
+ # Run the action chain in a busy block, marking the environment as
45
+ # interrupted if a SIGINT occurs, and exiting cleanly once the
46
+ # chain has been run.
47
+ ui = environment[:ui] if environment.has_key?(:ui)
48
+ int_callback = lambda do
49
+ if environment[:interrupted]
50
+ ui.error I18n.t("vagrant.actions.runner.exit_immediately") if ui
51
+ abort
52
+ end
53
+
54
+ ui.warn I18n.t("vagrant.actions.runner.waiting_cleanup") if ui && !@@reported_interrupt
55
+ environment[:interrupted] = true
56
+ @@reported_interrupt = true
57
+ end
58
+
59
+ # We place a process lock around every action that is called
60
+ @logger.info("Running action: #{callable_id}")
61
+ Util::Busy.busy(int_callback) { callable.call(environment) }
62
+
63
+ # Return the environment in case there are things in there that
64
+ # the caller wants to use.
65
+ environment
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,103 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ module Action
5
+ # The action warden is a middleware which injects itself between
6
+ # every other middleware, watching for exceptions which are raised
7
+ # and performing proper cleanup on every action by calling the `recover`
8
+ # method. The warden therefore allows middlewares to not worry about
9
+ # exceptional events, and by providing a simple callback, can clean up
10
+ # in any erroneous case.
11
+ #
12
+ # Warden will "just work" behind the scenes, and is not of particular
13
+ # interest except to those who are curious about the internal workings
14
+ # of Vagrant.
15
+ class Warden
16
+ attr_accessor :actions, :stack
17
+
18
+ def initialize(actions, env)
19
+ @stack = []
20
+ @actions = actions.map { |m| finalize_action(m, env) }
21
+ @logger = Log4r::Logger.new("vagrant::action::warden")
22
+ @last_error = nil
23
+ end
24
+
25
+ def call(env)
26
+ return if @actions.empty?
27
+
28
+ begin
29
+ # Call the next middleware in the sequence, appending to the stack
30
+ # of "recoverable" middlewares in case something goes wrong!
31
+ raise Errors::VagrantInterrupt if env[:interrupted]
32
+ action = @actions.shift
33
+ @logger.info("Calling action: #{action}")
34
+ @stack.unshift(action).first.call(env)
35
+ raise Errors::VagrantInterrupt if env[:interrupted]
36
+ rescue SystemExit
37
+ # This means that an "exit" or "abort" was called. In these cases,
38
+ # we just exit immediately.
39
+ raise
40
+ rescue Exception => e
41
+ # We guard this so that the Warden only outputs this once for
42
+ # an exception that bubbles up.
43
+ if e != @last_error
44
+ @logger.error("Error occurred: #{e}")
45
+ @last_error = e
46
+ end
47
+
48
+ env["vagrant.error"] = e
49
+
50
+ # Something went horribly wrong. Start the rescue chain then
51
+ # reraise the exception to properly kick us out of limbo here.
52
+ recover(env)
53
+ raise
54
+ end
55
+ end
56
+
57
+ # We implement the recover method ourselves in case a Warden is
58
+ # embedded within another Warden. To recover, we just do our own
59
+ # recovery process on our stack.
60
+ def recover(env)
61
+ @logger.info("Beginning recovery process...")
62
+
63
+ @stack.each do |act|
64
+ if act.respond_to?(:recover)
65
+ @logger.info("Calling recover: #{act}")
66
+ act.recover(env)
67
+ end
68
+ end
69
+
70
+ @logger.info("Recovery complete.")
71
+
72
+ # Clear stack so that warden down the middleware chain doesn't
73
+ # rescue again.
74
+ @stack.clear
75
+ end
76
+
77
+ # A somewhat confusing function which simply initializes each
78
+ # middleware properly to call the next middleware in the sequence.
79
+ def finalize_action(action, env)
80
+ klass, args, block = action
81
+
82
+ # Default the arguments to an empty array. Otherwise in Ruby 1.8
83
+ # a `nil` args will actually pass `nil` into the class.
84
+ args ||= []
85
+
86
+ if klass.is_a?(Class)
87
+ # A action klass which is to be instantiated with the
88
+ # app, env, and any arguments given
89
+ klass.new(self, env, *args, &block)
90
+ elsif klass.respond_to?(:call)
91
+ # Make it a lambda which calls the item then forwards
92
+ # up the chain
93
+ lambda do |e|
94
+ klass.call(e)
95
+ self.call(e)
96
+ end
97
+ else
98
+ raise "Invalid action: #{action.inspect}"
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,43 @@
1
+ require 'vagrant/action/builder'
2
+
3
+ module Vagrant
4
+ module Action
5
+ autoload :Runner, 'vagrant/action/runner'
6
+ autoload :Warden, 'vagrant/action/warden'
7
+
8
+ # Builtin contains middleware classes that are shipped with Vagrant-core
9
+ # and are thus available to all plugins as a "standard library" of sorts.
10
+ module Builtin
11
+ autoload :BoxAdd, "vagrant/action/builtin/box_add"
12
+ autoload :Call, "vagrant/action/builtin/call"
13
+ autoload :Confirm, "vagrant/action/builtin/confirm"
14
+ autoload :ConfigValidate, "vagrant/action/builtin/config_validate"
15
+ autoload :DestroyConfirm, "vagrant/action/builtin/destroy_confirm"
16
+ autoload :EnvSet, "vagrant/action/builtin/env_set"
17
+ autoload :GracefulHalt, "vagrant/action/builtin/graceful_halt"
18
+ autoload :HandleBoxUrl, "vagrant/action/builtin/handle_box_url"
19
+ autoload :HandleForwardedPortCollisions, "vagrant/action/builtin/handle_forwarded_port_collisions"
20
+ autoload :Lock, "vagrant/action/builtin/lock"
21
+ autoload :NFS, "vagrant/action/builtin/nfs"
22
+ autoload :Provision, "vagrant/action/builtin/provision"
23
+ autoload :SetHostname, "vagrant/action/builtin/set_hostname"
24
+ autoload :SSHExec, "vagrant/action/builtin/ssh_exec"
25
+ autoload :SSHRun, "vagrant/action/builtin/ssh_run"
26
+ end
27
+
28
+ module General
29
+ autoload :Package, 'vagrant/action/general/package'
30
+ end
31
+
32
+ # This is the action that will add a box from a URL. This middleware
33
+ # sequence is built-in to Vagrant. Plugins can hook into this like any
34
+ # other middleware sequence. This is particularly useful for provider
35
+ # plugins, which can hook in to do things like verification of boxes
36
+ # that are downloaded.
37
+ def self.action_box_add
38
+ Builder.new.tap do |b|
39
+ b.use Builtin::BoxAdd
40
+ end
41
+ end
42
+ end
43
+ end