vagrant-fixed-ssh 1.0.7

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 (413) hide show
  1. data/.gitignore +46 -0
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +723 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +22 -0
  6. data/README.md +121 -0
  7. data/Rakefile +18 -0
  8. data/bin/vagrant +60 -0
  9. data/config/default.rb +30 -0
  10. data/contrib/README.md +12 -0
  11. data/contrib/emacs/vagrant.el +8 -0
  12. data/contrib/vim/vagrantfile.vim +9 -0
  13. data/keys/README.md +17 -0
  14. data/keys/vagrant +27 -0
  15. data/keys/vagrant.pub +1 -0
  16. data/lib/vagrant.rb +197 -0
  17. data/lib/vagrant/action.rb +63 -0
  18. data/lib/vagrant/action/box/destroy.rb +25 -0
  19. data/lib/vagrant/action/box/download.rb +84 -0
  20. data/lib/vagrant/action/box/package.rb +19 -0
  21. data/lib/vagrant/action/box/unpackage.rb +61 -0
  22. data/lib/vagrant/action/box/verify.rb +23 -0
  23. data/lib/vagrant/action/builder.rb +128 -0
  24. data/lib/vagrant/action/builtin.rb +171 -0
  25. data/lib/vagrant/action/env/set.rb +21 -0
  26. data/lib/vagrant/action/environment.rb +12 -0
  27. data/lib/vagrant/action/general/check_virtualbox.rb +28 -0
  28. data/lib/vagrant/action/general/package.rb +101 -0
  29. data/lib/vagrant/action/general/validate.rb +18 -0
  30. data/lib/vagrant/action/runner.rb +53 -0
  31. data/lib/vagrant/action/vm/boot.rb +53 -0
  32. data/lib/vagrant/action/vm/check_accessible.rb +23 -0
  33. data/lib/vagrant/action/vm/check_box.rb +33 -0
  34. data/lib/vagrant/action/vm/check_guest_additions.rb +38 -0
  35. data/lib/vagrant/action/vm/check_port_collisions.rb +89 -0
  36. data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
  37. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +18 -0
  38. data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
  39. data/lib/vagrant/action/vm/clear_shared_folders.rb +18 -0
  40. data/lib/vagrant/action/vm/customize.rb +36 -0
  41. data/lib/vagrant/action/vm/default_name.rb +22 -0
  42. data/lib/vagrant/action/vm/destroy.rb +19 -0
  43. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +20 -0
  44. data/lib/vagrant/action/vm/discard_state.rb +22 -0
  45. data/lib/vagrant/action/vm/export.rb +57 -0
  46. data/lib/vagrant/action/vm/forward_ports.rb +92 -0
  47. data/lib/vagrant/action/vm/halt.rb +32 -0
  48. data/lib/vagrant/action/vm/host_name.rb +21 -0
  49. data/lib/vagrant/action/vm/import.rb +48 -0
  50. data/lib/vagrant/action/vm/match_mac_address.rb +21 -0
  51. data/lib/vagrant/action/vm/network.rb +403 -0
  52. data/lib/vagrant/action/vm/nfs.rb +196 -0
  53. data/lib/vagrant/action/vm/package.rb +23 -0
  54. data/lib/vagrant/action/vm/package_vagrantfile.rb +36 -0
  55. data/lib/vagrant/action/vm/provision.rb +61 -0
  56. data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
  57. data/lib/vagrant/action/vm/prune_nfs_exports.rb +20 -0
  58. data/lib/vagrant/action/vm/resume.rb +20 -0
  59. data/lib/vagrant/action/vm/sane_defaults.rb +78 -0
  60. data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
  61. data/lib/vagrant/action/vm/share_folders.rb +114 -0
  62. data/lib/vagrant/action/vm/suspend.rb +20 -0
  63. data/lib/vagrant/action/warden.rb +92 -0
  64. data/lib/vagrant/box.rb +44 -0
  65. data/lib/vagrant/box_collection.rb +58 -0
  66. data/lib/vagrant/cli.rb +76 -0
  67. data/lib/vagrant/command.rb +24 -0
  68. data/lib/vagrant/command/base.rb +167 -0
  69. data/lib/vagrant/command/box.rb +58 -0
  70. data/lib/vagrant/command/box_add.rb +37 -0
  71. data/lib/vagrant/command/box_list.rb +28 -0
  72. data/lib/vagrant/command/box_remove.rb +27 -0
  73. data/lib/vagrant/command/box_repackage.rb +27 -0
  74. data/lib/vagrant/command/destroy.rb +64 -0
  75. data/lib/vagrant/command/gem.rb +39 -0
  76. data/lib/vagrant/command/halt.rb +39 -0
  77. data/lib/vagrant/command/init.rb +40 -0
  78. data/lib/vagrant/command/package.rb +75 -0
  79. data/lib/vagrant/command/provision.rb +40 -0
  80. data/lib/vagrant/command/reload.rb +39 -0
  81. data/lib/vagrant/command/resume.rb +33 -0
  82. data/lib/vagrant/command/ssh.rb +90 -0
  83. data/lib/vagrant/command/ssh_config.rb +51 -0
  84. data/lib/vagrant/command/start_mixins.rb +26 -0
  85. data/lib/vagrant/command/status.rb +36 -0
  86. data/lib/vagrant/command/suspend.rb +33 -0
  87. data/lib/vagrant/command/up.rb +40 -0
  88. data/lib/vagrant/communication.rb +7 -0
  89. data/lib/vagrant/communication/base.rb +56 -0
  90. data/lib/vagrant/communication/ssh.rb +230 -0
  91. data/lib/vagrant/config.rb +49 -0
  92. data/lib/vagrant/config/base.rb +82 -0
  93. data/lib/vagrant/config/container.rb +37 -0
  94. data/lib/vagrant/config/error_recorder.rb +19 -0
  95. data/lib/vagrant/config/loader.rb +127 -0
  96. data/lib/vagrant/config/nfs.rb +8 -0
  97. data/lib/vagrant/config/package.rb +7 -0
  98. data/lib/vagrant/config/ssh.rb +27 -0
  99. data/lib/vagrant/config/top.rb +72 -0
  100. data/lib/vagrant/config/vagrant.rb +14 -0
  101. data/lib/vagrant/config/vm.rb +168 -0
  102. data/lib/vagrant/config/vm/provisioner.rb +52 -0
  103. data/lib/vagrant/config/vm/sub_vm.rb +17 -0
  104. data/lib/vagrant/data_store.rb +92 -0
  105. data/lib/vagrant/downloaders.rb +7 -0
  106. data/lib/vagrant/downloaders/base.rb +25 -0
  107. data/lib/vagrant/downloaders/file.rb +22 -0
  108. data/lib/vagrant/downloaders/http.rb +97 -0
  109. data/lib/vagrant/driver.rb +8 -0
  110. data/lib/vagrant/driver/virtualbox.rb +134 -0
  111. data/lib/vagrant/driver/virtualbox_4_0.rb +459 -0
  112. data/lib/vagrant/driver/virtualbox_4_1.rb +459 -0
  113. data/lib/vagrant/driver/virtualbox_4_2.rb +606 -0
  114. data/lib/vagrant/driver/virtualbox_base.rb +326 -0
  115. data/lib/vagrant/environment.rb +522 -0
  116. data/lib/vagrant/errors.rb +445 -0
  117. data/lib/vagrant/guest.rb +18 -0
  118. data/lib/vagrant/guest/arch.rb +56 -0
  119. data/lib/vagrant/guest/base.rb +99 -0
  120. data/lib/vagrant/guest/debian.rb +64 -0
  121. data/lib/vagrant/guest/fedora.rb +66 -0
  122. data/lib/vagrant/guest/freebsd.rb +86 -0
  123. data/lib/vagrant/guest/gentoo.rb +46 -0
  124. data/lib/vagrant/guest/linux.rb +118 -0
  125. data/lib/vagrant/guest/linux/config.rb +19 -0
  126. data/lib/vagrant/guest/linux/error.rb +9 -0
  127. data/lib/vagrant/guest/openbsd.rb +20 -0
  128. data/lib/vagrant/guest/redhat.rb +67 -0
  129. data/lib/vagrant/guest/solaris.rb +118 -0
  130. data/lib/vagrant/guest/suse.rb +17 -0
  131. data/lib/vagrant/guest/ubuntu.rb +23 -0
  132. data/lib/vagrant/hosts.rb +37 -0
  133. data/lib/vagrant/hosts/arch.rb +55 -0
  134. data/lib/vagrant/hosts/base.rb +66 -0
  135. data/lib/vagrant/hosts/bsd.rb +97 -0
  136. data/lib/vagrant/hosts/fedora.rb +47 -0
  137. data/lib/vagrant/hosts/freebsd.rb +41 -0
  138. data/lib/vagrant/hosts/gentoo.rb +20 -0
  139. data/lib/vagrant/hosts/linux.rb +94 -0
  140. data/lib/vagrant/hosts/opensuse.rb +30 -0
  141. data/lib/vagrant/hosts/windows.rb +16 -0
  142. data/lib/vagrant/plugin.rb +81 -0
  143. data/lib/vagrant/provisioners.rb +12 -0
  144. data/lib/vagrant/provisioners/base.rb +44 -0
  145. data/lib/vagrant/provisioners/chef.rb +168 -0
  146. data/lib/vagrant/provisioners/chef_client.rb +132 -0
  147. data/lib/vagrant/provisioners/chef_solo.rb +234 -0
  148. data/lib/vagrant/provisioners/puppet.rb +176 -0
  149. data/lib/vagrant/provisioners/puppet_server.rb +78 -0
  150. data/lib/vagrant/provisioners/shell.rb +103 -0
  151. data/lib/vagrant/registry.rb +52 -0
  152. data/lib/vagrant/ssh.rb +126 -0
  153. data/lib/vagrant/test_helpers.rb +154 -0
  154. data/lib/vagrant/ui.rb +168 -0
  155. data/lib/vagrant/util.rb +12 -0
  156. data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
  157. data/lib/vagrant/util/busy.rb +59 -0
  158. data/lib/vagrant/util/counter.rb +24 -0
  159. data/lib/vagrant/util/file_checksum.rb +38 -0
  160. data/lib/vagrant/util/file_mode.rb +12 -0
  161. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  162. data/lib/vagrant/util/is_port_open.rb +38 -0
  163. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  164. data/lib/vagrant/util/network_ip.rb +28 -0
  165. data/lib/vagrant/util/platform.rb +68 -0
  166. data/lib/vagrant/util/retryable.rb +25 -0
  167. data/lib/vagrant/util/safe_exec.rb +36 -0
  168. data/lib/vagrant/util/safe_puts.rb +31 -0
  169. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  170. data/lib/vagrant/util/subprocess.rb +247 -0
  171. data/lib/vagrant/util/template_renderer.rb +83 -0
  172. data/lib/vagrant/version.rb +6 -0
  173. data/lib/vagrant/vm.rb +195 -0
  174. data/tasks/acceptance.rake +113 -0
  175. data/tasks/bundler.rake +3 -0
  176. data/tasks/test.rake +20 -0
  177. data/templates/commands/init/Vagrantfile.erb +99 -0
  178. data/templates/commands/ssh_config/config.erb +15 -0
  179. data/templates/config/validation_failed.erb +7 -0
  180. data/templates/guests/arch/network_dhcp.erb +7 -0
  181. data/templates/guests/arch/network_static.erb +7 -0
  182. data/templates/guests/debian/network_dhcp.erb +6 -0
  183. data/templates/guests/debian/network_static.erb +7 -0
  184. data/templates/guests/fedora/network_dhcp.erb +6 -0
  185. data/templates/guests/fedora/network_static.erb +13 -0
  186. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  187. data/templates/guests/freebsd/network_static.erb +3 -0
  188. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  189. data/templates/guests/gentoo/network_static.erb +4 -0
  190. data/templates/guests/redhat/network_dhcp.erb +6 -0
  191. data/templates/guests/redhat/network_static.erb +7 -0
  192. data/templates/locales/en.yml +759 -0
  193. data/templates/nfs/exports.erb +5 -0
  194. data/templates/nfs/exports_freebsd.erb +5 -0
  195. data/templates/nfs/exports_linux.erb +5 -0
  196. data/templates/package_Vagrantfile.erb +11 -0
  197. data/templates/provisioners/chef_client/client.erb +32 -0
  198. data/templates/provisioners/chef_solo/solo.erb +25 -0
  199. data/test/acceptance/base.rb +48 -0
  200. data/test/acceptance/box_test.rb +99 -0
  201. data/test/acceptance/destroy_test.rb +37 -0
  202. data/test/acceptance/halt_test.rb +72 -0
  203. data/test/acceptance/init_test.rb +33 -0
  204. data/test/acceptance/networking/host_only_test.rb +37 -0
  205. data/test/acceptance/networking/port_forward_test.rb +125 -0
  206. data/test/acceptance/package_test.rb +46 -0
  207. data/test/acceptance/provisioning/basic_test.rb +61 -0
  208. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  209. data/test/acceptance/provisioning/shell_test.rb +53 -0
  210. data/test/acceptance/resume_test.rb +17 -0
  211. data/test/acceptance/shared_folders_test.rb +84 -0
  212. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  213. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  214. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  215. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  216. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  217. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  218. data/test/acceptance/ssh_test.rb +46 -0
  219. data/test/acceptance/support/config.rb +42 -0
  220. data/test/acceptance/support/isolated_environment.rb +117 -0
  221. data/test/acceptance/support/matchers/have_color.rb +9 -0
  222. data/test/acceptance/support/matchers/match_output.rb +14 -0
  223. data/test/acceptance/support/matchers/succeed.rb +14 -0
  224. data/test/acceptance/support/network_tests.rb +29 -0
  225. data/test/acceptance/support/output.rb +95 -0
  226. data/test/acceptance/support/shared/base_context.rb +72 -0
  227. data/test/acceptance/support/shared/command_examples.rb +33 -0
  228. data/test/acceptance/support/virtualbox.rb +36 -0
  229. data/test/acceptance/suspend_test.rb +56 -0
  230. data/test/acceptance/up_basic_test.rb +33 -0
  231. data/test/acceptance/up_with_box_url.rb +40 -0
  232. data/test/acceptance/vagrant_test.rb +47 -0
  233. data/test/acceptance/version_test.rb +15 -0
  234. data/test/buildbot/README.md +72 -0
  235. data/test/buildbot/buildbot_config/__init__.py +0 -0
  236. data/test/buildbot/buildbot_config/config/__init__.py +0 -0
  237. data/test/buildbot/buildbot_config/config/loader.py +24 -0
  238. data/test/buildbot/buildbot_config/config/master.py +24 -0
  239. data/test/buildbot/buildbot_config/config/slave.py +22 -0
  240. data/test/buildbot/buildbot_config/master/__init__.py +6 -0
  241. data/test/buildbot/buildbot_config/master/builders.py +78 -0
  242. data/test/buildbot/buildbot_config/master/buildsteps.py +100 -0
  243. data/test/buildbot/buildbot_config/master/change_sources.py +8 -0
  244. data/test/buildbot/buildbot_config/master/schedulers.py +32 -0
  245. data/test/buildbot/buildbot_config/master/slaves.py +60 -0
  246. data/test/buildbot/buildbot_config/master/status.py +52 -0
  247. data/test/buildbot/master/Makefile.sample +28 -0
  248. data/test/buildbot/master/buildbot.tac +36 -0
  249. data/test/buildbot/master/master.cfg +67 -0
  250. data/test/buildbot/master/public_html/bg_gradient.jpg +0 -0
  251. data/test/buildbot/master/public_html/default.css +545 -0
  252. data/test/buildbot/master/public_html/favicon.ico +0 -0
  253. data/test/buildbot/master/public_html/robots.txt +10 -0
  254. data/test/buildbot/master/public_html/static/css/bootstrap-1.4.0.min.css +356 -0
  255. data/test/buildbot/master/public_html/static/css/prettify.css +97 -0
  256. data/test/buildbot/master/public_html/static/css/syntax.css +60 -0
  257. data/test/buildbot/master/public_html/static/css/vagrant.base.css +205 -0
  258. data/test/buildbot/master/public_html/static/images/base_box_mac.jpg +0 -0
  259. data/test/buildbot/master/public_html/static/images/getting-started/success.jpg +0 -0
  260. data/test/buildbot/master/public_html/static/images/icons/error.png +0 -0
  261. data/test/buildbot/master/public_html/static/images/vagrant_chilling.png +0 -0
  262. data/test/buildbot/master/public_html/static/images/vagrant_holding.png +0 -0
  263. data/test/buildbot/master/public_html/static/images/vagrant_looking.png +0 -0
  264. data/test/buildbot/master/public_html/static/images/windows/alter_path.jpg +0 -0
  265. data/test/buildbot/master/public_html/static/images/windows/edit_path.jpg +0 -0
  266. data/test/buildbot/master/public_html/static/images/windows/environment_variables_button.jpg +0 -0
  267. data/test/buildbot/master/public_html/static/images/windows/port_and_ppk_path.jpg +0 -0
  268. data/test/buildbot/master/public_html/static/images/windows/ppk_selection.jpg +0 -0
  269. data/test/buildbot/master/public_html/static/images/windows/putty_first_screen.jpg +0 -0
  270. data/test/buildbot/master/public_html/static/images/windows/save_result.jpg +0 -0
  271. data/test/buildbot/master/public_html/static/images/windows/vbox_manage_default_location.jpg +0 -0
  272. data/test/buildbot/master/public_html/static/js/bootstrap-tabs.js +80 -0
  273. data/test/buildbot/master/public_html/static/js/jquery-1.7.min.js +4 -0
  274. data/test/buildbot/master/templates/authfail.html +9 -0
  275. data/test/buildbot/master/templates/build.html +205 -0
  276. data/test/buildbot/master/templates/builder.html +118 -0
  277. data/test/buildbot/master/templates/builders.html +33 -0
  278. data/test/buildbot/master/templates/buildslave.html +72 -0
  279. data/test/buildbot/master/templates/buildslaves.html +70 -0
  280. data/test/buildbot/master/templates/change.html +15 -0
  281. data/test/buildbot/master/templates/layouts/base.html +58 -0
  282. data/test/buildbot/master/templates/macros/box.html +37 -0
  283. data/test/buildbot/master/templates/macros/build_line.html +50 -0
  284. data/test/buildbot/master/templates/macros/change.html +81 -0
  285. data/test/buildbot/master/templates/macros/forms.html +300 -0
  286. data/test/buildbot/master/templates/root.html +42 -0
  287. data/test/buildbot/master/templates/waterfall.html +53 -0
  288. data/test/buildbot/requirements.txt +4 -0
  289. data/test/buildbot/scripts/deploy.sh +38 -0
  290. data/test/buildbot/scripts/setup.sh +107 -0
  291. data/test/buildbot/slave/buildbot.tac +43 -0
  292. data/test/buildbot/slave/info/admin +1 -0
  293. data/test/buildbot/slave/info/host +1 -0
  294. data/test/buildbot/tests/__init__.py +0 -0
  295. data/test/buildbot/tests/master/__init__.py +0 -0
  296. data/test/buildbot/tests/master/test_slaves.py +41 -0
  297. data/test/buildbot/vendor/choices-0.4.0.tar.gz +0 -0
  298. data/test/config/acceptance_boxes.yml +7 -0
  299. data/test/support/isolated_environment.rb +46 -0
  300. data/test/support/tempdir.rb +34 -0
  301. data/test/unit/base.rb +21 -0
  302. data/test/unit/support/isolated_environment.rb +47 -0
  303. data/test/unit/support/shared/base_context.rb +30 -0
  304. data/test/unit/vagrant/action/builder_test.rb +156 -0
  305. data/test/unit/vagrant/action/environment_test.rb +16 -0
  306. data/test/unit/vagrant/action/runner_test.rb +65 -0
  307. data/test/unit/vagrant/action/warden_test.rb +92 -0
  308. data/test/unit/vagrant/box_collection_test.rb +56 -0
  309. data/test/unit/vagrant/box_test.rb +34 -0
  310. data/test/unit/vagrant/command/base_test.rb +150 -0
  311. data/test/unit/vagrant/config/base_test.rb +48 -0
  312. data/test/unit/vagrant/config/loader_test.rb +79 -0
  313. data/test/unit/vagrant/config/ssh_test.rb +17 -0
  314. data/test/unit/vagrant/config/top_test.rb +69 -0
  315. data/test/unit/vagrant/config/vm_test.rb +71 -0
  316. data/test/unit/vagrant/config_test.rb +27 -0
  317. data/test/unit/vagrant/data_store_test.rb +79 -0
  318. data/test/unit/vagrant/downloaders/base_test.rb +18 -0
  319. data/test/unit/vagrant/downloaders/file_test.rb +75 -0
  320. data/test/unit/vagrant/downloaders/http_test.rb +19 -0
  321. data/test/unit/vagrant/environment_test.rb +220 -0
  322. data/test/unit/vagrant/hosts_test.rb +36 -0
  323. data/test/unit/vagrant/registry_test.rb +74 -0
  324. data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
  325. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  326. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
  327. data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
  328. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  329. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  330. data/test/unit/vagrant/util/retryable_test.rb +106 -0
  331. data/test/unit/vagrant_test.rb +27 -0
  332. data/test/unit_legacy/locales/en.yml +8 -0
  333. data/test/unit_legacy/test_helper.rb +32 -0
  334. data/test/unit_legacy/vagrant/action/box/destroy_test.rb +18 -0
  335. data/test/unit_legacy/vagrant/action/box/download_test.rb +125 -0
  336. data/test/unit_legacy/vagrant/action/box/package_test.rb +25 -0
  337. data/test/unit_legacy/vagrant/action/box/unpackage_test.rb +84 -0
  338. data/test/unit_legacy/vagrant/action/box/verify_test.rb +30 -0
  339. data/test/unit_legacy/vagrant/action/env/set_test.rb +24 -0
  340. data/test/unit_legacy/vagrant/action/general/package_test.rb +268 -0
  341. data/test/unit_legacy/vagrant/action/general/validate_test.rb +31 -0
  342. data/test/unit_legacy/vagrant/action/vm/boot_test.rb +66 -0
  343. data/test/unit_legacy/vagrant/action/vm/check_accessible_test.rb +61 -0
  344. data/test/unit_legacy/vagrant/action/vm/check_box_test.rb +61 -0
  345. data/test/unit_legacy/vagrant/action/vm/check_guest_additions_test.rb +9 -0
  346. data/test/unit_legacy/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
  347. data/test/unit_legacy/vagrant/action/vm/clear_forwarded_ports_test.rb +52 -0
  348. data/test/unit_legacy/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
  349. data/test/unit_legacy/vagrant/action/vm/clear_shared_folders_test.rb +40 -0
  350. data/test/unit_legacy/vagrant/action/vm/customize_test.rb +37 -0
  351. data/test/unit_legacy/vagrant/action/vm/destroy_test.rb +25 -0
  352. data/test/unit_legacy/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
  353. data/test/unit_legacy/vagrant/action/vm/discard_state_test.rb +45 -0
  354. data/test/unit_legacy/vagrant/action/vm/export_test.rb +107 -0
  355. data/test/unit_legacy/vagrant/action/vm/forward_ports_helpers_test.rb +77 -0
  356. data/test/unit_legacy/vagrant/action/vm/forward_ports_test.rb +197 -0
  357. data/test/unit_legacy/vagrant/action/vm/halt_test.rb +79 -0
  358. data/test/unit_legacy/vagrant/action/vm/host_name_test.rb +36 -0
  359. data/test/unit_legacy/vagrant/action/vm/import_test.rb +66 -0
  360. data/test/unit_legacy/vagrant/action/vm/match_mac_address_test.rb +40 -0
  361. data/test/unit_legacy/vagrant/action/vm/modify_test.rb +38 -0
  362. data/test/unit_legacy/vagrant/action/vm/network_test.rb +286 -0
  363. data/test/unit_legacy/vagrant/action/vm/nfs_helpers_test.rb +26 -0
  364. data/test/unit_legacy/vagrant/action/vm/nfs_test.rb +260 -0
  365. data/test/unit_legacy/vagrant/action/vm/package_test.rb +25 -0
  366. data/test/unit_legacy/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
  367. data/test/unit_legacy/vagrant/action/vm/provision_test.rb +65 -0
  368. data/test/unit_legacy/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
  369. data/test/unit_legacy/vagrant/action/vm/resume_test.rb +35 -0
  370. data/test/unit_legacy/vagrant/action/vm/share_folders_test.rb +144 -0
  371. data/test/unit_legacy/vagrant/action/vm/suspend_test.rb +35 -0
  372. data/test/unit_legacy/vagrant/action_test.rb +89 -0
  373. data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
  374. data/test/unit_legacy/vagrant/box_test.rb +74 -0
  375. data/test/unit_legacy/vagrant/cli_test.rb +35 -0
  376. data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
  377. data/test/unit_legacy/vagrant/command/group_base_test.rb +15 -0
  378. data/test/unit_legacy/vagrant/command/helpers_test.rb +88 -0
  379. data/test/unit_legacy/vagrant/command/init_test.rb +10 -0
  380. data/test/unit_legacy/vagrant/command/package_test.rb +27 -0
  381. data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
  382. data/test/unit_legacy/vagrant/config/error_recorder_test.rb +18 -0
  383. data/test/unit_legacy/vagrant/config/ssh_test.rb +12 -0
  384. data/test/unit_legacy/vagrant/config/vagrant_test.rb +35 -0
  385. data/test/unit_legacy/vagrant/config/vm/provisioner_test.rb +92 -0
  386. data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
  387. data/test/unit_legacy/vagrant/config_test.rb +148 -0
  388. data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
  389. data/test/unit_legacy/vagrant/environment_test.rb +539 -0
  390. data/test/unit_legacy/vagrant/errors_test.rb +42 -0
  391. data/test/unit_legacy/vagrant/hosts/base_test.rb +46 -0
  392. data/test/unit_legacy/vagrant/hosts/bsd_test.rb +53 -0
  393. data/test/unit_legacy/vagrant/hosts/linux_test.rb +54 -0
  394. data/test/unit_legacy/vagrant/plugin_test.rb +9 -0
  395. data/test/unit_legacy/vagrant/provisioners/base_test.rb +63 -0
  396. data/test/unit_legacy/vagrant/provisioners/chef_client_test.rb +190 -0
  397. data/test/unit_legacy/vagrant/provisioners/chef_solo_test.rb +115 -0
  398. data/test/unit_legacy/vagrant/provisioners/chef_test.rb +209 -0
  399. data/test/unit_legacy/vagrant/provisioners/puppet_server_test.rb +68 -0
  400. data/test/unit_legacy/vagrant/provisioners/puppet_test.rb +182 -0
  401. data/test/unit_legacy/vagrant/provisioners/shell_test.rb +79 -0
  402. data/test/unit_legacy/vagrant/ssh/session_test.rb +40 -0
  403. data/test/unit_legacy/vagrant/ssh_test.rb +304 -0
  404. data/test/unit_legacy/vagrant/systems/base_test.rb +18 -0
  405. data/test/unit_legacy/vagrant/systems/linux_test.rb +104 -0
  406. data/test/unit_legacy/vagrant/util/busy_test.rb +106 -0
  407. data/test/unit_legacy/vagrant/util/counter_test.rb +29 -0
  408. data/test/unit_legacy/vagrant/util/platform_test.rb +18 -0
  409. data/test/unit_legacy/vagrant/util/stacked_proc_runner_test.rb +43 -0
  410. data/test/unit_legacy/vagrant/util/template_renderer_test.rb +145 -0
  411. data/test/unit_legacy/vagrant/vm_test.rb +300 -0
  412. data/vagrant-fixed-ssh.gemspec +70 -0
  413. metadata +712 -0
