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,326 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/util/busy'
4
+ require 'vagrant/util/platform'
5
+ require 'vagrant/util/retryable'
6
+ require 'vagrant/util/subprocess'
7
+
8
+ module Vagrant
9
+ module Driver
10
+ # Base class for all VirtualBox drivers.
11
+ #
12
+ # This class provides useful tools for things such as executing
13
+ # VBoxManage and handling SIGINTs and so on.
14
+ class VirtualBoxBase
15
+ # Include this so we can use `Subprocess` more easily.
16
+ include Vagrant::Util
17
+ include Vagrant::Util::Retryable
18
+
19
+ def initialize
20
+ @logger = Log4r::Logger.new("vagrant::driver::virtualbox_base")
21
+
22
+ # This flag is used to keep track of interrupted state (SIGINT)
23
+ @interrupted = false
24
+
25
+ # Set the path to VBoxManage
26
+ @vboxmanage_path = "VBoxManage"
27
+
28
+ if Util::Platform.windows?
29
+ @logger.debug("Windows. Trying VBOX_INSTALL_PATH for VBoxManage")
30
+
31
+ # On Windows, we use the VBOX_INSTALL_PATH environmental
32
+ # variable to find VBoxManage.
33
+ if ENV.has_key?("VBOX_INSTALL_PATH")
34
+ # The path usually ends with a \ but we make sure here
35
+ path = ENV["VBOX_INSTALL_PATH"]
36
+ path += "\\" if !path.end_with?("\\")
37
+ @vboxmanage_path = "#{path}VBoxManage.exe"
38
+ end
39
+ end
40
+
41
+ @logger.info("VBoxManage path: #{@vboxmanage_path}")
42
+ end
43
+
44
+ # Clears the forwarded ports that have been set on the virtual machine.
45
+ def clear_forwarded_ports
46
+ end
47
+
48
+ # Clears the shared folders that have been set on the virtual machine.
49
+ def clear_shared_folders
50
+ end
51
+
52
+ # Creates a DHCP server for a host only network.
53
+ #
54
+ # @param [String] network Name of the host-only network.
55
+ # @param [Hash] options Options for the DHCP server.
56
+ def create_dhcp_server(network, options)
57
+ end
58
+
59
+ # Creates a host only network with the given options.
60
+ #
61
+ # @param [Hash] options Options to create the host only network.
62
+ # @return [Hash] The details of the host only network, including
63
+ # keys `:name`, `:ip`, and `:netmask`
64
+ def create_host_only_network(options)
65
+ end
66
+
67
+ # Deletes the virtual machine references by this driver.
68
+ def delete
69
+ end
70
+
71
+ # Deletes any host only networks that aren't being used for anything.
72
+ def delete_unused_host_only_networks
73
+ end
74
+
75
+ # Discards any saved state associated with this VM.
76
+ def discard_saved_state
77
+ end
78
+
79
+ # Enables network adapters on the VM.
80
+ #
81
+ # The format of each adapter specification should be like so:
82
+ #
83
+ # {
84
+ # :type => :hostonly,
85
+ # :hostonly => "vboxnet0",
86
+ # :mac_address => "tubes"
87
+ # }
88
+ #
89
+ # This must support setting up both host only and bridged networks.
90
+ #
91
+ # @param [Array<Hash>] adapters Array of adapters to enable.
92
+ def enable_adapters(adapters)
93
+ end
94
+
95
+ # Execute a raw command straight through to VBoxManage.
96
+ #
97
+ # @param [Array] command Command to execute.
98
+ def execute_command(command)
99
+ end
100
+
101
+ # Exports the virtual machine to the given path.
102
+ #
103
+ # @param [String] path Path to the OVF file.
104
+ # @yield [progress] Yields the block with the progress of the export.
105
+ def export(path)
106
+ end
107
+
108
+ # Forwards a set of ports for a VM.
109
+ #
110
+ # This will not affect any previously set forwarded ports,
111
+ # so be sure to delete those if you need to.
112
+ #
113
+ # The format of each port hash should be the following:
114
+ #
115
+ # {
116
+ # :name => "foo",
117
+ # :hostport => 8500,
118
+ # :guestport => 80,
119
+ # :adapter => 1,
120
+ # :protocol => "tcp"
121
+ # }
122
+ #
123
+ # Note that "adapter" and "protocol" are optional and will default
124
+ # to 1 and "tcp" respectively.
125
+ #
126
+ # @param [Array<Hash>] ports An array of ports to set. See documentation
127
+ # for more information on the format.
128
+ def forward_ports(ports)
129
+ end
130
+
131
+ # Halts the virtual machine (pulls the plug).
132
+ def halt
133
+ end
134
+
135
+ # Imports the VM from an OVF file.
136
+ #
137
+ # @param [String] ovf Path to the OVF file.
138
+ # @return [String] UUID of the imported VM.
139
+ def import(ovf)
140
+ end
141
+
142
+ # Returns a list of forwarded ports for a VM.
143
+ #
144
+ # @param [String] uuid UUID of the VM to read from, or `nil` if this
145
+ # VM.
146
+ # @param [Boolean] active_only If true, only VMs that are running will
147
+ # be checked.
148
+ # @return [Array<Array>]
149
+ def read_forwarded_ports(uuid=nil, active_only=false)
150
+ end
151
+
152
+ # Returns a list of bridged interfaces.
153
+ #
154
+ # @return [Hash]
155
+ def read_bridged_interfaces
156
+ end
157
+
158
+ # Returns the guest additions version that is installed on this VM.
159
+ #
160
+ # @return [String]
161
+ def read_guest_additions_version
162
+ end
163
+
164
+ # Returns a list of available host only interfaces.
165
+ #
166
+ # @return [Hash]
167
+ def read_host_only_interfaces
168
+ end
169
+
170
+ # Returns the MAC address of the first network interface.
171
+ #
172
+ # @return [String]
173
+ def read_mac_address
174
+ end
175
+
176
+ # Returns the folder where VirtualBox places it's VMs.
177
+ #
178
+ # @return [String]
179
+ def read_machine_folder
180
+ end
181
+
182
+ # Returns a list of network interfaces of the VM.
183
+ #
184
+ # @return [Hash]
185
+ def read_network_interfaces
186
+ end
187
+
188
+ # Returns the current state of this VM.
189
+ #
190
+ # @return [Symbol]
191
+ def read_state
192
+ end
193
+
194
+ # Returns a list of all forwarded ports in use by active
195
+ # virtual machines.
196
+ #
197
+ # @return [Array]
198
+ def read_used_ports
199
+ end
200
+
201
+ # Returns a list of all UUIDs of virtual machines currently
202
+ # known by VirtualBox.
203
+ #
204
+ # @return [Array<String>]
205
+ def read_vms
206
+ end
207
+
208
+ # Sets the MAC address of the first network adapter.
209
+ #
210
+ # @param [String] mac MAC address without any spaces/hyphens.
211
+ def set_mac_address(mac)
212
+ end
213
+
214
+ # Share a set of folders on this VM.
215
+ #
216
+ # @param [Array<Hash>] folders
217
+ def share_folders(folders)
218
+ end
219
+
220
+ # Reads the SSH port of this VM.
221
+ #
222
+ # @param [Integer] expected Expected guest port of SSH.
223
+ def ssh_port(expected)
224
+ end
225
+
226
+ # Starts the virtual machine.
227
+ #
228
+ # @param [String] mode Mode to boot the VM. Either "headless"
229
+ # or "gui"
230
+ def start(mode)
231
+ end
232
+
233
+ # Suspend the virtual machine.
234
+ def suspend
235
+ end
236
+
237
+ # Verifies that the driver is ready to accept work.
238
+ #
239
+ # This should raise a VagrantError if things are not ready.
240
+ def verify!
241
+ end
242
+
243
+ # Verifies that an image can be imported properly.
244
+ #
245
+ # @param [String] path Path to an OVF file.
246
+ # @return [Boolean]
247
+ def verify_image(path)
248
+ end
249
+
250
+ # Checks if a VM with the given UUID exists.
251
+ #
252
+ # @return [Boolean]
253
+ def vm_exists?(uuid)
254
+ end
255
+
256
+ # Execute the given subcommand for VBoxManage and return the output.
257
+ def execute(*command, &block)
258
+ # Get the options hash if it exists
259
+ opts = {}
260
+ opts = command.pop if command.last.is_a?(Hash)
261
+
262
+ tries = 0
263
+ tries = 3 if opts[:retryable]
264
+
265
+ # Variable to store our execution result
266
+ r = nil
267
+
268
+ retryable(:on => Errors::VBoxManageError, :tries => tries, :sleep => 1) do
269
+ # Execute the command
270
+ r = raw(*command, &block)
271
+
272
+ # If the command was a failure, then raise an exception that is
273
+ # nicely handled by Vagrant.
274
+ if r.exit_code != 0
275
+ if @interrupted
276
+ @logger.info("Exit code != 0, but interrupted. Ignoring.")
277
+ else
278
+ raise Errors::VBoxManageError, :command => command.inspect
279
+ end
280
+ else
281
+ # Sometimes, VBoxManage fails but doesn't actual return a non-zero
282
+ # exit code. For this we inspect the output and determine if an error
283
+ # occurred.
284
+ if r.stderr =~ /VBoxManage: error:/
285
+ @logger.info("VBoxManage error text found, assuming error.")
286
+ raise Errors::VBoxManageError, :command => command.inspect
287
+ end
288
+ end
289
+ end
290
+
291
+ # Return the output, making sure to replace any Windows-style
292
+ # newlines with Unix-style.
293
+ r.stdout.gsub("\r\n", "\n")
294
+ end
295
+
296
+ # Executes a command and returns the raw result object.
297
+ def raw(*command, &block)
298
+ int_callback = lambda do
299
+ @interrupted = true
300
+ @logger.info("Interrupted.")
301
+ end
302
+
303
+ # The following is a workaround for a combined VirtualBox and
304
+ # Mac OS X 10.8 bug:
305
+ #
306
+ # Remove the DYLD_LIBRARY_PATH environmental variable on Mac. This
307
+ # is to fix a bug in Mac OS X 10.8 where a warning is printed to the
308
+ # console if this is set when executing certain programs, which
309
+ # can cause some VBoxManage commands to break because they work
310
+ # by just reading stdout and don't expect the OS to just inject
311
+ # garbage into it.
312
+ old_dyld_lib_path = ENV.delete("DYLD_LIBRARY_PATH")
313
+ old_ld_lib_path = ENV.delete("LD_LIBRARY_PATH")
314
+
315
+ Util::Busy.busy(int_callback) do
316
+ Subprocess.execute(@vboxmanage_path, *command, &block)
317
+ end
318
+ ensure
319
+ # Reset the library path if it was set before. See above comments
320
+ # for more information on why this was unset in the first place.
321
+ ENV["DYLD_LIBRARY_PATH"] = old_dyld_lib_path if old_dyld_lib_path
322
+ ENV["LD_LIBRARY_PATH"] = old_ld_lib_path if old_ld_lib_path
323
+ end
324
+ end
325
+ end
326
+ end
@@ -0,0 +1,522 @@
1
+ require 'pathname'
2
+ require 'fileutils'
3
+
4
+ require 'log4r'
5
+ require 'rubygems' # This is needed for plugin loading below.
6
+
7
+ require 'vagrant/util/file_mode'
8
+ require 'vagrant/util/platform'
9
+
10
+ module Vagrant
11
+ # Represents a single Vagrant environment. A "Vagrant environment" is
12
+ # defined as basically a folder with a "Vagrantfile." This class allows
13
+ # access to the VMs, CLI, etc. all in the scope of this environment.
14
+ class Environment
15
+ HOME_SUBDIRS = ["tmp", "boxes", "gems"]
16
+ DEFAULT_VM = :default
17
+ DEFAULT_HOME = "~/.vagrant.d"
18
+
19
+ # The `cwd` that this environment represents
20
+ attr_reader :cwd
21
+
22
+ # The valid name for a Vagrantfile for this environment.
23
+ attr_reader :vagrantfile_name
24
+
25
+ # The {UI} object to communicate with the outside world.
26
+ attr_reader :ui
27
+
28
+ # The directory to the "home" folder that Vagrant will use to store
29
+ # global state.
30
+ attr_reader :home_path
31
+
32
+ # The directory where temporary files for Vagrant go.
33
+ attr_reader :tmp_path
34
+
35
+ # The directory where boxes are stored.
36
+ attr_reader :boxes_path
37
+
38
+ # The path where the plugins are stored (gems)
39
+ attr_reader :gems_path
40
+
41
+ # The path to the default private key
42
+ attr_reader :default_private_key_path
43
+
44
+ # Initializes a new environment with the given options. The options
45
+ # is a hash where the main available key is `cwd`, which defines where
46
+ # the environment represents. There are other options available but
47
+ # they shouldn't be used in general. If `cwd` is nil, then it defaults
48
+ # to the `Dir.pwd` (which is the cwd of the executing process).
49
+ def initialize(opts=nil)
50
+ opts = {
51
+ :cwd => nil,
52
+ :vagrantfile_name => nil,
53
+ :lock_path => nil,
54
+ :ui_class => nil,
55
+ :home_path => nil
56
+ }.merge(opts || {})
57
+
58
+ # Set the default working directory to look for the vagrantfile
59
+ opts[:cwd] ||= ENV["VAGRANT_CWD"] if ENV.has_key?("VAGRANT_CWD")
60
+ opts[:cwd] ||= Dir.pwd
61
+ opts[:cwd] = Pathname.new(opts[:cwd])
62
+ raise Errors::EnvironmentNonExistentCWD if !opts[:cwd].directory?
63
+
64
+ # Set the Vagrantfile name up. We append "Vagrantfile" and "vagrantfile" so that
65
+ # those continue to work as well, but anything custom will take precedence.
66
+ opts[:vagrantfile_name] ||= []
67
+ opts[:vagrantfile_name] = [opts[:vagrantfile_name]] if !opts[:vagrantfile_name].is_a?(Array)
68
+ opts[:vagrantfile_name] += ["Vagrantfile", "vagrantfile"]
69
+
70
+ # Set instance variables for all the configuration parameters.
71
+ @cwd = opts[:cwd]
72
+ @vagrantfile_name = opts[:vagrantfile_name]
73
+ @lock_path = opts[:lock_path]
74
+ @home_path = opts[:home_path]
75
+
76
+ ui_class = opts[:ui_class] || UI::Silent
77
+ @ui = ui_class.new("vagrant")
78
+
79
+ @loaded = false
80
+ @lock_acquired = false
81
+
82
+ @logger = Log4r::Logger.new("vagrant::environment")
83
+ @logger.info("Environment initialized (#{self})")
84
+ @logger.info(" - cwd: #{cwd}")
85
+
86
+ # Setup the home directory
87
+ setup_home_path
88
+ @tmp_path = @home_path.join("tmp")
89
+ @boxes_path = @home_path.join("boxes")
90
+ @gems_path = @home_path.join("gems")
91
+
92
+ # Setup the default private key
93
+ @default_private_key_path = @home_path.join("insecure_private_key")
94
+ copy_insecure_private_key
95
+
96
+ # Load the plugins
97
+ load_plugins
98
+ end
99
+
100
+ #---------------------------------------------------------------
101
+ # Helpers
102
+ #---------------------------------------------------------------
103
+
104
+ # The path to the `dotfile`, which contains the persisted UUID of
105
+ # the VM if it exists.
106
+ #
107
+ # @return [Pathname]
108
+ def dotfile_path
109
+ return nil if !root_path
110
+ root_path.join(config.global.vagrant.dotfile_name)
111
+ end
112
+
113
+ # Returns the collection of boxes for the environment.
114
+ #
115
+ # @return [BoxCollection]
116
+ def boxes
117
+ @_boxes ||= BoxCollection.new(boxes_path, action_runner)
118
+ end
119
+
120
+ # Returns the VMs associated with this environment.
121
+ #
122
+ # @return [Hash<Symbol,VM>]
123
+ def vms
124
+ load! if !loaded?
125
+ @vms ||= load_vms!
126
+ end
127
+
128
+ # Returns the VMs associated with this environment, in the order
129
+ # that they were defined.
130
+ #
131
+ # @return [Array<VM>]
132
+ def vms_ordered
133
+ return @vms.values if !multivm?
134
+ @vms_enum ||= config.global.vm.defined_vm_keys.map { |name| @vms[name] }
135
+ end
136
+
137
+ # Returns the primary VM associated with this environment. This
138
+ # method is only applicable for multi-VM environments. This can
139
+ # potentially be nil if no primary VM is specified.
140
+ #
141
+ # @return [VM]
142
+ def primary_vm
143
+ return vms.values.first if !multivm?
144
+
145
+ config.global.vm.defined_vms.each do |name, subvm|
146
+ return vms[name] if subvm.options[:primary]
147
+ end
148
+
149
+ nil
150
+ end
151
+
152
+ # Returns a boolean whether this environment represents a multi-VM
153
+ # environment or not. This will work even when called on child
154
+ # environments.
155
+ #
156
+ # @return [Bool]
157
+ def multivm?
158
+ vms.length > 1 || vms.keys.first != DEFAULT_VM
159
+ end
160
+
161
+ # Makes a call to the CLI with the given arguments as if they
162
+ # came from the real command line (sometimes they do!). An example:
163
+ #
164
+ # env.cli("package", "--vagrantfile", "Vagrantfile")
165
+ #
166
+ def cli(*args)
167
+ CLI.new(args.flatten, self).execute
168
+ end
169
+
170
+ # Returns the host object associated with this environment.
171
+ #
172
+ # @return [Hosts::Base]
173
+ def host
174
+ return @host if defined?(@host)
175
+
176
+ # Attempt to figure out the host class. Note that the order
177
+ # matters here, so please don't touch. Specifically: The symbol
178
+ # check is done after the detect check because the symbol check
179
+ # will return nil, and we don't want to trigger a detect load.
180
+ host_klass = config.global.vagrant.host
181
+ host_klass = Hosts.detect(Vagrant.hosts) if host_klass.nil? || host_klass == :detect
182
+ host_klass = Vagrant.hosts.get(host_klass) if host_klass.is_a?(Symbol)
183
+
184
+ # If no host class is detected, we use the base class.
185
+ host_klass ||= Hosts::Base
186
+
187
+ @host ||= host_klass.new(@ui)
188
+ end
189
+
190
+ # Action runner for executing actions in the context of this environment.
191
+ #
192
+ # @return [Action::Runner]
193
+ def action_runner
194
+ @action_runner ||= Action::Runner.new(action_registry) do
195
+ {
196
+ :action_runner => action_runner,
197
+ :box_collection => boxes,
198
+ :global_config => config.global,
199
+ :host => host,
200
+ :root_path => root_path,
201
+ :tmp_path => tmp_path,
202
+ :ui => @ui
203
+ }
204
+ end
205
+ end
206
+
207
+ # Action registry for registering new actions with this environment.
208
+ #
209
+ # @return [Registry]
210
+ def action_registry
211
+ # For now we return the global built-in actions registry. In the future
212
+ # we may want to create an isolated registry that inherits from this
213
+ # global one, but for now there isn't a use case that calls for it.
214
+ Vagrant.actions
215
+ end
216
+
217
+ # Loads on initial access and reads data from the global data store.
218
+ # The global data store is global to Vagrant everywhere (in every environment),
219
+ # so it can be used to store system-wide information. Note that "system-wide"
220
+ # typically means "for this user" since the location of the global data
221
+ # store is in the home directory.
222
+ #
223
+ # @return [DataStore]
224
+ def global_data
225
+ @global_data ||= DataStore.new(File.expand_path("global_data.json", home_path))
226
+ end
227
+
228
+ # Loads (on initial access) and reads data from the local data
229
+ # store. This file is always at the root path as the file "~/.vagrant"
230
+ # and contains a JSON dump of a hash. See {DataStore} for more
231
+ # information.
232
+ #
233
+ # @return [DataStore]
234
+ def local_data
235
+ @local_data ||= DataStore.new(dotfile_path)
236
+ end
237
+
238
+ # The root path is the path where the top-most (loaded last)
239
+ # Vagrantfile resides. It can be considered the project root for
240
+ # this environment.
241
+ #
242
+ # @return [String]
243
+ def root_path
244
+ return @root_path if defined?(@root_path)
245
+
246
+ root_finder = lambda do |path|
247
+ # Note: To remain compatible with Ruby 1.8, we have to use
248
+ # a `find` here instead of an `each`.
249
+ found = vagrantfile_name.find do |rootfile|
250
+ File.exist?(File.join(path.to_s, rootfile))
251
+ end
252
+
253
+ return path if found
254
+ return nil if path.root? || !File.exist?(path)
255
+ root_finder.call(path.parent)
256
+ end
257
+
258
+ @root_path = root_finder.call(cwd)
259
+ end
260
+
261
+ # This returns the path which Vagrant uses to determine the location
262
+ # of the file lock. This is specific to each operating system.
263
+ def lock_path
264
+ @lock_path || tmp_path.join("vagrant.lock")
265
+ end
266
+
267
+ # This locks Vagrant for the duration of the block passed to this
268
+ # method. During this time, any other environment which attempts
269
+ # to lock which points to the same lock file will fail.
270
+ def lock
271
+ # This allows multiple locks in the same process to be nested
272
+ return yield if @lock_acquired
273
+
274
+ File.open(lock_path, "w+") do |f|
275
+ # The file locking fails only if it returns "false." If it
276
+ # succeeds it returns a 0, so we must explicitly check for
277
+ # the proper error case.
278
+ raise Errors::EnvironmentLockedError if f.flock(File::LOCK_EX | File::LOCK_NB) === false
279
+
280
+ begin
281
+ # Mark that we have a lock
282
+ @lock_acquired = true
283
+
284
+ yield
285
+ ensure
286
+ # We need to make sure that no matter what this is always
287
+ # reset to false so we don't think we have a lock when we
288
+ # actually don't.
289
+ @lock_acquired = false
290
+ end
291
+ end
292
+ end
293
+
294
+ #---------------------------------------------------------------
295
+ # Config Methods
296
+ #---------------------------------------------------------------
297
+
298
+ # The configuration object represented by this environment. This
299
+ # will trigger the environment to load if it hasn't loaded yet (see
300
+ # {#load!}).
301
+ #
302
+ # @return [Config::Container]
303
+ def config
304
+ load! if !loaded?
305
+ @config
306
+ end
307
+
308
+ #---------------------------------------------------------------
309
+ # Load Methods
310
+ #---------------------------------------------------------------
311
+
312
+ # Returns a boolean representing if the environment has been
313
+ # loaded or not.
314
+ #
315
+ # @return [Bool]
316
+ def loaded?
317
+ !!@loaded
318
+ end
319
+
320
+ # Loads this entire environment, setting up the instance variables
321
+ # such as `vm`, `config`, etc. on this environment. The order this
322
+ # method calls its other methods is very particular.
323
+ def load!
324
+ if !loaded?
325
+ @loaded = true
326
+ @logger.info("Loading configuration...")
327
+ load_config!
328
+ end
329
+
330
+ self
331
+ end
332
+
333
+ # Reloads the configuration of this environment.
334
+ def reload!
335
+ # Reload the configuration
336
+ load_config!
337
+
338
+ # Clear the VMs because this can now be diferent due to configuration
339
+ @vms = nil
340
+ end
341
+
342
+ # Loads this environment's configuration and stores it in the {#config}
343
+ # variable. The configuration loaded by this method is specified to
344
+ # this environment, meaning that it will use the given root directory
345
+ # to load the Vagrantfile into that context.
346
+ def load_config!
347
+ # Initialize the config loader
348
+ config_loader = Config::Loader.new
349
+ config_loader.load_order = [:default, :box, :home, :root, :vm]
350
+
351
+ inner_load = lambda do |*args|
352
+ # This is for Ruby 1.8.7 compatibility. Ruby 1.8.7 doesn't allow
353
+ # default arguments for lambdas, so we get around by doing a *args
354
+ # and setting the args here.
355
+ subvm = args[0]
356
+ box = args[1]
357
+
358
+ # Default Vagrantfile first. This is the Vagrantfile that ships
359
+ # with Vagrant.
360
+ config_loader.set(:default, File.expand_path("config/default.rb", Vagrant.source_root))
361
+
362
+ if box
363
+ # We load the box Vagrantfile
364
+ box_vagrantfile = find_vagrantfile(box.directory)
365
+ config_loader.set(:box, box_vagrantfile) if box_vagrantfile
366
+ end
367
+
368
+ if home_path
369
+ # Load the home Vagrantfile
370
+ home_vagrantfile = find_vagrantfile(home_path)
371
+ config_loader.set(:home, home_vagrantfile) if home_vagrantfile
372
+ end
373
+
374
+ if root_path
375
+ # Load the Vagrantfile in this directory
376
+ root_vagrantfile = find_vagrantfile(root_path)
377
+ config_loader.set(:root, root_vagrantfile) if root_vagrantfile
378
+ end
379
+
380
+ if subvm
381
+ # We have subvm configuration, so set that up as well.
382
+ config_loader.set(:vm, subvm.proc_stack)
383
+ end
384
+
385
+ # Execute the configuration stack and store the result as the final
386
+ # value in the config ivar.
387
+ config_loader.load
388
+ end
389
+
390
+ # For the global configuration, we only need to load the configuration
391
+ # in a single pass, since nothing is conditional on the configuration.
392
+ global = inner_load.call
393
+
394
+ # For each virtual machine represented by this environment, we have
395
+ # to load the configuration in two-passes. We do this because the
396
+ # first pass is used to determine the box for the VM. The second pass
397
+ # is used to also load the box Vagrantfile.
398
+ defined_vm_keys = global.vm.defined_vm_keys.dup
399
+ defined_vms = global.vm.defined_vms.dup
400
+
401
+ # If this isn't a multi-VM environment, then setup the default VM
402
+ # to simply be our configuration.
403
+ if defined_vm_keys.empty?
404
+ defined_vm_keys << DEFAULT_VM
405
+ defined_vms[DEFAULT_VM] = Config::VMConfig::SubVM.new
406
+ end
407
+
408
+ vm_configs = defined_vm_keys.map do |vm_name|
409
+ @logger.debug("Loading configuration for VM: #{vm_name}")
410
+
411
+ subvm = defined_vms[vm_name]
412
+
413
+ # First pass, first run.
414
+ config = inner_load[subvm]
415
+
416
+ # Second pass, with the box
417
+ config = inner_load[subvm, boxes.find(config.vm.box)]
418
+ config.vm.name = vm_name
419
+
420
+ # Return the final configuration for this VM
421
+ config
422
+ end
423
+
424
+ # Finally, we have our configuration. Set it and forget it.
425
+ @config = Config::Container.new(global, vm_configs)
426
+ end
427
+
428
+ # Loads the persisted VM (if it exists) for this environment.
429
+ def load_vms!
430
+ result = {}
431
+
432
+ # Load all the virtual machine instances.
433
+ config.vms.each do |name|
434
+ result[name] = Vagrant::VM.new(name, self, config.for_vm(name))
435
+ end
436
+
437
+ result
438
+ end
439
+
440
+ # This sets the `@home_path` variable properly.
441
+ #
442
+ # @return [Pathname]
443
+ def setup_home_path
444
+ @home_path = Pathname.new(File.expand_path(@home_path ||
445
+ ENV["VAGRANT_HOME"] ||
446
+ DEFAULT_HOME))
447
+ @logger.info("Home path: #{@home_path}")
448
+
449
+ # If the setup_version file exists, then we can't load because we're
450
+ # not forward compatible. It means they ran a future version of Vagrant.
451
+ raise Errors::IncompatibleWithFutureVersion, :path => @home_path.to_s if \
452
+ @home_path.join("setup_version").file?
453
+
454
+ # Setup the array of necessary home directories
455
+ dirs = [@home_path]
456
+ dirs += HOME_SUBDIRS.collect { |subdir| @home_path.join(subdir) }
457
+
458
+ # Go through each required directory, creating it if it doesn't exist
459
+ dirs.each do |dir|
460
+ next if File.directory?(dir)
461
+
462
+ begin
463
+ @logger.info("Creating: #{dir}")
464
+ FileUtils.mkdir_p(dir)
465
+ rescue Errno::EACCES
466
+ raise Errors::HomeDirectoryNotAccessible, :home_path => @home_path.to_s
467
+ end
468
+ end
469
+ end
470
+
471
+ protected
472
+
473
+ # This method copies the private key into the home directory if it
474
+ # doesn't already exist.
475
+ #
476
+ # This must be done because `ssh` requires that the key is chmod
477
+ # 0600, but if Vagrant is installed as a separate user, then the
478
+ # effective uid won't be able to read the key. So the key is copied
479
+ # to the home directory and chmod 0600.
480
+ def copy_insecure_private_key
481
+ if !@default_private_key_path.exist?
482
+ @logger.info("Copying private key to home directory")
483
+ FileUtils.cp(File.expand_path("keys/vagrant", Vagrant.source_root),
484
+ @default_private_key_path)
485
+ end
486
+
487
+ if !Util::Platform.windows?
488
+ # On Windows, permissions don't matter as much, so don't worry
489
+ # about doing chmod.
490
+ if Util::FileMode.from_octal(@default_private_key_path.stat.mode) != "600"
491
+ @logger.info("Changing permissions on private key to 0600")
492
+ @default_private_key_path.chmod(0600)
493
+ end
494
+ end
495
+ end
496
+
497
+ # Finds the Vagrantfile in the given directory.
498
+ #
499
+ # @param [Pathname] path Path to search in.
500
+ # @return [Pathname]
501
+ def find_vagrantfile(search_path)
502
+ @vagrantfile_name.each do |vagrantfile|
503
+ current_path = search_path.join(vagrantfile)
504
+ return current_path if current_path.exist?
505
+ end
506
+
507
+ nil
508
+ end
509
+
510
+ # Loads the Vagrant plugins by properly setting up RubyGems so that
511
+ # our private gem repository is on the path.
512
+ def load_plugins
513
+ # Add our private gem path to the gem path and reset the paths
514
+ # that Rubygems knows about.
515
+ ENV["GEM_PATH"] = "#{@gems_path}#{::File::PATH_SEPARATOR}#{ENV["GEM_PATH"]}"
516
+ ::Gem.clear_paths
517
+
518
+ # Load the plugins
519
+ Plugin.load!
520
+ end
521
+ end
522
+ end