boxcar 0.10005.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (453) hide show
  1. data/.gitignore +48 -0
  2. data/.gitsetup.yml +6 -0
  3. data/.yardopts +1 -0
  4. data/CHANGELOG.md +696 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +40 -0
  7. data/LICENSE +21 -0
  8. data/README.md +91 -0
  9. data/Rakefile +18 -0
  10. data/VERSION +1 -0
  11. data/bin/_bump +126 -0
  12. data/bin/_jason +172 -0
  13. data/bin/_log4sh +3840 -0
  14. data/bin/_meat +172 -0
  15. data/bin/_prime +8 -0
  16. data/bin/_shflags +1012 -0
  17. data/bin/_shunit +1048 -0
  18. data/bin/_sub +37 -0
  19. data/bin/_treadstone +8 -0
  20. data/bin/_versions +174 -0
  21. data/bin/build +15 -0
  22. data/bin/bump +15 -0
  23. data/bin/edit +15 -0
  24. data/bin/publish +15 -0
  25. data/bin/stub +15 -0
  26. data/bin/vagrant +60 -0
  27. data/boxcar.gemspec +32 -0
  28. data/config/default.rb +30 -0
  29. data/contrib/README.md +12 -0
  30. data/contrib/emacs/vagrant.el +8 -0
  31. data/contrib/vim/vagrantfile.vim +9 -0
  32. data/keys/README.md +17 -0
  33. data/keys/vagrant +27 -0
  34. data/keys/vagrant.pub +1 -0
  35. data/lib/development.rb +25 -0
  36. data/lib/vagrant.rb +197 -0
  37. data/lib/vagrant/action.rb +63 -0
  38. data/lib/vagrant/action/box/destroy.rb +25 -0
  39. data/lib/vagrant/action/box/download.rb +84 -0
  40. data/lib/vagrant/action/box/package.rb +19 -0
  41. data/lib/vagrant/action/box/unpackage.rb +61 -0
  42. data/lib/vagrant/action/box/verify.rb +23 -0
  43. data/lib/vagrant/action/builder.rb +128 -0
  44. data/lib/vagrant/action/builtin.rb +171 -0
  45. data/lib/vagrant/action/env/set.rb +21 -0
  46. data/lib/vagrant/action/environment.rb +12 -0
  47. data/lib/vagrant/action/general/check_virtualbox.rb +28 -0
  48. data/lib/vagrant/action/general/package.rb +101 -0
  49. data/lib/vagrant/action/general/validate.rb +18 -0
  50. data/lib/vagrant/action/runner.rb +53 -0
  51. data/lib/vagrant/action/vm/boot.rb +53 -0
  52. data/lib/vagrant/action/vm/check_accessible.rb +23 -0
  53. data/lib/vagrant/action/vm/check_box.rb +33 -0
  54. data/lib/vagrant/action/vm/check_guest_additions.rb +38 -0
  55. data/lib/vagrant/action/vm/check_port_collisions.rb +89 -0
  56. data/lib/vagrant/action/vm/clean_machine_folder.rb +43 -0
  57. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +18 -0
  58. data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
  59. data/lib/vagrant/action/vm/clear_shared_folders.rb +18 -0
  60. data/lib/vagrant/action/vm/customize.rb +36 -0
  61. data/lib/vagrant/action/vm/default_name.rb +22 -0
  62. data/lib/vagrant/action/vm/destroy.rb +19 -0
  63. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +20 -0
  64. data/lib/vagrant/action/vm/discard_state.rb +22 -0
  65. data/lib/vagrant/action/vm/export.rb +57 -0
  66. data/lib/vagrant/action/vm/forward_ports.rb +92 -0
  67. data/lib/vagrant/action/vm/halt.rb +32 -0
  68. data/lib/vagrant/action/vm/host_name.rb +21 -0
  69. data/lib/vagrant/action/vm/import.rb +48 -0
  70. data/lib/vagrant/action/vm/match_mac_address.rb +21 -0
  71. data/lib/vagrant/action/vm/network.rb +403 -0
  72. data/lib/vagrant/action/vm/nfs.rb +196 -0
  73. data/lib/vagrant/action/vm/package.rb +23 -0
  74. data/lib/vagrant/action/vm/package_vagrantfile.rb +36 -0
  75. data/lib/vagrant/action/vm/provision.rb +61 -0
  76. data/lib/vagrant/action/vm/provisioner_cleanup.rb +26 -0
  77. data/lib/vagrant/action/vm/prune_nfs_exports.rb +20 -0
  78. data/lib/vagrant/action/vm/resume.rb +20 -0
  79. data/lib/vagrant/action/vm/sane_defaults.rb +78 -0
  80. data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
  81. data/lib/vagrant/action/vm/share_folders.rb +114 -0
  82. data/lib/vagrant/action/vm/suspend.rb +20 -0
  83. data/lib/vagrant/action/warden.rb +92 -0
  84. data/lib/vagrant/box.rb +44 -0
  85. data/lib/vagrant/box_collection.rb +58 -0
  86. data/lib/vagrant/cli.rb +76 -0
  87. data/lib/vagrant/command.rb +24 -0
  88. data/lib/vagrant/command/base.rb +167 -0
  89. data/lib/vagrant/command/box.rb +58 -0
  90. data/lib/vagrant/command/box_add.rb +37 -0
  91. data/lib/vagrant/command/box_list.rb +28 -0
  92. data/lib/vagrant/command/box_remove.rb +27 -0
  93. data/lib/vagrant/command/box_repackage.rb +27 -0
  94. data/lib/vagrant/command/destroy.rb +64 -0
  95. data/lib/vagrant/command/gem.rb +39 -0
  96. data/lib/vagrant/command/halt.rb +39 -0
  97. data/lib/vagrant/command/init.rb +40 -0
  98. data/lib/vagrant/command/package.rb +75 -0
  99. data/lib/vagrant/command/provision.rb +40 -0
  100. data/lib/vagrant/command/reload.rb +39 -0
  101. data/lib/vagrant/command/resume.rb +33 -0
  102. data/lib/vagrant/command/ssh.rb +90 -0
  103. data/lib/vagrant/command/ssh_config.rb +51 -0
  104. data/lib/vagrant/command/start_mixins.rb +26 -0
  105. data/lib/vagrant/command/status.rb +36 -0
  106. data/lib/vagrant/command/suspend.rb +33 -0
  107. data/lib/vagrant/command/up.rb +40 -0
  108. data/lib/vagrant/communication.rb +7 -0
  109. data/lib/vagrant/communication/base.rb +56 -0
  110. data/lib/vagrant/communication/ssh.rb +229 -0
  111. data/lib/vagrant/config.rb +49 -0
  112. data/lib/vagrant/config/base.rb +82 -0
  113. data/lib/vagrant/config/container.rb +37 -0
  114. data/lib/vagrant/config/error_recorder.rb +19 -0
  115. data/lib/vagrant/config/loader.rb +127 -0
  116. data/lib/vagrant/config/nfs.rb +8 -0
  117. data/lib/vagrant/config/package.rb +7 -0
  118. data/lib/vagrant/config/ssh.rb +27 -0
  119. data/lib/vagrant/config/top.rb +72 -0
  120. data/lib/vagrant/config/vagrant.rb +14 -0
  121. data/lib/vagrant/config/vm.rb +168 -0
  122. data/lib/vagrant/config/vm/provisioner.rb +52 -0
  123. data/lib/vagrant/config/vm/sub_vm.rb +17 -0
  124. data/lib/vagrant/data_store.rb +92 -0
  125. data/lib/vagrant/downloaders.rb +7 -0
  126. data/lib/vagrant/downloaders/base.rb +25 -0
  127. data/lib/vagrant/downloaders/file.rb +22 -0
  128. data/lib/vagrant/downloaders/http.rb +97 -0
  129. data/lib/vagrant/driver.rb +8 -0
  130. data/lib/vagrant/driver/virtualbox.rb +134 -0
  131. data/lib/vagrant/driver/virtualbox_4_0.rb +459 -0
  132. data/lib/vagrant/driver/virtualbox_4_1.rb +459 -0
  133. data/lib/vagrant/driver/virtualbox_4_2.rb +606 -0
  134. data/lib/vagrant/driver/virtualbox_base.rb +309 -0
  135. data/lib/vagrant/environment.rb +517 -0
  136. data/lib/vagrant/errors.rb +441 -0
  137. data/lib/vagrant/guest.rb +18 -0
  138. data/lib/vagrant/guest/arch.rb +56 -0
  139. data/lib/vagrant/guest/base.rb +99 -0
  140. data/lib/vagrant/guest/debian.rb +64 -0
  141. data/lib/vagrant/guest/fedora.rb +66 -0
  142. data/lib/vagrant/guest/freebsd.rb +86 -0
  143. data/lib/vagrant/guest/gentoo.rb +46 -0
  144. data/lib/vagrant/guest/linux.rb +118 -0
  145. data/lib/vagrant/guest/linux/config.rb +19 -0
  146. data/lib/vagrant/guest/linux/error.rb +9 -0
  147. data/lib/vagrant/guest/openbsd.rb +20 -0
  148. data/lib/vagrant/guest/redhat.rb +67 -0
  149. data/lib/vagrant/guest/solaris.rb +118 -0
  150. data/lib/vagrant/guest/suse.rb +9 -0
  151. data/lib/vagrant/guest/ubuntu.rb +23 -0
  152. data/lib/vagrant/hosts.rb +37 -0
  153. data/lib/vagrant/hosts/arch.rb +55 -0
  154. data/lib/vagrant/hosts/base.rb +66 -0
  155. data/lib/vagrant/hosts/bsd.rb +97 -0
  156. data/lib/vagrant/hosts/fedora.rb +47 -0
  157. data/lib/vagrant/hosts/freebsd.rb +41 -0
  158. data/lib/vagrant/hosts/gentoo.rb +20 -0
  159. data/lib/vagrant/hosts/linux.rb +94 -0
  160. data/lib/vagrant/hosts/opensuse.rb +30 -0
  161. data/lib/vagrant/hosts/windows.rb +16 -0
  162. data/lib/vagrant/plugin.rb +81 -0
  163. data/lib/vagrant/provisioners.rb +12 -0
  164. data/lib/vagrant/provisioners/base.rb +44 -0
  165. data/lib/vagrant/provisioners/chef.rb +168 -0
  166. data/lib/vagrant/provisioners/chef_client.rb +132 -0
  167. data/lib/vagrant/provisioners/chef_solo.rb +234 -0
  168. data/lib/vagrant/provisioners/puppet.rb +175 -0
  169. data/lib/vagrant/provisioners/puppet_server.rb +78 -0
  170. data/lib/vagrant/provisioners/shell.rb +96 -0
  171. data/lib/vagrant/registry.rb +52 -0
  172. data/lib/vagrant/ssh.rb +126 -0
  173. data/lib/vagrant/test_helpers.rb +154 -0
  174. data/lib/vagrant/ui.rb +168 -0
  175. data/lib/vagrant/util.rb +12 -0
  176. data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
  177. data/lib/vagrant/util/busy.rb +59 -0
  178. data/lib/vagrant/util/counter.rb +24 -0
  179. data/lib/vagrant/util/file_checksum.rb +38 -0
  180. data/lib/vagrant/util/file_mode.rb +12 -0
  181. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  182. data/lib/vagrant/util/is_port_open.rb +38 -0
  183. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  184. data/lib/vagrant/util/network_ip.rb +28 -0
  185. data/lib/vagrant/util/platform.rb +68 -0
  186. data/lib/vagrant/util/retryable.rb +25 -0
  187. data/lib/vagrant/util/safe_exec.rb +36 -0
  188. data/lib/vagrant/util/safe_puts.rb +31 -0
  189. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  190. data/lib/vagrant/util/subprocess.rb +247 -0
  191. data/lib/vagrant/util/template_renderer.rb +83 -0
  192. data/lib/vagrant/version.rb +7 -0
  193. data/lib/vagrant/vm.rb +195 -0
  194. data/libexec/build +30 -0
  195. data/libexec/build-gem +30 -0
  196. data/libexec/bump +32 -0
  197. data/libexec/edit-gem +81 -0
  198. data/libexec/publish +58 -0
  199. data/libexec/publish-gem +58 -0
  200. data/libexec/stub-prepare +37 -0
  201. data/tasks/acceptance.rake +113 -0
  202. data/tasks/bundler.rake +3 -0
  203. data/tasks/test.rake +20 -0
  204. data/templates/commands/init/Vagrantfile.erb +99 -0
  205. data/templates/commands/ssh_config/config.erb +15 -0
  206. data/templates/config/validation_failed.erb +7 -0
  207. data/templates/guests/arch/network_dhcp.erb +7 -0
  208. data/templates/guests/arch/network_static.erb +7 -0
  209. data/templates/guests/debian/network_dhcp.erb +6 -0
  210. data/templates/guests/debian/network_static.erb +7 -0
  211. data/templates/guests/fedora/network_dhcp.erb +6 -0
  212. data/templates/guests/fedora/network_static.erb +13 -0
  213. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  214. data/templates/guests/freebsd/network_static.erb +3 -0
  215. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  216. data/templates/guests/gentoo/network_static.erb +4 -0
  217. data/templates/guests/redhat/network_dhcp.erb +6 -0
  218. data/templates/guests/redhat/network_static.erb +7 -0
  219. data/templates/locales/en.yml +747 -0
  220. data/templates/nfs/exports.erb +5 -0
  221. data/templates/nfs/exports_freebsd.erb +5 -0
  222. data/templates/nfs/exports_linux.erb +5 -0
  223. data/templates/package_Vagrantfile.erb +11 -0
  224. data/templates/provisioners/chef_client/client.erb +32 -0
  225. data/templates/provisioners/chef_solo/solo.erb +25 -0
  226. data/test/acceptance/base.rb +48 -0
  227. data/test/acceptance/box_test.rb +99 -0
  228. data/test/acceptance/destroy_test.rb +37 -0
  229. data/test/acceptance/halt_test.rb +72 -0
  230. data/test/acceptance/init_test.rb +33 -0
  231. data/test/acceptance/networking/host_only_test.rb +37 -0
  232. data/test/acceptance/networking/port_forward_test.rb +125 -0
  233. data/test/acceptance/package_test.rb +46 -0
  234. data/test/acceptance/provisioning/basic_test.rb +61 -0
  235. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  236. data/test/acceptance/provisioning/shell_test.rb +53 -0
  237. data/test/acceptance/resume_test.rb +17 -0
  238. data/test/acceptance/shared_folders_test.rb +84 -0
  239. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  240. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  241. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  242. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  243. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  244. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  245. data/test/acceptance/ssh_test.rb +46 -0
  246. data/test/acceptance/support/config.rb +42 -0
  247. data/test/acceptance/support/isolated_environment.rb +117 -0
  248. data/test/acceptance/support/matchers/have_color.rb +9 -0
  249. data/test/acceptance/support/matchers/match_output.rb +14 -0
  250. data/test/acceptance/support/matchers/succeed.rb +14 -0
  251. data/test/acceptance/support/network_tests.rb +29 -0
  252. data/test/acceptance/support/output.rb +95 -0
  253. data/test/acceptance/support/shared/base_context.rb +72 -0
  254. data/test/acceptance/support/shared/command_examples.rb +33 -0
  255. data/test/acceptance/support/virtualbox.rb +36 -0
  256. data/test/acceptance/suspend_test.rb +56 -0
  257. data/test/acceptance/up_basic_test.rb +33 -0
  258. data/test/acceptance/up_with_box_url.rb +40 -0
  259. data/test/acceptance/vagrant_test.rb +47 -0
  260. data/test/acceptance/version_test.rb +15 -0
  261. data/test/buildbot/README.md +72 -0
  262. data/test/buildbot/buildbot_config/__init__.py +0 -0
  263. data/test/buildbot/buildbot_config/config/__init__.py +0 -0
  264. data/test/buildbot/buildbot_config/config/loader.py +24 -0
  265. data/test/buildbot/buildbot_config/config/master.py +24 -0
  266. data/test/buildbot/buildbot_config/config/slave.py +22 -0
  267. data/test/buildbot/buildbot_config/master/__init__.py +6 -0
  268. data/test/buildbot/buildbot_config/master/builders.py +78 -0
  269. data/test/buildbot/buildbot_config/master/buildsteps.py +100 -0
  270. data/test/buildbot/buildbot_config/master/change_sources.py +8 -0
  271. data/test/buildbot/buildbot_config/master/schedulers.py +32 -0
  272. data/test/buildbot/buildbot_config/master/slaves.py +60 -0
  273. data/test/buildbot/buildbot_config/master/status.py +52 -0
  274. data/test/buildbot/master/Makefile.sample +28 -0
  275. data/test/buildbot/master/buildbot.tac +36 -0
  276. data/test/buildbot/master/master.cfg +67 -0
  277. data/test/buildbot/master/public_html/bg_gradient.jpg +0 -0
  278. data/test/buildbot/master/public_html/default.css +545 -0
  279. data/test/buildbot/master/public_html/favicon.ico +0 -0
  280. data/test/buildbot/master/public_html/robots.txt +10 -0
  281. data/test/buildbot/master/public_html/static/css/bootstrap-1.4.0.min.css +356 -0
  282. data/test/buildbot/master/public_html/static/css/prettify.css +97 -0
  283. data/test/buildbot/master/public_html/static/css/syntax.css +60 -0
  284. data/test/buildbot/master/public_html/static/css/vagrant.base.css +205 -0
  285. data/test/buildbot/master/public_html/static/images/base_box_mac.jpg +0 -0
  286. data/test/buildbot/master/public_html/static/images/getting-started/success.jpg +0 -0
  287. data/test/buildbot/master/public_html/static/images/icons/error.png +0 -0
  288. data/test/buildbot/master/public_html/static/images/vagrant_chilling.png +0 -0
  289. data/test/buildbot/master/public_html/static/images/vagrant_holding.png +0 -0
  290. data/test/buildbot/master/public_html/static/images/vagrant_looking.png +0 -0
  291. data/test/buildbot/master/public_html/static/images/windows/alter_path.jpg +0 -0
  292. data/test/buildbot/master/public_html/static/images/windows/edit_path.jpg +0 -0
  293. data/test/buildbot/master/public_html/static/images/windows/environment_variables_button.jpg +0 -0
  294. data/test/buildbot/master/public_html/static/images/windows/port_and_ppk_path.jpg +0 -0
  295. data/test/buildbot/master/public_html/static/images/windows/ppk_selection.jpg +0 -0
  296. data/test/buildbot/master/public_html/static/images/windows/putty_first_screen.jpg +0 -0
  297. data/test/buildbot/master/public_html/static/images/windows/save_result.jpg +0 -0
  298. data/test/buildbot/master/public_html/static/images/windows/vbox_manage_default_location.jpg +0 -0
  299. data/test/buildbot/master/public_html/static/js/bootstrap-tabs.js +80 -0
  300. data/test/buildbot/master/public_html/static/js/jquery-1.7.min.js +4 -0
  301. data/test/buildbot/master/templates/authfail.html +9 -0
  302. data/test/buildbot/master/templates/build.html +205 -0
  303. data/test/buildbot/master/templates/builder.html +118 -0
  304. data/test/buildbot/master/templates/builders.html +33 -0
  305. data/test/buildbot/master/templates/buildslave.html +72 -0
  306. data/test/buildbot/master/templates/buildslaves.html +70 -0
  307. data/test/buildbot/master/templates/change.html +15 -0
  308. data/test/buildbot/master/templates/layouts/base.html +58 -0
  309. data/test/buildbot/master/templates/macros/box.html +37 -0
  310. data/test/buildbot/master/templates/macros/build_line.html +50 -0
  311. data/test/buildbot/master/templates/macros/change.html +81 -0
  312. data/test/buildbot/master/templates/macros/forms.html +300 -0
  313. data/test/buildbot/master/templates/root.html +42 -0
  314. data/test/buildbot/master/templates/waterfall.html +53 -0
  315. data/test/buildbot/requirements.txt +4 -0
  316. data/test/buildbot/scripts/deploy.sh +38 -0
  317. data/test/buildbot/scripts/setup.sh +107 -0
  318. data/test/buildbot/slave/buildbot.tac +43 -0
  319. data/test/buildbot/slave/info/admin +1 -0
  320. data/test/buildbot/slave/info/host +1 -0
  321. data/test/buildbot/tests/__init__.py +0 -0
  322. data/test/buildbot/tests/master/__init__.py +0 -0
  323. data/test/buildbot/tests/master/test_slaves.py +41 -0
  324. data/test/buildbot/vendor/choices-0.4.0.tar.gz +0 -0
  325. data/test/config/acceptance_boxes.yml +7 -0
  326. data/test/support/isolated_environment.rb +46 -0
  327. data/test/support/tempdir.rb +34 -0
  328. data/test/unit/base.rb +21 -0
  329. data/test/unit/support/isolated_environment.rb +47 -0
  330. data/test/unit/support/shared/base_context.rb +30 -0
  331. data/test/unit/vagrant/action/builder_test.rb +156 -0
  332. data/test/unit/vagrant/action/environment_test.rb +16 -0
  333. data/test/unit/vagrant/action/runner_test.rb +65 -0
  334. data/test/unit/vagrant/action/warden_test.rb +92 -0
  335. data/test/unit/vagrant/box_collection_test.rb +56 -0
  336. data/test/unit/vagrant/box_test.rb +34 -0
  337. data/test/unit/vagrant/command/base_test.rb +150 -0
  338. data/test/unit/vagrant/config/base_test.rb +48 -0
  339. data/test/unit/vagrant/config/loader_test.rb +79 -0
  340. data/test/unit/vagrant/config/ssh_test.rb +17 -0
  341. data/test/unit/vagrant/config/top_test.rb +69 -0
  342. data/test/unit/vagrant/config/vm_test.rb +71 -0
  343. data/test/unit/vagrant/config_test.rb +27 -0
  344. data/test/unit/vagrant/data_store_test.rb +79 -0
  345. data/test/unit/vagrant/downloaders/base_test.rb +18 -0
  346. data/test/unit/vagrant/downloaders/file_test.rb +75 -0
  347. data/test/unit/vagrant/downloaders/http_test.rb +19 -0
  348. data/test/unit/vagrant/environment_test.rb +212 -0
  349. data/test/unit/vagrant/hosts_test.rb +36 -0
  350. data/test/unit/vagrant/registry_test.rb +74 -0
  351. data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
  352. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  353. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
  354. data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
  355. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  356. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  357. data/test/unit/vagrant/util/retryable_test.rb +106 -0
  358. data/test/unit/vagrant_test.rb +27 -0
  359. data/test/unit_legacy/locales/en.yml +8 -0
  360. data/test/unit_legacy/test_helper.rb +32 -0
  361. data/test/unit_legacy/vagrant/action/box/destroy_test.rb +18 -0
  362. data/test/unit_legacy/vagrant/action/box/download_test.rb +125 -0
  363. data/test/unit_legacy/vagrant/action/box/package_test.rb +25 -0
  364. data/test/unit_legacy/vagrant/action/box/unpackage_test.rb +84 -0
  365. data/test/unit_legacy/vagrant/action/box/verify_test.rb +30 -0
  366. data/test/unit_legacy/vagrant/action/env/set_test.rb +24 -0
  367. data/test/unit_legacy/vagrant/action/general/package_test.rb +268 -0
  368. data/test/unit_legacy/vagrant/action/general/validate_test.rb +31 -0
  369. data/test/unit_legacy/vagrant/action/vm/boot_test.rb +66 -0
  370. data/test/unit_legacy/vagrant/action/vm/check_accessible_test.rb +61 -0
  371. data/test/unit_legacy/vagrant/action/vm/check_box_test.rb +61 -0
  372. data/test/unit_legacy/vagrant/action/vm/check_guest_additions_test.rb +9 -0
  373. data/test/unit_legacy/vagrant/action/vm/clean_machine_folder_test.rb +84 -0
  374. data/test/unit_legacy/vagrant/action/vm/clear_forwarded_ports_test.rb +52 -0
  375. data/test/unit_legacy/vagrant/action/vm/clear_nfs_exports_test.rb +22 -0
  376. data/test/unit_legacy/vagrant/action/vm/clear_shared_folders_test.rb +40 -0
  377. data/test/unit_legacy/vagrant/action/vm/customize_test.rb +37 -0
  378. data/test/unit_legacy/vagrant/action/vm/destroy_test.rb +25 -0
  379. data/test/unit_legacy/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +49 -0
  380. data/test/unit_legacy/vagrant/action/vm/discard_state_test.rb +45 -0
  381. data/test/unit_legacy/vagrant/action/vm/export_test.rb +107 -0
  382. data/test/unit_legacy/vagrant/action/vm/forward_ports_helpers_test.rb +77 -0
  383. data/test/unit_legacy/vagrant/action/vm/forward_ports_test.rb +197 -0
  384. data/test/unit_legacy/vagrant/action/vm/halt_test.rb +79 -0
  385. data/test/unit_legacy/vagrant/action/vm/host_name_test.rb +36 -0
  386. data/test/unit_legacy/vagrant/action/vm/import_test.rb +66 -0
  387. data/test/unit_legacy/vagrant/action/vm/match_mac_address_test.rb +40 -0
  388. data/test/unit_legacy/vagrant/action/vm/modify_test.rb +38 -0
  389. data/test/unit_legacy/vagrant/action/vm/network_test.rb +286 -0
  390. data/test/unit_legacy/vagrant/action/vm/nfs_helpers_test.rb +26 -0
  391. data/test/unit_legacy/vagrant/action/vm/nfs_test.rb +260 -0
  392. data/test/unit_legacy/vagrant/action/vm/package_test.rb +25 -0
  393. data/test/unit_legacy/vagrant/action/vm/package_vagrantfile_test.rb +46 -0
  394. data/test/unit_legacy/vagrant/action/vm/provision_test.rb +65 -0
  395. data/test/unit_legacy/vagrant/action/vm/provisioner_cleanup_test.rb +56 -0
  396. data/test/unit_legacy/vagrant/action/vm/resume_test.rb +35 -0
  397. data/test/unit_legacy/vagrant/action/vm/share_folders_test.rb +144 -0
  398. data/test/unit_legacy/vagrant/action/vm/suspend_test.rb +35 -0
  399. data/test/unit_legacy/vagrant/action_test.rb +89 -0
  400. data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
  401. data/test/unit_legacy/vagrant/box_test.rb +74 -0
  402. data/test/unit_legacy/vagrant/cli_test.rb +35 -0
  403. data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
  404. data/test/unit_legacy/vagrant/command/group_base_test.rb +15 -0
  405. data/test/unit_legacy/vagrant/command/helpers_test.rb +88 -0
  406. data/test/unit_legacy/vagrant/command/init_test.rb +10 -0
  407. data/test/unit_legacy/vagrant/command/package_test.rb +27 -0
  408. data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
  409. data/test/unit_legacy/vagrant/config/error_recorder_test.rb +18 -0
  410. data/test/unit_legacy/vagrant/config/ssh_test.rb +12 -0
  411. data/test/unit_legacy/vagrant/config/vagrant_test.rb +35 -0
  412. data/test/unit_legacy/vagrant/config/vm/provisioner_test.rb +92 -0
  413. data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
  414. data/test/unit_legacy/vagrant/config_test.rb +148 -0
  415. data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
  416. data/test/unit_legacy/vagrant/environment_test.rb +539 -0
  417. data/test/unit_legacy/vagrant/errors_test.rb +42 -0
  418. data/test/unit_legacy/vagrant/hosts/base_test.rb +46 -0
  419. data/test/unit_legacy/vagrant/hosts/bsd_test.rb +53 -0
  420. data/test/unit_legacy/vagrant/hosts/linux_test.rb +54 -0
  421. data/test/unit_legacy/vagrant/plugin_test.rb +9 -0
  422. data/test/unit_legacy/vagrant/provisioners/base_test.rb +63 -0
  423. data/test/unit_legacy/vagrant/provisioners/chef_client_test.rb +190 -0
  424. data/test/unit_legacy/vagrant/provisioners/chef_solo_test.rb +115 -0
  425. data/test/unit_legacy/vagrant/provisioners/chef_test.rb +209 -0
  426. data/test/unit_legacy/vagrant/provisioners/puppet_server_test.rb +68 -0
  427. data/test/unit_legacy/vagrant/provisioners/puppet_test.rb +182 -0
  428. data/test/unit_legacy/vagrant/provisioners/shell_test.rb +79 -0
  429. data/test/unit_legacy/vagrant/ssh/session_test.rb +40 -0
  430. data/test/unit_legacy/vagrant/ssh_test.rb +304 -0
  431. data/test/unit_legacy/vagrant/systems/base_test.rb +18 -0
  432. data/test/unit_legacy/vagrant/systems/linux_test.rb +104 -0
  433. data/test/unit_legacy/vagrant/util/busy_test.rb +106 -0
  434. data/test/unit_legacy/vagrant/util/counter_test.rb +29 -0
  435. data/test/unit_legacy/vagrant/util/platform_test.rb +18 -0
  436. data/test/unit_legacy/vagrant/util/stacked_proc_runner_test.rb +43 -0
  437. data/test/unit_legacy/vagrant/util/template_renderer_test.rb +145 -0
  438. data/test/unit_legacy/vagrant/vm_test.rb +300 -0
  439. data/vagrant.gemspec +39 -0
  440. data/vendor/cache/contest-0.1.3.gem +0 -0
  441. data/vendor/cache/diff-lcs-1.1.3.gem +0 -0
  442. data/vendor/cache/erubis-2.7.0.gem +0 -0
  443. data/vendor/cache/i18n-0.6.1.gem +0 -0
  444. data/vendor/cache/json-1.5.4.gem +0 -0
  445. data/vendor/cache/log4r-1.1.10.gem +0 -0
  446. data/vendor/cache/metaclass-0.0.1.gem +0 -0
  447. data/vendor/cache/minitest-2.5.1.gem +0 -0
  448. data/vendor/cache/mocha-0.13.1.gem +0 -0
  449. data/vendor/cache/rake-10.0.2.gem +0 -0
  450. data/vendor/cache/rspec-core-2.8.0.gem +0 -0
  451. data/vendor/cache/rspec-expectations-2.8.0.gem +0 -0
  452. data/vendor/cache/rspec-mocks-2.8.0.gem +0 -0
  453. metadata +676 -0
