tnargav 1.2.2

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 (452) hide show
  1. data/.gitignore +31 -0
  2. data/.gitsetup.yml +5 -0
  3. data/.travis.yml +7 -0
  4. data/.yardopts +1 -0
  5. data/CHANGELOG.md +1067 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +21 -0
  8. data/README.md +89 -0
  9. data/Rakefile +18 -0
  10. data/bin/vagrant +106 -0
  11. data/config/default.rb +36 -0
  12. data/contrib/README.md +12 -0
  13. data/contrib/bash/completion.sh +3 -0
  14. data/contrib/emacs/vagrant.el +8 -0
  15. data/contrib/vim/vagrantfile.vim +9 -0
  16. data/keys/README.md +17 -0
  17. data/keys/vagrant +27 -0
  18. data/keys/vagrant.pub +1 -0
  19. data/lib/vagrant/action/builder.rb +174 -0
  20. data/lib/vagrant/action/builtin/box_add.rb +81 -0
  21. data/lib/vagrant/action/builtin/call.rb +67 -0
  22. data/lib/vagrant/action/builtin/config_validate.rb +30 -0
  23. data/lib/vagrant/action/builtin/confirm.rb +38 -0
  24. data/lib/vagrant/action/builtin/destroy_confirm.rb +21 -0
  25. data/lib/vagrant/action/builtin/env_set.rb +24 -0
  26. data/lib/vagrant/action/builtin/graceful_halt.rb +73 -0
  27. data/lib/vagrant/action/builtin/handle_box_url.rb +77 -0
  28. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +134 -0
  29. data/lib/vagrant/action/builtin/lock.rb +57 -0
  30. data/lib/vagrant/action/builtin/nfs.rb +118 -0
  31. data/lib/vagrant/action/builtin/provision.rb +70 -0
  32. data/lib/vagrant/action/builtin/set_hostname.rb +27 -0
  33. data/lib/vagrant/action/builtin/ssh_exec.rb +42 -0
  34. data/lib/vagrant/action/builtin/ssh_run.rb +43 -0
  35. data/lib/vagrant/action/general/package.rb +103 -0
  36. data/lib/vagrant/action/hook.rb +107 -0
  37. data/lib/vagrant/action/runner.rb +69 -0
  38. data/lib/vagrant/action/warden.rb +103 -0
  39. data/lib/vagrant/action.rb +43 -0
  40. data/lib/vagrant/batch_action.rb +113 -0
  41. data/lib/vagrant/box.rb +97 -0
  42. data/lib/vagrant/box_collection.rb +375 -0
  43. data/lib/vagrant/cli.rb +82 -0
  44. data/lib/vagrant/config/loader.rb +222 -0
  45. data/lib/vagrant/config/v1/dummy_config.rb +13 -0
  46. data/lib/vagrant/config/v1/loader.rb +105 -0
  47. data/lib/vagrant/config/v1/root.rb +60 -0
  48. data/lib/vagrant/config/v1.rb +9 -0
  49. data/lib/vagrant/config/v2/dummy_config.rb +13 -0
  50. data/lib/vagrant/config/v2/loader.rb +141 -0
  51. data/lib/vagrant/config/v2/root.rb +105 -0
  52. data/lib/vagrant/config/v2/util.rb +21 -0
  53. data/lib/vagrant/config/v2.rb +9 -0
  54. data/lib/vagrant/config/version_base.rb +80 -0
  55. data/lib/vagrant/config.rb +61 -0
  56. data/lib/vagrant/environment.rb +843 -0
  57. data/lib/vagrant/errors.rb +570 -0
  58. data/lib/vagrant/guest.rb +163 -0
  59. data/lib/vagrant/hosts.rb +28 -0
  60. data/lib/vagrant/machine.rb +325 -0
  61. data/lib/vagrant/machine_state.rb +45 -0
  62. data/lib/vagrant/plugin/v1/command.rb +169 -0
  63. data/lib/vagrant/plugin/v1/communicator.rb +98 -0
  64. data/lib/vagrant/plugin/v1/config.rb +112 -0
  65. data/lib/vagrant/plugin/v1/errors.rb +15 -0
  66. data/lib/vagrant/plugin/v1/guest.rb +92 -0
  67. data/lib/vagrant/plugin/v1/host.rb +66 -0
  68. data/lib/vagrant/plugin/v1/manager.rb +131 -0
  69. data/lib/vagrant/plugin/v1/plugin.rb +229 -0
  70. data/lib/vagrant/plugin/v1/provider.rb +68 -0
  71. data/lib/vagrant/plugin/v1/provisioner.rb +50 -0
  72. data/lib/vagrant/plugin/v1.rb +19 -0
  73. data/lib/vagrant/plugin/v2/command.rb +234 -0
  74. data/lib/vagrant/plugin/v2/communicator.rb +98 -0
  75. data/lib/vagrant/plugin/v2/components.rb +47 -0
  76. data/lib/vagrant/plugin/v2/config.rb +136 -0
  77. data/lib/vagrant/plugin/v2/errors.rb +15 -0
  78. data/lib/vagrant/plugin/v2/guest.rb +78 -0
  79. data/lib/vagrant/plugin/v2/host.rb +66 -0
  80. data/lib/vagrant/plugin/v2/manager.rb +173 -0
  81. data/lib/vagrant/plugin/v2/plugin.rb +226 -0
  82. data/lib/vagrant/plugin/v2/provider.rb +69 -0
  83. data/lib/vagrant/plugin/v2/provisioner.rb +47 -0
  84. data/lib/vagrant/plugin/v2.rb +22 -0
  85. data/lib/vagrant/plugin.rb +6 -0
  86. data/lib/vagrant/registry.rb +78 -0
  87. data/lib/vagrant/ui.rb +215 -0
  88. data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
  89. data/lib/vagrant/util/busy.rb +59 -0
  90. data/lib/vagrant/util/counter.rb +24 -0
  91. data/lib/vagrant/util/downloader.rb +146 -0
  92. data/lib/vagrant/util/file_checksum.rb +38 -0
  93. data/lib/vagrant/util/file_mode.rb +12 -0
  94. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  95. data/lib/vagrant/util/is_port_open.rb +38 -0
  96. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  97. data/lib/vagrant/util/network_ip.rb +28 -0
  98. data/lib/vagrant/util/platform.rb +58 -0
  99. data/lib/vagrant/util/retryable.rb +31 -0
  100. data/lib/vagrant/util/safe_chdir.rb +33 -0
  101. data/lib/vagrant/util/safe_exec.rb +36 -0
  102. data/lib/vagrant/util/safe_puts.rb +31 -0
  103. data/lib/vagrant/util/scoped_hash_override.rb +45 -0
  104. data/lib/vagrant/util/ssh.rb +150 -0
  105. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  106. data/lib/vagrant/util/string_block_editor.rb +77 -0
  107. data/lib/vagrant/util/subprocess.rb +273 -0
  108. data/lib/vagrant/util/template_renderer.rb +83 -0
  109. data/lib/vagrant/util/which.rb +43 -0
  110. data/lib/vagrant/util.rb +12 -0
  111. data/lib/vagrant/version.rb +6 -0
  112. data/lib/vagrant.rb +258 -0
  113. data/plugins/README.md +5 -0
  114. data/plugins/commands/box/command/add.rb +51 -0
  115. data/plugins/commands/box/command/list.rb +41 -0
  116. data/plugins/commands/box/command/remove.rb +37 -0
  117. data/plugins/commands/box/command/repackage.rb +43 -0
  118. data/plugins/commands/box/command/root.rb +75 -0
  119. data/plugins/commands/box/plugin.rb +15 -0
  120. data/plugins/commands/destroy/command.rb +31 -0
  121. data/plugins/commands/destroy/plugin.rb +18 -0
  122. data/plugins/commands/halt/command.rb +33 -0
  123. data/plugins/commands/halt/plugin.rb +18 -0
  124. data/plugins/commands/init/command.rb +40 -0
  125. data/plugins/commands/init/plugin.rb +18 -0
  126. data/plugins/commands/package/command.rb +83 -0
  127. data/plugins/commands/package/plugin.rb +18 -0
  128. data/plugins/commands/plugin/action/bundler_check.rb +25 -0
  129. data/plugins/commands/plugin/action/install_gem.rb +81 -0
  130. data/plugins/commands/plugin/action/license_plugin.rb +54 -0
  131. data/plugins/commands/plugin/action/list_plugins.rb +54 -0
  132. data/plugins/commands/plugin/action/prune_gems.rb +149 -0
  133. data/plugins/commands/plugin/action/uninstall_plugin.rb +23 -0
  134. data/plugins/commands/plugin/action.rb +52 -0
  135. data/plugins/commands/plugin/command/base.rb +22 -0
  136. data/plugins/commands/plugin/command/install.rb +58 -0
  137. data/plugins/commands/plugin/command/license.rb +31 -0
  138. data/plugins/commands/plugin/command/list.rb +28 -0
  139. data/plugins/commands/plugin/command/root.rb +75 -0
  140. data/plugins/commands/plugin/command/uninstall.rb +28 -0
  141. data/plugins/commands/plugin/gem_helper.rb +74 -0
  142. data/plugins/commands/plugin/plugin.rb +22 -0
  143. data/plugins/commands/plugin/state_file.rb +57 -0
  144. data/plugins/commands/provision/command.rb +34 -0
  145. data/plugins/commands/provision/plugin.rb +18 -0
  146. data/plugins/commands/reload/command.rb +37 -0
  147. data/plugins/commands/reload/plugin.rb +18 -0
  148. data/plugins/commands/resume/command.rb +25 -0
  149. data/plugins/commands/resume/plugin.rb +17 -0
  150. data/plugins/commands/ssh/command.rb +63 -0
  151. data/plugins/commands/ssh/plugin.rb +17 -0
  152. data/plugins/commands/ssh_config/command.rb +49 -0
  153. data/plugins/commands/ssh_config/plugin.rb +18 -0
  154. data/plugins/commands/status/command.rb +39 -0
  155. data/plugins/commands/status/plugin.rb +18 -0
  156. data/plugins/commands/suspend/command.rb +25 -0
  157. data/plugins/commands/suspend/plugin.rb +18 -0
  158. data/plugins/commands/up/command.rb +57 -0
  159. data/plugins/commands/up/plugin.rb +17 -0
  160. data/plugins/commands/up/start_mixins.rb +26 -0
  161. data/plugins/communicators/ssh/communicator.rb +342 -0
  162. data/plugins/communicators/ssh/plugin.rb +19 -0
  163. data/plugins/guests/arch/cap/change_host_name.rb +18 -0
  164. data/plugins/guests/arch/cap/configure_networks.rb +23 -0
  165. data/plugins/guests/arch/guest.rb +11 -0
  166. data/plugins/guests/arch/plugin.rb +25 -0
  167. data/plugins/guests/debian/cap/change_host_name.rb +18 -0
  168. data/plugins/guests/debian/cap/configure_networks.rb +61 -0
  169. data/plugins/guests/debian/guest.rb +9 -0
  170. data/plugins/guests/debian/plugin.rb +25 -0
  171. data/plugins/guests/fedora/cap/configure_networks.rb +59 -0
  172. data/plugins/guests/fedora/cap/network_scripts_dir.rb +15 -0
  173. data/plugins/guests/fedora/guest.rb +11 -0
  174. data/plugins/guests/fedora/plugin.rb +25 -0
  175. data/plugins/guests/freebsd/cap/change_host_name.rb +14 -0
  176. data/plugins/guests/freebsd/cap/configure_networks.rb +39 -0
  177. data/plugins/guests/freebsd/cap/halt.rb +16 -0
  178. data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +14 -0
  179. data/plugins/guests/freebsd/guest.rb +14 -0
  180. data/plugins/guests/freebsd/plugin.rb +35 -0
  181. data/plugins/guests/gentoo/cap/change_host_name.rb +17 -0
  182. data/plugins/guests/gentoo/cap/configure_networks.rb +43 -0
  183. data/plugins/guests/gentoo/guest.rb +9 -0
  184. data/plugins/guests/gentoo/plugin.rb +25 -0
  185. data/plugins/guests/linux/cap/halt.rb +16 -0
  186. data/plugins/guests/linux/cap/mount_nfs.rb +30 -0
  187. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +40 -0
  188. data/plugins/guests/linux/cap/read_ip_address.rb +17 -0
  189. data/plugins/guests/linux/cap/shell_expand_guest_path.rb +26 -0
  190. data/plugins/guests/linux/guest.rb +11 -0
  191. data/plugins/guests/linux/plugin.rb +40 -0
  192. data/plugins/guests/openbsd/cap/halt.rb +16 -0
  193. data/plugins/guests/openbsd/guest.rb +11 -0
  194. data/plugins/guests/openbsd/plugin.rb +20 -0
  195. data/plugins/guests/pld/cap/network_scripts_dir.rb +11 -0
  196. data/plugins/guests/pld/guest.rb +11 -0
  197. data/plugins/guests/pld/plugin.rb +20 -0
  198. data/plugins/guests/redhat/cap/change_host_name.rb +18 -0
  199. data/plugins/guests/redhat/cap/configure_networks.rb +60 -0
  200. data/plugins/guests/redhat/cap/network_scripts_dir.rb +11 -0
  201. data/plugins/guests/redhat/guest.rb +11 -0
  202. data/plugins/guests/redhat/plugin.rb +30 -0
  203. data/plugins/guests/solaris/cap/change_host_name.rb +17 -0
  204. data/plugins/guests/solaris/cap/configure_networks.rb +25 -0
  205. data/plugins/guests/solaris/cap/halt.rb +21 -0
  206. data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +28 -0
  207. data/plugins/guests/solaris/config.rb +18 -0
  208. data/plugins/guests/solaris/guest.rb +14 -0
  209. data/plugins/guests/solaris/plugin.rb +40 -0
  210. data/plugins/guests/suse/cap/change_host_name.rb +18 -0
  211. data/plugins/guests/suse/cap/network_scripts_dir.rb +11 -0
  212. data/plugins/guests/suse/guest.rb +11 -0
  213. data/plugins/guests/suse/plugin.rb +25 -0
  214. data/plugins/guests/ubuntu/cap/change_host_name.rb +23 -0
  215. data/plugins/guests/ubuntu/guest.rb +32 -0
  216. data/plugins/guests/ubuntu/plugin.rb +20 -0
  217. data/plugins/hosts/arch/host.rb +68 -0
  218. data/plugins/hosts/arch/plugin.rb +15 -0
  219. data/plugins/hosts/bsd/host.rb +102 -0
  220. data/plugins/hosts/bsd/plugin.rb +15 -0
  221. data/plugins/hosts/fedora/host.rb +51 -0
  222. data/plugins/hosts/fedora/plugin.rb +15 -0
  223. data/plugins/hosts/freebsd/host.rb +43 -0
  224. data/plugins/hosts/freebsd/plugin.rb +15 -0
  225. data/plugins/hosts/gentoo/host.rb +24 -0
  226. data/plugins/hosts/gentoo/plugin.rb +15 -0
  227. data/plugins/hosts/linux/host.rb +95 -0
  228. data/plugins/hosts/linux/plugin.rb +15 -0
  229. data/plugins/hosts/opensuse/host.rb +34 -0
  230. data/plugins/hosts/opensuse/plugin.rb +15 -0
  231. data/plugins/hosts/windows/host.rb +17 -0
  232. data/plugins/hosts/windows/plugin.rb +15 -0
  233. data/plugins/kernel_v1/config/nfs.rb +20 -0
  234. data/plugins/kernel_v1/config/package.rb +17 -0
  235. data/plugins/kernel_v1/config/ssh.rb +46 -0
  236. data/plugins/kernel_v1/config/vagrant.rb +31 -0
  237. data/plugins/kernel_v1/config/vm.rb +184 -0
  238. data/plugins/kernel_v1/plugin.rb +44 -0
  239. data/plugins/kernel_v2/config/nfs.rb +14 -0
  240. data/plugins/kernel_v2/config/package.rb +13 -0
  241. data/plugins/kernel_v2/config/ssh.rb +76 -0
  242. data/plugins/kernel_v2/config/ssh_connect.rb +40 -0
  243. data/plugins/kernel_v2/config/vagrant.rb +13 -0
  244. data/plugins/kernel_v2/config/vm.rb +416 -0
  245. data/plugins/kernel_v2/config/vm_provisioner.rb +55 -0
  246. data/plugins/kernel_v2/config/vm_subvm.rb +30 -0
  247. data/plugins/kernel_v2/plugin.rb +44 -0
  248. data/plugins/providers/virtualbox/action/boot.rb +49 -0
  249. data/plugins/providers/virtualbox/action/check_accessible.rb +23 -0
  250. data/plugins/providers/virtualbox/action/check_created.rb +21 -0
  251. data/plugins/providers/virtualbox/action/check_guest_additions.rb +45 -0
  252. data/plugins/providers/virtualbox/action/check_running.rb +21 -0
  253. data/plugins/providers/virtualbox/action/check_virtualbox.rb +22 -0
  254. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +43 -0
  255. data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +18 -0
  256. data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +31 -0
  257. data/plugins/providers/virtualbox/action/clear_shared_folders.rb +17 -0
  258. data/plugins/providers/virtualbox/action/created.rb +20 -0
  259. data/plugins/providers/virtualbox/action/customize.rb +36 -0
  260. data/plugins/providers/virtualbox/action/destroy.rb +19 -0
  261. data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +16 -0
  262. data/plugins/providers/virtualbox/action/discard_state.rb +20 -0
  263. data/plugins/providers/virtualbox/action/export.rb +57 -0
  264. data/plugins/providers/virtualbox/action/forced_halt.rb +25 -0
  265. data/plugins/providers/virtualbox/action/forward_ports.rb +87 -0
  266. data/plugins/providers/virtualbox/action/import.rb +51 -0
  267. data/plugins/providers/virtualbox/action/is_paused.rb +20 -0
  268. data/plugins/providers/virtualbox/action/is_running.rb +20 -0
  269. data/plugins/providers/virtualbox/action/is_saved.rb +20 -0
  270. data/plugins/providers/virtualbox/action/match_mac_address.rb +21 -0
  271. data/plugins/providers/virtualbox/action/message_already_running.rb +16 -0
  272. data/plugins/providers/virtualbox/action/message_not_created.rb +16 -0
  273. data/plugins/providers/virtualbox/action/message_not_running.rb +16 -0
  274. data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +17 -0
  275. data/plugins/providers/virtualbox/action/network.rb +410 -0
  276. data/plugins/providers/virtualbox/action/package.rb +20 -0
  277. data/plugins/providers/virtualbox/action/package_vagrantfile.rb +33 -0
  278. data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +35 -0
  279. data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +64 -0
  280. data/plugins/providers/virtualbox/action/prune_nfs_exports.rb +20 -0
  281. data/plugins/providers/virtualbox/action/resume.rb +25 -0
  282. data/plugins/providers/virtualbox/action/sane_defaults.rb +91 -0
  283. data/plugins/providers/virtualbox/action/set_name.rb +40 -0
  284. data/plugins/providers/virtualbox/action/setup_package_files.rb +51 -0
  285. data/plugins/providers/virtualbox/action/share_folders.rb +128 -0
  286. data/plugins/providers/virtualbox/action/suspend.rb +20 -0
  287. data/plugins/providers/virtualbox/action.rb +311 -0
  288. data/plugins/providers/virtualbox/config.rb +86 -0
  289. data/plugins/providers/virtualbox/driver/base.rb +360 -0
  290. data/plugins/providers/virtualbox/driver/meta.rb +142 -0
  291. data/plugins/providers/virtualbox/driver/version_4_0.rb +485 -0
  292. data/plugins/providers/virtualbox/driver/version_4_1.rb +485 -0
  293. data/plugins/providers/virtualbox/driver/version_4_2.rb +482 -0
  294. data/plugins/providers/virtualbox/model/forwarded_port.rb +58 -0
  295. data/plugins/providers/virtualbox/plugin.rb +42 -0
  296. data/plugins/providers/virtualbox/provider.rb +92 -0
  297. data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +31 -0
  298. data/plugins/provisioners/ansible/config.rb +72 -0
  299. data/plugins/provisioners/ansible/plugin.rb +23 -0
  300. data/plugins/provisioners/ansible/provisioner.rb +45 -0
  301. data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +19 -0
  302. data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +14 -0
  303. data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +34 -0
  304. data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +24 -0
  305. data/plugins/provisioners/cfengine/config.rb +120 -0
  306. data/plugins/provisioners/cfengine/plugin.rb +42 -0
  307. data/plugins/provisioners/cfengine/provisioner.rb +136 -0
  308. data/plugins/provisioners/chef/config/base.rb +85 -0
  309. data/plugins/provisioners/chef/config/chef_client.rb +57 -0
  310. data/plugins/provisioners/chef/config/chef_solo.rb +87 -0
  311. data/plugins/provisioners/chef/plugin.rb +33 -0
  312. data/plugins/provisioners/chef/provisioner/base.rb +93 -0
  313. data/plugins/provisioners/chef/provisioner/chef_client.rb +107 -0
  314. data/plugins/provisioners/chef/provisioner/chef_solo.rb +192 -0
  315. data/plugins/provisioners/puppet/config/puppet.rb +70 -0
  316. data/plugins/provisioners/puppet/config/puppet_server.rb +16 -0
  317. data/plugins/provisioners/puppet/plugin.rb +33 -0
  318. data/plugins/provisioners/puppet/provisioner/puppet.rb +117 -0
  319. data/plugins/provisioners/puppet/provisioner/puppet_server.rb +67 -0
  320. data/plugins/provisioners/shell/config.rb +56 -0
  321. data/plugins/provisioners/shell/plugin.rb +23 -0
  322. data/plugins/provisioners/shell/provisioner.rb +86 -0
  323. data/tasks/acceptance.rake +113 -0
  324. data/tasks/bundler.rake +3 -0
  325. data/tasks/test.rake +20 -0
  326. data/templates/commands/init/Vagrantfile.erb +111 -0
  327. data/templates/commands/ssh_config/config.erb +16 -0
  328. data/templates/config/messages.erb +14 -0
  329. data/templates/config/validation_failed.erb +7 -0
  330. data/templates/guests/arch/network_dhcp.erb +4 -0
  331. data/templates/guests/arch/network_static.erb +6 -0
  332. data/templates/guests/debian/network_dhcp.erb +11 -0
  333. data/templates/guests/debian/network_static.erb +7 -0
  334. data/templates/guests/fedora/network_dhcp.erb +6 -0
  335. data/templates/guests/fedora/network_static.erb +13 -0
  336. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  337. data/templates/guests/freebsd/network_static.erb +3 -0
  338. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  339. data/templates/guests/gentoo/network_static.erb +4 -0
  340. data/templates/guests/redhat/network_dhcp.erb +6 -0
  341. data/templates/guests/redhat/network_static.erb +8 -0
  342. data/templates/locales/en.yml +1126 -0
  343. data/templates/nfs/exports.erb +5 -0
  344. data/templates/nfs/exports_freebsd.erb +5 -0
  345. data/templates/nfs/exports_linux.erb +5 -0
  346. data/templates/package_Vagrantfile.erb +11 -0
  347. data/templates/provisioners/chef_client/client.erb +32 -0
  348. data/templates/provisioners/chef_solo/solo.erb +25 -0
  349. data/templates/rgloader.rb +9 -0
  350. data/test/acceptance/base.rb +48 -0
  351. data/test/acceptance/box_test.rb +99 -0
  352. data/test/acceptance/destroy_test.rb +37 -0
  353. data/test/acceptance/halt_test.rb +72 -0
  354. data/test/acceptance/init_test.rb +33 -0
  355. data/test/acceptance/networking/host_only_test.rb +37 -0
  356. data/test/acceptance/networking/port_forward_test.rb +125 -0
  357. data/test/acceptance/package_test.rb +46 -0
  358. data/test/acceptance/provisioning/basic_test.rb +61 -0
  359. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  360. data/test/acceptance/provisioning/shell_test.rb +53 -0
  361. data/test/acceptance/resume_test.rb +17 -0
  362. data/test/acceptance/shared_folders_test.rb +84 -0
  363. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  364. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  365. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  366. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  367. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  368. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  369. data/test/acceptance/ssh_test.rb +46 -0
  370. data/test/acceptance/support/config.rb +42 -0
  371. data/test/acceptance/support/isolated_environment.rb +118 -0
  372. data/test/acceptance/support/matchers/have_color.rb +9 -0
  373. data/test/acceptance/support/matchers/match_output.rb +14 -0
  374. data/test/acceptance/support/matchers/succeed.rb +14 -0
  375. data/test/acceptance/support/network_tests.rb +29 -0
  376. data/test/acceptance/support/output.rb +95 -0
  377. data/test/acceptance/support/shared/base_context.rb +72 -0
  378. data/test/acceptance/support/shared/command_examples.rb +33 -0
  379. data/test/acceptance/support/virtualbox.rb +36 -0
  380. data/test/acceptance/suspend_test.rb +56 -0
  381. data/test/acceptance/up_basic_test.rb +33 -0
  382. data/test/acceptance/up_with_box_url.rb +40 -0
  383. data/test/acceptance/vagrant_test.rb +47 -0
  384. data/test/acceptance/version_test.rb +15 -0
  385. data/test/config/acceptance_boxes.yml +7 -0
  386. data/test/support/isolated_environment.rb +46 -0
  387. data/test/support/tempdir.rb +43 -0
  388. data/test/unit/base.rb +27 -0
  389. data/test/unit/support/dummy_provider.rb +16 -0
  390. data/test/unit/support/isolated_environment.rb +179 -0
  391. data/test/unit/support/shared/base_context.rb +104 -0
  392. data/test/unit/vagrant/action/builder_test.rb +242 -0
  393. data/test/unit/vagrant/action/builtin/call_test.rb +145 -0
  394. data/test/unit/vagrant/action/builtin/confirm_test.rb +36 -0
  395. data/test/unit/vagrant/action/builtin/env_set_test.rb +20 -0
  396. data/test/unit/vagrant/action/builtin/graceful_halt_test.rb +61 -0
  397. data/test/unit/vagrant/action/builtin/lock_test.rb +98 -0
  398. data/test/unit/vagrant/action/builtin/ssh_exec_test.rb +57 -0
  399. data/test/unit/vagrant/action/hook_test.rb +120 -0
  400. data/test/unit/vagrant/action/runner_test.rb +71 -0
  401. data/test/unit/vagrant/action/warden_test.rb +92 -0
  402. data/test/unit/vagrant/batch_action_test.rb +36 -0
  403. data/test/unit/vagrant/box_collection_test.rb +237 -0
  404. data/test/unit/vagrant/box_test.rb +122 -0
  405. data/test/unit/vagrant/cli_test.rb +27 -0
  406. data/test/unit/vagrant/config/loader_test.rb +184 -0
  407. data/test/unit/vagrant/config/v1/dummy_config_test.rb +24 -0
  408. data/test/unit/vagrant/config/v1/loader_test.rb +145 -0
  409. data/test/unit/vagrant/config/v1/root_test.rb +40 -0
  410. data/test/unit/vagrant/config/v2/dummy_config_test.rb +24 -0
  411. data/test/unit/vagrant/config/v2/loader_test.rb +151 -0
  412. data/test/unit/vagrant/config/v2/root_test.rb +97 -0
  413. data/test/unit/vagrant/config/v2/util_test.rb +21 -0
  414. data/test/unit/vagrant/config_test.rb +66 -0
  415. data/test/unit/vagrant/environment_test.rb +721 -0
  416. data/test/unit/vagrant/guest_test.rb +166 -0
  417. data/test/unit/vagrant/hosts_test.rb +37 -0
  418. data/test/unit/vagrant/machine_state_test.rb +26 -0
  419. data/test/unit/vagrant/machine_test.rb +384 -0
  420. data/test/unit/vagrant/plugin/v1/command_test.rb +143 -0
  421. data/test/unit/vagrant/plugin/v1/communicator_test.rb +9 -0
  422. data/test/unit/vagrant/plugin/v1/config_test.rb +50 -0
  423. data/test/unit/vagrant/plugin/v1/host_test.rb +5 -0
  424. data/test/unit/vagrant/plugin/v1/manager_test.rb +114 -0
  425. data/test/unit/vagrant/plugin/v1/plugin_test.rb +267 -0
  426. data/test/unit/vagrant/plugin/v1/provider_test.rb +18 -0
  427. data/test/unit/vagrant/plugin/v2/command_test.rb +238 -0
  428. data/test/unit/vagrant/plugin/v2/communicator_test.rb +9 -0
  429. data/test/unit/vagrant/plugin/v2/components_test.rb +17 -0
  430. data/test/unit/vagrant/plugin/v2/config_test.rb +60 -0
  431. data/test/unit/vagrant/plugin/v2/host_test.rb +5 -0
  432. data/test/unit/vagrant/plugin/v2/manager_test.rb +174 -0
  433. data/test/unit/vagrant/plugin/v2/plugin_test.rb +305 -0
  434. data/test/unit/vagrant/plugin/v2/provider_test.rb +18 -0
  435. data/test/unit/vagrant/registry_test.rb +128 -0
  436. data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
  437. data/test/unit/vagrant/util/downloader_test.rb +57 -0
  438. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  439. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
  440. data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
  441. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  442. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  443. data/test/unit/vagrant/util/retryable_test.rb +106 -0
  444. data/test/unit/vagrant/util/safe_chdir_test.rb +43 -0
  445. data/test/unit/vagrant/util/scoped_hash_override_test.rb +48 -0
  446. data/test/unit/vagrant/util/ssh_test.rb +30 -0
  447. data/test/unit/vagrant/util/string_block_editor_test.rb +106 -0
  448. data/test/unit/vagrant/util/which_test.rb +43 -0
  449. data/test/unit/vagrant_test.rb +56 -0
  450. data/tnargav.gemspec +69 -0
  451. data/vagrant.gemspec +69 -0
  452. metadata +730 -0
