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,56 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+
4
+ require 'vagrant/util/template_renderer'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Arch < Linux
9
+ # Make the TemplateRenderer top-level
10
+ include Vagrant::Util
11
+
12
+ def change_host_name(name)
13
+ # Only do this if the hostname is not already set
14
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
15
+ vm.channel.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/rc.conf")
16
+ vm.channel.sudo("hostname #{name}")
17
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} @' /etc/hosts")
18
+ end
19
+ end
20
+
21
+ def configure_networks(networks)
22
+ # Remove previous Vagrant-managed network interfaces
23
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/rc.conf > /tmp/vagrant-network-interfaces")
24
+ vm.channel.sudo("cat /tmp/vagrant-network-interfaces > /etc/rc.conf")
25
+
26
+ # Configure the network interfaces
27
+ interfaces = Set.new
28
+ entries = []
29
+ networks.each do |network|
30
+ interfaces.add(network[:interface])
31
+ entry = TemplateRenderer.render("guests/arch/network_#{network[:type]}",
32
+ :options => network)
33
+
34
+ entries << entry
35
+ end
36
+
37
+ # Perform the careful dance necessary to reconfigure
38
+ # the network interfaces
39
+ temp = Tempfile.new("vagrant")
40
+ temp.binmode
41
+ temp.write(entries.join("\n"))
42
+ temp.close
43
+
44
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry")
45
+
46
+ # Reconfigure the network interfaces
47
+ vm.channel.sudo("cat /tmp/vagrant-network-entry >> /etc/rc.conf")
48
+ vm.channel.sudo("/etc/rc.d/network restart")
49
+
50
+ interfaces.each do |interface|
51
+ vm.channel.sudo("dhcpcd -k eth#{interface} && dhcpcd eth#{interface} && sleep 3")
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,99 @@
1
+ module Vagrant
2
+ module Guest
3
+ # The base class for a "system." A system represents an installed
4
+ # operating system on a given box. There are some portions of
5
+ # Vagrant which are fairly OS-specific (such as mounting shared
6
+ # folders) and while the number is few, this abstraction allows
7
+ # more obscure operating systems to be installed without having
8
+ # to directly modify Vagrant internals.
9
+ #
10
+ # Subclasses of the system base class are expected to implement
11
+ # all the methods. These methods are described in the comments
12
+ # above their definition.
13
+ #
14
+ # **This is by no means a complete specification. The methods
15
+ # required by systems can and will change at any time. Any
16
+ # changes will be noted on release notes.**
17
+ class Base
18
+ class BaseError < Errors::VagrantError
19
+ error_namespace("vagrant.guest.base")
20
+ end
21
+
22
+ include Vagrant::Util
23
+
24
+ # The VM which this system is tied to.
25
+ attr_reader :vm
26
+
27
+ # Initializes the system. Any subclasses MUST make sure this
28
+ # method is called on the parent. Therefore, if a subclass overrides
29
+ # `initialize`, then you must call `super`.
30
+ def initialize(vm)
31
+ @vm = vm
32
+ end
33
+
34
+ # This method is automatically called when the system is available (when
35
+ # Vagrant can successfully SSH into the machine) to give the system a chance
36
+ # to determine the distro and return a distro-specific system.
37
+ #
38
+ # **Warning:** If a return value which subclasses from {Base} is
39
+ # returned, Vagrant will use it as the new system instance for the
40
+ # class.
41
+ def distro_dispatch; end
42
+
43
+ # Halt the machine. This method should gracefully shut down the
44
+ # operating system. This method will cause `vagrant halt` and associated
45
+ # commands to _block_, meaning that if the machine doesn't halt
46
+ # in a reasonable amount of time, this method should just return.
47
+ #
48
+ # If when this method returns, the machine's state isn't "powered_off,"
49
+ # Vagrant will proceed to forcefully shut the machine down.
50
+ def halt
51
+ raise BaseError, :_key => :unsupported_halt
52
+ end
53
+
54
+ # Mounts a shared folder.
55
+ #
56
+ # This method should create, mount, and properly set permissions
57
+ # on the shared folder. This method should also properly
58
+ # adhere to any configuration values such as `shared_folder_uid`
59
+ # on `config.vm`.
60
+ #
61
+ # @param [String] name The name of the shared folder.
62
+ # @param [String] guestpath The path on the machine which the user
63
+ # wants the folder mounted.
64
+ # @param [Hash] options Additional options for the shared folder
65
+ # which can be honored.
66
+ def mount_shared_folder(name, guestpath, options)
67
+ raise BaseError, :_key => :unsupported_shared_folder
68
+ end
69
+
70
+ # Mounts a shared folder via NFS. This assumes that the exports
71
+ # via the host are already done.
72
+ def mount_nfs(ip, folders)
73
+ raise BaseError, :_key => :unsupported_nfs
74
+ end
75
+
76
+ # Configures the given list of networks on the virtual machine.
77
+ #
78
+ # The networks parameter will be an array of hashes where the hashes
79
+ # represent the configuration of a network interface. The structure
80
+ # of the hash will be roughly the following:
81
+ #
82
+ # {
83
+ # :type => :static,
84
+ # :ip => "192.168.33.10",
85
+ # :netmask => "255.255.255.0",
86
+ # :interface => 1
87
+ # }
88
+ #
89
+ def configure_networks(networks)
90
+ raise BaseError, :_key => :unsupported_configure_networks
91
+ end
92
+
93
+ # Called to change the hostname of the virtual machine.
94
+ def change_host_name(name)
95
+ raise BaseError, :_key => :unsupported_host_name
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,64 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+
4
+ require 'vagrant/util/template_renderer'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Debian < Linux
9
+ # Make the TemplateRenderer top-level
10
+ include Vagrant::Util
11
+
12
+ def configure_networks(networks)
13
+ # First, remove any previous network modifications
14
+ # from the interface file.
15
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/network/interfaces > /tmp/vagrant-network-interfaces")
16
+ vm.channel.sudo("su -c 'cat /tmp/vagrant-network-interfaces > /etc/network/interfaces'")
17
+
18
+ # Accumulate the configurations to add to the interfaces file as
19
+ # well as what interfaces we're actually configuring since we use that
20
+ # later.
21
+ interfaces = Set.new
22
+ entries = []
23
+ networks.each do |network|
24
+ interfaces.add(network[:interface])
25
+ entry = TemplateRenderer.render("guests/debian/network_#{network[:type]}",
26
+ :options => network)
27
+
28
+ entries << entry
29
+ end
30
+
31
+ # Perform the careful dance necessary to reconfigure
32
+ # the network interfaces
33
+ temp = Tempfile.new("vagrant")
34
+ temp.binmode
35
+ temp.write(entries.join("\n"))
36
+ temp.close
37
+
38
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry")
39
+
40
+ # Bring down all the interfaces we're reconfiguring. By bringing down
41
+ # each specifically, we avoid reconfiguring eth0 (the NAT interface) so
42
+ # SSH never dies.
43
+ interfaces.each do |interface|
44
+ vm.channel.sudo("/sbin/ifdown eth#{interface} 2> /dev/null")
45
+ end
46
+
47
+ vm.channel.sudo("cat /tmp/vagrant-network-entry >> /etc/network/interfaces")
48
+
49
+ # Bring back up each network interface, reconfigured
50
+ interfaces.each do |interface|
51
+ vm.channel.sudo("/sbin/ifup eth#{interface}")
52
+ end
53
+ end
54
+
55
+ def change_host_name(name)
56
+ if !vm.channel.test("hostname --fqdn | grep '^#{name}$' || hostname --short | grep '^#{name}$'")
57
+ vm.channel.sudo("sed -r -i 's/^(127[.]0[.]1[.]1[[:space:]]+).*$/\\1#{name} #{name.split('.')[0]}/' /etc/hosts")
58
+ vm.channel.sudo("sed -i 's/.*$/#{name.split('.')[0]}/' /etc/hostname")
59
+ vm.channel.sudo("hostname -F /etc/hostname")
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,66 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+
4
+ require 'vagrant/util/template_renderer'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Fedora < 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 well
14
+ # as what interfaces we're actually configuring since we use that later.
15
+ interfaces = Set.new
16
+ networks.each do |network|
17
+ interfaces.add(network[:interface])
18
+
19
+ # Remove any previous vagrant configuration in this network
20
+ # interface's configuration files.
21
+ vm.channel.sudo("touch #{network_scripts_dir}/ifcfg-p7p#{network[:interface]}")
22
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-p7p#{network[:interface]} > /tmp/vagrant-ifcfg-p7p#{network[:interface]}")
23
+ vm.channel.sudo("cat /tmp/vagrant-ifcfg-p7p#{network[:interface]} > #{network_scripts_dir}/ifcfg-p7p#{network[:interface]}")
24
+
25
+ # Render and upload the network entry file to a deterministic
26
+ # temporary location.
27
+ entry = TemplateRenderer.render("guests/fedora/network_#{network[:type]}",
28
+ :options => network)
29
+
30
+ temp = Tempfile.new("vagrant")
31
+ temp.binmode
32
+ temp.write(entry)
33
+ temp.close
34
+
35
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry_#{network[:interface]}")
36
+ end
37
+
38
+ # Bring down all the interfaces we're reconfiguring. By bringing down
39
+ # each specifically, we avoid reconfiguring p7p (the NAT interface) so
40
+ # SSH never dies.
41
+ interfaces.each do |interface|
42
+ vm.channel.sudo("/sbin/ifdown p7p#{interface} 2> /dev/null", :error_check => false)
43
+ vm.channel.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-p7p#{interface}")
44
+ vm.channel.sudo("/sbin/ifup p7p#{interface} 2> /dev/null")
45
+ end
46
+ end
47
+
48
+ # The path to the directory with the network configuration scripts.
49
+ # This is pulled out into its own directory since there are other
50
+ # operating systems (SuSE) which behave similarly but with a different
51
+ # path to the network scripts.
52
+ def network_scripts_dir
53
+ '/etc/sysconfig/network-scripts'
54
+ end
55
+
56
+ def change_host_name(name)
57
+ # Only do this if the hostname is not already set
58
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
59
+ vm.channel.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
60
+ vm.channel.sudo("hostname #{name}")
61
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,86 @@
1
+ require 'vagrant/util/template_renderer'
2
+
3
+ module Vagrant
4
+ module Guest
5
+ # A general Vagrant system implementation for "freebsd".
6
+ #
7
+ # Contributed by Kenneth Vestergaard <kvs@binarysolutions.dk>
8
+ class FreeBSD < Base
9
+ # A custom config class which will be made accessible via `config.freebsd`
10
+ # This is not necessary for all system implementers, of course. However,
11
+ # generally, Vagrant tries to make almost every aspect of its execution
12
+ # configurable, and this assists that goal.
13
+ class FreeBSDConfig < Vagrant::Config::Base
14
+ attr_accessor :halt_timeout
15
+ attr_accessor :halt_check_interval
16
+
17
+ def initialize
18
+ @halt_timeout = 30
19
+ @halt_check_interval = 1
20
+ end
21
+ end
22
+
23
+ # Here for whenever it may be used.
24
+ class FreeBSDError < Errors::VagrantError
25
+ error_namespace("vagrant.guest.freebsd")
26
+ end
27
+
28
+ def halt
29
+ vm.channel.sudo("shutdown -p now")
30
+
31
+ # Wait until the VM's state is actually powered off. If this doesn't
32
+ # occur within a reasonable amount of time (15 seconds by default),
33
+ # then simply return and allow Vagrant to kill the machine.
34
+ count = 0
35
+ while vm.state != :poweroff
36
+ count += 1
37
+
38
+ return if count >= vm.config.freebsd.halt_timeout
39
+ sleep vm.config.freebsd.halt_check_interval
40
+ end
41
+ end
42
+
43
+ # TODO: vboxsf is currently unsupported in FreeBSD, if you are able to
44
+ # help out with this project, please contact vbox@FreeBSD.org
45
+ #
46
+ # See: http://wiki.freebsd.org/VirtualBox/ToDo
47
+ # def mount_shared_folder(ssh, name, guestpath)
48
+ # ssh.exec!("sudo mkdir -p #{guestpath}")
49
+ # # Using a custom mount method here; could use improvement.
50
+ # ssh.exec!("sudo mount -t vboxfs v-root #{guestpath}")
51
+ # ssh.exec!("sudo chown #{vm.config.ssh.username} #{guestpath}")
52
+ # end
53
+
54
+ def mount_nfs(ip, folders)
55
+ folders.each do |name, opts|
56
+ vm.channel.sudo("mkdir -p #{opts[:guestpath]}")
57
+ vm.channel.sudo("mount #{ip}:#{opts[:hostpath]} #{opts[:guestpath]}")
58
+ end
59
+ end
60
+
61
+ def configure_networks(networks)
62
+ # Remove any previous network additions to the configuration file.
63
+ vm.channel.sudo("sed -i '' -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/rc.conf")
64
+
65
+ networks.each do |network|
66
+ entry = TemplateRenderer.render("guests/freebsd/network_#{network[:type]}",
67
+ :options => network)
68
+ vm.channel.upload(StringIO.new(entry), "/tmp/vagrant-network-entry")
69
+ vm.channel.sudo("su -m root -c 'cat /tmp/vagrant-network-entry >> /etc/rc.conf'")
70
+ if network[:type].to_sym == :static
71
+ vm.channel.sudo("ifconfig em#{network[:interface]} inet #{network[:ip]} netmask #{network[:netmask]}")
72
+ elsif network[:type].to_sym == :dhcp
73
+ vm.channel.sudo("dhclient em#{network[:interface]}")
74
+ end
75
+ end
76
+ end
77
+
78
+ def change_host_name(name)
79
+ if !vm.channel.test("hostname -f | grep '^#{name}$' || hostname -s | grep '^#{name}$'")
80
+ vm.channel.sudo("sed -i '' 's/^hostname=.*$/hostname=#{name}/' /etc/rc.conf")
81
+ vm.channel.sudo("hostname #{name}")
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,46 @@
1
+ require 'tempfile'
2
+
3
+ require 'vagrant/util/template_renderer'
4
+
5
+ module Vagrant
6
+ module Guest
7
+ class Gentoo < Linux
8
+ # Make the TemplateRenderer top-level
9
+ include Vagrant::Util
10
+
11
+ def configure_networks(networks)
12
+ # Remove any previous host only network additions to the interface file
13
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/conf.d/net > /tmp/vagrant-network-interfaces")
14
+ vm.channel.sudo("cat /tmp/vagrant-network-interfaces > /etc/conf.d/net")
15
+
16
+ # Configure each network interface
17
+ networks.each do |network|
18
+ entry = TemplateRenderer.render("guests/gentoo/network_#{network[:type]}",
19
+ :options => network)
20
+
21
+ # Upload the entry to a temporary location
22
+ temp = Tempfile.new("vagrant")
23
+ temp.binmode
24
+ temp.write(entry)
25
+ temp.close
26
+
27
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry")
28
+
29
+ # Configure the interface
30
+ vm.channel.sudo("ln -fs /etc/init.d/net.lo /etc/init.d/net.eth#{network[:interface]}")
31
+ vm.channel.sudo("/etc/init.d/net.eth#{network[:interface]} stop 2> /dev/null")
32
+ vm.channel.sudo("cat /tmp/vagrant-network-entry >> /etc/conf.d/net")
33
+ vm.channel.sudo("/etc/init.d/net.eth#{network[:interface]} start")
34
+ end
35
+ end
36
+
37
+ def change_host_name(name)
38
+ if !vm.channel.test("sudo hostname --fqdn | grep '#{name}'")
39
+ vm.channel.sudo("echo 'hostname=#{name.split('.')[0]}' > /etc/conf.d/hostname")
40
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]1[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
41
+ vm.channel.sudo("hostname #{name.split('.')[0]}")
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,118 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/guest/linux/error'
4
+ require 'vagrant/guest/linux/config'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Linux < Base
9
+ def initialize(*args)
10
+ super
11
+
12
+ @logger = Log4r::Logger.new("vagrant::guest::linux")
13
+ end
14
+
15
+ def distro_dispatch
16
+ if @vm.channel.test("cat /etc/debian_version")
17
+ return :debian if @vm.channel.test("cat /proc/version | grep 'Debian'")
18
+ return :ubuntu if @vm.channel.test("cat /proc/version | grep 'Ubuntu'")
19
+ end
20
+
21
+ return :gentoo if @vm.channel.test("cat /etc/gentoo-release")
22
+ return :fedora if @vm.channel.test("grep 'Fedora release 16' /etc/redhat-release")
23
+ return :redhat if @vm.channel.test("cat /etc/redhat-release")
24
+ return :suse if @vm.channel.test("cat /etc/SuSE-release")
25
+ return :arch if @vm.channel.test("cat /etc/arch-release")
26
+
27
+ # Can't detect the distro, assume vanilla linux
28
+ nil
29
+ end
30
+
31
+ def halt
32
+ @vm.channel.sudo("shutdown -h now")
33
+
34
+ # Wait until the VM's state is actually powered off. If this doesn't
35
+ # occur within a reasonable amount of time (15 seconds by default),
36
+ # then simply return and allow Vagrant to kill the machine.
37
+ count = 0
38
+ while @vm.state != :poweroff
39
+ count += 1
40
+
41
+ return if count >= @vm.config.linux.halt_timeout
42
+ sleep @vm.config.linux.halt_check_interval
43
+ end
44
+ end
45
+
46
+ def mount_shared_folder(name, guestpath, options)
47
+ real_guestpath = expanded_guest_path(guestpath)
48
+ @logger.debug("Shell expanded guest path: #{real_guestpath}")
49
+
50
+ @vm.channel.sudo("mkdir -p #{real_guestpath}")
51
+ mount_folder(name, real_guestpath, options)
52
+ @vm.channel.sudo("chown `id -u #{options[:owner]}`:`id -g #{options[:group]}` #{real_guestpath}")
53
+ end
54
+
55
+ def mount_nfs(ip, folders)
56
+ # TODO: Maybe check for nfs support on the guest, since its often
57
+ # not installed by default
58
+ folders.each do |name, opts|
59
+ # Expand the guestpath, so we can handle things like "~/vagrant"
60
+ real_guestpath = expanded_guest_path(opts[:guestpath])
61
+
62
+ # Do the actual creating and mounting
63
+ @vm.channel.sudo("mkdir -p #{real_guestpath}")
64
+ @vm.channel.sudo("mount -o vers=#{opts[:nfs_version]} #{ip}:'#{opts[:hostpath]}' #{real_guestpath}",
65
+ :error_class => LinuxError,
66
+ :error_key => :mount_nfs_fail)
67
+ end
68
+ end
69
+
70
+ protected
71
+
72
+ # Determine the real guest path. Since we use a `sudo` shell everywhere
73
+ # else, things like '~' don't expand properly in shared folders. We have
74
+ # to `echo` here to get that path.
75
+ #
76
+ # @param [String] guestpath The unexpanded guest path.
77
+ # @return [String] The expanded guestpath
78
+ def expanded_guest_path(guestpath)
79
+ real_guestpath = nil
80
+ @vm.channel.execute("printf #{guestpath}") do |type, data|
81
+ if type == :stdout
82
+ real_guestpath ||= ""
83
+ real_guestpath += data
84
+ end
85
+ end
86
+
87
+ if !real_guestpath
88
+ # Really strange error case if this happens. Let's throw an error,
89
+ # tell the user to check the echo output.
90
+ raise LinuxError, :_key => :guestpath_expand_fail
91
+ end
92
+
93
+ # Chomp the string so that any trailing newlines are killed
94
+ return real_guestpath.chomp
95
+ end
96
+
97
+ def mount_folder(name, guestpath, options)
98
+ # Determine the permission string to attach to the mount command
99
+ mount_options = "-o uid=`id -u #{options[:owner]}`,gid=`id -g #{options[:group]}`"
100
+ mount_options += ",#{options[:extra]}" if options[:extra]
101
+
102
+ attempts = 0
103
+ while true
104
+ success = true
105
+ @vm.channel.sudo("mount -t vboxsf #{mount_options} #{name} #{guestpath}") do |type, data|
106
+ success = false if type == :stderr && data =~ /No such device/i
107
+ end
108
+
109
+ break if success
110
+
111
+ attempts += 1
112
+ raise LinuxError, :mount_fail if attempts >= 10
113
+ sleep 5
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end