@@ -0,0 +1,19 @@
1
+ module Vagrant
2
+ module Guest
3
+ class Linux < Vagrant::Guest::Base
4
+ # A custom config class which will be made accessible via `config.linux`
5
+ # This is not necessary for all system implementers, of course. However,
6
+ # generally, Vagrant tries to make almost every aspect of its execution
7
+ # configurable, and this assists that goal.
8
+ class LinuxConfig < Vagrant::Config::Base
9
+ attr_accessor :halt_timeout
10
+ attr_accessor :halt_check_interval
11
+
12
+ def initialize
13
+ @halt_timeout = 30
14
+ @halt_check_interval = 1
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module Vagrant
2
+ module Guest
3
+ class Linux < Vagrant::Guest::Base
4
+ class LinuxError < Errors::VagrantError
5
+ error_namespace("vagrant.guest.linux")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module Vagrant
2
+ module Guest
3
+ class OpenBSD < Base
4
+ def halt
5
+ vm.channel.sudo("shutdown -p -h now")
6
+
7
+ # Wait until the VM's state is actually powered off. If this doesn't
8
+ # occur within a reasonable amount of time then simply return which
9
+ # will cause Vagrant to force kill the machine.
10
+ count = 0
11
+ while vm.state != :poweroff
12
+ count += 1
13
+
14
+ return if count >= 30
15
+ sleep 1
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,67 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+
4
+ require 'vagrant/util/template_renderer'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Redhat < Linux
9
+ # Make the TemplateRenderer top-level
10
+ include Vagrant::Util
11
+
12
+ def configure_networks(networks)
13
+ # Accumulate the configurations to add to the interfaces file as
14
+ # well as what interfaces we're actually configuring since we use that
15
+ # later.
16
+ interfaces = Set.new
17
+ networks.each do |network|
18
+ interfaces.add(network[:interface])
19
+
20
+ # Remove any previous vagrant configuration in this network interface's
21
+ # configuration files.
22
+ vm.channel.sudo("touch #{network_scripts_dir}/ifcfg-eth#{network[:interface]}")
23
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-eth#{network[:interface]} > /tmp/vagrant-ifcfg-eth#{network[:interface]}")
24
+ vm.channel.sudo("cat /tmp/vagrant-ifcfg-eth#{network[:interface]} > #{network_scripts_dir}/ifcfg-eth#{network[:interface]}")
25
+
26
+ # Render and upload the network entry file to a deterministic
27
+ # temporary location.
28
+ entry = TemplateRenderer.render("guests/redhat/network_#{network[:type]}",
29
+ :options => network)
30
+
31
+ temp = Tempfile.new("vagrant")
32
+ temp.binmode
33
+ temp.write(entry)
34
+ temp.close
35
+
36
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry_#{network[:interface]}")
37
+ end
38
+
39
+ # Bring down all the interfaces we're reconfiguring. By bringing down
40
+ # each specifically, we avoid reconfiguring eth0 (the NAT interface) so
41
+ # SSH never dies.
42
+ interfaces.each do |interface|
43
+ vm.channel.sudo("/sbin/ifdown eth#{interface} 2> /dev/null", :error_check => false)
44
+ vm.channel.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-eth#{interface}")
45
+ vm.channel.sudo("/sbin/ifup eth#{interface} 2> /dev/null")
46
+ end
47
+ end
48
+
49
+ # The path to the directory with the network configuration scripts.
50
+ # This is pulled out into its own directory since there are other
51
+ # operating systems (SuSE) which behave similarly but with a different
52
+ # path to the network scripts.
53
+ def network_scripts_dir
54
+ '/etc/sysconfig/network-scripts'
55
+ end
56
+
57
+ def change_host_name(name)
58
+ # Only do this if the hostname is not already set
59
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
60
+ vm.channel.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
61
+ vm.channel.sudo("hostname #{name}")
62
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,118 @@
1
+ module Vagrant
2
+ module Guest
3
+ # A general Vagrant system implementation for "solaris".
4
+ #
5
+ # Contributed by Blake Irvin <b.irvin@modcloth.com>
6
+ class Solaris < Base
7
+ # A custom config class which will be made accessible via `config.solaris`
8
+ # This is not necessary for all system implementers, of course. However,
9
+ # generally, Vagrant tries to make almost every aspect of its execution
10
+ # configurable, and this assists that goal.
11
+ class SolarisConfig < Vagrant::Config::Base
12
+ attr_accessor :halt_timeout
13
+ attr_accessor :halt_check_interval
14
+ # This sets the command to use to execute items as a superuser. sudo is default
15
+ attr_accessor :suexec_cmd
16
+ attr_accessor :device
17
+
18
+ def initialize
19
+ @halt_timeout = 30
20
+ @halt_check_interval = 1
21
+ @suexec_cmd = 'sudo'
22
+ @device = "e1000g"
23
+ end
24
+ end
25
+
26
+ # Here for whenever it may be used.
27
+ class SolarisError < Errors::VagrantError
28
+ error_namespace("vagrant.guest.solaris")
29
+ end
30
+
31
+ def configure_networks(networks)
32
+ networks.each do |network|
33
+ device = "#{vm.config.solaris.device}#{network[:interface]}"
34
+ su_cmd = vm.config.solaris.suexec_cmd
35
+ ifconfig_cmd = "#{su_cmd} /sbin/ifconfig #{device}"
36
+
37
+ vm.channel.execute("#{ifconfig_cmd} plumb")
38
+
39
+ if network[:type].to_sym == :static
40
+ vm.channel.execute("#{ifconfig_cmd} inet #{network[:ip]} netmask #{network[:netmask]}")
41
+ vm.channel.execute("#{ifconfig_cmd} up")
42
+ vm.channel.execute("#{su_cmd} sh -c \"echo '#{network[:ip]}' > /etc/hostname.#{device}\"")
43
+ elsif network[:type].to_sym == :dhcp
44
+ vm.channel.execute("#{ifconfig_cmd} dhcp start")
45
+ end
46
+ end
47
+ end
48
+
49
+ def change_host_name(name)
50
+ su_cmd = vm.config.solaris.suexec_cmd
51
+
52
+ # Only do this if the hostname is not already set
53
+ if !vm.channel.test("#{su_cmd} hostname | grep '#{name}'")
54
+ vm.channel.execute("#{su_cmd} sh -c \"echo '#{name}' > /etc/nodename\"")
55
+ vm.channel.execute("#{su_cmd} uname -S #{name}")
56
+ end
57
+ end
58
+
59
+ # There should be an exception raised if the line
60
+ #
61
+ # vagrant::::profiles=Primary Administrator
62
+ #
63
+ # does not exist in /etc/user_attr. TODO
64
+ def halt
65
+ # Wait until the VM's state is actually powered off. If this doesn't
66
+ # occur within a reasonable amount of time (15 seconds by default),
67
+ # then simply return and allow Vagrant to kill the machine.
68
+ count = 0
69
+ last_error = nil
70
+ while vm.state != :poweroff
71
+ begin
72
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} /usr/sbin/poweroff")
73
+ rescue IOError => e
74
+ # Save the last error; if it's not shutdown in a reasonable amount
75
+ # of attempts we will re-raise the error so it's not hidden for
76
+ # all time
77
+ last_error = e
78
+ end
79
+
80
+ count += 1
81
+ if count >= vm.config.solaris.halt_timeout
82
+ # Check for last error and re-raise it
83
+ if last_error != nil
84
+ raise last_error
85
+ else
86
+ # Otherwise, just return
87
+ return
88
+ end
89
+ end
90
+
91
+ # Still opportunities remaining; sleep and loop
92
+ sleep vm.config.solaris.halt_check_interval
93
+ end # while
94
+ end
95
+
96
+ def mount_shared_folder(name, guestpath, options)
97
+ # These are just far easier to use than the full options syntax
98
+ owner = options[:owner]
99
+ group = options[:group]
100
+
101
+ # Create the shared folder
102
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} mkdir -p #{guestpath}")
103
+
104
+ # We have to use this `id` command instead of `/usr/bin/id` since this
105
+ # one accepts the "-u" and "-g" flags.
106
+ id_cmd = "/usr/xpg4/bin/id"
107
+
108
+ # Mount the folder with the proper owner/group
109
+ mount_options = "-o uid=`#{id_cmd} -u #{owner}`,gid=`#{id_cmd} -g #{group}`"
110
+ mount_options += ",#{options[:extra]}" if options[:extra]
111
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} /sbin/mount -F vboxfs #{mount_options} #{name} #{guestpath}")
112
+
113
+ # chown the folder to the proper owner/group
114
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} chown `#{id_cmd} -u #{owner}`:`#{id_cmd} -g #{group}` #{guestpath}")
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,17 @@
1
+ module Vagrant
2
+ module Guest
3
+ class Suse < Redhat
4
+ def network_scripts_dir
5
+ '/etc/sysconfig/network/'
6
+ end
7
+ def change_host_name(name)
8
+ # Only do this if the hostname is not already set
9
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
10
+ vm.channel.sudo("echo #{name} > /etc/HOSTNAME")
11
+ vm.channel.sudo("hostname #{name}")
12
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ require 'vagrant/guest/debian'
2
+
3
+ module Vagrant
4
+ module Guest
5
+ class Ubuntu < Debian
6
+ def mount_shared_folder(name, guestpath, options)
7
+ # Mount it like normal
8
+ super
9
+
10
+ # Emit an upstart event if upstart is available
11
+ vm.channel.sudo("[ -x /sbin/initctl ] && /sbin/initctl emit vagrant-mounted MOUNTPOINT=#{guestpath}")
12
+ end
13
+
14
+ def change_host_name(name)
15
+ if !vm.channel.test("sudo hostname | grep '^#{name}$'")
16
+ vm.channel.sudo("sed -i 's/.*$/#{name}/' /etc/hostname")
17
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]1[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
18
+ vm.channel.sudo("service hostname start")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ require 'log4r'
2
+
3
+ module Vagrant
4
+ module Hosts
5
+ autoload :Base, 'vagrant/hosts/base'
6
+ autoload :Arch, 'vagrant/hosts/arch'
7
+ autoload :BSD, 'vagrant/hosts/bsd'
8
+ autoload :FreeBSD, 'vagrant/hosts/freebsd'
9
+ autoload :Fedora, 'vagrant/hosts/fedora'
10
+ autoload :OpenSUSE, 'vagrant/hosts/opensuse'
11
+ autoload :Gentoo, 'vagrant/hosts/gentoo'
12
+ autoload :Linux, 'vagrant/hosts/linux'
13
+ autoload :Windows, 'vagrant/hosts/windows'
14
+
15
+ # This method detects the correct host based on the `match?` methods
16
+ # implemented in the registered hosts.
17
+ def self.detect(registry)
18
+ logger = Log4r::Logger.new("vagrant::hosts")
19
+
20
+ # Sort the hosts by their precedence
21
+ host_klasses = registry.to_hash.values
22
+ host_klasses = host_klasses.sort_by { |a| a.precedence }.reverse
23
+ logger.debug("Host path search classes: #{host_klasses.inspect}")
24
+
25
+ # Test for matches and return the host class that matches
26
+ host_klasses.each do |klass|
27
+ if klass.match?
28
+ logger.info("Host class: #{klass}")
29
+ return klass
30
+ end
31
+ end
32
+
33
+ # No matches found...
34
+ return nil
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,55 @@
1
+ module Vagrant
2
+ module Hosts
3
+ class Arch < Linux
4
+ def self.match?
5
+ File.exist?("/etc/os-release") && File.read("/etc/os-release") =~ /arch linux/i
6
+ end
7
+
8
+ # Normal, mid-range precedence.
9
+ def self.precedence
10
+ 5
11
+ end
12
+
13
+ def nfs_export(id, ip, folders)
14
+ output = TemplateRenderer.render('nfs/exports_linux',
15
+ :uuid => id,
16
+ :ip => ip,
17
+ :folders => folders)
18
+
19
+ @ui.info I18n.t("vagrant.hosts.arch.nfs_export.prepare")
20
+ sleep 0.5
21
+
22
+ nfs_cleanup(id)
23
+
24
+ output.split("\n").each do |line|
25
+ # This should only ask for administrative permission once, even
26
+ # though its executed in multiple subshells.
27
+ system(%Q[sudo su root -c "echo '#{line}' >> /etc/exports"])
28
+ end
29
+
30
+ if systemd?
31
+ # Call start to be nice. This will be a no-op if things are
32
+ # already running. Then use exportfs to pick up the changes we
33
+ # just made.
34
+ system("sudo systemctl start nfsd.service rpc-idmapd.service rpc-mountd.service rpcbind.service")
35
+ system("sudo exportfs -r")
36
+ else
37
+ # The restarting of services when we might not need to can be
38
+ # considered evil, but this will be obviated by systemd soon
39
+ # enough anyway.
40
+ system("sudo /etc/rc.d/rpcbind restart")
41
+ system("sudo /etc/rc.d/nfs-common restart")
42
+ system("sudo /etc/rc.d/nfs-server restart")
43
+ end
44
+ end
45
+
46
+ protected
47
+
48
+ # This tests to see if systemd is used on the system. This is used
49
+ # in newer versions of Arch, and requires a change in behavior.
50
+ def systemd?
51
+ Kernel.system("which systemctl &>/dev/null")
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,66 @@
1
+ module Vagrant
2
+ module Hosts
3
+ # Interface for classes which house behavior that is specific
4
+ # to the host OS that is running Vagrant.
5
+ #
6
+ # By default, Vagrant will attempt to choose the best option
7
+ # for your machine, but the host may also be explicitly set
8
+ # via the `config.vagrant.host` parameter.
9
+ class Base
10
+ # This returns true/false depending on if the current running system
11
+ # matches the host class.
12
+ #
13
+ # @return [Boolean]
14
+ def self.match?
15
+ nil
16
+ end
17
+
18
+ # The precedence of the host when checking for matches. This is to
19
+ # allow certain host such as generic OS's ("Linux", "BSD", etc.)
20
+ # to be specified last.
21
+ #
22
+ # The hosts with the higher numbers will be checked first.
23
+ #
24
+ # If you're implementing a basic host, you can probably ignore this.
25
+ def self.precedence
26
+ 5
27
+ end
28
+
29
+ # Initializes a new host class.
30
+ #
31
+ # The only required parameter is a UI object so that the host
32
+ # objects have some way to communicate with the outside world.
33
+ #
34
+ # @param [UI] ui UI for the hosts to output to.
35
+ def initialize(ui)
36
+ @ui = ui
37
+ end
38
+
39
+ # Returns true of false denoting whether or not this host supports
40
+ # NFS shared folder setup. This method ideally should verify that
41
+ # NFS is installed.
42
+ #
43
+ # @return [Boolean]
44
+ def nfs?
45
+ false
46
+ end
47
+
48
+ # Exports the given hash of folders via NFS.
49
+ #
50
+ # @param [String] id A unique ID that is guaranteed to be unique to
51
+ # match these sets of folders.
52
+ # @param [String] ip IP of the guest machine.
53
+ # @param [Hash] folders Shared folders to sync.
54
+ def nfs_export(id, ip, folders)
55
+ end
56
+
57
+ # Prunes any NFS exports made by Vagrant which aren't in the set
58
+ # of valid ids given.
59
+ #
60
+ # @param [Array<String>] valid_ids Valid IDs that should not be
61
+ # pruned.
62
+ def nfs_prune(valid_ids)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,97 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/util/platform'
4
+
5
+ module Vagrant
6
+ module Hosts
7
+ # Represents a BSD host, such as FreeBSD and Darwin (Mac OS X).
8
+ class BSD < Base
9
+ include Util
10
+ include Util::Retryable
11
+
12
+ def self.match?
13
+ Util::Platform.darwin? || Util::Platform.bsd?
14
+ end
15
+
16
+ def self.precedence
17
+ # Set a lower precedence because this is a generic OS. We
18
+ # want specific distros to match first.
19
+ 2
20
+ end
21
+
22
+ def initialize(*args)
23
+ super
24
+
25
+ @logger = Log4r::Logger.new("vagrant::hosts::bsd")
26
+ @nfs_restart_command = "sudo nfsd restart"
27
+ @nfs_exports_template = "nfs/exports"
28
+ end
29
+
30
+ def nfs?
31
+ retryable(:tries => 10, :on => TypeError) do
32
+ system("which nfsd > /dev/null 2>&1")
33
+ end
34
+ end
35
+
36
+ def nfs_export(id, ip, folders)
37
+ output = TemplateRenderer.render(@nfs_exports_template,
38
+ :uuid => id,
39
+ :ip => ip,
40
+ :folders => folders)
41
+
42
+ # The sleep ensures that the output is truly flushed before any `sudo`
43
+ # commands are issued.
44
+ @ui.info I18n.t("vagrant.hosts.bsd.nfs_export")
45
+ sleep 0.5
46
+
47
+ # First, clean up the old entry
48
+ nfs_cleanup(id)
49
+
50
+ # Output the rendered template into the exports
51
+ output.split("\n").each do |line|
52
+ line = line.gsub('"', '\"')
53
+ system(%Q[sudo su root -c "echo '#{line}' >> /etc/exports"])
54
+ end
55
+
56
+ # We run restart here instead of "update" just in case nfsd
57
+ # is not starting
58
+ system(@nfs_restart_command)
59
+ end
60
+
61
+ def nfs_prune(valid_ids)
62
+ return if !File.exist?("/etc/exports")
63
+
64
+ @logger.info("Pruning invalid NFS entries...")
65
+
66
+ output = false
67
+
68
+ File.read("/etc/exports").lines.each do |line|
69
+ if line =~ /^# VAGRANT-BEGIN: (.+?)$/
70
+ if valid_ids.include?($1.to_s)
71
+ @logger.debug("Valid ID: #{$1.to_s}")
72
+ else
73
+ if !output
74
+ # We want to warn the user but we only want to output once
75
+ @ui.info I18n.t("vagrant.hosts.bsd.nfs_prune")
76
+ output = true
77
+ end
78
+
79
+ @logger.info("Invalid ID, pruning: #{$1.to_s}")
80
+ nfs_cleanup($1.to_s)
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ protected
87
+
88
+ def nfs_cleanup(id)
89
+ return if !File.exist?("/etc/exports")
90
+
91
+ # Use sed to just strip out the block of code which was inserted
92
+ # by Vagrant, and restart NFS.
93
+ system("sudo sed -e '/^# VAGRANT-BEGIN: #{id}/,/^# VAGRANT-END: #{id}/ d' -ibak /etc/exports")
94
+ end
95
+ end
96
+ end
97
+ end