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,48 @@
1
+ module Vagrant
2
+ module Action
3
+ module VM
4
+ class Import
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.actions.vm.import.importing", :name => env[:vm].box.name)
11
+
12
+ # Import the virtual machine
13
+ ovf_file = env[:vm].box.directory.join("box.ovf").to_s
14
+ env[:vm].uuid = env[:vm].driver.import(ovf_file) do |progress|
15
+ env[:ui].clear_line
16
+ env[:ui].report_progress(progress, 100, false)
17
+ end
18
+
19
+ # Clear the line one last time since the progress meter doesn't disappear
20
+ # immediately.
21
+ env[:ui].clear_line
22
+
23
+ # If we got interrupted, then the import could have been
24
+ # interrupted and its not a big deal. Just return out.
25
+ return if env[:interrupted]
26
+
27
+ # Flag as erroneous and return if import failed
28
+ raise Errors::VMImportFailure if !env[:vm].uuid
29
+
30
+ # Import completed successfully. Continue the chain
31
+ @app.call(env)
32
+ end
33
+
34
+ def recover(env)
35
+ if env[:vm].created?
36
+ return if env["vagrant.error"].is_a?(Errors::VagrantError)
37
+
38
+ # Interrupted, destroy the VM. We note that we don't want to
39
+ # validate the configuration here.
40
+ destroy_env = env.clone
41
+ destroy_env[:validate] = false
42
+ env[:action_runner].run(:destroy, destroy_env)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ module Vagrant
2
+ module Action
3
+ module VM
4
+ class MatchMACAddress
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ raise Errors::VMBaseMacNotSpecified if !env[:vm].config.vm.base_mac
11
+
12
+ # Create the proc which we want to use to modify the virtual machine
13
+ env[:ui].info I18n.t("vagrant.actions.vm.match_mac.matching")
14
+ env[:vm].driver.set_mac_address(env[:vm].config.vm.base_mac)
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,403 @@
1
+ require 'set'
2
+
3
+ require 'log4r'
4
+
5
+ require 'vagrant/util/network_ip'
6
+
7
+ module Vagrant
8
+ module Action
9
+ module VM
10
+ # This action handles all `config.vm.network` configurations by
11
+ # setting up the VM properly and enabling the networks afterword.
12
+ class Network
13
+ # Utilities to deal with network addresses
14
+ include Util::NetworkIP
15
+
16
+ def initialize(app, env)
17
+ @logger = Log4r::Logger.new("vagrant::action::vm::network")
18
+
19
+ @app = app
20
+ end
21
+
22
+ def call(env)
23
+ @env = env
24
+
25
+ # First we have to get the array of adapters that we need
26
+ # to create on the virtual machine itself, as well as the
27
+ # driver-agnostic network configurations for each.
28
+ @logger.debug("Determining adapters and networks...")
29
+ adapters = []
30
+ networks = []
31
+ env[:vm].config.vm.networks.each do |type, args|
32
+ # Get the normalized configuration we'll use around
33
+ config = send("#{type}_config", args)
34
+
35
+ # Get the virtualbox adapter configuration
36
+ adapter = send("#{type}_adapter", config)
37
+ adapters << adapter
38
+
39
+ # Get the network configuration
40
+ network = send("#{type}_network_config", config)
41
+ network[:_auto_config] = true if config[:auto_config]
42
+ networks << network
43
+ end
44
+
45
+ if !adapters.empty?
46
+ # Automatically assign an adapter number to any adapters
47
+ # that aren't explicitly set.
48
+ @logger.debug("Assigning adapter locations...")
49
+ assign_adapter_locations(adapters)
50
+
51
+ # Verify that our adapters are good just prior to enabling them.
52
+ verify_adapters(adapters)
53
+
54
+ # Create all the network interfaces
55
+ @logger.info("Enabling adapters...")
56
+ env[:ui].info I18n.t("vagrant.actions.vm.network.preparing")
57
+ env[:vm].driver.enable_adapters(adapters)
58
+ end
59
+
60
+ # Continue the middleware chain. We're done with our VM
61
+ # setup until after it is booted.
62
+ @app.call(env)
63
+
64
+ if !adapters.empty? && !networks.empty?
65
+ # Determine the interface numbers for the guest.
66
+ assign_interface_numbers(networks, adapters)
67
+
68
+ # Configure all the network interfaces on the guest. We only
69
+ # want to configure the networks that have `auto_config` setup.
70
+ networks_to_configure = networks.select { |n| n[:_auto_config] }
71
+ env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
72
+ env[:vm].guest.configure_networks(networks_to_configure)
73
+ end
74
+ end
75
+
76
+ # This method assigns the adapter to use for the adapter.
77
+ # e.g. it says that the first adapter is actually on the
78
+ # virtual machine's 2nd adapter location.
79
+ #
80
+ # It determines the adapter numbers by simply finding the
81
+ # "next available" in each case.
82
+ #
83
+ # The adapters are modified in place by adding an ":adapter"
84
+ # field to each.
85
+ def assign_adapter_locations(adapters)
86
+ available = Set.new(1..8)
87
+
88
+ # Determine which NICs are actually available.
89
+ interfaces = @env[:vm].driver.read_network_interfaces
90
+ interfaces.each do |number, nic|
91
+ # Remove the number from the available NICs if the
92
+ # NIC is in use.
93
+ available.delete(number) if nic[:type] != :none
94
+ end
95
+
96
+ # Based on the available set, assign in order to
97
+ # the adapters.
98
+ available = available.to_a.sort
99
+ @logger.debug("Available NICs: #{available.inspect}")
100
+ adapters.each do |adapter|
101
+ # Ignore the adapters that already have been assigned
102
+ if !adapter[:adapter]
103
+ # If we have no available adapters, then that is an exceptional
104
+ # event.
105
+ raise Errors::NetworkNoAdapters if available.empty?
106
+
107
+ # Otherwise, assign as the adapter the next available item
108
+ adapter[:adapter] = available.shift
109
+ end
110
+ end
111
+ end
112
+
113
+ # Verifies that the adapter configurations look good. This will
114
+ # raise an exception in the case that any errors occur.
115
+ def verify_adapters(adapters)
116
+ # Verify that there are no collisions in the adapters being used.
117
+ used = Set.new
118
+ adapters.each do |adapter|
119
+ raise Errors::NetworkAdapterCollision if used.include?(adapter[:adapter])
120
+ used.add(adapter[:adapter])
121
+ end
122
+ end
123
+
124
+ # Assigns the actual interface number of a network based on the
125
+ # enabled NICs on the virtual machine.
126
+ #
127
+ # This interface number is used by the guest to configure the
128
+ # NIC on the guest VM.
129
+ #
130
+ # The networks are modified in place by adding an ":interface"
131
+ # field to each.
132
+ def assign_interface_numbers(networks, adapters)
133
+ current = 0
134
+ adapter_to_interface = {}
135
+
136
+ # Make a first pass to assign interface numbers by adapter location
137
+ vm_adapters = @env[:vm].driver.read_network_interfaces
138
+ vm_adapters.sort.each do |number, adapter|
139
+ if adapter[:type] != :none
140
+ # Not used, so assign the interface number and increment
141
+ adapter_to_interface[number] = current
142
+ current += 1
143
+ end
144
+ end
145
+
146
+ # Make a pass through the adapters to assign the :interface
147
+ # key to each network configuration.
148
+ adapters.each_index do |i|
149
+ adapter = adapters[i]
150
+ network = networks[i]
151
+
152
+ # Figure out the interface number by simple lookup
153
+ network[:interface] = adapter_to_interface[adapter[:adapter]]
154
+ end
155
+ end
156
+
157
+ def hostonly_config(args)
158
+ ip = args[0]
159
+ options = args[1] || {}
160
+
161
+ # Determine if we're dealing with a static IP or a DHCP-served IP.
162
+ type = ip == :dhcp ? :dhcp : :static
163
+
164
+ # Default IP is in the 20-bit private network block for DHCP based networks
165
+ ip = "172.28.128.1" if type == :dhcp
166
+
167
+ options = {
168
+ :type => type,
169
+ :ip => ip,
170
+ :netmask => "255.255.255.0",
171
+ :adapter => nil,
172
+ :mac => nil,
173
+ :name => nil,
174
+ :auto_config => true
175
+ }.merge(options)
176
+
177
+ # Verify that this hostonly network wouldn't conflict with any
178
+ # bridged interfaces
179
+ verify_no_bridge_collision(options)
180
+
181
+ # Get the network address and IP parts which are used for many
182
+ # default calculations
183
+ netaddr = network_address(options[:ip], options[:netmask])
184
+ ip_parts = netaddr.split(".").map { |i| i.to_i }
185
+
186
+ # Calculate the adapter IP, which we assume is the IP ".1" at the
187
+ # end usually.
188
+ adapter_ip = ip_parts.dup
189
+ adapter_ip[3] += 1
190
+ options[:adapter_ip] ||= adapter_ip.join(".")
191
+
192
+ if type == :dhcp
193
+ # Calculate the DHCP server IP, which is the network address
194
+ # with the final octet + 2. So "172.28.0.0" turns into "172.28.0.2"
195
+ dhcp_ip = ip_parts.dup
196
+ dhcp_ip[3] += 2
197
+ options[:dhcp_ip] ||= dhcp_ip.join(".")
198
+
199
+ # Calculate the lower and upper bound for the DHCP server
200
+ dhcp_lower = ip_parts.dup
201
+ dhcp_lower[3] += 3
202
+ options[:dhcp_lower] ||= dhcp_lower.join(".")
203
+
204
+ dhcp_upper = ip_parts.dup
205
+ dhcp_upper[3] = 254
206
+ options[:dhcp_upper] ||= dhcp_upper.join(".")
207
+ end
208
+
209
+ # Return the hostonly network configuration
210
+ return options
211
+ end
212
+
213
+ def hostonly_adapter(config)
214
+ @logger.debug("Searching for matching network: #{config[:ip]}")
215
+ interface = find_matching_hostonly_network(config)
216
+
217
+ if !interface
218
+ @logger.debug("Network not found. Creating if we can.")
219
+
220
+ # It is an error case if a specific name was given but the network
221
+ # doesn't exist.
222
+ if config[:name]
223
+ raise Errors::NetworkNotFound, :name => config[:name]
224
+ end
225
+
226
+ # Otherwise, we create a new network and put the net network
227
+ # in the list of available networks so other network definitions
228
+ # can use it!
229
+ interface = create_hostonly_network(config)
230
+ @logger.debug("Created network: #{interface[:name]}")
231
+ end
232
+
233
+ if config[:type] == :dhcp
234
+ # Check that if there is a DHCP server attached on our interface,
235
+ # then it is identical. Otherwise, we can't set it.
236
+ if interface[:dhcp]
237
+ valid = interface[:dhcp][:ip] == config[:dhcp_ip] &&
238
+ interface[:dhcp][:lower] == config[:dhcp_lower] &&
239
+ interface[:dhcp][:upper] == config[:dhcp_upper]
240
+
241
+ raise Errors::NetworkDHCPAlreadyAttached if !valid
242
+
243
+ @logger.debug("DHCP server already properly configured")
244
+ else
245
+ # Configure the DHCP server for the network.
246
+ @logger.debug("Creating a DHCP server...")
247
+ @env[:vm].driver.create_dhcp_server(interface[:name], config)
248
+ end
249
+ end
250
+
251
+ return {
252
+ :adapter => config[:adapter],
253
+ :type => :hostonly,
254
+ :hostonly => interface[:name],
255
+ :mac_address => config[:mac],
256
+ :nic_type => config[:nic_type]
257
+ }
258
+ end
259
+
260
+ def hostonly_network_config(config)
261
+ return {
262
+ :type => config[:type],
263
+ :ip => config[:ip],
264
+ :netmask => config[:netmask]
265
+ }
266
+ end
267
+
268
+ # Creates a new hostonly network that matches the network requested
269
+ # by the given host-only network configuration.
270
+ def create_hostonly_network(config)
271
+ # Create the options that are going to be used to create our
272
+ # new network.
273
+ options = config.dup
274
+ options[:ip] = options[:adapter_ip]
275
+
276
+ @env[:vm].driver.create_host_only_network(options)
277
+ end
278
+
279
+ # Finds a host only network that matches our configuration on VirtualBox.
280
+ # This will return nil if a matching network does not exist.
281
+ def find_matching_hostonly_network(config)
282
+ this_netaddr = network_address(config[:ip], config[:netmask])
283
+
284
+ @env[:vm].driver.read_host_only_interfaces.each do |interface|
285
+ if config[:name] && config[:name] == interface[:name]
286
+ return interface
287
+ elsif this_netaddr == network_address(interface[:ip], interface[:netmask])
288
+ return interface
289
+ end
290
+ end
291
+
292
+ nil
293
+ end
294
+
295
+ # Verifies that a host-only network subnet would not collide with
296
+ # a bridged networking interface.
297
+ #
298
+ # If the subnets overlap in any way then the host only network
299
+ # will not work because the routing tables will force the traffic
300
+ # onto the real interface rather than the virtualbox interface.
301
+ def verify_no_bridge_collision(options)
302
+ this_netaddr = network_address(options[:ip], options[:netmask])
303
+
304
+ @env[:vm].driver.read_bridged_interfaces.each do |interface|
305
+ that_netaddr = network_address(interface[:ip], interface[:netmask])
306
+ raise Errors::NetworkCollision if this_netaddr == that_netaddr && interface[:status] != "Down"
307
+ end
308
+ end
309
+
310
+ def bridged_config(args)
311
+ options = args[0] || {}
312
+ options = {} if !options.is_a?(Hash)
313
+
314
+ return {
315
+ :adapter => nil,
316
+ :mac => nil,
317
+ :bridge => nil,
318
+ :auto_config => true
319
+ }.merge(options)
320
+ end
321
+
322
+ def bridged_adapter(config)
323
+ # Find the bridged interfaces that are available
324
+ bridgedifs = @env[:vm].driver.read_bridged_interfaces
325
+ bridgedifs.delete_if { |interface| interface[:status] == "Down" }
326
+
327
+ # The name of the chosen bridge interface will be assigned to this
328
+ # variable.
329
+ chosen_bridge = nil
330
+
331
+ if config[:bridge]
332
+ @logger.debug("Bridge was directly specified in config, searching for: #{config[:bridge]}")
333
+
334
+ # Search for a matching bridged interface
335
+ bridgedifs.each do |interface|
336
+ if interface[:name].downcase == config[:bridge].downcase
337
+ @logger.debug("Specific bridge found as configured in the Vagrantfile. Using it.")
338
+ chosen_bridge = interface[:name]
339
+ break
340
+ end
341
+ end
342
+
343
+ # If one wasn't found, then we notify the user here.
344
+ if !chosen_bridge
345
+ @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.specific_not_found",
346
+ :bridge => config[:bridge])
347
+ end
348
+ end
349
+
350
+ # If we still don't have a bridge chosen (this means that one wasn't
351
+ # specified in the Vagrantfile, or the bridge specified in the Vagrantfile
352
+ # wasn't found), then we fall back to the normal means of searchign for a
353
+ # bridged network.
354
+ if !chosen_bridge
355
+ if bridgedifs.length == 1
356
+ # One bridgable interface? Just use it.
357
+ chosen_bridge = bridgedifs[0][:name]
358
+ @logger.debug("Only one bridged interface available. Using it by default.")
359
+ else
360
+ # More than one bridgable interface requires a user decision, so
361
+ # show options to choose from.
362
+ @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.available",
363
+ :prefix => false)
364
+ bridgedifs.each_index do |index|
365
+ interface = bridgedifs[index]
366
+ @env[:ui].info("#{index + 1}) #{interface[:name]}", :prefix => false)
367
+ end
368
+
369
+ # The range of valid choices
370
+ valid = Range.new(1, bridgedifs.length)
371
+
372
+ # The choice that the user has chosen as the bridging interface
373
+ choice = nil
374
+ while !valid.include?(choice)
375
+ choice = @env[:ui].ask("What interface should the network bridge to? ")
376
+ choice = choice.to_i
377
+ end
378
+
379
+ chosen_bridge = bridgedifs[choice - 1][:name]
380
+ end
381
+ end
382
+
383
+ @logger.info("Bridging adapter #{config[:adapter]} to #{chosen_bridge}")
384
+
385
+ # Given the choice we can now define the adapter we're using
386
+ return {
387
+ :adapter => config[:adapter],
388
+ :type => :bridged,
389
+ :bridge => chosen_bridge,
390
+ :mac_address => config[:mac],
391
+ :nic_type => config[:nic_type],
392
+ }
393
+ end
394
+
395
+ def bridged_network_config(config)
396
+ return {
397
+ :type => :dhcp
398
+ }
399
+ end
400
+ end
401
+ end
402
+ end
403
+ end