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,59 @@
1
+ module Vagrant
2
+ module Util
3
+ # Utility class which allows blocks of code to be marked as "busy"
4
+ # with a specified interrupt handler. During busy areas of code, it
5
+ # is often undesirable for SIGINTs to immediately kill the application.
6
+ # This class is a helper to cleanly register callbacks to handle this
7
+ # situation.
8
+ class Busy
9
+ @@registered = []
10
+ @@mutex = Mutex.new
11
+
12
+ class << self
13
+ # Mark a given block of code as a "busy" block of code, which will
14
+ # register a SIGINT handler for the duration of the block. When a
15
+ # SIGINT occurs, the `sig_callback` proc will be called. It is up
16
+ # to the callback to behave properly and exit the application.
17
+ def busy(sig_callback)
18
+ register(sig_callback)
19
+ return yield
20
+ ensure
21
+ unregister(sig_callback)
22
+ end
23
+
24
+ # Registers a SIGINT handler. This typically is called from {busy}.
25
+ # Callbacks are only registered once, so calling this multiple times
26
+ # with the same callback has no consequence.
27
+ def register(sig_callback)
28
+ @@mutex.synchronize do
29
+ registered << sig_callback
30
+ registered.uniq!
31
+
32
+ # Register the handler if this is our first callback.
33
+ Signal.trap("INT") { fire_callbacks } if registered.length == 1
34
+ end
35
+ end
36
+
37
+ # Unregisters a SIGINT handler.
38
+ def unregister(sig_callback)
39
+ @@mutex.synchronize do
40
+ registered.delete(sig_callback)
41
+
42
+ # Remove the signal trap if no more registered callbacks exist
43
+ Signal.trap("INT", "DEFAULT") if registered.empty?
44
+ end
45
+ end
46
+
47
+ # Fires all the registered callbacks.
48
+ def fire_callbacks
49
+ registered.reverse.each { |r| r.call }
50
+ end
51
+
52
+ # Helper method to get access to the class variable. This is mostly
53
+ # exposed for tests. This shouldn't be mucked with directly, since it's
54
+ # structure may change at any time.
55
+ def registered; @@registered; end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,24 @@
1
+ require 'thread'
2
+
3
+ module Vagrant
4
+ module Util
5
+ # Atomic counter implementation. This is useful for incrementing
6
+ # a counter which is guaranteed to only be used once in its class.
7
+ module Counter
8
+ def get_and_update_counter(name=nil)
9
+ name ||= :global
10
+
11
+ mutex.synchronize do
12
+ @__counter ||= Hash.new(1)
13
+ result = @__counter[name]
14
+ @__counter[name] += 1
15
+ result
16
+ end
17
+ end
18
+
19
+ def mutex
20
+ @__counter_mutex ||= Mutex.new
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,146 @@
1
+ require "log4r"
2
+
3
+ require "vagrant/util/busy"
4
+ require "vagrant/util/subprocess"
5
+
6
+ module Vagrant
7
+ module Util
8
+ # This class downloads files using various protocols by subprocessing
9
+ # to cURL. cURL is a much more capable and complete download tool than
10
+ # a hand-rolled Ruby library, so we defer to it's expertise.
11
+ class Downloader
12
+ def initialize(source, destination, options=nil)
13
+ @logger = Log4r::Logger.new("vagrant::util::downloader")
14
+ @source = source.to_s
15
+ @destination = destination.to_s
16
+
17
+ # Get the various optional values
18
+ options ||= {}
19
+ @insecure = options[:insecure]
20
+ @ui = options[:ui]
21
+ end
22
+
23
+ # This executes the actual download, downloading the source file
24
+ # to the destination with the given opens used to initialize this
25
+ # class.
26
+ #
27
+ # If this method returns without an exception, the download
28
+ # succeeded. An exception will be raised if the download failed.
29
+ def download!
30
+ # Build the list of parameters to execute with cURL
31
+ options = [
32
+ "--fail",
33
+ "--location",
34
+ "--max-redirs", "10",
35
+ "--output", @destination
36
+ ]
37
+
38
+ options << "--insecure" if @insecure
39
+ options << @source
40
+
41
+ # Specify some options for the subprocess
42
+ subprocess_options = {}
43
+
44
+ # If we're in Vagrant, then we use the packaged CA bundle
45
+ if Vagrant.in_installer?
46
+ subprocess_options[:env] ||= {}
47
+ subprocess_options[:env]["CURL_CA_BUNDLE"] =
48
+ File.expand_path("cacert.pem", ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"])
49
+ end
50
+
51
+ # This variable can contain the proc that'll be sent to
52
+ # the subprocess execute.
53
+ data_proc = nil
54
+
55
+ if @ui
56
+ # If we're outputting progress, then setup the subprocess to
57
+ # tell us output so we can parse it out.
58
+ subprocess_options[:notify] = :stderr
59
+
60
+ progress_data = ""
61
+ progress_regexp = /(\r(.+?))\r/
62
+
63
+ # Setup the proc that'll receive the real-time data from
64
+ # the downloader.
65
+ data_proc = Proc.new do |type, data|
66
+ # Type will always be "stderr" because that is the only
67
+ # type of data we're subscribed for notifications.
68
+
69
+ # Accumulate progress_data
70
+ progress_data << data
71
+
72
+ while true
73
+ # If we have a full amount of column data (two "\r") then
74
+ # we report new progress reports. Otherwise, just keep
75
+ # accumulating.
76
+ match = progress_regexp.match(progress_data)
77
+ break if !match
78
+ data = match[2]
79
+ progress_data.gsub!(match[1], "")
80
+
81
+ # Ignore the first \r and split by whitespace to grab the columns
82
+ columns = data.strip.split(/\s+/)
83
+
84
+ # COLUMN DATA:
85
+ #
86
+ # 0 - % total
87
+ # 1 - Total size
88
+ # 2 - % received
89
+ # 3 - Received size
90
+ # 4 - % transferred
91
+ # 5 - Transferred size
92
+ # 6 - Average download speed
93
+ # 7 - Average upload speed
94
+ # 9 - Total time
95
+ # 9 - Time spent
96
+ # 10 - Time left
97
+ # 11 - Current speed
98
+
99
+ output = "Progress: #{columns[0]}% (Rate: #{columns[11]}/s, Estimated time remaining: #{columns[10]})"
100
+ @ui.clear_line
101
+ @ui.info(output, :new_line => false)
102
+ end
103
+ end
104
+ end
105
+
106
+ # Add the subprocess options onto the options we'll execute with
107
+ options << subprocess_options
108
+
109
+ # Create the callback that is called if we are interrupted
110
+ interrupted = false
111
+ int_callback = Proc.new do
112
+ @logger.info("Downloader interrupted!")
113
+ interrupted = true
114
+ end
115
+
116
+ @logger.info("Downloader starting download: ")
117
+ @logger.info(" -- Source: #{@source}")
118
+ @logger.info(" -- Destination: #{@destination}")
119
+
120
+ # Execute!
121
+ result = Busy.busy(int_callback) do
122
+ Subprocess.execute("curl", *options, &data_proc)
123
+ end
124
+
125
+ # If the download was interrupted, then raise a specific error
126
+ raise Errors::DownloaderInterrupted if interrupted
127
+
128
+ # If we're outputting to the UI, clear the output to
129
+ # avoid lingering progress meters.
130
+ @ui.clear_line if @ui
131
+
132
+ # If it didn't exit successfully, we need to parse the data and
133
+ # show an error message.
134
+ if result.exit_code != 0
135
+ @logger.warn("Downloader exit code: #{result.exit_code}")
136
+ parts = result.stderr.split(/\n*curl:\s+\(\d+\)\s*/, 2)
137
+ parts[1] ||= ""
138
+ raise Errors::DownloaderError, :message => parts[1].chomp
139
+ end
140
+
141
+ # Everything succeeded
142
+ true
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,38 @@
1
+ # This is an "interface" that should be implemented by any digest class
2
+ # passed into FileChecksum. Note that this isn't strictly enforced at
3
+ # the moment, and this class isn't directly used. It is merely here for
4
+ # documentation of structure of the class.
5
+ class DigestClass
6
+ def update(string); end
7
+ def hexdigest; end
8
+ end
9
+
10
+ class FileChecksum
11
+ BUFFER_SIZE = 1024
12
+
13
+ # Initializes an object to calculate the checksum of a file. The given
14
+ # ``digest_klass`` should implement the ``DigestClass`` interface. Note
15
+ # that the built-in Ruby digest classes duck type this properly:
16
+ # Digest::MD5, Digest::SHA1, etc.
17
+ def initialize(path, digest_klass)
18
+ @digest_klass = digest_klass
19
+ @path = path
20
+ end
21
+
22
+ # This calculates the checksum of the file and returns it as a
23
+ # string.
24
+ #
25
+ # @return [String]
26
+ def checksum
27
+ digest= @digest_klass.new
28
+
29
+ File.open(@path, "r") do |f|
30
+ while !f.eof
31
+ buf = f.readpartial(BUFFER_SIZE)
32
+ digest.update(buf)
33
+ end
34
+ end
35
+
36
+ return digest.hexdigest
37
+ end
38
+ end
@@ -0,0 +1,12 @@
1
+ module Vagrant
2
+ module Util
3
+ class FileMode
4
+ # This returns the file permissions as a string from
5
+ # an octal number.
6
+ def self.from_octal(octal)
7
+ perms = sprintf("%o", octal)
8
+ perms.reverse[0..2].reverse
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,63 @@
1
+ module Vagrant
2
+ module Util
3
+ # A hash with indifferent access. Mostly taken from Thor/Rails (thanks).
4
+ # Normally I'm not a fan of using an indifferent access hash since Symbols
5
+ # are basically memory leaks in Ruby, but since Vagrant is typically a quick
6
+ # one-off binary run and it doesn't use too many hash keys where this is
7
+ # used, the effect should be minimal.
8
+ #
9
+ # hash[:foo] #=> 'bar'
10
+ # hash['foo'] #=> 'bar'
11
+ #
12
+ class HashWithIndifferentAccess < ::Hash
13
+ def initialize(hash={}, &block)
14
+ super(&block)
15
+
16
+ hash.each do |key, value|
17
+ self[convert_key(key)] = value
18
+ end
19
+ end
20
+
21
+ def [](key)
22
+ super(convert_key(key))
23
+ end
24
+
25
+ def []=(key, value)
26
+ super(convert_key(key), value)
27
+ end
28
+
29
+ def delete(key)
30
+ super(convert_key(key))
31
+ end
32
+
33
+ def values_at(*indices)
34
+ indices.collect { |key| self[convert_key(key)] }
35
+ end
36
+
37
+ def merge(other)
38
+ dup.merge!(other)
39
+ end
40
+
41
+ def merge!(other)
42
+ other.each do |key, value|
43
+ self[convert_key(key)] = value
44
+ end
45
+ self
46
+ end
47
+
48
+ def key?(key)
49
+ super(convert_key(key))
50
+ end
51
+
52
+ alias_method :include?, :key?
53
+ alias_method :has_key?, :key?
54
+ alias_method :member?, :key?
55
+
56
+ protected
57
+
58
+ def convert_key(key)
59
+ key.is_a?(Symbol) ? key.to_s : key
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,38 @@
1
+ require "socket"
2
+ require "timeout"
3
+
4
+ module Vagrant
5
+ module Util
6
+ # Contains the method {#is_ruby_open?} to check if a port is open
7
+ # (listening) or closed (not in use). This method isn't completely
8
+ # fool-proof, but it works enough of the time to be useful.
9
+ module IsPortOpen
10
+ # Checks if a port is open (listening) on a given host and port.
11
+ #
12
+ # @param [String] host Hostname or IP address.
13
+ # @param [Integer] port Port to check.
14
+ # @return [Boolean] `true` if the port is open (listening), `false`
15
+ # otherwise.
16
+ def is_port_open?(host, port)
17
+ # We wrap this in a timeout because once in awhile the TCPSocket
18
+ # _will_ hang, but this signals that the port is closed.
19
+ Timeout.timeout(1) do
20
+ # Attempt to make a connection
21
+ s = TCPSocket.new(host, port)
22
+
23
+ # A connection was made! Properly clean up the socket, not caring
24
+ # at all if any exception is raised, because we already know the
25
+ # result.
26
+ s.close rescue nil
27
+
28
+ # The port is open if we reached this point, since we were able
29
+ # to connect.
30
+ return true
31
+ end
32
+ rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH
33
+ # Any of the above exceptions signal that the port is closed.
34
+ return false
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ module Vagrant
2
+ module Util
3
+ module LineEndingHelpers
4
+ # Converts line endings to unix-style line endings in the
5
+ # given string.
6
+ #
7
+ # @param [String] string Original string
8
+ # @return [String] The fixed string
9
+ def dos_to_unix(string)
10
+ string.gsub("\r\n", "\n")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ module Vagrant
2
+ module Util
3
+ module NetworkIP
4
+ # Returns the network address of the given IP and subnet.
5
+ #
6
+ # @return [String]
7
+ def network_address(ip, subnet)
8
+ ip = ip_parts(ip)
9
+ netmask = ip_parts(subnet)
10
+
11
+ # Bitwise-AND each octet to get the network address
12
+ # in octets and join each part with a period to get
13
+ # the resulting network address.
14
+ ip.map { |part| part & netmask.shift }.join(".")
15
+ end
16
+
17
+ protected
18
+
19
+ # Splits an IP into the four octets and returns each as an
20
+ # integer in an array.
21
+ #
22
+ # @return [Array<Integer>]
23
+ def ip_parts(ip)
24
+ ip.split(".").map { |i| i.to_i }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ require 'rbconfig'
2
+
3
+ require "vagrant/util/subprocess"
4
+
5
+ module Vagrant
6
+ module Util
7
+ # This class just contains some platform checking code.
8
+ class Platform
9
+ class << self
10
+ def cygwin?
11
+ return true if ENV["VAGRANT_DETECTED_OS"] &&
12
+ ENV["VAGRANT_DETECTED_OS"].downcase.include?("cygwin")
13
+
14
+ platform.include?("cygwin")
15
+ end
16
+
17
+ [:darwin, :bsd, :freebsd, :linux, :solaris].each do |type|
18
+ define_method("#{type}?") do
19
+ platform.include?(type.to_s)
20
+ end
21
+ end
22
+
23
+ def windows?
24
+ %W[mingw mswin].each do |text|
25
+ return true if platform.include?(text)
26
+ end
27
+
28
+ false
29
+ end
30
+
31
+ # This takes any path and converts it to a full-length Windows
32
+ # path on Windows machines in Cygwin.
33
+ #
34
+ # @return [String]
35
+ def cygwin_windows_path(path)
36
+ return path if !cygwin?
37
+
38
+ process = Subprocess.execute("cygpath", "-w", "-l", "-a", path.to_s)
39
+ process.stdout.chomp
40
+ end
41
+
42
+ # Returns a boolean noting whether the terminal supports color.
43
+ # output.
44
+ def terminal_supports_colors?
45
+ if windows?
46
+ return ENV.has_key?("ANSICON") || cygwin?
47
+ end
48
+
49
+ true
50
+ end
51
+
52
+ def platform
53
+ RbConfig::CONFIG["host_os"].downcase
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,31 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ module Util
5
+ module Retryable
6
+ # Retries a given block a specified number of times in the
7
+ # event the specified exception is raised. If the retries
8
+ # run out, the final exception is raised.
9
+ #
10
+ # This code is adapted slightly from the following blog post:
11
+ # http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/
12
+ def retryable(opts=nil)
13
+ logger = nil
14
+ opts = { :tries => 1, :on => Exception }.merge(opts || {})
15
+
16
+ begin
17
+ return yield
18
+ rescue *opts[:on] => e
19
+ if (opts[:tries] -= 1) > 0
20
+ logger = Log4r::Logger.new("vagrant::util::retryable")
21
+ logger.info("Retryable exception raised: #{e.inspect}")
22
+
23
+ sleep opts[:sleep].to_f if opts[:sleep]
24
+ retry
25
+ end
26
+ raise
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ require 'thread'
2
+
3
+ module Vagrant
4
+ module Util
5
+ class SafeChdir
6
+ @@chdir_lock = Mutex.new
7
+
8
+ # Safely changes directory of this process by putting a lock around
9
+ # it so that it is thread safe. This will yield a block and when the
10
+ # block exits it changes back to the original directory.
11
+ #
12
+ # @param [String] dir Dir to change to temporarily
13
+ def self.safe_chdir(dir)
14
+ lock = @@chdir_lock
15
+
16
+ begin
17
+ @@chdir_lock.synchronize {}
18
+ rescue ThreadError
19
+ # If we already hold the lock, just create a new lock so we
20
+ # definitely don't block and don't get an error.
21
+ lock = Mutex.new
22
+ end
23
+
24
+ lock.synchronize do
25
+ Dir.chdir(dir) do
26
+ return yield
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
@@ -0,0 +1,36 @@
1
+ module Vagrant
2
+ module Util
3
+ # This module provies a `safe_exec` method which is a drop-in
4
+ # replacement for `Kernel.exec` which addresses a specific issue
5
+ # which manifests on OS X 10.5 (GH-51) and perhaps other operating systems.
6
+ # This issue causes `exec` to fail if there is more than one system
7
+ # thread. In that case, `safe_exec` automatically falls back to
8
+ # forking.
9
+ class SafeExec
10
+ def self.exec(command, *args)
11
+ # Create a list of things to rescue from. Since this is OS
12
+ # specific, we need to do some defined? checks here to make
13
+ # sure they exist.
14
+ rescue_from = []
15
+ rescue_from << Errno::EOPNOTSUPP if defined?(Errno::EOPNOTSUPP)
16
+ rescue_from << Errno::E045 if defined?(Errno::E045)
17
+ rescue_from << SystemCallError
18
+
19
+ fork_instead = false
20
+ begin
21
+ pid = nil
22
+ pid = fork if fork_instead
23
+ Kernel.exec(command, *args) if pid.nil?
24
+ Process.wait(pid) if pid
25
+ rescue *rescue_from
26
+ # We retried already, raise the issue and be done
27
+ raise if fork_instead
28
+
29
+ # The error manifested itself, retry with a fork.
30
+ fork_instead = true
31
+ retry
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,31 @@
1
+ module Vagrant
2
+ module Util
3
+ # This module provides a `safe_puts` method which outputs to
4
+ # the given IO object, and rescues any broken pipe errors and
5
+ # ignores them. This is useful in cases where you're outputting
6
+ # to stdout, for example, and the stdout is closed, but you want to
7
+ # keep running.
8
+ module SafePuts
9
+ # Uses `puts` on the given IO object and safely ignores any
10
+ # Errno::EPIPE.
11
+ #
12
+ # @param [String] message Message to output.
13
+ # @param [Hash] opts Options hash.
14
+ def safe_puts(message=nil, opts=nil)
15
+ message ||= ""
16
+ opts = {
17
+ :io => $stdout,
18
+ :printer => :puts
19
+ }.merge(opts || {})
20
+
21
+ begin
22
+ opts[:io].send(opts[:printer], message)
23
+ rescue Errno::EPIPE
24
+ # This is what makes this a `safe` puts.
25
+ return
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,45 @@
1
+ module Vagrant
2
+ module Util
3
+ # This allows for hash options to be overridden by a scope key
4
+ # prefix. An example speaks best here. Imagine the following hash:
5
+ #
6
+ # original = {
7
+ # :id => "foo",
8
+ # :mitchellh__id => "bar",
9
+ # :mitchellh__other => "foo"
10
+ # }
11
+ #
12
+ # scoped = scoped_hash_override(original, "mitchellh")
13
+ #
14
+ # scoped == {
15
+ # :id => "bar",
16
+ # :other => "foo"
17
+ # }
18
+ #
19
+ module ScopedHashOverride
20
+ def scoped_hash_override(original, scope)
21
+ # Convert the scope to a string in case a symbol was given since
22
+ # we use string comparisons for everything.
23
+ scope = scope.to_s
24
+
25
+ # Shallow copy the hash for the result
26
+ result = original.dup
27
+
28
+ original.each do |key, value|
29
+ parts = key.to_s.split("__", 2)
30
+
31
+ # If we don't have the proper parts, then bail
32
+ next if parts.length != 2
33
+
34
+ # If this is our scope, then override
35
+ if parts[0] == scope
36
+ result[parts[1].to_sym] = value
37
+ result.delete(key)
38
+ end
39
+ end
40
+
41
+ result
42
+ end
43
+ end
44
+ end
45
+ end