@@ -0,0 +1,226 @@
1
+ require "set"
2
+
3
+ require "log4r"
4
+
5
+ require "vagrant/plugin/v2/components"
6
+
7
+ module Vagrant
8
+ module Plugin
9
+ module V2
10
+ # This is the superclass for all V2 plugins.
11
+ class Plugin
12
+ # Special marker that can be used for action hooks that matches
13
+ # all action sequences.
14
+ ALL_ACTIONS = :__all_actions__
15
+
16
+ # The logger for this class.
17
+ LOGGER = Log4r::Logger.new("vagrant::plugin::v2::plugin")
18
+
19
+ # Set the root class up to be ourself, so that we can reference this
20
+ # from within methods which are probably in subclasses.
21
+ ROOT_CLASS = self
22
+
23
+ # This returns the manager for all V2 plugins.
24
+ #
25
+ # @return [V2::Manager]
26
+ def self.manager
27
+ @manager ||= Manager.new
28
+ end
29
+
30
+ # Returns the {Components} for this plugin.
31
+ #
32
+ # @return [Components]
33
+ def self.components
34
+ @components ||= Components.new
35
+ end
36
+
37
+ # Set the name of the plugin. The moment that this is called, the
38
+ # plugin will be registered and available. Before this is called, a
39
+ # plugin does not exist. The name must be unique among all installed
40
+ # plugins.
41
+ #
42
+ # @param [String] name Name of the plugin.
43
+ # @return [String] The name of the plugin.
44
+ def self.name(name=UNSET_VALUE)
45
+ # Get or set the value first, so we have a name for logging when
46
+ # we register.
47
+ result = get_or_set(:name, name)
48
+
49
+ # The plugin should be registered if we're setting a real name on it
50
+ Plugin.manager.register(self) if name != UNSET_VALUE
51
+
52
+ # Return the result
53
+ result
54
+ end
55
+
56
+ # Sets a human-friendly descrition of the plugin.
57
+ #
58
+ # @param [String] value Description of the plugin.
59
+ # @return [String] Description of the plugin.
60
+ def self.description(value=UNSET_VALUE)
61
+ get_or_set(:description, value)
62
+ end
63
+
64
+ # Registers a callback to be called when a specific action sequence
65
+ # is run. This allows plugin authors to hook into things like VM
66
+ # bootup, VM provisioning, etc.
67
+ #
68
+ # @param [String] name Name of the action.
69
+ # @param [Symbol] hook_name The location to hook. If this isn't
70
+ # set, every middleware action is hooked.
71
+ # @return [Array] List of the hooks for the given action.
72
+ def self.action_hook(name, hook_name=nil, &block)
73
+ # The name is currently not used but we want it for the future.
74
+
75
+ hook_name ||= ALL_ACTIONS
76
+ components.action_hooks[hook_name] << block
77
+ end
78
+
79
+ # Defines additional command line commands available by key. The key
80
+ # becomes the subcommand, so if you register a command "foo" then
81
+ # "vagrant foo" becomes available.
82
+ #
83
+ # @param [String] name Subcommand key.
84
+ def self.command(name=UNSET_VALUE, &block)
85
+ data[:command] ||= Registry.new
86
+
87
+ if name != UNSET_VALUE
88
+ # Validate the name of the command
89
+ if name.to_s !~ /^[-a-z0-9]+$/i
90
+ raise InvalidCommandName, "Commands can only contain letters, numbers, and hyphens"
91
+ end
92
+
93
+ # Register a new command class only if a name was given.
94
+ data[:command].register(name.to_sym, &block)
95
+ end
96
+
97
+ # Return the registry
98
+ data[:command]
99
+ end
100
+
101
+ # Defines additional communicators to be available. Communicators
102
+ # should be returned by a block passed to this method. This is done
103
+ # to ensure that the class is lazy loaded, so if your class inherits
104
+ # from or uses any Vagrant internals specific to Vagrant 1.0, then
105
+ # the plugin can still be defined without breaking anything in future
106
+ # versions of Vagrant.
107
+ #
108
+ # @param [String] name Communicator name.
109
+ def self.communicator(name=UNSET_VALUE, &block)
110
+ data[:communicator] ||= Registry.new
111
+
112
+ # Register a new communicator class only if a name was given.
113
+ data[:communicator].register(name.to_sym, &block) if name != UNSET_VALUE
114
+
115
+ # Return the registry
116
+ data[:communicator]
117
+ end
118
+
119
+ # Defines additional configuration keys to be available in the
120
+ # Vagrantfile. The configuration class should be returned by a
121
+ # block passed to this method. This is done to ensure that the class
122
+ # is lazy loaded, so if your class inherits from any classes that
123
+ # are specific to Vagrant 1.0, then the plugin can still be defined
124
+ # without breaking anything in future versions of Vagrant.
125
+ #
126
+ # @param [String] name Configuration key.
127
+ def self.config(name, scope=nil, &block)
128
+ scope ||= :top
129
+ components.configs[scope].register(name.to_sym, &block)
130
+ nil
131
+ end
132
+
133
+ # Defines an additionally available guest implementation with
134
+ # the given key.
135
+ #
136
+ # @param [String] name Name of the guest.
137
+ # @param [String] parent Name of the parent guest (if any)
138
+ def self.guest(name=UNSET_VALUE, parent=nil, &block)
139
+ components.guests.register(name.to_sym) do
140
+ parent = parent.to_sym if parent
141
+
142
+ [block.call, parent]
143
+ end
144
+ nil
145
+ end
146
+
147
+ # Defines a capability for the given guest. The block should return
148
+ # a class/module that has a method with the capability name, ready
149
+ # to be executed. This means that if it is an instance method,
150
+ # the block should return an instance of the class.
151
+ #
152
+ # @param [String] guest The name of the guest
153
+ # @param [String] cap The name of the capability
154
+ def self.guest_capability(guest, cap, &block)
155
+ components.guest_capabilities[guest.to_sym].register(cap.to_sym, &block)
156
+ nil
157
+ end
158
+
159
+ # Defines an additionally available host implementation with
160
+ # the given key.
161
+ #
162
+ # @param [String] name Name of the host.
163
+ def self.host(name=UNSET_VALUE, &block)
164
+ data[:hosts] ||= Registry.new
165
+
166
+ # Register a new host class only if a name was given
167
+ data[:hosts].register(name.to_sym, &block) if name != UNSET_VALUE
168
+
169
+ # Return the registry
170
+ data[:hosts]
171
+ end
172
+
173
+ # Registers additional providers to be available.
174
+ #
175
+ # @param [Symbol] name Name of the provider.
176
+ def self.provider(name=UNSET_VALUE, options=nil, &block)
177
+ components.providers.register(name.to_sym) do
178
+ [block.call, options || {}]
179
+ end
180
+
181
+ nil
182
+ end
183
+
184
+ # Registers additional provisioners to be available.
185
+ #
186
+ # @param [String] name Name of the provisioner.
187
+ def self.provisioner(name=UNSET_VALUE, &block)
188
+ data[:provisioners] ||= Registry.new
189
+
190
+ # Register a new provisioner class only if a name was given
191
+ data[:provisioners].register(name.to_sym, &block) if name != UNSET_VALUE
192
+
193
+ # Return the registry
194
+ data[:provisioners]
195
+ end
196
+
197
+ # Returns the internal data associated with this plugin. This
198
+ # should NOT be called by the general public.
199
+ #
200
+ # @return [Hash]
201
+ def self.data
202
+ @data ||= {}
203
+ end
204
+
205
+ protected
206
+
207
+ # Sentinel value denoting that a value has not been set.
208
+ UNSET_VALUE = Object.new
209
+
210
+ # Helper method that will set a value if a value is given, or otherwise
211
+ # return the already set value.
212
+ #
213
+ # @param [Symbol] key Key for the data
214
+ # @param [Object] value Value to store.
215
+ # @return [Object] Stored value.
216
+ def self.get_or_set(key, value=UNSET_VALUE)
217
+ # If no value is to be set, then return the value we have already set
218
+ return data[key] if value.eql?(UNSET_VALUE)
219
+
220
+ # Otherwise set the value
221
+ data[key] = value
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,69 @@
1
+ module Vagrant
2
+ module Plugin
3
+ module V2
4
+ # This is the base class for a provider for the V2 API. A provider
5
+ # is responsible for creating compute resources to match the needs
6
+ # of a Vagrant-configured system.
7
+ class Provider
8
+ # Initialize the provider to represent the given machine.
9
+ #
10
+ # @param [Vagrant::Machine] machine The machine that this provider
11
+ # is responsible for.
12
+ def initialize(machine)
13
+ end
14
+
15
+ # This should return an action callable for the given name.
16
+ #
17
+ # @param [Symbol] name Name of the action.
18
+ # @return [Object] A callable action sequence object, whether it
19
+ # is a proc, object, etc.
20
+ def action(name)
21
+ nil
22
+ end
23
+
24
+ # This method is called if the underying machine ID changes. Providers
25
+ # can use this method to load in new data for the actual backing
26
+ # machine or to realize that the machine is now gone (the ID can
27
+ # become `nil`). No parameters are given, since the underlying machine
28
+ # is simply the machine instance given to this object. And no
29
+ # return value is necessary.
30
+ def machine_id_changed
31
+ end
32
+
33
+ # This should return a hash of information that explains how to
34
+ # SSH into the machine. If the machine is not at a point where
35
+ # SSH is even possible, then `nil` should be returned.
36
+ #
37
+ # The general structure of this returned hash should be the
38
+ # following:
39
+ #
40
+ # {
41
+ # :host => "1.2.3.4",
42
+ # :port => "22",
43
+ # :username => "mitchellh",
44
+ # :private_key_path => "/path/to/my/key"
45
+ # }
46
+ #
47
+ # **Note:** Vagrant only supports private key based authentication,
48
+ # mainly for the reason that there is no easy way to exec into an
49
+ # `ssh` prompt with a password, whereas we can pass a private key
50
+ # via commandline.
51
+ #
52
+ # @return [Hash] SSH information. For the structure of this hash
53
+ # read the accompanying documentation for this method.
54
+ def ssh_info
55
+ nil
56
+ end
57
+
58
+ # This should return the state of the machine within this provider.
59
+ # The state must be an instance of {MachineState}. Please read the
60
+ # documentation of that class for more information.
61
+ #
62
+ # @return [MachineState]
63
+ def state
64
+ nil
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,47 @@
1
+ module Vagrant
2
+ module Plugin
3
+ module V2
4
+ # This is the base class for a provisioner for the V2 API. A provisioner
5
+ # is primarily responsible for installing software on a Vagrant guest.
6
+ class Provisioner
7
+ attr_reader :machine
8
+ attr_reader :config
9
+
10
+ # Initializes the provisioner with the machine that it will be
11
+ # provisioning along with the provisioner configuration (if there
12
+ # is any).
13
+ #
14
+ # The provisioner should _not_ do anything at this point except
15
+ # initialize internal state.
16
+ #
17
+ # @param [Machine] machine The machine that this will be provisioning.
18
+ # @param [Object] config Provisioner configuration, if one was set.
19
+ def initialize(machine, config)
20
+ @machine = machine
21
+ @config = config
22
+ end
23
+
24
+ # Called with the root configuration of the machine so the provisioner
25
+ # can add some configuration on top of the machine.
26
+ #
27
+ # During this step, and this step only, the provisioner should modify
28
+ # the root machine configuration to add any additional features it
29
+ # may need. Examples include sharing folders, networking, and so on.
30
+ # This step is guaranteed to be called before any of those steps are
31
+ # done so the provisioner may do that.
32
+ #
33
+ # No return value is expected.
34
+ def configure(root_config)
35
+ end
36
+
37
+ # This is the method called when the actual provisioning should be
38
+ # done. The communicator is guaranteed to be ready at this point,
39
+ # and any shared folders or networks are already setup.
40
+ #
41
+ # No return value is expected.
42
+ def provision
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,22 @@
1
+ require "log4r"
2
+
3
+ # We don't autoload components because if we're loading anything in the
4
+ # V2 namespace anyways, then we're going to need the Components class.
5
+ require "vagrant/plugin/v2/components"
6
+ require "vagrant/plugin/v2/errors"
7
+
8
+ module Vagrant
9
+ module Plugin
10
+ module V2
11
+ autoload :Command, "vagrant/plugin/v2/command"
12
+ autoload :Communicator, "vagrant/plugin/v2/communicator"
13
+ autoload :Config, "vagrant/plugin/v2/config"
14
+ autoload :Guest, "vagrant/plugin/v2/guest"
15
+ autoload :Host, "vagrant/plugin/v2/host"
16
+ autoload :Manager, "vagrant/plugin/v2/manager"
17
+ autoload :Plugin, "vagrant/plugin/v2/plugin"
18
+ autoload :Provider, "vagrant/plugin/v2/provider"
19
+ autoload :Provisioner, "vagrant/plugin/v2/provisioner"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ module Vagrant
2
+ module Plugin
3
+ autoload :V1, "vagrant/plugin/v1"
4
+ autoload :V2, "vagrant/plugin/v2"
5
+ end
6
+ end
@@ -0,0 +1,78 @@
1
+ module Vagrant
2
+ # Register components in a single location that can be queried.
3
+ #
4
+ # This allows certain components (such as guest systems, configuration
5
+ # pieces, etc.) to be registered and queried, lazily.
6
+ class Registry
7
+ def initialize
8
+ @items = {}
9
+ @results_cache = {}
10
+ end
11
+
12
+ # Register a key with a lazy-loaded value.
13
+ #
14
+ # If a key with the given name already exists, it is overwritten.
15
+ def register(key, &block)
16
+ raise ArgumentError, "block required" if !block_given?
17
+ @items[key] = block
18
+ end
19
+
20
+ # Get a value by the given key.
21
+ #
22
+ # This will evaluate the block given to `register` and return the
23
+ # resulting value.
24
+ def get(key)
25
+ return nil if !@items.has_key?(key)
26
+ return @results_cache[key] if @results_cache.has_key?(key)
27
+ @results_cache[key] = @items[key].call
28
+ end
29
+ alias :[] :get
30
+
31
+ # Checks if the given key is registered with the registry.
32
+ #
33
+ # @return [Boolean]
34
+ def has_key?(key)
35
+ @items.has_key?(key)
36
+ end
37
+
38
+ # Iterate over the keyspace.
39
+ def each(&block)
40
+ @items.each do |key, _|
41
+ yield key, get(key)
42
+ end
43
+ end
44
+
45
+ # Merge one registry with another and return a completely new
46
+ # registry. Note that the result cache is completely busted, so
47
+ # any gets on the new registry will result in a cache miss.
48
+ def merge(other)
49
+ self.class.new.tap do |result|
50
+ result.merge!(self)
51
+ result.merge!(other)
52
+ end
53
+ end
54
+
55
+ # Like #{merge} but merges into self.
56
+ def merge!(other)
57
+ @items.merge!(other.__internal_state[:items])
58
+ self
59
+ end
60
+
61
+ # Converts this registry to a hash
62
+ def to_hash
63
+ result = {}
64
+ self.each do |key, value|
65
+ result[key] = value
66
+ end
67
+
68
+ result
69
+ end
70
+
71
+ def __internal_state
72
+ {
73
+ :items => @items,
74
+ :results_cache => @results_cache
75
+ }
76
+ end
77
+ end
78
+ end
data/lib/vagrant/ui.rb ADDED
@@ -0,0 +1,215 @@
1
+ require "thread"
2
+
3
+ require "log4r"
4
+
5
+ require "vagrant/util/platform"
6
+ require "vagrant/util/safe_puts"
7
+
8
+ module Vagrant
9
+ module UI
10
+ # Vagrant UIs handle communication with the outside world (typically
11
+ # through a shell). They must respond to the following methods:
12
+ #
13
+ # * `info`
14
+ # * `warn`
15
+ # * `error`
16
+ # * `success`
17
+ class Interface
18
+ def initialize
19
+ @logger = Log4r::Logger.new("vagrant::ui::interface")
20
+ end
21
+
22
+ [:ask, :warn, :error, :info, :success].each do |method|
23
+ define_method(method) do |message, *opts|
24
+ # Log normal console messages
25
+ @logger.info { "#{method}: #{message}" }
26
+ end
27
+ end
28
+
29
+ [:clear_line, :report_progress].each do |method|
30
+ # By default do nothing, these aren't logged
31
+ define_method(method) { |*args| }
32
+ end
33
+
34
+ # Returns a new UI class that is scoped to the given resource name.
35
+ # Subclasses can then use this scope name to do whatever they please.
36
+ #
37
+ # @param [String] scope_name
38
+ # @return [Interface]
39
+ def scope(scope_name)
40
+ self
41
+ end
42
+ end
43
+
44
+ # This is a UI implementation that does nothing.
45
+ class Silent < Interface
46
+ def ask(*args)
47
+ super
48
+
49
+ # Silent can't do this, obviously.
50
+ raise Errors::UIExpectsTTY
51
+ end
52
+ end
53
+
54
+ # This is a UI implementation that outputs the text as is. It
55
+ # doesn't add any color.
56
+ class Basic < Interface
57
+ include Util::SafePuts
58
+
59
+ def initialize
60
+ super
61
+
62
+ @lock = Mutex.new
63
+ end
64
+
65
+ # Use some light meta-programming to create the various methods to
66
+ # output text to the UI. These all delegate the real functionality
67
+ # to `say`.
68
+ [:info, :warn, :error, :success].each do |method|
69
+ class_eval <<-CODE
70
+ def #{method}(message, *args)
71
+ super(message)
72
+ say(#{method.inspect}, message, *args)
73
+ end
74
+ CODE
75
+ end
76
+
77
+ def ask(message, opts=nil)
78
+ super(message)
79
+
80
+ # We can't ask questions when the output isn't a TTY.
81
+ raise Errors::UIExpectsTTY if !$stdin.tty? && !Vagrant::Util::Platform.cygwin?
82
+
83
+ # Setup the options so that the new line is suppressed
84
+ opts ||= {}
85
+ opts[:new_line] = false if !opts.has_key?(:new_line)
86
+ opts[:prefix] = false if !opts.has_key?(:prefix)
87
+
88
+ # Output the data
89
+ say(:info, message, opts)
90
+
91
+ # Get the results and chomp off the newline. We do a logical OR
92
+ # here because `gets` can return a nil, for example in the case
93
+ # that ctrl-D is pressed on the input.
94
+ input = $stdin.gets || ""
95
+ input.chomp
96
+ end
97
+
98
+ # This is used to output progress reports to the UI.
99
+ # Send this method progress/total and it will output it
100
+ # to the UI. Send `clear_line` to clear the line to show
101
+ # a continuous progress meter.
102
+ def report_progress(progress, total, show_parts=true)
103
+ if total && total > 0
104
+ percent = (progress.to_f / total.to_f) * 100
105
+ line = "Progress: #{percent.to_i}%"
106
+ line << " (#{progress} / #{total})" if show_parts
107
+ else
108
+ line = "Progress: #{progress}"
109
+ end
110
+
111
+ info(line, :new_line => false)
112
+ end
113
+
114
+ def clear_line
115
+ reset = "\r"
116
+ reset += "\e[0K" if Util::Platform.windows? && !Util::Platform.cygwin?
117
+
118
+ info(reset, :new_line => false)
119
+ end
120
+
121
+ # This method handles actually outputting a message of a given type
122
+ # to the console.
123
+ def say(type, message, opts=nil)
124
+ defaults = { :new_line => true, :prefix => true }
125
+ opts = defaults.merge(opts || {})
126
+
127
+ # Determine whether we're expecting to output our
128
+ # own new line or not.
129
+ printer = opts[:new_line] ? :puts : :print
130
+
131
+ # Determine the proper IO channel to send this message
132
+ # to based on the type of the message
133
+ channel = type == :error || opts[:channel] == :error ? $stderr : $stdout
134
+
135
+ # Output! We wrap this in a lock so that it safely outputs only
136
+ # one line at a time.
137
+ @lock.synchronize do
138
+ safe_puts(format_message(type, message, opts),
139
+ :io => channel, :printer => printer)
140
+ end
141
+ end
142
+
143
+ def scope(scope_name)
144
+ BasicScope.new(self, scope_name)
145
+ end
146
+
147
+ # This is called by `say` to format the message for output.
148
+ def format_message(type, message, opts=nil)
149
+ opts ||= {}
150
+ message = "[#{opts[:scope]}] #{message}" if opts[:scope] && opts[:prefix]
151
+ message
152
+ end
153
+ end
154
+
155
+ # This implements a scope for the {Basic} UI.
156
+ class BasicScope < Interface
157
+ def initialize(ui, scope)
158
+ super()
159
+
160
+ @ui = ui
161
+ @scope = scope
162
+ end
163
+
164
+ [:ask, :warn, :error, :info, :success].each do |method|
165
+ define_method(method) do |message, opts=nil|
166
+ opts ||= {}
167
+ opts[:scope] = @scope
168
+ @ui.send(method, message, opts)
169
+ end
170
+ end
171
+
172
+ [:clear_line, :report_progress].each do |method|
173
+ # By default do nothing, these aren't logged
174
+ define_method(method) { |*args| @ui.send(method, *args) }
175
+ end
176
+ end
177
+
178
+ # This is a UI implementation that outputs color for various types
179
+ # of messages. This should only be used with a TTY that supports color,
180
+ # but is up to the user of the class to verify this is the case.
181
+ class Colored < Basic
182
+ # Terminal colors
183
+ COLORS = {
184
+ :clear => "\e[0m",
185
+ :red => "\e[31m",
186
+ :green => "\e[32m",
187
+ :yellow => "\e[33m"
188
+ }
189
+
190
+ # Mapping between type of message and the color to output
191
+ COLOR_MAP = {
192
+ :warn => COLORS[:yellow],
193
+ :error => COLORS[:red],
194
+ :success => COLORS[:green]
195
+ }
196
+
197
+ # This is called by `say` to format the message for output.
198
+ def format_message(type, message, opts=nil)
199
+ # Get the format of the message before adding color.
200
+ message = super
201
+
202
+ # Colorize the message if there is a color for this type of message,
203
+ # either specified by the options or via the default color map.
204
+ if opts.has_key?(:color)
205
+ color = COLORS[opts[:color]]
206
+ message = "#{color}#{message}#{COLORS[:clear]}"
207
+ else
208
+ message = "#{COLOR_MAP[type]}#{message}#{COLORS[:clear]}" if COLOR_MAP[type]
209
+ end
210
+
211
+ message
212
+ end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,34 @@
1
+ module Vagrant
2
+ module Util
3
+ module ANSIEscapeCodeRemover
4
+ # Removes ANSI escape code sequences from the text and returns
5
+ # it.
6
+ #
7
+ # This removes all the ANSI escape codes listed here along with
8
+ # the escape codes for VT100 terminals:
9
+ #
10
+ # http://ascii-table.com/ansi-escape-sequences.php
11
+ def remove_ansi_escape_codes(text)
12
+ # An array of regular expressions which match various kinds
13
+ # of escape sequences. I can't think of a better single regular
14
+ # expression or any faster way to do this.
15
+ matchers = [/\e\[\d*[ABCD]/, # Matches things like \e[4D
16
+ /\e\[(\d*;)?\d*[HF]/, # Matches \e[1;2H or \e[H
17
+ /\e\[(s|u|2J|K)/, # Matches \e[s, \e[2J, etc.
18
+ /\e\[=\d*[hl]/, # Matches \e[=24h
19
+ /\e\[\?[1-9][hl]/, # Matches \e[?2h
20
+ /\e\[20[hl]/, # Matches \e[20l]
21
+ /\e[DME78H]/, # Matches \eD, \eH, etc.
22
+ /\e\[[0-2]?[JK]/, # Matches \e[0J, \e[K, etc.
23
+ ]
24
+
25
+ # Take each matcher and replace it with emptiness.
26
+ matchers.each do |matcher|
27
+ text.gsub!(matcher, "")
28
+ end
29
+
30
+ text
31
+ end
32
+ end
33
+ end
34
+ end