@@ -0,0 +1,309 @@
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
+ Util::Busy.busy(int_callback) do
304
+ Subprocess.execute(@vboxmanage_path, *command, &block)
305
+ end
306
+ end
307
+ end
308
+ end
309
+ end
@@ -0,0 +1,517 @@
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
+ # Setup the array of necessary home directories
450
+ dirs = [@home_path]
451
+ dirs += HOME_SUBDIRS.collect { |subdir| @home_path.join(subdir) }
452
+
453
+ # Go through each required directory, creating it if it doesn't exist
454
+ dirs.each do |dir|
455
+ next if File.directory?(dir)
456
+
457
+ begin
458
+ @logger.info("Creating: #{dir}")
459
+ FileUtils.mkdir_p(dir)
460
+ rescue Errno::EACCES
461
+ raise Errors::HomeDirectoryNotAccessible, :home_path => @home_path.to_s
462
+ end
463
+ end
464
+ end
465
+
466
+ protected
467
+
468
+ # This method copies the private key into the home directory if it
469
+ # doesn't already exist.
470
+ #
471
+ # This must be done because `ssh` requires that the key is chmod
472
+ # 0600, but if Vagrant is installed as a separate user, then the
473
+ # effective uid won't be able to read the key. So the key is copied
474
+ # to the home directory and chmod 0600.
475
+ def copy_insecure_private_key
476
+ if !@default_private_key_path.exist?
477
+ @logger.info("Copying private key to home directory")
478
+ FileUtils.cp(File.expand_path("keys/vagrant", Vagrant.source_root),
479
+ @default_private_key_path)
480
+ end
481
+
482
+ if !Util::Platform.windows?
483
+ # On Windows, permissions don't matter as much, so don't worry
484
+ # about doing chmod.
485
+ if Util::FileMode.from_octal(@default_private_key_path.stat.mode) != "600"
486
+ @logger.info("Changing permissions on private key to 0600")
487
+ @default_private_key_path.chmod(0600)
488
+ end
489
+ end
490
+ end
491
+
492
+ # Finds the Vagrantfile in the given directory.
493
+ #
494
+ # @param [Pathname] path Path to search in.
495
+ # @return [Pathname]
496
+ def find_vagrantfile(search_path)
497
+ @vagrantfile_name.each do |vagrantfile|
498
+ current_path = search_path.join(vagrantfile)
499
+ return current_path if current_path.exist?
500
+ end
501
+
502
+ nil
503
+ end
504
+
505
+ # Loads the Vagrant plugins by properly setting up RubyGems so that
506
+ # our private gem repository is on the path.
507
+ def load_plugins
508
+ # Add our private gem path to the gem path and reset the paths
509
+ # that Rubygems knows about.
510
+ ENV["GEM_PATH"] = "#{@gems_path}#{::File::PATH_SEPARATOR}#{ENV["GEM_PATH"]}"
511
+ ::Gem.clear_paths
512
+
513
+ # Load the plugins
514
+ Plugin.load!
515
+ end
516
+ end
517
+ end