vagrant 1.5.0 → 2.4.4

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 (1101) hide show
  1. checksums.yaml +5 -5
  2. data/.copywrite.hcl +15 -0
  3. data/.gitignore +79 -14
  4. data/.gitmodules +0 -0
  5. data/.vimrc +5 -0
  6. data/.yardopts +1 -0
  7. data/CHANGELOG.md +4512 -0
  8. data/Gemfile +10 -2
  9. data/LICENSE +92 -0
  10. data/README.md +55 -3
  11. data/RELEASE.md +11 -0
  12. data/Rakefile +22 -1
  13. data/Vagrantfile +31 -0
  14. data/bin/vagrant +268 -2
  15. data/contrib/README.md +17 -0
  16. data/contrib/bash/completion.sh +190 -0
  17. data/contrib/emacs/vagrant.el +11 -0
  18. data/contrib/st/Ruby.sublime-settings +6 -0
  19. data/contrib/sudoers/linux-fedora +7 -0
  20. data/contrib/sudoers/linux-suse +6 -0
  21. data/contrib/sudoers/linux-ubuntu +8 -0
  22. data/contrib/sudoers/osx +10 -0
  23. data/contrib/vim/vagrantfile.vim +9 -0
  24. data/contrib/zsh/_vagrant +738 -0
  25. data/contrib/zsh/generate_zsh_completion.rb +168 -0
  26. data/ext/vagrant/vagrant_ssl/extconf.rb +24 -0
  27. data/ext/vagrant/vagrant_ssl/vagrant_ssl.c +37 -0
  28. data/ext/vagrant/vagrant_ssl/vagrant_ssl.h +19 -0
  29. data/keys/README.md +23 -0
  30. data/keys/vagrant +27 -0
  31. data/keys/vagrant.key.ed25519 +7 -0
  32. data/keys/vagrant.key.rsa +27 -0
  33. data/keys/vagrant.pub +2 -0
  34. data/keys/vagrant.pub.ed25519 +1 -0
  35. data/keys/vagrant.pub.rsa +1 -0
  36. data/lib/vagrant/action/builder.rb +356 -0
  37. data/lib/vagrant/action/builtin/box_add.rb +638 -0
  38. data/lib/vagrant/action/builtin/box_check_outdated.rb +116 -0
  39. data/lib/vagrant/action/builtin/box_remove.rb +181 -0
  40. data/lib/vagrant/action/builtin/box_update.rb +23 -0
  41. data/lib/vagrant/action/builtin/call.rb +69 -0
  42. data/lib/vagrant/action/builtin/cleanup_disks.rb +59 -0
  43. data/lib/vagrant/action/builtin/cloud_init_setup.rb +125 -0
  44. data/lib/vagrant/action/builtin/cloud_init_wait.rb +35 -0
  45. data/lib/vagrant/action/builtin/config_validate.rb +33 -0
  46. data/lib/vagrant/action/builtin/confirm.rb +51 -0
  47. data/lib/vagrant/action/builtin/delayed.rb +29 -0
  48. data/lib/vagrant/action/builtin/destroy_confirm.rb +24 -0
  49. data/lib/vagrant/action/builtin/disk.rb +55 -0
  50. data/lib/vagrant/action/builtin/env_set.rb +27 -0
  51. data/lib/vagrant/action/builtin/graceful_halt.rb +88 -0
  52. data/lib/vagrant/action/builtin/handle_box.rb +111 -0
  53. data/lib/vagrant/action/builtin/handle_box_url.rb +17 -0
  54. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +300 -0
  55. data/lib/vagrant/action/builtin/has_provisioner.rb +39 -0
  56. data/lib/vagrant/action/builtin/is_env_set.rb +25 -0
  57. data/lib/vagrant/action/builtin/is_state.rb +35 -0
  58. data/lib/vagrant/action/builtin/lock.rb +60 -0
  59. data/lib/vagrant/action/builtin/message.rb +29 -0
  60. data/lib/vagrant/action/builtin/mixin_provisioners.rb +159 -0
  61. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +267 -0
  62. data/lib/vagrant/action/builtin/prepare_clone.rb +41 -0
  63. data/lib/vagrant/action/builtin/provision.rb +146 -0
  64. data/lib/vagrant/action/builtin/provisioner_cleanup.rb +57 -0
  65. data/lib/vagrant/action/builtin/set_hostname.rb +34 -0
  66. data/lib/vagrant/action/builtin/ssh_exec.rb +47 -0
  67. data/lib/vagrant/action/builtin/ssh_run.rb +88 -0
  68. data/lib/vagrant/action/builtin/synced_folder_cleanup.rb +36 -0
  69. data/lib/vagrant/action/builtin/synced_folders.rb +154 -0
  70. data/lib/vagrant/action/builtin/trigger.rb +40 -0
  71. data/lib/vagrant/action/builtin/wait_for_communicator.rb +82 -0
  72. data/lib/vagrant/action/general/package.rb +248 -0
  73. data/lib/vagrant/action/general/package_setup_files.rb +54 -0
  74. data/lib/vagrant/action/general/package_setup_folders.rb +40 -0
  75. data/lib/vagrant/action/hook.rb +163 -0
  76. data/lib/vagrant/action/primary_runner.rb +18 -0
  77. data/lib/vagrant/action/runner.rb +112 -0
  78. data/lib/vagrant/action/warden.rb +126 -0
  79. data/lib/vagrant/action.rb +88 -0
  80. data/lib/vagrant/alias.rb +59 -0
  81. data/lib/vagrant/batch_action.rb +181 -0
  82. data/lib/vagrant/box.rb +260 -0
  83. data/lib/vagrant/box_collection.rb +563 -0
  84. data/lib/vagrant/box_metadata.rb +275 -0
  85. data/lib/vagrant/bundler.rb +936 -0
  86. data/lib/vagrant/capability_host.rb +180 -0
  87. data/lib/vagrant/cli.rb +122 -0
  88. data/lib/vagrant/config/loader.rb +323 -0
  89. data/lib/vagrant/config/v1/dummy_config.rb +16 -0
  90. data/lib/vagrant/config/v1/loader.rb +108 -0
  91. data/lib/vagrant/config/v1/root.rb +63 -0
  92. data/lib/vagrant/config/v1.rb +12 -0
  93. data/lib/vagrant/config/v2/dummy_config.rb +60 -0
  94. data/lib/vagrant/config/v2/loader.rb +154 -0
  95. data/lib/vagrant/config/v2/root.rb +122 -0
  96. data/lib/vagrant/config/v2/util.rb +24 -0
  97. data/lib/vagrant/config/v2.rb +13 -0
  98. data/lib/vagrant/config/version_base.rb +83 -0
  99. data/lib/vagrant/config.rb +64 -0
  100. data/lib/vagrant/environment.rb +1230 -0
  101. data/lib/vagrant/errors.rb +1158 -0
  102. data/lib/vagrant/guest.rb +72 -0
  103. data/lib/vagrant/host.rb +19 -0
  104. data/lib/vagrant/machine.rb +672 -0
  105. data/lib/vagrant/machine_index.rb +527 -0
  106. data/lib/vagrant/machine_state.rb +54 -0
  107. data/lib/vagrant/patches/builder/mkmf.rb +116 -0
  108. data/lib/vagrant/patches/fake_ftp.rb +28 -0
  109. data/lib/vagrant/patches/log4r.rb +54 -0
  110. data/lib/vagrant/patches/net-ssh.rb +76 -0
  111. data/lib/vagrant/patches/rubygems.rb +23 -0
  112. data/lib/vagrant/patches/timeout_error.rb +5 -0
  113. data/lib/vagrant/plugin/manager.rb +406 -0
  114. data/lib/vagrant/plugin/state_file.rb +136 -0
  115. data/lib/vagrant/plugin/v1/command.rb +171 -0
  116. data/lib/vagrant/plugin/v1/communicator.rb +101 -0
  117. data/lib/vagrant/plugin/v1/config.rb +115 -0
  118. data/lib/vagrant/plugin/v1/errors.rb +18 -0
  119. data/lib/vagrant/plugin/v1/guest.rb +95 -0
  120. data/lib/vagrant/plugin/v1/host.rb +69 -0
  121. data/lib/vagrant/plugin/v1/manager.rb +134 -0
  122. data/lib/vagrant/plugin/v1/plugin.rb +231 -0
  123. data/lib/vagrant/plugin/v1/provider.rb +71 -0
  124. data/lib/vagrant/plugin/v1/provisioner.rb +53 -0
  125. data/lib/vagrant/plugin/v1.rb +25 -0
  126. data/lib/vagrant/plugin/v2/command.rb +309 -0
  127. data/lib/vagrant/plugin/v2/communicator.rb +133 -0
  128. data/lib/vagrant/plugin/v2/components.rb +94 -0
  129. data/lib/vagrant/plugin/v2/config.rb +167 -0
  130. data/lib/vagrant/plugin/v2/errors.rb +18 -0
  131. data/lib/vagrant/plugin/v2/guest.rb +26 -0
  132. data/lib/vagrant/plugin/v2/host.rb +22 -0
  133. data/lib/vagrant/plugin/v2/manager.rb +306 -0
  134. data/lib/vagrant/plugin/v2/plugin.rb +296 -0
  135. data/lib/vagrant/plugin/v2/provider.rb +118 -0
  136. data/lib/vagrant/plugin/v2/provisioner.rb +56 -0
  137. data/lib/vagrant/plugin/v2/push.rb +30 -0
  138. data/lib/vagrant/plugin/v2/synced_folder.rb +113 -0
  139. data/lib/vagrant/plugin/v2/trigger.rb +367 -0
  140. data/lib/vagrant/plugin/v2.rb +33 -0
  141. data/lib/vagrant/plugin.rb +11 -0
  142. data/lib/vagrant/registry.rb +113 -0
  143. data/lib/vagrant/shared_helpers.rb +238 -0
  144. data/lib/vagrant/ui.rb +449 -0
  145. data/lib/vagrant/util/ansi_escape_code_remover.rb +37 -0
  146. data/lib/vagrant/util/busy.rb +62 -0
  147. data/lib/vagrant/util/caps.rb +51 -0
  148. data/lib/vagrant/util/checkpoint_client.rb +186 -0
  149. data/lib/vagrant/util/command_deprecation.rb +59 -0
  150. data/lib/vagrant/util/counter.rb +27 -0
  151. data/lib/vagrant/util/credential_scrubber.rb +74 -0
  152. data/lib/vagrant/util/curl_helper.rb +104 -0
  153. data/lib/vagrant/util/deep_merge.rb +23 -0
  154. data/lib/vagrant/util/directory.rb +22 -0
  155. data/lib/vagrant/util/downloader.rb +278 -0
  156. data/lib/vagrant/util/env.rb +56 -0
  157. data/lib/vagrant/util/experimental.rb +79 -0
  158. data/lib/vagrant/util/file_checksum.rb +77 -0
  159. data/lib/vagrant/util/file_mode.rb +15 -0
  160. data/lib/vagrant/util/file_mutex.rb +50 -0
  161. data/lib/vagrant/util/guest_hosts.rb +71 -0
  162. data/lib/vagrant/util/guest_inspection.rb +118 -0
  163. data/lib/vagrant/util/guest_networks.rb +107 -0
  164. data/lib/vagrant/util/hash_with_indifferent_access.rb +66 -0
  165. data/lib/vagrant/util/install_cli_autocomplete.rb +121 -0
  166. data/lib/vagrant/util/io.rb +53 -0
  167. data/lib/vagrant/util/ipv4_interfaces.rb +18 -0
  168. data/lib/vagrant/util/is_port_open.rb +31 -0
  169. data/lib/vagrant/util/keypair.rb +293 -0
  170. data/lib/vagrant/util/line_buffer.rb +63 -0
  171. data/lib/vagrant/util/line_ending_helpers.rb +17 -0
  172. data/lib/vagrant/util/logging_formatter.rb +70 -0
  173. data/lib/vagrant/util/map_command_options.rb +36 -0
  174. data/lib/vagrant/util/mime.rb +95 -0
  175. data/lib/vagrant/util/network_ip.rb +27 -0
  176. data/lib/vagrant/util/numeric.rb +92 -0
  177. data/lib/vagrant/util/platform.rb +737 -0
  178. data/lib/vagrant/util/powershell.rb +316 -0
  179. data/lib/vagrant/util/presence.rb +48 -0
  180. data/lib/vagrant/util/retryable.rb +34 -0
  181. data/lib/vagrant/util/safe_chdir.rb +36 -0
  182. data/lib/vagrant/util/safe_env.rb +17 -0
  183. data/lib/vagrant/util/safe_exec.rb +78 -0
  184. data/lib/vagrant/util/safe_puts.rb +34 -0
  185. data/lib/vagrant/util/scoped_hash_override.rb +47 -0
  186. data/lib/vagrant/util/shell_quote.rb +18 -0
  187. data/lib/vagrant/util/silence_warnings.rb +17 -0
  188. data/lib/vagrant/util/ssh.rb +267 -0
  189. data/lib/vagrant/util/stacked_proc_runner.rb +38 -0
  190. data/lib/vagrant/util/string_block_editor.rb +80 -0
  191. data/lib/vagrant/util/subprocess.rb +365 -0
  192. data/lib/vagrant/util/template_renderer.rb +91 -0
  193. data/lib/vagrant/util/uploader.rb +109 -0
  194. data/lib/vagrant/util/which.rb +56 -0
  195. data/lib/vagrant/util/windows_path.rb +41 -0
  196. data/lib/vagrant/util.rb +63 -0
  197. data/lib/vagrant/vagrantfile.rb +320 -0
  198. data/lib/vagrant/version.rb +10 -0
  199. data/lib/vagrant.rb +380 -0
  200. data/plugins/README.md +11 -0
  201. data/plugins/commands/autocomplete/command/install.rb +52 -0
  202. data/plugins/commands/autocomplete/command/root.rb +69 -0
  203. data/plugins/commands/autocomplete/plugin.rb +21 -0
  204. data/plugins/commands/box/command/add.rb +111 -0
  205. data/plugins/commands/box/command/download_mixins.rb +32 -0
  206. data/plugins/commands/box/command/list.rb +82 -0
  207. data/plugins/commands/box/command/outdated.rb +109 -0
  208. data/plugins/commands/box/command/prune.rb +136 -0
  209. data/plugins/commands/box/command/remove.rb +83 -0
  210. data/plugins/commands/box/command/repackage.rb +46 -0
  211. data/plugins/commands/box/command/root.rb +98 -0
  212. data/plugins/commands/box/command/update.rb +206 -0
  213. data/plugins/commands/box/plugin.rb +18 -0
  214. data/plugins/commands/cap/command.rb +83 -0
  215. data/plugins/commands/cap/plugin.rb +20 -0
  216. data/plugins/commands/cloud/auth/login.rb +90 -0
  217. data/plugins/commands/cloud/auth/logout.rb +37 -0
  218. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +116 -0
  219. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +68 -0
  220. data/plugins/commands/cloud/auth/plugin.rb +23 -0
  221. data/plugins/commands/cloud/auth/root.rb +77 -0
  222. data/plugins/commands/cloud/auth/whoami.rb +63 -0
  223. data/plugins/commands/cloud/box/create.rb +82 -0
  224. data/plugins/commands/cloud/box/delete.rb +74 -0
  225. data/plugins/commands/cloud/box/plugin.rb +22 -0
  226. data/plugins/commands/cloud/box/root.rb +81 -0
  227. data/plugins/commands/cloud/box/show.rb +133 -0
  228. data/plugins/commands/cloud/box/update.rb +82 -0
  229. data/plugins/commands/cloud/client/client.rb +257 -0
  230. data/plugins/commands/cloud/errors.rb +31 -0
  231. data/plugins/commands/cloud/list.rb +54 -0
  232. data/plugins/commands/cloud/locales/en.yml +197 -0
  233. data/plugins/commands/cloud/plugin.rb +48 -0
  234. data/plugins/commands/cloud/provider/create.rb +105 -0
  235. data/plugins/commands/cloud/provider/delete.rb +109 -0
  236. data/plugins/commands/cloud/provider/plugin.rb +22 -0
  237. data/plugins/commands/cloud/provider/root.rb +81 -0
  238. data/plugins/commands/cloud/provider/update.rb +102 -0
  239. data/plugins/commands/cloud/provider/upload.rb +100 -0
  240. data/plugins/commands/cloud/publish.rb +297 -0
  241. data/plugins/commands/cloud/root.rb +108 -0
  242. data/plugins/commands/cloud/search.rb +102 -0
  243. data/plugins/commands/cloud/util.rb +371 -0
  244. data/plugins/commands/cloud/version/create.rb +77 -0
  245. data/plugins/commands/cloud/version/delete.rb +78 -0
  246. data/plugins/commands/cloud/version/plugin.rb +22 -0
  247. data/plugins/commands/cloud/version/release.rb +78 -0
  248. data/plugins/commands/cloud/version/revoke.rb +79 -0
  249. data/plugins/commands/cloud/version/root.rb +85 -0
  250. data/plugins/commands/cloud/version/update.rb +76 -0
  251. data/plugins/commands/destroy/command.rb +79 -0
  252. data/plugins/commands/destroy/plugin.rb +21 -0
  253. data/plugins/commands/global-status/command.rb +114 -0
  254. data/plugins/commands/global-status/plugin.rb +21 -0
  255. data/plugins/commands/halt/command.rb +42 -0
  256. data/plugins/commands/halt/plugin.rb +21 -0
  257. data/plugins/commands/help/command.rb +19 -0
  258. data/plugins/commands/help/plugin.rb +20 -0
  259. data/plugins/commands/init/command.rb +110 -0
  260. data/plugins/commands/init/plugin.rb +21 -0
  261. data/plugins/commands/list-commands/command.rb +46 -0
  262. data/plugins/commands/list-commands/plugin.rb +21 -0
  263. data/plugins/commands/login/plugin.rb +20 -0
  264. data/plugins/commands/package/command.rb +104 -0
  265. data/plugins/commands/package/plugin.rb +21 -0
  266. data/plugins/commands/plugin/action/expunge_plugins.rb +77 -0
  267. data/plugins/commands/plugin/action/install_gem.rb +80 -0
  268. data/plugins/commands/plugin/action/license_plugin.rb +48 -0
  269. data/plugins/commands/plugin/action/list_plugins.rb +79 -0
  270. data/plugins/commands/plugin/action/plugin_exists_check.rb +28 -0
  271. data/plugins/commands/plugin/action/repair_plugins.rb +67 -0
  272. data/plugins/commands/plugin/action/uninstall_plugin.rb +28 -0
  273. data/plugins/commands/plugin/action/update_gems.rb +52 -0
  274. data/plugins/commands/plugin/action.rb +82 -0
  275. data/plugins/commands/plugin/command/base.rb +22 -0
  276. data/plugins/commands/plugin/command/expunge.rb +95 -0
  277. data/plugins/commands/plugin/command/install.rb +90 -0
  278. data/plugins/commands/plugin/command/license.rb +34 -0
  279. data/plugins/commands/plugin/command/list.rb +34 -0
  280. data/plugins/commands/plugin/command/mixin_install_opts.rb +34 -0
  281. data/plugins/commands/plugin/command/repair.rb +41 -0
  282. data/plugins/commands/plugin/command/root.rb +98 -0
  283. data/plugins/commands/plugin/command/uninstall.rb +38 -0
  284. data/plugins/commands/plugin/command/update.rb +42 -0
  285. data/plugins/commands/plugin/gem_helper.rb +89 -0
  286. data/plugins/commands/plugin/plugin.rb +23 -0
  287. data/plugins/commands/port/command.rb +91 -0
  288. data/plugins/commands/port/locales/en.yml +23 -0
  289. data/plugins/commands/port/plugin.rb +30 -0
  290. data/plugins/commands/powershell/command.rb +132 -0
  291. data/plugins/commands/powershell/errors.rb +29 -0
  292. data/plugins/commands/powershell/plugin.rb +34 -0
  293. data/plugins/commands/powershell/scripts/enable_psremoting.ps1 +63 -0
  294. data/plugins/commands/powershell/scripts/reset_trustedhosts.ps1 +15 -0
  295. data/plugins/commands/provider/command.rb +77 -0
  296. data/plugins/commands/provider/plugin.rb +21 -0
  297. data/plugins/commands/provision/command.rb +41 -0
  298. data/plugins/commands/provision/plugin.rb +21 -0
  299. data/plugins/commands/push/command.rb +78 -0
  300. data/plugins/commands/push/plugin.rb +20 -0
  301. data/plugins/commands/rdp/command.rb +114 -0
  302. data/plugins/commands/rdp/config.rb +29 -0
  303. data/plugins/commands/rdp/errors.rb +21 -0
  304. data/plugins/commands/rdp/plugin.rb +39 -0
  305. data/plugins/commands/reload/command.rb +67 -0
  306. data/plugins/commands/reload/plugin.rb +21 -0
  307. data/plugins/commands/resume/command.rb +46 -0
  308. data/plugins/commands/resume/plugin.rb +20 -0
  309. data/plugins/commands/snapshot/command/delete.rb +50 -0
  310. data/plugins/commands/snapshot/command/list.rb +50 -0
  311. data/plugins/commands/snapshot/command/pop.rb +52 -0
  312. data/plugins/commands/snapshot/command/push.rb +36 -0
  313. data/plugins/commands/snapshot/command/push_shared.rb +58 -0
  314. data/plugins/commands/snapshot/command/restore.rb +67 -0
  315. data/plugins/commands/snapshot/command/root.rb +95 -0
  316. data/plugins/commands/snapshot/command/save.rb +75 -0
  317. data/plugins/commands/snapshot/plugin.rb +18 -0
  318. data/plugins/commands/ssh/command.rb +80 -0
  319. data/plugins/commands/ssh/plugin.rb +20 -0
  320. data/plugins/commands/ssh_config/command.rb +78 -0
  321. data/plugins/commands/ssh_config/plugin.rb +21 -0
  322. data/plugins/commands/status/command.rb +59 -0
  323. data/plugins/commands/status/plugin.rb +21 -0
  324. data/plugins/commands/suspend/command.rb +49 -0
  325. data/plugins/commands/suspend/plugin.rb +21 -0
  326. data/plugins/commands/up/command.rb +194 -0
  327. data/plugins/commands/up/middleware/store_box_metadata.rb +40 -0
  328. data/plugins/commands/up/plugin.rb +25 -0
  329. data/plugins/commands/up/start_mixins.rb +58 -0
  330. data/plugins/commands/upload/command.rb +239 -0
  331. data/plugins/commands/upload/plugin.rb +20 -0
  332. data/plugins/commands/validate/command.rb +107 -0
  333. data/plugins/commands/validate/plugin.rb +20 -0
  334. data/plugins/commands/version/command.rb +60 -0
  335. data/plugins/commands/version/plugin.rb +21 -0
  336. data/plugins/commands/winrm/command.rb +71 -0
  337. data/plugins/commands/winrm/plugin.rb +20 -0
  338. data/plugins/commands/winrm_config/command.rb +129 -0
  339. data/plugins/commands/winrm_config/plugin.rb +20 -0
  340. data/plugins/communicators/ssh/communicator.rb +898 -0
  341. data/plugins/communicators/ssh/plugin.rb +22 -0
  342. data/plugins/communicators/winrm/command_filter.rb +49 -0
  343. data/plugins/communicators/winrm/command_filters/cat.rb +26 -0
  344. data/plugins/communicators/winrm/command_filters/chmod.rb +20 -0
  345. data/plugins/communicators/winrm/command_filters/chown.rb +20 -0
  346. data/plugins/communicators/winrm/command_filters/grep.rb +26 -0
  347. data/plugins/communicators/winrm/command_filters/mkdir.rb +30 -0
  348. data/plugins/communicators/winrm/command_filters/rm.rb +50 -0
  349. data/plugins/communicators/winrm/command_filters/test.rb +68 -0
  350. data/plugins/communicators/winrm/command_filters/uname.rb +30 -0
  351. data/plugins/communicators/winrm/command_filters/which.rb +27 -0
  352. data/plugins/communicators/winrm/communicator.rb +230 -0
  353. data/plugins/communicators/winrm/config.rb +76 -0
  354. data/plugins/communicators/winrm/errors.rb +72 -0
  355. data/plugins/communicators/winrm/helper.rb +91 -0
  356. data/plugins/communicators/winrm/plugin.rb +69 -0
  357. data/plugins/communicators/winrm/shell.rb +267 -0
  358. data/plugins/communicators/winssh/communicator.rb +252 -0
  359. data/plugins/communicators/winssh/config.rb +37 -0
  360. data/plugins/communicators/winssh/plugin.rb +24 -0
  361. data/plugins/guests/alma/cap/flavor.rb +26 -0
  362. data/plugins/guests/alma/guest.rb +13 -0
  363. data/plugins/guests/alma/plugin.rb +23 -0
  364. data/plugins/guests/alpine/cap/change_host_name.rb +85 -0
  365. data/plugins/guests/alpine/cap/configure_networks.rb +67 -0
  366. data/plugins/guests/alpine/cap/halt.rb +24 -0
  367. data/plugins/guests/alpine/cap/nfs_client.rb +17 -0
  368. data/plugins/guests/alpine/cap/rsync.rb +20 -0
  369. data/plugins/guests/alpine/cap/smb.rb +16 -0
  370. data/plugins/guests/alpine/guest.rb +14 -0
  371. data/plugins/guests/alpine/plugin.rb +69 -0
  372. data/plugins/guests/alt/cap/change_host_name.rb +55 -0
  373. data/plugins/guests/alt/cap/configure_networks.rb +132 -0
  374. data/plugins/guests/alt/cap/flavor.rb +66 -0
  375. data/plugins/guests/alt/cap/network_scripts_dir.rb +14 -0
  376. data/plugins/guests/alt/cap/rsync.rb +16 -0
  377. data/plugins/guests/alt/guest.rb +12 -0
  378. data/plugins/guests/alt/plugin.rb +43 -0
  379. data/plugins/guests/amazon/cap/configure_networks.rb +26 -0
  380. data/plugins/guests/amazon/cap/flavor.rb +17 -0
  381. data/plugins/guests/amazon/guest.rb +12 -0
  382. data/plugins/guests/amazon/plugin.rb +28 -0
  383. data/plugins/guests/arch/cap/change_host_name.rb +18 -0
  384. data/plugins/guests/arch/cap/configure_networks.rb +81 -0
  385. data/plugins/guests/arch/cap/nfs.rb +36 -0
  386. data/plugins/guests/arch/cap/rsync.rb +19 -0
  387. data/plugins/guests/arch/cap/smb.rb +20 -0
  388. data/plugins/guests/arch/guest.rb +14 -0
  389. data/plugins/guests/arch/plugin.rb +53 -0
  390. data/plugins/guests/atomic/cap/change_host_name.rb +18 -0
  391. data/plugins/guests/atomic/cap/docker.rb +14 -0
  392. data/plugins/guests/atomic/guest.rb +14 -0
  393. data/plugins/guests/atomic/plugin.rb +28 -0
  394. data/plugins/guests/bsd/cap/file_system.rb +80 -0
  395. data/plugins/guests/bsd/cap/halt.rb +19 -0
  396. data/plugins/guests/bsd/cap/mount_virtualbox_shared_folder.rb +19 -0
  397. data/plugins/guests/bsd/cap/nfs.rb +50 -0
  398. data/plugins/guests/bsd/cap/public_key.rb +69 -0
  399. data/plugins/guests/bsd/guest.rb +12 -0
  400. data/plugins/guests/bsd/plugin.rb +58 -0
  401. data/plugins/guests/centos/cap/flavor.rb +32 -0
  402. data/plugins/guests/centos/guest.rb +14 -0
  403. data/plugins/guests/centos/plugin.rb +23 -0
  404. data/plugins/guests/coreos/cap/change_host_name.rb +41 -0
  405. data/plugins/guests/coreos/cap/configure_networks.rb +138 -0
  406. data/plugins/guests/coreos/cap/docker.rb +14 -0
  407. data/plugins/guests/coreos/guest.rb +14 -0
  408. data/plugins/guests/coreos/plugin.rb +33 -0
  409. data/plugins/guests/darwin/cap/change_host_name.rb +43 -0
  410. data/plugins/guests/darwin/cap/choose_addressable_ip_addr.rb +23 -0
  411. data/plugins/guests/darwin/cap/configure_networks.rb +126 -0
  412. data/plugins/guests/darwin/cap/darwin_version.rb +43 -0
  413. data/plugins/guests/darwin/cap/halt.rb +21 -0
  414. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +46 -0
  415. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +135 -0
  416. data/plugins/guests/darwin/cap/rsync.rb +14 -0
  417. data/plugins/guests/darwin/cap/shell_expand_guest_path.rb +30 -0
  418. data/plugins/guests/darwin/cap/verify_vmware_hgfs.rb +15 -0
  419. data/plugins/guests/darwin/guest.rb +18 -0
  420. data/plugins/guests/darwin/plugin.rb +93 -0
  421. data/plugins/guests/debian/cap/change_host_name.rb +110 -0
  422. data/plugins/guests/debian/cap/configure_networks.rb +205 -0
  423. data/plugins/guests/debian/cap/nfs.rb +19 -0
  424. data/plugins/guests/debian/cap/rsync.rb +18 -0
  425. data/plugins/guests/debian/cap/smb.rb +20 -0
  426. data/plugins/guests/debian/guest.rb +13 -0
  427. data/plugins/guests/debian/plugin.rb +43 -0
  428. data/plugins/guests/dragonflybsd/guest.rb +12 -0
  429. data/plugins/guests/dragonflybsd/plugin.rb +18 -0
  430. data/plugins/guests/elementary/guest.rb +13 -0
  431. data/plugins/guests/elementary/plugin.rb +18 -0
  432. data/plugins/guests/esxi/cap/change_host_name.rb +16 -0
  433. data/plugins/guests/esxi/cap/configure_networks.rb +41 -0
  434. data/plugins/guests/esxi/cap/halt.rb +19 -0
  435. data/plugins/guests/esxi/cap/mount_nfs_folder.rb +43 -0
  436. data/plugins/guests/esxi/cap/public_key.rb +68 -0
  437. data/plugins/guests/esxi/guest.rb +14 -0
  438. data/plugins/guests/esxi/plugin.rb +49 -0
  439. data/plugins/guests/fedora/cap/flavor.rb +26 -0
  440. data/plugins/guests/fedora/guest.rb +14 -0
  441. data/plugins/guests/fedora/plugin.rb +23 -0
  442. data/plugins/guests/freebsd/cap/change_host_name.rb +34 -0
  443. data/plugins/guests/freebsd/cap/configure_networks.rb +70 -0
  444. data/plugins/guests/freebsd/cap/mount_virtualbox_shared_folder.rb +79 -0
  445. data/plugins/guests/freebsd/cap/rsync.rb +18 -0
  446. data/plugins/guests/freebsd/cap/shell_expand_guest_path.rb +31 -0
  447. data/plugins/guests/freebsd/guest.rb +17 -0
  448. data/plugins/guests/freebsd/plugin.rb +68 -0
  449. data/plugins/guests/funtoo/cap/configure_networks.rb +50 -0
  450. data/plugins/guests/funtoo/guest.rb +12 -0
  451. data/plugins/guests/funtoo/plugin.rb +23 -0
  452. data/plugins/guests/gentoo/cap/change_host_name.rb +27 -0
  453. data/plugins/guests/gentoo/cap/configure_networks.rb +92 -0
  454. data/plugins/guests/gentoo/guest.rb +12 -0
  455. data/plugins/guests/gentoo/plugin.rb +28 -0
  456. data/plugins/guests/haiku/cap/change_host_name.rb +36 -0
  457. data/plugins/guests/haiku/cap/halt.rb +19 -0
  458. data/plugins/guests/haiku/cap/insert_public_key.rb +24 -0
  459. data/plugins/guests/haiku/cap/remove_public_key.rb +24 -0
  460. data/plugins/guests/haiku/cap/rsync.rb +22 -0
  461. data/plugins/guests/haiku/guest.rb +14 -0
  462. data/plugins/guests/haiku/plugin.rb +53 -0
  463. data/plugins/guests/kali/guest.rb +13 -0
  464. data/plugins/guests/kali/plugin.rb +18 -0
  465. data/plugins/guests/linux/cap/change_host_name.rb +49 -0
  466. data/plugins/guests/linux/cap/choose_addressable_ip_addr.rb +22 -0
  467. data/plugins/guests/linux/cap/file_system.rb +82 -0
  468. data/plugins/guests/linux/cap/halt.rb +27 -0
  469. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +95 -0
  470. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +78 -0
  471. data/plugins/guests/linux/cap/network_interfaces.rb +89 -0
  472. data/plugins/guests/linux/cap/nfs.rb +51 -0
  473. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +77 -0
  474. data/plugins/guests/linux/cap/port.rb +14 -0
  475. data/plugins/guests/linux/cap/public_key.rb +65 -0
  476. data/plugins/guests/linux/cap/read_ip_address.rb +28 -0
  477. data/plugins/guests/linux/cap/reboot.rb +74 -0
  478. data/plugins/guests/linux/cap/rsync.rb +14 -0
  479. data/plugins/guests/linux/cap/shell_expand_guest_path.rb +35 -0
  480. data/plugins/guests/linux/guest.rb +26 -0
  481. data/plugins/guests/linux/plugin.rb +139 -0
  482. data/plugins/guests/mint/guest.rb +13 -0
  483. data/plugins/guests/mint/plugin.rb +18 -0
  484. data/plugins/guests/netbsd/cap/change_host_name.rb +20 -0
  485. data/plugins/guests/netbsd/cap/configure_networks.rb +56 -0
  486. data/plugins/guests/netbsd/cap/rsync.rb +23 -0
  487. data/plugins/guests/netbsd/cap/shell_expand_guest_path.rb +30 -0
  488. data/plugins/guests/netbsd/guest.rb +14 -0
  489. data/plugins/guests/netbsd/plugin.rb +58 -0
  490. data/plugins/guests/nixos/cap/change_host_name.rb +47 -0
  491. data/plugins/guests/nixos/cap/configure_networks.rb +135 -0
  492. data/plugins/guests/nixos/cap/nfs_client.rb +14 -0
  493. data/plugins/guests/nixos/guest.rb +20 -0
  494. data/plugins/guests/nixos/plugin.rb +33 -0
  495. data/plugins/guests/omnios/cap/change_host_name.rb +23 -0
  496. data/plugins/guests/omnios/cap/mount_nfs_folder.rb +24 -0
  497. data/plugins/guests/omnios/cap/rsync.rb +14 -0
  498. data/plugins/guests/omnios/guest.rb +12 -0
  499. data/plugins/guests/omnios/plugin.rb +33 -0
  500. data/plugins/guests/openbsd/cap/change_host_name.rb +35 -0
  501. data/plugins/guests/openbsd/cap/configure_networks.rb +49 -0
  502. data/plugins/guests/openbsd/cap/halt.rb +22 -0
  503. data/plugins/guests/openbsd/cap/rsync.rb +32 -0
  504. data/plugins/guests/openbsd/cap/shell_expand_guest_path.rb +30 -0
  505. data/plugins/guests/openbsd/guest.rb +14 -0
  506. data/plugins/guests/openbsd/plugin.rb +63 -0
  507. data/plugins/guests/openwrt/cap/change_host_name.rb +22 -0
  508. data/plugins/guests/openwrt/cap/halt.rb +19 -0
  509. data/plugins/guests/openwrt/cap/insert_public_key.rb +23 -0
  510. data/plugins/guests/openwrt/cap/remove_public_key.rb +25 -0
  511. data/plugins/guests/openwrt/cap/rsync.rb +38 -0
  512. data/plugins/guests/openwrt/guest.rb +26 -0
  513. data/plugins/guests/openwrt/plugin.rb +64 -0
  514. data/plugins/guests/photon/cap/change_host_name.rb +22 -0
  515. data/plugins/guests/photon/cap/configure_networks.rb +33 -0
  516. data/plugins/guests/photon/cap/docker.rb +14 -0
  517. data/plugins/guests/photon/guest.rb +12 -0
  518. data/plugins/guests/photon/plugin.rb +33 -0
  519. data/plugins/guests/pld/cap/change_host_name.rb +26 -0
  520. data/plugins/guests/pld/cap/flavor.rb +14 -0
  521. data/plugins/guests/pld/cap/network_scripts_dir.rb +14 -0
  522. data/plugins/guests/pld/guest.rb +12 -0
  523. data/plugins/guests/pld/plugin.rb +33 -0
  524. data/plugins/guests/redhat/cap/change_host_name.rb +59 -0
  525. data/plugins/guests/redhat/cap/configure_networks.rb +113 -0
  526. data/plugins/guests/redhat/cap/flavor.rb +32 -0
  527. data/plugins/guests/redhat/cap/network_scripts_dir.rb +18 -0
  528. data/plugins/guests/redhat/cap/nfs_client.rb +33 -0
  529. data/plugins/guests/redhat/cap/rsync.rb +20 -0
  530. data/plugins/guests/redhat/cap/smb.rb +23 -0
  531. data/plugins/guests/redhat/guest.rb +12 -0
  532. data/plugins/guests/redhat/plugin.rb +53 -0
  533. data/plugins/guests/rocky/cap/flavor.rb +26 -0
  534. data/plugins/guests/rocky/guest.rb +13 -0
  535. data/plugins/guests/rocky/plugin.rb +23 -0
  536. data/plugins/guests/slackware/cap/change_host_name.rb +24 -0
  537. data/plugins/guests/slackware/cap/configure_networks.rb +51 -0
  538. data/plugins/guests/slackware/guest.rb +12 -0
  539. data/plugins/guests/slackware/plugin.rb +28 -0
  540. data/plugins/guests/smartos/cap/change_host_name.rb +29 -0
  541. data/plugins/guests/smartos/cap/configure_networks.rb +30 -0
  542. data/plugins/guests/smartos/cap/halt.rb +25 -0
  543. data/plugins/guests/smartos/cap/insert_public_key.rb +31 -0
  544. data/plugins/guests/smartos/cap/mount_nfs.rb +31 -0
  545. data/plugins/guests/smartos/cap/remove_public_key.rb +28 -0
  546. data/plugins/guests/smartos/cap/rsync.rb +36 -0
  547. data/plugins/guests/smartos/config.rb +18 -0
  548. data/plugins/guests/smartos/guest.rb +14 -0
  549. data/plugins/guests/smartos/plugin.rb +74 -0
  550. data/plugins/guests/solaris/cap/change_host_name.rb +20 -0
  551. data/plugins/guests/solaris/cap/configure_networks.rb +28 -0
  552. data/plugins/guests/solaris/cap/file_system.rb +80 -0
  553. data/plugins/guests/solaris/cap/halt.rb +25 -0
  554. data/plugins/guests/solaris/cap/insert_public_key.rb +25 -0
  555. data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +44 -0
  556. data/plugins/guests/solaris/cap/remove_public_key.rb +25 -0
  557. data/plugins/guests/solaris/cap/rsync.rb +36 -0
  558. data/plugins/guests/solaris/config.rb +34 -0
  559. data/plugins/guests/solaris/guest.rb +17 -0
  560. data/plugins/guests/solaris/plugin.rb +88 -0
  561. data/plugins/guests/solaris11/cap/change_host_name.rb +26 -0
  562. data/plugins/guests/solaris11/cap/configure_networks.rb +37 -0
  563. data/plugins/guests/solaris11/config.rb +37 -0
  564. data/plugins/guests/solaris11/guest.rb +22 -0
  565. data/plugins/guests/solaris11/plugin.rb +42 -0
  566. data/plugins/guests/suse/cap/change_host_name.rb +48 -0
  567. data/plugins/guests/suse/cap/configure_networks.rb +53 -0
  568. data/plugins/guests/suse/cap/halt.rb +23 -0
  569. data/plugins/guests/suse/cap/network_scripts_dir.rb +14 -0
  570. data/plugins/guests/suse/cap/nfs_client.rb +18 -0
  571. data/plugins/guests/suse/cap/rsync.rb +18 -0
  572. data/plugins/guests/suse/guest.rb +12 -0
  573. data/plugins/guests/suse/plugin.rb +53 -0
  574. data/plugins/guests/tinycore/cap/change_host_name.rb +16 -0
  575. data/plugins/guests/tinycore/cap/configure_networks.rb +29 -0
  576. data/plugins/guests/tinycore/cap/halt.rb +19 -0
  577. data/plugins/guests/tinycore/cap/mount_nfs.rb +44 -0
  578. data/plugins/guests/tinycore/cap/rsync.rb +20 -0
  579. data/plugins/guests/tinycore/guest.rb +13 -0
  580. data/plugins/guests/tinycore/plugin.rb +43 -0
  581. data/plugins/guests/trisquel/guest.rb +12 -0
  582. data/plugins/guests/trisquel/plugin.rb +18 -0
  583. data/plugins/guests/ubuntu/guest.rb +13 -0
  584. data/plugins/guests/ubuntu/plugin.rb +18 -0
  585. data/plugins/guests/windows/cap/change_host_name.rb +36 -0
  586. data/plugins/guests/windows/cap/choose_addressable_ip_addr.rb +23 -0
  587. data/plugins/guests/windows/cap/configure_networks.rb +83 -0
  588. data/plugins/guests/windows/cap/file_system.rb +68 -0
  589. data/plugins/guests/windows/cap/halt.rb +19 -0
  590. data/plugins/guests/windows/cap/mount_shared_folder.rb +60 -0
  591. data/plugins/guests/windows/cap/public_key.rb +87 -0
  592. data/plugins/guests/windows/cap/reboot.rb +63 -0
  593. data/plugins/guests/windows/cap/rsync.rb +29 -0
  594. data/plugins/guests/windows/config.rb +26 -0
  595. data/plugins/guests/windows/errors.rb +25 -0
  596. data/plugins/guests/windows/guest.rb +13 -0
  597. data/plugins/guests/windows/guest_network.rb +128 -0
  598. data/plugins/guests/windows/plugin.rb +116 -0
  599. data/plugins/guests/windows/scripts/mount_volume.ps1.erb +48 -0
  600. data/plugins/guests/windows/scripts/reboot_detect.ps1 +50 -0
  601. data/plugins/guests/windows/scripts/set_work_network.ps1 +9 -0
  602. data/plugins/guests/windows/scripts/winrs_v3_get_adapters.ps1 +14 -0
  603. data/plugins/hosts/alt/cap/nfs.rb +46 -0
  604. data/plugins/hosts/alt/host.rb +14 -0
  605. data/plugins/hosts/alt/plugin.rb +35 -0
  606. data/plugins/hosts/arch/cap/nfs.rb +22 -0
  607. data/plugins/hosts/arch/host.rb +14 -0
  608. data/plugins/hosts/arch/plugin.rb +35 -0
  609. data/plugins/hosts/bsd/cap/nfs.rb +218 -0
  610. data/plugins/hosts/bsd/cap/path.rb +14 -0
  611. data/plugins/hosts/bsd/cap/ssh.rb +19 -0
  612. data/plugins/hosts/bsd/host.rb +15 -0
  613. data/plugins/hosts/bsd/plugin.rb +63 -0
  614. data/plugins/hosts/darwin/cap/configured_ip_addresses.rb +21 -0
  615. data/plugins/hosts/darwin/cap/fs_iso.rb +52 -0
  616. data/plugins/hosts/darwin/cap/nfs.rb +14 -0
  617. data/plugins/hosts/darwin/cap/path.rb +66 -0
  618. data/plugins/hosts/darwin/cap/provider_install_virtualbox.rb +64 -0
  619. data/plugins/hosts/darwin/cap/rdp.rb +64 -0
  620. data/plugins/hosts/darwin/cap/smb.rb +128 -0
  621. data/plugins/hosts/darwin/cap/version.rb +26 -0
  622. data/plugins/hosts/darwin/host.rb +14 -0
  623. data/plugins/hosts/darwin/plugin.rb +83 -0
  624. data/plugins/hosts/darwin/scripts/install_virtualbox.sh +18 -0
  625. data/plugins/hosts/freebsd/cap/nfs.rb +34 -0
  626. data/plugins/hosts/freebsd/host.rb +15 -0
  627. data/plugins/hosts/freebsd/plugin.rb +34 -0
  628. data/plugins/hosts/gentoo/cap/nfs.rb +42 -0
  629. data/plugins/hosts/gentoo/host.rb +14 -0
  630. data/plugins/hosts/gentoo/plugin.rb +31 -0
  631. data/plugins/hosts/linux/cap/fs_iso.rb +52 -0
  632. data/plugins/hosts/linux/cap/nfs.rb +296 -0
  633. data/plugins/hosts/linux/cap/rdp.rb +59 -0
  634. data/plugins/hosts/linux/cap/ssh.rb +19 -0
  635. data/plugins/hosts/linux/host.rb +15 -0
  636. data/plugins/hosts/linux/plugin.rb +70 -0
  637. data/plugins/hosts/null/host.rb +15 -0
  638. data/plugins/hosts/null/plugin.rb +18 -0
  639. data/plugins/hosts/redhat/cap/nfs.rb +58 -0
  640. data/plugins/hosts/redhat/host.rb +31 -0
  641. data/plugins/hosts/redhat/plugin.rb +30 -0
  642. data/plugins/hosts/slackware/cap/nfs.rb +18 -0
  643. data/plugins/hosts/slackware/host.rb +15 -0
  644. data/plugins/hosts/slackware/plugin.rb +30 -0
  645. data/plugins/hosts/suse/cap/nfs.rb +22 -0
  646. data/plugins/hosts/suse/host.rb +30 -0
  647. data/plugins/hosts/suse/plugin.rb +33 -0
  648. data/plugins/hosts/void/cap/nfs.rb +27 -0
  649. data/plugins/hosts/void/host.rb +23 -0
  650. data/plugins/hosts/void/plugin.rb +33 -0
  651. data/plugins/hosts/windows/cap/configured_ip_addresses.rb +32 -0
  652. data/plugins/hosts/windows/cap/fs_iso.rb +51 -0
  653. data/plugins/hosts/windows/cap/nfs.rb +14 -0
  654. data/plugins/hosts/windows/cap/provider_install_virtualbox.rb +65 -0
  655. data/plugins/hosts/windows/cap/ps.rb +50 -0
  656. data/plugins/hosts/windows/cap/rdp.rb +33 -0
  657. data/plugins/hosts/windows/cap/smb.rb +203 -0
  658. data/plugins/hosts/windows/cap/ssh.rb +29 -0
  659. data/plugins/hosts/windows/host.rb +26 -0
  660. data/plugins/hosts/windows/plugin.rb +83 -0
  661. data/plugins/hosts/windows/scripts/check_credentials.ps1 +37 -0
  662. data/plugins/hosts/windows/scripts/host_info.ps1 +24 -0
  663. data/plugins/hosts/windows/scripts/install_virtualbox.ps1 +40 -0
  664. data/plugins/hosts/windows/scripts/set_share.ps1 +40 -0
  665. data/plugins/hosts/windows/scripts/set_ssh_key_permissions.ps1 +20 -0
  666. data/plugins/hosts/windows/scripts/unset_share.ps1 +13 -0
  667. data/plugins/hosts/windows/scripts/utils/VagrantSSH/VagrantSSH.psm1 +29 -0
  668. data/plugins/kernel_v1/config/nfs.rb +23 -0
  669. data/plugins/kernel_v1/config/package.rb +20 -0
  670. data/plugins/kernel_v1/config/ssh.rb +50 -0
  671. data/plugins/kernel_v1/config/vagrant.rb +34 -0
  672. data/plugins/kernel_v1/config/vm.rb +191 -0
  673. data/plugins/kernel_v1/plugin.rb +47 -0
  674. data/plugins/kernel_v2/config/cloud_init.rb +136 -0
  675. data/plugins/kernel_v2/config/disk.rb +224 -0
  676. data/plugins/kernel_v2/config/package.rb +24 -0
  677. data/plugins/kernel_v2/config/push.rb +155 -0
  678. data/plugins/kernel_v2/config/ssh.rb +93 -0
  679. data/plugins/kernel_v2/config/ssh_connect.rb +194 -0
  680. data/plugins/kernel_v2/config/trigger.rb +214 -0
  681. data/plugins/kernel_v2/config/vagrant.rb +99 -0
  682. data/plugins/kernel_v2/config/vm.rb +1062 -0
  683. data/plugins/kernel_v2/config/vm_provisioner.rb +202 -0
  684. data/plugins/kernel_v2/config/vm_subvm.rb +33 -0
  685. data/plugins/kernel_v2/config/vm_trigger.rb +297 -0
  686. data/plugins/kernel_v2/plugin.rb +71 -0
  687. data/plugins/providers/docker/action/build.rb +99 -0
  688. data/plugins/providers/docker/action/compare_synced_folders.rb +65 -0
  689. data/plugins/providers/docker/action/connect_networks.rb +80 -0
  690. data/plugins/providers/docker/action/create.rb +162 -0
  691. data/plugins/providers/docker/action/destroy.rb +34 -0
  692. data/plugins/providers/docker/action/destroy_build_image.rb +51 -0
  693. data/plugins/providers/docker/action/destroy_network.rb +53 -0
  694. data/plugins/providers/docker/action/forwarded_ports.rb +36 -0
  695. data/plugins/providers/docker/action/has_ssh.rb +21 -0
  696. data/plugins/providers/docker/action/host_machine.rb +75 -0
  697. data/plugins/providers/docker/action/host_machine_build_dir.rb +48 -0
  698. data/plugins/providers/docker/action/host_machine_port_checker.rb +34 -0
  699. data/plugins/providers/docker/action/host_machine_port_warning.rb +40 -0
  700. data/plugins/providers/docker/action/host_machine_required.rb +20 -0
  701. data/plugins/providers/docker/action/host_machine_sync_folders.rb +175 -0
  702. data/plugins/providers/docker/action/host_machine_sync_folders_disable.rb +91 -0
  703. data/plugins/providers/docker/action/init_state.rb +23 -0
  704. data/plugins/providers/docker/action/is_build.rb +19 -0
  705. data/plugins/providers/docker/action/is_host_machine_created.rb +32 -0
  706. data/plugins/providers/docker/action/login.rb +51 -0
  707. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +64 -0
  708. data/plugins/providers/docker/action/prepare_networks.rb +372 -0
  709. data/plugins/providers/docker/action/prepare_nfs_settings.rb +60 -0
  710. data/plugins/providers/docker/action/prepare_nfs_valid_ids.rb +22 -0
  711. data/plugins/providers/docker/action/prepare_ssh.rb +48 -0
  712. data/plugins/providers/docker/action/pull.rb +30 -0
  713. data/plugins/providers/docker/action/start.rb +24 -0
  714. data/plugins/providers/docker/action/stop.rb +24 -0
  715. data/plugins/providers/docker/action/wait_for_running.rb +70 -0
  716. data/plugins/providers/docker/action.rb +319 -0
  717. data/plugins/providers/docker/cap/has_communicator.rb +14 -0
  718. data/plugins/providers/docker/cap/proxy_machine.rb +15 -0
  719. data/plugins/providers/docker/cap/public_address.rb +26 -0
  720. data/plugins/providers/docker/command/exec.rb +112 -0
  721. data/plugins/providers/docker/command/logs.rb +111 -0
  722. data/plugins/providers/docker/command/run.rb +76 -0
  723. data/plugins/providers/docker/communicator.rb +199 -0
  724. data/plugins/providers/docker/config.rb +362 -0
  725. data/plugins/providers/docker/driver/compose.rb +315 -0
  726. data/plugins/providers/docker/driver.rb +416 -0
  727. data/plugins/providers/docker/errors.rb +108 -0
  728. data/plugins/providers/docker/executor/local.rb +48 -0
  729. data/plugins/providers/docker/executor/vagrant.rb +88 -0
  730. data/plugins/providers/docker/hostmachine/Vagrantfile +3 -0
  731. data/plugins/providers/docker/plugin.rb +89 -0
  732. data/plugins/providers/docker/provider.rb +215 -0
  733. data/plugins/providers/docker/synced_folder.rb +35 -0
  734. data/plugins/providers/hyperv/action/check_access.rb +27 -0
  735. data/plugins/providers/hyperv/action/check_enabled.rb +25 -0
  736. data/plugins/providers/hyperv/action/configure.rb +115 -0
  737. data/plugins/providers/hyperv/action/delete_vm.rb +28 -0
  738. data/plugins/providers/hyperv/action/export.rb +45 -0
  739. data/plugins/providers/hyperv/action/import.rb +86 -0
  740. data/plugins/providers/hyperv/action/is_windows.rb +19 -0
  741. data/plugins/providers/hyperv/action/message_will_not_destroy.rb +20 -0
  742. data/plugins/providers/hyperv/action/net_set_mac.rb +23 -0
  743. data/plugins/providers/hyperv/action/net_set_vlan.rb +23 -0
  744. data/plugins/providers/hyperv/action/package.rb +19 -0
  745. data/plugins/providers/hyperv/action/package_metadata_json.rb +37 -0
  746. data/plugins/providers/hyperv/action/package_setup_files.rb +19 -0
  747. data/plugins/providers/hyperv/action/package_setup_folders.rb +21 -0
  748. data/plugins/providers/hyperv/action/package_vagrantfile.rb +37 -0
  749. data/plugins/providers/hyperv/action/read_guest_ip.rb +45 -0
  750. data/plugins/providers/hyperv/action/read_state.rb +33 -0
  751. data/plugins/providers/hyperv/action/resume_vm.rb +20 -0
  752. data/plugins/providers/hyperv/action/set_name.rb +46 -0
  753. data/plugins/providers/hyperv/action/snapshot_delete.rb +30 -0
  754. data/plugins/providers/hyperv/action/snapshot_restore.rb +26 -0
  755. data/plugins/providers/hyperv/action/snapshot_save.rb +30 -0
  756. data/plugins/providers/hyperv/action/start_instance.rb +20 -0
  757. data/plugins/providers/hyperv/action/stop_instance.rb +20 -0
  758. data/plugins/providers/hyperv/action/suspend_vm.rb +20 -0
  759. data/plugins/providers/hyperv/action/wait_for_ip_address.rb +62 -0
  760. data/plugins/providers/hyperv/action.rb +326 -0
  761. data/plugins/providers/hyperv/cap/cleanup_disks.rb +92 -0
  762. data/plugins/providers/hyperv/cap/configure_disks.rb +248 -0
  763. data/plugins/providers/hyperv/cap/public_address.rb +18 -0
  764. data/plugins/providers/hyperv/cap/snapshot_list.rb +14 -0
  765. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +37 -0
  766. data/plugins/providers/hyperv/config.rb +148 -0
  767. data/plugins/providers/hyperv/driver.rb +368 -0
  768. data/plugins/providers/hyperv/errors.rb +49 -0
  769. data/plugins/providers/hyperv/plugin.rb +74 -0
  770. data/plugins/providers/hyperv/provider.rb +116 -0
  771. data/plugins/providers/hyperv/scripts/add_dvd.ps1 +18 -0
  772. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +31 -0
  773. data/plugins/providers/hyperv/scripts/check_hyperv.ps1 +11 -0
  774. data/plugins/providers/hyperv/scripts/check_hyperv_access.ps1 +17 -0
  775. data/plugins/providers/hyperv/scripts/clone_vhd.ps1 +21 -0
  776. data/plugins/providers/hyperv/scripts/configure_vm.ps1 +130 -0
  777. data/plugins/providers/hyperv/scripts/create_snapshot.ps1 +27 -0
  778. data/plugins/providers/hyperv/scripts/delete_snapshot.ps1 +19 -0
  779. data/plugins/providers/hyperv/scripts/delete_vm.ps1 +22 -0
  780. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +16 -0
  781. data/plugins/providers/hyperv/scripts/export_vm.ps1 +32 -0
  782. data/plugins/providers/hyperv/scripts/file_sync.ps1 +123 -0
  783. data/plugins/providers/hyperv/scripts/get_network_config.ps1 +68 -0
  784. data/plugins/providers/hyperv/scripts/get_network_mac.ps1 +35 -0
  785. data/plugins/providers/hyperv/scripts/get_scsi_controller.ps1 +19 -0
  786. data/plugins/providers/hyperv/scripts/get_switches.ps1 +13 -0
  787. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +19 -0
  788. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +52 -0
  789. data/plugins/providers/hyperv/scripts/has_vmcx_support.ps1 +12 -0
  790. data/plugins/providers/hyperv/scripts/import_vm.ps1 +40 -0
  791. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +20 -0
  792. data/plugins/providers/hyperv/scripts/list_snapshots.ps1 +22 -0
  793. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +34 -0
  794. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +28 -0
  795. data/plugins/providers/hyperv/scripts/remove_dvd.ps1 +21 -0
  796. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +21 -0
  797. data/plugins/providers/hyperv/scripts/restore_snapshot.ps1 +20 -0
  798. data/plugins/providers/hyperv/scripts/resume_vm.ps1 +19 -0
  799. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +36 -0
  800. data/plugins/providers/hyperv/scripts/set_name.ps1 +27 -0
  801. data/plugins/providers/hyperv/scripts/set_network_mac.ps1 +21 -0
  802. data/plugins/providers/hyperv/scripts/set_network_vlan.ps1 +19 -0
  803. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +30 -0
  804. data/plugins/providers/hyperv/scripts/start_vm.ps1 +29 -0
  805. data/plugins/providers/hyperv/scripts/stop_vm.ps1 +20 -0
  806. data/plugins/providers/hyperv/scripts/suspend_vm.ps1 +19 -0
  807. data/plugins/providers/hyperv/scripts/utils/VagrantMessages/VagrantMessages.psm1 +27 -0
  808. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +776 -0
  809. data/plugins/providers/virtualbox/action/boot.rb +26 -0
  810. data/plugins/providers/virtualbox/action/check_accessible.rb +26 -0
  811. data/plugins/providers/virtualbox/action/check_created.rb +24 -0
  812. data/plugins/providers/virtualbox/action/check_guest_additions.rb +58 -0
  813. data/plugins/providers/virtualbox/action/check_running.rb +24 -0
  814. data/plugins/providers/virtualbox/action/check_virtualbox.rb +28 -0
  815. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +55 -0
  816. data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +23 -0
  817. data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +34 -0
  818. data/plugins/providers/virtualbox/action/created.rb +23 -0
  819. data/plugins/providers/virtualbox/action/customize.rb +48 -0
  820. data/plugins/providers/virtualbox/action/destroy.rb +22 -0
  821. data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +26 -0
  822. data/plugins/providers/virtualbox/action/discard_state.rb +23 -0
  823. data/plugins/providers/virtualbox/action/export.rb +54 -0
  824. data/plugins/providers/virtualbox/action/forced_halt.rb +28 -0
  825. data/plugins/providers/virtualbox/action/forward_ports.rb +92 -0
  826. data/plugins/providers/virtualbox/action/import.rb +110 -0
  827. data/plugins/providers/virtualbox/action/import_master.rb +83 -0
  828. data/plugins/providers/virtualbox/action/is_paused.rb +23 -0
  829. data/plugins/providers/virtualbox/action/is_running.rb +23 -0
  830. data/plugins/providers/virtualbox/action/is_saved.rb +23 -0
  831. data/plugins/providers/virtualbox/action/match_mac_address.rb +30 -0
  832. data/plugins/providers/virtualbox/action/message_already_running.rb +19 -0
  833. data/plugins/providers/virtualbox/action/message_not_created.rb +19 -0
  834. data/plugins/providers/virtualbox/action/message_not_running.rb +19 -0
  835. data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +20 -0
  836. data/plugins/providers/virtualbox/action/network.rb +638 -0
  837. data/plugins/providers/virtualbox/action/network_fix_ipv6.rb +87 -0
  838. data/plugins/providers/virtualbox/action/package.rb +19 -0
  839. data/plugins/providers/virtualbox/action/package_setup_files.rb +19 -0
  840. data/plugins/providers/virtualbox/action/package_setup_folders.rb +21 -0
  841. data/plugins/providers/virtualbox/action/package_vagrantfile.rb +36 -0
  842. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +69 -0
  843. data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +38 -0
  844. data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +162 -0
  845. data/plugins/providers/virtualbox/action/prepare_nfs_valid_ids.rb +20 -0
  846. data/plugins/providers/virtualbox/action/resume.rb +28 -0
  847. data/plugins/providers/virtualbox/action/sane_defaults.rb +92 -0
  848. data/plugins/providers/virtualbox/action/set_default_nic_type.rb +72 -0
  849. data/plugins/providers/virtualbox/action/set_name.rb +58 -0
  850. data/plugins/providers/virtualbox/action/setup_package_files.rb +20 -0
  851. data/plugins/providers/virtualbox/action/snapshot_delete.rb +37 -0
  852. data/plugins/providers/virtualbox/action/snapshot_restore.rb +33 -0
  853. data/plugins/providers/virtualbox/action/snapshot_save.rb +28 -0
  854. data/plugins/providers/virtualbox/action/suspend.rb +23 -0
  855. data/plugins/providers/virtualbox/action.rb +433 -0
  856. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +86 -0
  857. data/plugins/providers/virtualbox/cap/configure_disks.rb +441 -0
  858. data/plugins/providers/virtualbox/cap/mount_options.rb +43 -0
  859. data/plugins/providers/virtualbox/cap/public_address.rb +18 -0
  860. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +37 -0
  861. data/plugins/providers/virtualbox/cap.rb +40 -0
  862. data/plugins/providers/virtualbox/config.rb +211 -0
  863. data/plugins/providers/virtualbox/driver/base.rb +530 -0
  864. data/plugins/providers/virtualbox/driver/meta.rb +212 -0
  865. data/plugins/providers/virtualbox/driver/version_4_0.rb +574 -0
  866. data/plugins/providers/virtualbox/driver/version_4_1.rb +699 -0
  867. data/plugins/providers/virtualbox/driver/version_4_2.rb +713 -0
  868. data/plugins/providers/virtualbox/driver/version_4_3.rb +757 -0
  869. data/plugins/providers/virtualbox/driver/version_5_0.rb +1022 -0
  870. data/plugins/providers/virtualbox/driver/version_5_1.rb +19 -0
  871. data/plugins/providers/virtualbox/driver/version_5_2.rb +19 -0
  872. data/plugins/providers/virtualbox/driver/version_6_0.rb +105 -0
  873. data/plugins/providers/virtualbox/driver/version_6_1.rb +42 -0
  874. data/plugins/providers/virtualbox/driver/version_7_0.rb +306 -0
  875. data/plugins/providers/virtualbox/driver/version_7_1.rb +19 -0
  876. data/plugins/providers/virtualbox/model/forwarded_port.rb +73 -0
  877. data/plugins/providers/virtualbox/model/storage_controller.rb +138 -0
  878. data/plugins/providers/virtualbox/model/storage_controller_array.rb +101 -0
  879. data/plugins/providers/virtualbox/plugin.rb +120 -0
  880. data/plugins/providers/virtualbox/provider.rb +133 -0
  881. data/plugins/providers/virtualbox/synced_folder.rb +153 -0
  882. data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +40 -0
  883. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +47 -0
  884. data/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +44 -0
  885. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +56 -0
  886. data/plugins/provisioners/ansible/cap/guest/facts.rb +27 -0
  887. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +43 -0
  888. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +26 -0
  889. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +49 -0
  890. data/plugins/provisioners/ansible/cap/guest/posix/ansible_installed.rb +28 -0
  891. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +75 -0
  892. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +26 -0
  893. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +42 -0
  894. data/plugins/provisioners/ansible/config/base.rb +157 -0
  895. data/plugins/provisioners/ansible/config/guest.rb +59 -0
  896. data/plugins/provisioners/ansible/config/host.rb +66 -0
  897. data/plugins/provisioners/ansible/constants.rb +17 -0
  898. data/plugins/provisioners/ansible/errors.rb +43 -0
  899. data/plugins/provisioners/ansible/helpers.rb +20 -0
  900. data/plugins/provisioners/ansible/plugin.rb +88 -0
  901. data/plugins/provisioners/ansible/provisioner/base.rb +405 -0
  902. data/plugins/provisioners/ansible/provisioner/guest.rb +197 -0
  903. data/plugins/provisioners/ansible/provisioner/host.rb +352 -0
  904. data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +24 -0
  905. data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +17 -0
  906. data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +37 -0
  907. data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +37 -0
  908. data/plugins/provisioners/cfengine/cap/suse/cfengine_install.rb +21 -0
  909. data/plugins/provisioners/cfengine/config.rb +127 -0
  910. data/plugins/provisioners/cfengine/plugin.rb +50 -0
  911. data/plugins/provisioners/cfengine/provisioner.rb +142 -0
  912. data/plugins/provisioners/chef/cap/debian/chef_install.rb +22 -0
  913. data/plugins/provisioners/chef/cap/freebsd/chef_install.rb +21 -0
  914. data/plugins/provisioners/chef/cap/freebsd/chef_installed.rb +27 -0
  915. data/plugins/provisioners/chef/cap/linux/chef_installed.rb +27 -0
  916. data/plugins/provisioners/chef/cap/omnios/chef_install.rb +23 -0
  917. data/plugins/provisioners/chef/cap/omnios/chef_installed.rb +28 -0
  918. data/plugins/provisioners/chef/cap/redhat/chef_install.rb +27 -0
  919. data/plugins/provisioners/chef/cap/suse/chef_install.rb +30 -0
  920. data/plugins/provisioners/chef/cap/windows/chef_install.rb +19 -0
  921. data/plugins/provisioners/chef/cap/windows/chef_installed.rb +24 -0
  922. data/plugins/provisioners/chef/command_builder.rb +87 -0
  923. data/plugins/provisioners/chef/config/base.rb +139 -0
  924. data/plugins/provisioners/chef/config/base_runner.rb +131 -0
  925. data/plugins/provisioners/chef/config/chef_apply.rb +53 -0
  926. data/plugins/provisioners/chef/config/chef_client.rb +77 -0
  927. data/plugins/provisioners/chef/config/chef_solo.rb +141 -0
  928. data/plugins/provisioners/chef/config/chef_zero.rb +133 -0
  929. data/plugins/provisioners/chef/installer.rb +51 -0
  930. data/plugins/provisioners/chef/omnibus.rb +40 -0
  931. data/plugins/provisioners/chef/plugin.rb +108 -0
  932. data/plugins/provisioners/chef/provisioner/base.rb +258 -0
  933. data/plugins/provisioners/chef/provisioner/chef_apply.rb +74 -0
  934. data/plugins/provisioners/chef/provisioner/chef_client.rb +179 -0
  935. data/plugins/provisioners/chef/provisioner/chef_solo.rb +244 -0
  936. data/plugins/provisioners/chef/provisioner/chef_zero.rb +123 -0
  937. data/plugins/provisioners/container/client.rb +206 -0
  938. data/plugins/provisioners/container/config.rb +86 -0
  939. data/plugins/provisioners/container/installer.rb +16 -0
  940. data/plugins/provisioners/container/plugin.rb +26 -0
  941. data/plugins/provisioners/container/provisioner.rb +31 -0
  942. data/plugins/provisioners/docker/cap/centos/docker_install.rb +44 -0
  943. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +27 -0
  944. data/plugins/provisioners/docker/cap/debian/docker_install.rb +21 -0
  945. data/plugins/provisioners/docker/cap/debian/docker_start_service.rb +16 -0
  946. data/plugins/provisioners/docker/cap/fedora/docker_install.rb +30 -0
  947. data/plugins/provisioners/docker/cap/linux/docker_configure_vagrant_user.rb +23 -0
  948. data/plugins/provisioners/docker/cap/linux/docker_daemon_running.rb +16 -0
  949. data/plugins/provisioners/docker/cap/linux/docker_installed.rb +29 -0
  950. data/plugins/provisioners/docker/cap/windows/docker_daemon_running.rb +16 -0
  951. data/plugins/provisioners/docker/client.rb +26 -0
  952. data/plugins/provisioners/docker/config.rb +19 -0
  953. data/plugins/provisioners/docker/installer.rb +37 -0
  954. data/plugins/provisioners/docker/plugin.rb +71 -0
  955. data/plugins/provisioners/docker/provisioner.rb +59 -0
  956. data/plugins/provisioners/file/config.rb +32 -0
  957. data/plugins/provisioners/file/plugin.rb +26 -0
  958. data/plugins/provisioners/file/provisioner.rb +46 -0
  959. data/plugins/provisioners/podman/cap/centos/podman_install.rb +38 -0
  960. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +16 -0
  961. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +29 -0
  962. data/plugins/provisioners/podman/client.rb +15 -0
  963. data/plugins/provisioners/podman/config.rb +31 -0
  964. data/plugins/provisioners/podman/installer.rb +36 -0
  965. data/plugins/provisioners/podman/plugin.rb +41 -0
  966. data/plugins/provisioners/podman/provisioner.rb +55 -0
  967. data/plugins/provisioners/puppet/config/puppet.rb +178 -0
  968. data/plugins/provisioners/puppet/config/puppet_server.rb +84 -0
  969. data/plugins/provisioners/puppet/plugin.rb +36 -0
  970. data/plugins/provisioners/puppet/provisioner/puppet.rb +336 -0
  971. data/plugins/provisioners/puppet/provisioner/puppet_server.rb +114 -0
  972. data/plugins/provisioners/salt/bootstrap_downloader.rb +62 -0
  973. data/plugins/provisioners/salt/config.rb +194 -0
  974. data/plugins/provisioners/salt/errors.rb +18 -0
  975. data/plugins/provisioners/salt/plugin.rb +25 -0
  976. data/plugins/provisioners/salt/provisioner.rb +499 -0
  977. data/plugins/provisioners/shell/config.rb +146 -0
  978. data/plugins/provisioners/shell/plugin.rb +26 -0
  979. data/plugins/provisioners/shell/provisioner.rb +368 -0
  980. data/plugins/pushes/atlas/config.rb +151 -0
  981. data/plugins/pushes/atlas/errors.rb +16 -0
  982. data/plugins/pushes/atlas/locales/en.yml +25 -0
  983. data/plugins/pushes/atlas/plugin.rb +38 -0
  984. data/plugins/pushes/atlas/push.rb +87 -0
  985. data/plugins/pushes/ftp/adapter.rb +147 -0
  986. data/plugins/pushes/ftp/config.rb +133 -0
  987. data/plugins/pushes/ftp/errors.rb +16 -0
  988. data/plugins/pushes/ftp/locales/en.yml +19 -0
  989. data/plugins/pushes/ftp/plugin.rb +36 -0
  990. data/plugins/pushes/ftp/push.rb +137 -0
  991. data/plugins/pushes/heroku/config.rb +77 -0
  992. data/plugins/pushes/heroku/errors.rb +24 -0
  993. data/plugins/pushes/heroku/locales/en.yml +33 -0
  994. data/plugins/pushes/heroku/plugin.rb +36 -0
  995. data/plugins/pushes/heroku/push.rb +147 -0
  996. data/plugins/pushes/local-exec/config.rb +80 -0
  997. data/plugins/pushes/local-exec/errors.rb +16 -0
  998. data/plugins/pushes/local-exec/locales/en.yml +26 -0
  999. data/plugins/pushes/local-exec/plugin.rb +36 -0
  1000. data/plugins/pushes/local-exec/push.rb +91 -0
  1001. data/plugins/pushes/noop/config.rb +19 -0
  1002. data/plugins/pushes/noop/plugin.rb +25 -0
  1003. data/plugins/pushes/noop/push.rb +12 -0
  1004. data/plugins/synced_folders/nfs/action_cleanup.rb +32 -0
  1005. data/plugins/synced_folders/nfs/config.rb +35 -0
  1006. data/plugins/synced_folders/nfs/plugin.rb +49 -0
  1007. data/plugins/synced_folders/nfs/synced_folder.rb +171 -0
  1008. data/plugins/synced_folders/rsync/command/rsync.rb +81 -0
  1009. data/plugins/synced_folders/rsync/command/rsync_auto.rb +244 -0
  1010. data/plugins/synced_folders/rsync/default_unix_cap.rb +49 -0
  1011. data/plugins/synced_folders/rsync/helper.rb +296 -0
  1012. data/plugins/synced_folders/rsync/plugin.rb +31 -0
  1013. data/plugins/synced_folders/rsync/synced_folder.rb +62 -0
  1014. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +14 -0
  1015. data/plugins/synced_folders/smb/cap/mount_options.rb +59 -0
  1016. data/plugins/synced_folders/smb/config.rb +26 -0
  1017. data/plugins/synced_folders/smb/errors.rb +65 -0
  1018. data/plugins/synced_folders/smb/plugin.rb +60 -0
  1019. data/plugins/synced_folders/smb/synced_folder.rb +189 -0
  1020. data/plugins/synced_folders/unix_mount_helpers.rb +122 -0
  1021. data/scripts/install_rvm +19 -0
  1022. data/scripts/setup_tests +49 -0
  1023. data/scripts/sign.sh +29 -0
  1024. data/scripts/website_push_www.sh +43 -0
  1025. data/tasks/acceptance.rake +22 -0
  1026. data/tasks/bundler.rake +3 -0
  1027. data/tasks/test.rake +8 -0
  1028. data/templates/commands/init/Vagrantfile.erb +86 -0
  1029. data/templates/commands/init/Vagrantfile.min.erb +12 -0
  1030. data/templates/commands/ssh_config/config.erb +42 -0
  1031. data/templates/commands/winrm_config/config.erb +11 -0
  1032. data/templates/config/messages.erb +14 -0
  1033. data/templates/config/validation_failed.erb +7 -0
  1034. data/templates/guests/alpine/network_dhcp.erb +13 -0
  1035. data/templates/guests/alpine/network_static.erb +7 -0
  1036. data/templates/guests/alt/network_dhcp.erb +7 -0
  1037. data/templates/guests/alt/network_ipv4address.erb +3 -0
  1038. data/templates/guests/alt/network_ipv4route.erb +5 -0
  1039. data/templates/guests/alt/network_static.erb +7 -0
  1040. data/templates/guests/arch/default_network/network_dhcp.erb +4 -0
  1041. data/templates/guests/arch/default_network/network_static.erb +8 -0
  1042. data/templates/guests/arch/default_network/network_static6.erb +8 -0
  1043. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  1044. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  1045. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  1046. data/templates/guests/coreos/etcd.service.erb +10 -0
  1047. data/templates/guests/debian/network_dhcp.erb +13 -0
  1048. data/templates/guests/debian/network_static.erb +10 -0
  1049. data/templates/guests/debian/network_static6.erb +10 -0
  1050. data/templates/guests/freebsd/network_dhcp.erb +4 -0
  1051. data/templates/guests/freebsd/network_static.erb +6 -0
  1052. data/templates/guests/freebsd/network_static6.erb +6 -0
  1053. data/templates/guests/funtoo/network_dhcp.erb +4 -0
  1054. data/templates/guests/funtoo/network_static.erb +10 -0
  1055. data/templates/guests/funtoo/network_static6.erb +9 -0
  1056. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  1057. data/templates/guests/gentoo/network_static.erb +8 -0
  1058. data/templates/guests/gentoo/network_static6.erb +8 -0
  1059. data/templates/guests/gentoo/network_systemd.erb +16 -0
  1060. data/templates/guests/linux/etc_fstab.erb +6 -0
  1061. data/templates/guests/netbsd/network_dhcp.erb +3 -0
  1062. data/templates/guests/netbsd/network_static.erb +3 -0
  1063. data/templates/guests/nixos/hostname.erb +6 -0
  1064. data/templates/guests/nixos/network.erb +15 -0
  1065. data/templates/guests/openbsd/network_dhcp.erb +1 -0
  1066. data/templates/guests/openbsd/network_static.erb +1 -0
  1067. data/templates/guests/openbsd/network_static6.erb +1 -0
  1068. data/templates/guests/redhat/network_dhcp.erb +7 -0
  1069. data/templates/guests/redhat/network_static.erb +16 -0
  1070. data/templates/guests/redhat/network_static6.erb +12 -0
  1071. data/templates/guests/slackware/network_dhcp.erb +11 -0
  1072. data/templates/guests/slackware/network_static.erb +13 -0
  1073. data/templates/guests/suse/network_dhcp.erb +6 -0
  1074. data/templates/guests/suse/network_static.erb +13 -0
  1075. data/templates/guests/suse/network_static6.erb +16 -0
  1076. data/templates/license/license.html.tmpl +127 -0
  1077. data/templates/license/license.rtf.tmpl +0 -0
  1078. data/templates/license/license.tmpl +92 -0
  1079. data/templates/locales/comm_winrm.yml +85 -0
  1080. data/templates/locales/command_ps.yml +35 -0
  1081. data/templates/locales/command_rdp.yml +28 -0
  1082. data/templates/locales/en.yml +3149 -0
  1083. data/templates/locales/guest_windows.yml +26 -0
  1084. data/templates/locales/providers_docker.yml +321 -0
  1085. data/templates/locales/providers_hyperv.yml +111 -0
  1086. data/templates/locales/synced_folder_smb.yml +98 -0
  1087. data/templates/networking/network_manager/network_manager_device.erb +41 -0
  1088. data/templates/nfs/exports_bsd.erb +5 -0
  1089. data/templates/nfs/exports_darwin.erb +7 -0
  1090. data/templates/nfs/exports_linux.erb +7 -0
  1091. data/templates/package_Vagrantfile.erb +11 -0
  1092. data/templates/provisioners/chef_client/client.erb +41 -0
  1093. data/templates/provisioners/chef_solo/solo.erb +52 -0
  1094. data/templates/provisioners/chef_zero/zero.erb +45 -0
  1095. data/templates/rgloader.rb +12 -0
  1096. data/vagrant-spec.config.example.rb +13 -0
  1097. data/vagrant.gemspec +113 -20
  1098. data/version.txt +1 -0
  1099. metadata +1621 -43
  1100. data/LICENSE.txt +0 -22
  1101. data/message.txt +0 -17
@@ -0,0 +1,1230 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: BUSL-1.1
3
+
4
+ require 'fileutils'
5
+ require 'json'
6
+ require 'pathname'
7
+ require 'set'
8
+ require 'thread'
9
+
10
+ require 'log4r'
11
+
12
+ require 'vagrant/util/file_mode'
13
+ require 'vagrant/util/platform'
14
+ require 'vagrant/util/hash_with_indifferent_access'
15
+ require "vagrant/util/silence_warnings"
16
+ require "vagrant/vagrantfile"
17
+ require "vagrant/version"
18
+
19
+ module Vagrant
20
+ # A "Vagrant environment" represents a configuration of how Vagrant
21
+ # should behave: data directories, working directory, UI output,
22
+ # etc. In day-to-day usage, every `vagrant` invocation typically
23
+ # leads to a single Vagrant environment.
24
+ class Environment
25
+ # This is the current version that this version of Vagrant is
26
+ # compatible with in the home directory.
27
+ #
28
+ # @return [String]
29
+ CURRENT_SETUP_VERSION = "1.5"
30
+
31
+ DEFAULT_LOCAL_DATA = ".vagrant"
32
+
33
+ # The `cwd` that this environment represents
34
+ attr_reader :cwd
35
+
36
+ # The persistent data directory where global data can be stored. It
37
+ # is up to the creator of the data in this directory to properly
38
+ # remove it when it is no longer needed.
39
+ #
40
+ # @return [Pathname]
41
+ attr_reader :data_dir
42
+
43
+ # The valid name for a Vagrantfile for this environment.
44
+ attr_reader :vagrantfile_name
45
+
46
+ # The {UI} object to communicate with the outside world.
47
+ attr_reader :ui
48
+
49
+ # This is the UI class to use when creating new UIs.
50
+ attr_reader :ui_class
51
+
52
+ # The directory to the "home" folder that Vagrant will use to store
53
+ # global state.
54
+ attr_reader :home_path
55
+
56
+ # The directory to the directory where local, environment-specific
57
+ # data is stored.
58
+ attr_reader :local_data_path
59
+
60
+ # The directory where temporary files for Vagrant go.
61
+ attr_reader :tmp_path
62
+
63
+ # File where command line aliases go.
64
+ attr_reader :aliases_path
65
+
66
+ # The directory where boxes are stored.
67
+ attr_reader :boxes_path
68
+
69
+ # The path where the plugins are stored (gems)
70
+ attr_reader :gems_path
71
+
72
+ # The path to the default private keys directory
73
+ attr_reader :default_private_keys_directory
74
+
75
+ # The paths for each of the default private keys
76
+ attr_reader :default_private_key_paths
77
+
78
+ # Initializes a new environment with the given options. The options
79
+ # is a hash where the main available key is `cwd`, which defines where
80
+ # the environment represents. There are other options available but
81
+ # they shouldn't be used in general. If `cwd` is nil, then it defaults
82
+ # to the `Dir.pwd` (which is the cwd of the executing process).
83
+ def initialize(opts=nil)
84
+ opts = {
85
+ cwd: nil,
86
+ home_path: nil,
87
+ local_data_path: nil,
88
+ ui_class: nil,
89
+ ui_opts: nil,
90
+ vagrantfile_name: nil,
91
+ }.merge(opts || {})
92
+
93
+ # Set the default working directory to look for the vagrantfile
94
+ opts[:cwd] ||= ENV["VAGRANT_CWD"] if ENV.key?("VAGRANT_CWD")
95
+ opts[:cwd] ||= Dir.pwd
96
+ opts[:cwd] = Pathname.new(opts[:cwd])
97
+ if !opts[:cwd].directory?
98
+ raise Errors::EnvironmentNonExistentCWD, cwd: opts[:cwd].to_s
99
+ end
100
+ opts[:cwd] = opts[:cwd].expand_path
101
+
102
+ # Set the default ui class
103
+ opts[:ui_class] ||= UI::Silent
104
+
105
+ # Set the Vagrantfile name up. We append "Vagrantfile" and "vagrantfile" so that
106
+ # those continue to work as well, but anything custom will take precedence.
107
+ opts[:vagrantfile_name] ||= ENV["VAGRANT_VAGRANTFILE"] if \
108
+ ENV.key?("VAGRANT_VAGRANTFILE")
109
+ opts[:vagrantfile_name] = [opts[:vagrantfile_name]] if \
110
+ opts[:vagrantfile_name] && !opts[:vagrantfile_name].is_a?(Array)
111
+
112
+ # Set instance variables for all the configuration parameters.
113
+ @cwd = opts[:cwd]
114
+ @home_path = opts[:home_path]
115
+ @vagrantfile_name = opts[:vagrantfile_name]
116
+ @ui = opts.fetch(:ui, opts[:ui_class].new)
117
+ @ui_class = opts[:ui_class]
118
+
119
+ if @ui.nil?
120
+ if opts[:ui_opts].nil?
121
+ @ui = opts[:ui_class].new
122
+ else
123
+ @ui = opts[:ui_class].new(*opts[:ui_opts])
124
+ end
125
+ end
126
+
127
+ # This is the batch lock, that enforces that only one {BatchAction}
128
+ # runs at a time from {#batch}.
129
+ @batch_lock = Mutex.new
130
+
131
+ @locks = {}
132
+
133
+ @logger = Log4r::Logger.new("vagrant::environment")
134
+ @logger.info("Environment initialized (#{self})")
135
+ @logger.info(" - cwd: #{cwd}")
136
+
137
+ # Setup the home directory
138
+ @home_path ||= Vagrant.user_data_path
139
+ @home_path = Util::Platform.fs_real_path(@home_path)
140
+ @boxes_path = @home_path.join("boxes")
141
+ @data_dir = @home_path.join("data")
142
+ @gems_path = Vagrant::Bundler.instance.plugin_gem_path
143
+ @tmp_path = @home_path.join("tmp")
144
+ @machine_index_dir = @data_dir.join("machine-index")
145
+
146
+ @aliases_path = Pathname.new(ENV["VAGRANT_ALIAS_FILE"]).expand_path if ENV.key?("VAGRANT_ALIAS_FILE")
147
+ @aliases_path ||= @home_path.join("aliases")
148
+
149
+ # Prepare the directories
150
+ setup_home_path
151
+
152
+ # Setup the local data directory. If a configuration path is given,
153
+ # it is expanded relative to the root path. Otherwise, we use the
154
+ # default (which is also expanded relative to the root path).
155
+ if !root_path.nil?
156
+ if !ENV["VAGRANT_DOTFILE_PATH"].to_s.empty? && !opts[:child]
157
+ opts[:local_data_path] ||= Pathname.new(File.expand_path(ENV["VAGRANT_DOTFILE_PATH"], root_path))
158
+ else
159
+ opts[:local_data_path] ||= root_path.join(DEFAULT_LOCAL_DATA)
160
+ end
161
+ end
162
+ if opts[:local_data_path]
163
+ @local_data_path = Pathname.new(File.expand_path(opts[:local_data_path], @cwd))
164
+ end
165
+
166
+ @logger.debug("Effective local data path: #{@local_data_path}")
167
+
168
+ # If we have a root path, load the ".vagrantplugins" file.
169
+ if root_path
170
+ plugins_file = root_path.join(".vagrantplugins")
171
+ if plugins_file.file?
172
+ @logger.info("Loading plugins file: #{plugins_file}")
173
+ load plugins_file
174
+ end
175
+ end
176
+
177
+ setup_local_data_path
178
+
179
+ # Setup the default private key
180
+ @default_private_key_path = @home_path.join("insecure_private_key")
181
+ @default_private_keys_directory = @home_path.join("insecure_private_keys")
182
+ if !@default_private_keys_directory.directory?
183
+ @default_private_keys_directory.mkdir
184
+ end
185
+ @default_private_key_paths = []
186
+ copy_insecure_private_keys
187
+
188
+ # Initialize localized plugins
189
+ plugins = Vagrant::Plugin::Manager.instance.localize!(self)
190
+ # Load any environment local plugins
191
+ Vagrant::Plugin::Manager.instance.load_plugins(plugins)
192
+
193
+ # Initialize globalize plugins
194
+ plugins = Vagrant::Plugin::Manager.instance.globalize!
195
+ # Load any global plugins
196
+ Vagrant::Plugin::Manager.instance.load_plugins(plugins)
197
+
198
+ plugins = process_configured_plugins
199
+
200
+ # Call the hooks that does not require configurations to be loaded
201
+ # by using a "clean" action runner
202
+ hook(:environment_plugins_loaded, runner: Action::PrimaryRunner.new(env: self))
203
+
204
+ # Call the environment load hooks
205
+ hook(:environment_load, runner: Action::PrimaryRunner.new(env: self))
206
+ end
207
+
208
+ # The path to the default private key
209
+ # NOTE: deprecated, used default_private_keys_directory instead
210
+ def default_private_key_path
211
+ # TODO(spox): Add deprecation warning
212
+ @default_private_key_path
213
+ end
214
+
215
+ # Return a human-friendly string for pretty printed or inspected
216
+ # instances.
217
+ #
218
+ # @return [String]
219
+ def inspect
220
+ "#<#{self.class}: #{@cwd}>".encode('external')
221
+ end
222
+
223
+ # Action runner for executing actions in the context of this environment.
224
+ #
225
+ # @return [Action::Runner]
226
+ def action_runner
227
+ @action_runner ||= Action::PrimaryRunner.new do
228
+ {
229
+ action_runner: action_runner,
230
+ box_collection: boxes,
231
+ hook: method(:hook),
232
+ host: host,
233
+ machine_index: machine_index,
234
+ gems_path: gems_path,
235
+ home_path: home_path,
236
+ root_path: root_path,
237
+ tmp_path: tmp_path,
238
+ ui: @ui,
239
+ env: self
240
+ }
241
+ end
242
+ end
243
+
244
+ # Returns a list of machines that this environment is currently
245
+ # managing that physically have been created.
246
+ #
247
+ # An "active" machine is a machine that Vagrant manages that has
248
+ # been created. The machine itself may be in any state such as running,
249
+ # suspended, etc. but if a machine is "active" then it exists.
250
+ #
251
+ # Note that the machines in this array may no longer be present in
252
+ # the Vagrantfile of this environment. In this case the machine can
253
+ # be considered an "orphan." Determining which machines are orphan
254
+ # and which aren't is not currently a supported feature, but will
255
+ # be in a future version.
256
+ #
257
+ # @return [Array<String, Symbol>]
258
+ def active_machines
259
+ # We have no active machines if we have no data path
260
+ return [] if !@local_data_path
261
+
262
+ machine_folder = @local_data_path.join("machines")
263
+
264
+ # If the machine folder is not a directory then we just return
265
+ # an empty array since no active machines exist.
266
+ return [] if !machine_folder.directory?
267
+
268
+ # Traverse the machines folder accumulate a result
269
+ result = []
270
+
271
+ machine_folder.children(true).each do |name_folder|
272
+ # If this isn't a directory then it isn't a machine
273
+ next if !name_folder.directory?
274
+
275
+ name = name_folder.basename.to_s.to_sym
276
+ name_folder.children(true).each do |provider_folder|
277
+ # If this isn't a directory then it isn't a provider
278
+ next if !provider_folder.directory?
279
+
280
+ # If this machine doesn't have an ID, then ignore
281
+ next if !provider_folder.join("id").file?
282
+
283
+ provider = provider_folder.basename.to_s.to_sym
284
+ result << [name, provider]
285
+ end
286
+ end
287
+
288
+ # Return the results
289
+ result
290
+ end
291
+
292
+ # This creates a new batch action, yielding it, and then running it
293
+ # once the block is called.
294
+ #
295
+ # This handles the case where batch actions are disabled by the
296
+ # VAGRANT_NO_PARALLEL environmental variable.
297
+ def batch(parallel=true)
298
+ parallel = false if ENV["VAGRANT_NO_PARALLEL"]
299
+
300
+ @batch_lock.synchronize do
301
+ BatchAction.new(parallel).tap do |b|
302
+ # Yield it so that the caller can setup actions
303
+ yield b
304
+
305
+ # And run it!
306
+ b.run
307
+ end
308
+ end
309
+ end
310
+
311
+ # Makes a call to the CLI with the given arguments as if they
312
+ # came from the real command line (sometimes they do!). An example:
313
+ #
314
+ # env.cli("package", "--vagrantfile", "Vagrantfile")
315
+ #
316
+ def cli(*args)
317
+ CLI.new(args.flatten, self).execute
318
+ end
319
+
320
+ # This returns the provider name for the default provider for this
321
+ # environment.
322
+ #
323
+ # @param check_usable [Boolean] (true) whether to filter for `.usable?` providers
324
+ # @param exclude [Array<Symbol>] ([]) list of provider names to exclude from
325
+ # consideration
326
+ # @param force_default [Boolean] (true) whether to prefer the value of
327
+ # VAGRANT_DEFAULT_PROVIDER over other strategies if it is set
328
+ # @param machine [Symbol] (nil) a machine name to scope this lookup
329
+ # @return [Symbol] Name of the default provider.
330
+ def default_provider(**opts)
331
+ opts[:exclude] = Set.new(opts[:exclude]) if opts[:exclude]
332
+ opts[:force_default] = true if !opts.key?(:force_default)
333
+ opts[:check_usable] = true if !opts.key?(:check_usable)
334
+
335
+ # Implement the algorithm from
336
+ # https://www.vagrantup.com/docs/providers/basic_usage.html#default-provider
337
+ # with additional steps 2.5 and 3.5 from
338
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1444492
339
+ # to allow system-configured provider priorities.
340
+ #
341
+ # 1. The --provider flag on a vagrant up is chosen above all else, if it is
342
+ # present.
343
+ #
344
+ # (Step 1 is done by the caller; this method is only called if --provider
345
+ # wasn't given.)
346
+ #
347
+ # 2. If the VAGRANT_DEFAULT_PROVIDER environmental variable is set, it
348
+ # takes next priority and will be the provider chosen.
349
+
350
+ default = ENV["VAGRANT_DEFAULT_PROVIDER"].to_s
351
+ if default.empty?
352
+ default = nil
353
+ else
354
+ default = default.to_sym
355
+ @logger.debug("Default provider: `#{default}`")
356
+ end
357
+
358
+ # If we're forcing the default, just short-circuit and return
359
+ # that (the default behavior)
360
+ if default && opts[:force_default]
361
+ @logger.debug("Using forced default provider: `#{default}`")
362
+ return default
363
+ end
364
+
365
+ # Determine the config to use to look for provider definitions. By
366
+ # default it is the global but if we're targeting a specific machine,
367
+ # then look there.
368
+ root_config = vagrantfile.config
369
+ if opts[:machine]
370
+ machine_info = vagrantfile.machine_config(opts[:machine], nil, nil, nil)
371
+ root_config = machine_info[:config]
372
+ end
373
+
374
+ # Get the list of providers within our configuration, in order.
375
+ config = root_config.vm.__providers
376
+
377
+ # Get the list of usable providers with their internally-declared
378
+ # priorities.
379
+ usable = []
380
+ Vagrant.plugin("2").manager.providers.each do |key, data|
381
+ impl = data[0]
382
+ popts = data[1]
383
+
384
+ # Skip excluded providers
385
+ next if opts[:exclude] && opts[:exclude].include?(key)
386
+
387
+ # Skip providers that can't be defaulted, unless they're in our
388
+ # config, in which case someone made our decision for us.
389
+ if !config.include?(key)
390
+ next if popts.key?(:defaultable) && !popts[:defaultable]
391
+ end
392
+
393
+ # Skip providers that aren't usable.
394
+ next if opts[:check_usable] && !impl.usable?(false)
395
+
396
+ # Each provider sets its own priority, defaulting to 5 so we can trust
397
+ # it's always set.
398
+ usable << [popts[:priority], key]
399
+ end
400
+ @logger.debug("Initial usable provider list: #{usable}")
401
+
402
+ # Sort the usable providers by priority. Higher numbers are higher
403
+ # priority, otherwise alpha sort.
404
+ usable = usable.sort {|a, b| a[0] == b[0] ? a[1] <=> b[1] : b[0] <=> a[0]}
405
+ .map {|prio, key| key}
406
+ @logger.debug("Priority sorted usable provider list: #{usable}")
407
+
408
+ # If we're not forcing the default, but it's usable and hasn't been
409
+ # otherwise excluded, return it now.
410
+ if usable.include?(default)
411
+ @logger.debug("Using default provider `#{default}` as it was found in usable list.")
412
+ return default
413
+ end
414
+
415
+ # 2.5. Vagrant will go through all of the config.vm.provider calls in the
416
+ # Vagrantfile and try each in order. It will choose the first
417
+ # provider that is usable and listed in VAGRANT_PREFERRED_PROVIDERS.
418
+
419
+ preferred = ENV.fetch('VAGRANT_PREFERRED_PROVIDERS', '')
420
+ .split(',')
421
+ .map {|s| s.strip}
422
+ .select {|s| !s.empty?}
423
+ .map {|s| s.to_sym}
424
+ @logger.debug("Preferred provider list: #{preferred}")
425
+
426
+ config.each do |key|
427
+ if usable.include?(key) && preferred.include?(key)
428
+ @logger.debug("Using preferred provider `#{key}` detected in configuration and usable.")
429
+ return key
430
+ end
431
+ end
432
+
433
+ # 3. Vagrant will go through all of the config.vm.provider calls in the
434
+ # Vagrantfile and try each in order. It will choose the first provider
435
+ # that is usable. For example, if you configure Hyper-V, it will never
436
+ # be chosen on Mac this way. It must be both configured and usable.
437
+
438
+ config.each do |key|
439
+ if usable.include?(key)
440
+ @logger.debug("Using provider `#{key}` detected in configuration and usable.")
441
+ return key
442
+ end
443
+ end
444
+
445
+ # 3.5. Vagrant will go through VAGRANT_PREFERRED_PROVIDERS and find the
446
+ # first plugin that reports it is usable.
447
+
448
+ preferred.each do |key|
449
+ if usable.include?(key)
450
+ @logger.debug("Using preferred provider `#{key}` found in usable list.")
451
+ return key
452
+ end
453
+ end
454
+
455
+ # 4. Vagrant will go through all installed provider plugins (including the
456
+ # ones that come with Vagrant), and find the first plugin that reports
457
+ # it is usable. There is a priority system here: systems that are known
458
+ # better have a higher priority than systems that are worse. For
459
+ # example, if you have the VMware provider installed, it will always
460
+ # take priority over VirtualBox.
461
+
462
+ if !usable.empty?
463
+ @logger.debug("Using provider `#{usable[0]}` as it is the highest priority in the usable list.")
464
+ return usable[0]
465
+ end
466
+
467
+ # 5. If Vagrant still has not found any usable providers, it will error.
468
+
469
+ # No providers available is a critical error for Vagrant.
470
+ raise Errors::NoDefaultProvider
471
+ end
472
+
473
+ # Returns whether or not we know how to install the provider with
474
+ # the given name.
475
+ #
476
+ # @return [Boolean]
477
+ def can_install_provider?(name)
478
+ host.capability?(provider_install_key(name))
479
+ end
480
+
481
+ # Installs the provider with the given name.
482
+ #
483
+ # This will raise an exception if we don't know how to install the
484
+ # provider with the given name. You should guard this call with
485
+ # `can_install_provider?` for added safety.
486
+ #
487
+ # An exception will be raised if there are any failures installing
488
+ # the provider.
489
+ def install_provider(name)
490
+ host.capability(provider_install_key(name))
491
+ end
492
+
493
+ # Returns the collection of boxes for the environment.
494
+ #
495
+ # @return [BoxCollection]
496
+ def boxes
497
+ @_boxes ||= BoxCollection.new(
498
+ boxes_path,
499
+ hook: method(:hook),
500
+ temp_dir_root: tmp_path)
501
+ end
502
+
503
+ # Returns the {Config::Loader} that can be used to load Vagrantfiles
504
+ # given the settings of this environment.
505
+ #
506
+ # @return [Config::Loader]
507
+ def config_loader
508
+ return @config_loader if @config_loader
509
+
510
+ home_vagrantfile = nil
511
+ root_vagrantfile = nil
512
+ home_vagrantfile = find_vagrantfile(home_path) if home_path
513
+ if root_path
514
+ root_vagrantfile = find_vagrantfile(root_path, @vagrantfile_name)
515
+ end
516
+
517
+ @config_loader = Config::Loader.new(
518
+ Config::VERSIONS, Config::VERSIONS_ORDER)
519
+ @config_loader.set(:home, home_vagrantfile) if home_vagrantfile
520
+ @config_loader.set(:root, root_vagrantfile) if root_vagrantfile
521
+ @config_loader
522
+ end
523
+
524
+ # Loads another environment for the given Vagrantfile, sharing as much
525
+ # useful state from this Environment as possible (such as UI and paths).
526
+ # Any initialization options can be overidden using the opts hash.
527
+ #
528
+ # @param [String] vagrantfile Path to a Vagrantfile
529
+ # @return [Environment]
530
+ def environment(vagrantfile, **opts)
531
+ path = File.expand_path(vagrantfile, root_path)
532
+ file = File.basename(path)
533
+ path = File.dirname(path)
534
+
535
+ Util::SilenceWarnings.silence! do
536
+ Environment.new({
537
+ child: true,
538
+ cwd: path,
539
+ home_path: home_path,
540
+ ui_class: ui_class,
541
+ vagrantfile_name: file,
542
+ }.merge(opts))
543
+ end
544
+ end
545
+
546
+ # This defines a hook point where plugin action hooks that are registered
547
+ # against the given name will be run in the context of this environment.
548
+ #
549
+ # @param [Symbol] name Name of the hook.
550
+ # @param [Action::Runner] action_runner A custom action runner for running hooks.
551
+ def hook(name, opts=nil)
552
+ @logger.info("Running hook: #{name}")
553
+
554
+ opts ||= {}
555
+ opts[:callable] ||= Action::Builder.new
556
+ opts[:runner] ||= action_runner
557
+ opts[:action_name] = name
558
+ opts[:env] = self
559
+ opts.delete(:runner).run(opts.delete(:callable), opts)
560
+ end
561
+
562
+ # Returns the host object associated with this environment.
563
+ #
564
+ # @return [Class]
565
+ def host
566
+ return @host if defined?(@host)
567
+
568
+ # Determine the host class to use. ":detect" is an old Vagrant config
569
+ # that shouldn't be valid anymore, but we respect it here by assuming
570
+ # its old behavior. No need to deprecate this because I thin it is
571
+ # fairly harmless.
572
+ host_klass = vagrantfile.config.vagrant.host
573
+ host_klass = nil if host_klass == :detect
574
+
575
+ begin
576
+ @host = Host.new(
577
+ host_klass,
578
+ Vagrant.plugin("2").manager.hosts,
579
+ Vagrant.plugin("2").manager.host_capabilities,
580
+ self)
581
+ rescue Errors::CapabilityHostNotDetected
582
+ # If the auto-detect failed, then we create a brand new host
583
+ # with no capabilities and use that. This should almost never happen
584
+ # since Vagrant works on most host OS's now, so this is a "slow path"
585
+ klass = Class.new(Vagrant.plugin("2", :host)) do
586
+ def detect?(env); true; end
587
+ end
588
+
589
+ hosts = { generic: [klass, nil] }
590
+ host_caps = {}
591
+
592
+ @host = Host.new(:generic, hosts, host_caps, self)
593
+ rescue Errors::CapabilityHostExplicitNotDetected => e
594
+ raise Errors::HostExplicitNotDetected, e.extra_data
595
+ end
596
+ end
597
+
598
+ # This acquires a process-level lock with the given name.
599
+ #
600
+ # The lock file is held within the data directory of this environment,
601
+ # so make sure that all environments that are locking are sharing
602
+ # the same data directory.
603
+ #
604
+ # This will raise Errors::EnvironmentLockedError if the lock can't
605
+ # be obtained.
606
+ #
607
+ # @param [String] name Name of the lock, since multiple locks can
608
+ # be held at one time.
609
+ def lock(name="global", **opts)
610
+ f = nil
611
+
612
+ # If we don't have a block, then locking is useless, so ignore it
613
+ return if !block_given?
614
+
615
+ # This allows multiple locks in the same process to be nested
616
+ return yield if @locks[name] || opts[:noop]
617
+
618
+ # The path to this lock
619
+ lock_path = data_dir.join("lock.#{name}.lock")
620
+
621
+ @logger.debug("Attempting to acquire process-lock: #{name}")
622
+ lock("dotlock", noop: name == "dotlock", retry: true) do
623
+ f = File.open(lock_path, "w+")
624
+ end
625
+
626
+ # The file locking fails only if it returns "false." If it
627
+ # succeeds it returns a 0, so we must explicitly check for
628
+ # the proper error case.
629
+ while f.flock(File::LOCK_EX | File::LOCK_NB) === false
630
+ @logger.warn("Process-lock in use: #{name}")
631
+
632
+ if !opts[:retry]
633
+ raise Errors::EnvironmentLockedError,
634
+ name: name
635
+ end
636
+
637
+ sleep 0.2
638
+ end
639
+
640
+ @logger.info("Acquired process lock: #{name}")
641
+
642
+ result = nil
643
+ begin
644
+ # Mark that we have a lock
645
+ @locks[name] = true
646
+
647
+ result = yield
648
+ ensure
649
+ # We need to make sure that no matter what this is always
650
+ # reset to false so we don't think we have a lock when we
651
+ # actually don't.
652
+ @locks.delete(name)
653
+ @logger.info("Released process lock: #{name}")
654
+ end
655
+
656
+ # Clean up the lock file, this requires another lock
657
+ if name != "dotlock"
658
+ lock("dotlock", retry: true) do
659
+ f.close
660
+ begin
661
+ File.delete(lock_path)
662
+ rescue
663
+ @logger.error(
664
+ "Failed to delete lock file #{lock_path} - some other thread " +
665
+ "might be trying to acquire it. ignoring this error")
666
+ end
667
+ end
668
+ end
669
+
670
+ # Return the result
671
+ return result
672
+ ensure
673
+ begin
674
+ f.close if f
675
+ rescue IOError
676
+ end
677
+ end
678
+
679
+ # This executes the push with the given name, raising any exceptions that
680
+ # occur.
681
+ #
682
+ # @param name [String] Push plugin name
683
+ # @param manager [Vagrant::Plugin::Manager] Plugin Manager to use,
684
+ # defaults to the primary one registered but parameterized so it can be
685
+ # overridden in server mode
686
+ #
687
+ # @see VagrantPlugins::CommandServe::Service::PushService Server mode behavior
688
+ #
689
+ # Precondition: the push is not nil and exists.
690
+ def push(name, manager: Vagrant.plugin("2").manager)
691
+ @logger.info("Getting push: #{name}")
692
+
693
+ name = name.to_sym
694
+
695
+ pushes = self.vagrantfile.config.push.__compiled_pushes
696
+ if !pushes.key?(name)
697
+ raise Vagrant::Errors::PushStrategyNotDefined,
698
+ name: name,
699
+ pushes: pushes.keys
700
+ end
701
+
702
+ strategy, config = pushes[name]
703
+ push_registry = manager.pushes
704
+ klass, _ = push_registry.get(strategy)
705
+ if klass.nil?
706
+ raise Vagrant::Errors::PushStrategyNotLoaded,
707
+ name: strategy,
708
+ pushes: push_registry.keys
709
+ end
710
+
711
+ klass.new(self, config).push
712
+ end
713
+
714
+ # The list of pushes defined in this Vagrantfile.
715
+ #
716
+ # @return [Array<Symbol>]
717
+ def pushes
718
+ self.vagrantfile.config.push.__compiled_pushes.keys
719
+ end
720
+
721
+ # This returns a machine with the proper provider for this environment.
722
+ # The machine named by `name` must be in this environment.
723
+ #
724
+ # @param [Symbol] name Name of the machine (as configured in the
725
+ # Vagrantfile).
726
+ # @param [Symbol] provider The provider that this machine should be
727
+ # backed by.
728
+ # @param [Boolean] refresh If true, then if there is a cached version
729
+ # it is reloaded.
730
+ # @return [Machine]
731
+ def machine(name, provider, refresh=false)
732
+ @logger.info("Getting machine: #{name} (#{provider})")
733
+
734
+ # Compose the cache key of the name and provider, and return from
735
+ # the cache if we have that.
736
+ cache_key = [name, provider]
737
+ @machines ||= {}
738
+ if refresh
739
+ @logger.info("Refreshing machine (busting cache): #{name} (#{provider})")
740
+ @machines.delete(cache_key)
741
+ end
742
+
743
+ if @machines.key?(cache_key)
744
+ @logger.info("Returning cached machine: #{name} (#{provider})")
745
+ return @machines[cache_key]
746
+ end
747
+
748
+ @logger.info("Uncached load of machine.")
749
+
750
+ # Determine the machine data directory and pass it to the machine.
751
+ machine_data_path = @local_data_path.join(
752
+ "machines/#{name}/#{provider}")
753
+
754
+ # Create the machine and cache it for future calls. This will also
755
+ # return the machine from this method.
756
+ @machines[cache_key] = vagrantfile.machine(
757
+ name, provider, boxes, machine_data_path, self)
758
+ end
759
+
760
+ # The {MachineIndex} to store information about the machines.
761
+ #
762
+ # @return [MachineIndex]
763
+ def machine_index
764
+ @machine_index ||= MachineIndex.new(@machine_index_dir)
765
+ end
766
+
767
+ # This returns a list of the configured machines for this environment.
768
+ # Each of the names returned by this method is valid to be used with
769
+ # the {#machine} method.
770
+ #
771
+ # @return [Array<Symbol>] Configured machine names.
772
+ def machine_names
773
+ vagrantfile.machine_names
774
+ end
775
+
776
+ # This returns the name of the machine that is the "primary." In the
777
+ # case of a single-machine environment, this is just the single machine
778
+ # name. In the case of a multi-machine environment, then this can
779
+ # potentially be nil if no primary machine is specified.
780
+ #
781
+ # @return [Symbol]
782
+ def primary_machine_name
783
+ vagrantfile.primary_machine_name
784
+ end
785
+
786
+ # The root path is the path where the top-most (loaded last)
787
+ # Vagrantfile resides. It can be considered the project root for
788
+ # this environment.
789
+ #
790
+ # @return [String]
791
+ def root_path
792
+ return @root_path if defined?(@root_path)
793
+
794
+ root_finder = lambda do |path|
795
+ # Note: To remain compatible with Ruby 1.8, we have to use
796
+ # a `find` here instead of an `each`.
797
+ vf = find_vagrantfile(path, @vagrantfile_name)
798
+ return path if vf
799
+ return nil if path.root? || !File.exist?(path)
800
+ root_finder.call(path.parent)
801
+ end
802
+
803
+ @root_path = root_finder.call(cwd)
804
+ end
805
+
806
+ # Unload the environment, running completion hooks. The environment
807
+ # should not be used after this (but CAN be, technically). It is
808
+ # recommended to always immediately set the variable to `nil` after
809
+ # running this so you can't accidentally run any more methods. Example:
810
+ #
811
+ # env.unload
812
+ # env = nil
813
+ #
814
+ def unload
815
+ hook(:environment_unload)
816
+ end
817
+
818
+ # Represents the default Vagrantfile, or the Vagrantfile that is
819
+ # in the working directory or a parent of the working directory
820
+ # of this environment.
821
+ #
822
+ # The existence of this function is primarily a convenience. There
823
+ # is nothing stopping you from instantiating your own {Vagrantfile}
824
+ # and loading machines in any way you see fit. Typical behavior of
825
+ # Vagrant, however, loads this Vagrantfile.
826
+ #
827
+ # This Vagrantfile is comprised of two major sources: the Vagrantfile
828
+ # in the user's home directory as well as the "root" Vagrantfile or
829
+ # the Vagrantfile in the working directory (or parent).
830
+ #
831
+ # @return [Vagrantfile]
832
+ def vagrantfile
833
+ @vagrantfile ||= Vagrantfile.new(config_loader, [:home, :root])
834
+ end
835
+
836
+ #---------------------------------------------------------------
837
+ # Load Methods
838
+ #---------------------------------------------------------------
839
+
840
+ # This sets the `@home_path` variable properly.
841
+ #
842
+ # @return [Pathname]
843
+ def setup_home_path
844
+ @logger.info("Home path: #{@home_path}")
845
+
846
+ # Setup the list of child directories that need to be created if they
847
+ # don't already exist.
848
+ dirs = [
849
+ @home_path,
850
+ @home_path.join("rgloader"),
851
+ @boxes_path,
852
+ @data_dir,
853
+ @gems_path,
854
+ @tmp_path,
855
+ @machine_index_dir,
856
+ ]
857
+
858
+ # Go through each required directory, creating it if it doesn't exist
859
+ dirs.each do |dir|
860
+ next if File.directory?(dir)
861
+
862
+ begin
863
+ @logger.info("Creating: #{dir}")
864
+ FileUtils.mkdir_p(dir)
865
+ rescue Errno::EACCES, Errno::EROFS
866
+ raise Errors::HomeDirectoryNotAccessible, home_path: @home_path.to_s
867
+ end
868
+ end
869
+
870
+ # Attempt to write into the home directory to verify we can
871
+ begin
872
+ # Append a random suffix to avoid race conditions if Vagrant
873
+ # is running in parallel with other Vagrant processes.
874
+ suffix = (0...32).map { (65 + rand(26)).chr }.join
875
+ path = @home_path.join("perm_test_#{suffix}")
876
+ path.open("w") do |f|
877
+ f.write("hello")
878
+ end
879
+ path.unlink
880
+ rescue Errno::EACCES
881
+ raise Errors::HomeDirectoryNotAccessible, home_path: @home_path.to_s
882
+ end
883
+
884
+ # Create the version file that we use to track the structure of
885
+ # the home directory. If we have an old version, we need to explicitly
886
+ # upgrade it. Otherwise, we just mark that its the current version.
887
+ version_file = @home_path.join("setup_version")
888
+ if version_file.file?
889
+ version = version_file.read.chomp
890
+ if version > CURRENT_SETUP_VERSION
891
+ raise Errors::HomeDirectoryLaterVersion
892
+ end
893
+
894
+ case version
895
+ when CURRENT_SETUP_VERSION
896
+ # We're already good, at the latest version.
897
+ when "1.1"
898
+ # We need to update our directory structure
899
+ upgrade_home_path_v1_1
900
+
901
+ # Delete the version file so we put our latest version in
902
+ version_file.delete
903
+ else
904
+ raise Errors::HomeDirectoryUnknownVersion,
905
+ path: @home_path.to_s,
906
+ version: version
907
+ end
908
+ end
909
+
910
+ if !version_file.file?
911
+ @logger.debug(
912
+ "Creating home directory version file: #{CURRENT_SETUP_VERSION}")
913
+ version_file.open("w") do |f|
914
+ f.write(CURRENT_SETUP_VERSION)
915
+ end
916
+ end
917
+
918
+ # Create the rgloader/loader file so we can use encoded files.
919
+ loader_file = @home_path.join("rgloader", "loader.rb")
920
+ if !loader_file.file?
921
+ source_loader = Vagrant.source_root.join("templates/rgloader.rb")
922
+ FileUtils.cp(source_loader.to_s, loader_file.to_s)
923
+ end
924
+ end
925
+
926
+ # This creates the local data directory and show an error if it
927
+ # couldn't properly be created.
928
+ def setup_local_data_path(force=false)
929
+ if @local_data_path.nil?
930
+ @logger.warn("No local data path is set. Local data cannot be stored.")
931
+ return
932
+ end
933
+
934
+ @logger.info("Local data path: #{@local_data_path}")
935
+
936
+ # If the local data path is a file, then we are probably seeing an
937
+ # old (V1) "dotfile." In this case, we upgrade it. The upgrade process
938
+ # will remove the old data file if it is successful.
939
+ if @local_data_path.file?
940
+ upgrade_v1_dotfile(@local_data_path)
941
+ end
942
+
943
+ # If we don't have a root path, we don't setup anything
944
+ return if !force && root_path.nil?
945
+
946
+ begin
947
+ @logger.debug("Creating: #{@local_data_path}")
948
+ FileUtils.mkdir_p(@local_data_path)
949
+ # Create the rgloader/loader file so we can use encoded files.
950
+ loader_file = @local_data_path.join("rgloader", "loader.rb")
951
+ if !loader_file.file?
952
+ source_loader = Vagrant.source_root.join("templates/rgloader.rb")
953
+ FileUtils.mkdir_p(@local_data_path.join("rgloader").to_s)
954
+ FileUtils.cp(source_loader.to_s, loader_file.to_s)
955
+ end
956
+ rescue Errno::EACCES
957
+ raise Errors::LocalDataDirectoryNotAccessible,
958
+ local_data_path: @local_data_path.to_s
959
+ end
960
+ end
961
+
962
+ protected
963
+
964
+ # Attempt to guess the configured provider in use. Will fallback
965
+ # to the default provider if an explicit provider name is not
966
+ # provided. This can be pretty error prone, but is used during
967
+ # initial environment setup to allow loading plugins so it doesn't
968
+ # need to be perfect
969
+ #
970
+ # @return [String]
971
+ def guess_provider
972
+ gp = nil
973
+ ARGV.each_with_index do |val, idx|
974
+ if val.start_with?("--provider=")
975
+ gp = val.split("=", 2).last
976
+ break
977
+ elsif val == "--provider"
978
+ gp = ARGV[idx+1]
979
+ break
980
+ end
981
+ end
982
+ return gp.to_sym if gp
983
+ begin
984
+ default_provider
985
+ rescue Errors::NoDefaultProvider
986
+ # if a provider cannot be determined just return nil
987
+ nil
988
+ end
989
+ end
990
+
991
+ # Load any configuration provided by guests defined within
992
+ # the Vagrantfile to pull plugin information they may have
993
+ # defined.
994
+ def find_configured_plugins
995
+ plugins = []
996
+ provider = guess_provider
997
+ vagrantfile.machine_names.each do |mname|
998
+ ldp = @local_data_path.join("machines/#{mname}/#{provider}") if @local_data_path
999
+ plugins << vagrantfile.machine_config(mname, provider, boxes, ldp, false)[:config]
1000
+ end
1001
+ result = plugins.reverse.inject(Vagrant::Util::HashWithIndifferentAccess.new) do |memo, val|
1002
+ Vagrant::Util::DeepMerge.deep_merge(memo, val.vagrant.plugins)
1003
+ end
1004
+ Vagrant::Util::DeepMerge.deep_merge(result, vagrantfile.config.vagrant.plugins)
1005
+ end
1006
+
1007
+ # Check for any local plugins defined within the Vagrantfile. If
1008
+ # found, validate they are available. If they are not available,
1009
+ # request to install them, or raise an exception
1010
+ #
1011
+ # @return [Hash] plugin list for loading
1012
+ def process_configured_plugins
1013
+ return if !Vagrant.plugins_enabled?
1014
+ errors = vagrantfile.config.vagrant.validate(nil)
1015
+ if !Array(errors["vagrant"]).empty?
1016
+ raise Errors::ConfigInvalid,
1017
+ errors: Util::TemplateRenderer.render(
1018
+ "config/validation_failed",
1019
+ errors: {vagrant: errors["vagrant"]}
1020
+ )
1021
+ end
1022
+ # Check if defined plugins are installed
1023
+ installed = Plugin::Manager.instance.installed_plugins
1024
+ needs_install = []
1025
+ config_plugins = find_configured_plugins
1026
+ config_plugins.each do |name, info|
1027
+ if !installed[name]
1028
+ needs_install << name
1029
+ end
1030
+ end
1031
+ if !needs_install.empty?
1032
+ ui.warn(I18n.t("vagrant.plugins.local.uninstalled_plugins",
1033
+ plugins: needs_install.sort.join(", ")))
1034
+ if !Vagrant.auto_install_local_plugins?
1035
+ answer = nil
1036
+ until ["y", "n"].include?(answer)
1037
+ answer = ui.ask(I18n.t("vagrant.plugins.local.request_plugin_install") + " [N]: ")
1038
+ answer = answer.strip.downcase
1039
+ answer = "n" if answer.to_s.empty?
1040
+ end
1041
+ if answer == "n"
1042
+ raise Errors::PluginMissingLocalError,
1043
+ plugins: needs_install.sort.join(", ")
1044
+ end
1045
+ end
1046
+ needs_install.each do |name|
1047
+ pconfig = Util::HashWithIndifferentAccess.new(config_plugins[name])
1048
+ ui.info(I18n.t("vagrant.commands.plugin.installing", name: name))
1049
+
1050
+ options = {sources: Vagrant::Bundler::DEFAULT_GEM_SOURCES.dup, env_local: true}
1051
+ options[:sources] = pconfig[:sources] if pconfig[:sources]
1052
+ options[:require] = pconfig[:entry_point] if pconfig[:entry_point]
1053
+ options[:version] = pconfig[:version] if pconfig[:version]
1054
+
1055
+ spec = Plugin::Manager.instance.install_plugin(name, **options)
1056
+
1057
+ ui.info(I18n.t("vagrant.commands.plugin.installed",
1058
+ name: spec.name, version: spec.version.to_s))
1059
+ end
1060
+ ui.info("\n")
1061
+ # Force halt after installation and require command to be run again. This
1062
+ # will proper load any new locally installed plugins which are now available.
1063
+ ui.warn(I18n.t("vagrant.plugins.local.install_rerun_command"))
1064
+ exit(-1)
1065
+ end
1066
+ if Vagrant::Plugin::Manager.instance.local_file
1067
+ Vagrant::Plugin::Manager.instance.local_file.installed_plugins
1068
+ else
1069
+ {}
1070
+ end
1071
+ end
1072
+
1073
+ # This method copies the private keys into the home directory if they
1074
+ # do not already exist. The `default_private_key_path` references the
1075
+ # original rsa based private key and is retained for compatibility. The
1076
+ # `default_private_keys_directory` contains the list of valid private
1077
+ # keys supported by Vagrant.
1078
+ #
1079
+ # NOTE: The keys are copied because `ssh` requires that the key is chmod
1080
+ # 0600, but if Vagrant is installed as a separate user, then the
1081
+ # effective uid won't be able to read the key. So the key is copied
1082
+ # to the home directory and chmod 0600.
1083
+ def copy_insecure_private_keys
1084
+ # First setup the deprecated single key path
1085
+ if !@default_private_key_path.exist?
1086
+ @logger.info("Copying private key to home directory")
1087
+
1088
+ source = File.expand_path("keys/vagrant", Vagrant.source_root)
1089
+ destination = @default_private_key_path
1090
+
1091
+ begin
1092
+ FileUtils.cp(source, destination)
1093
+ rescue Errno::EACCES
1094
+ raise Errors::CopyPrivateKeyFailed,
1095
+ source: source,
1096
+ destination: destination
1097
+ end
1098
+ end
1099
+
1100
+ if !Util::Platform.windows?
1101
+ # On Windows, permissions don't matter as much, so don't worry
1102
+ # about doing chmod.
1103
+ if Util::FileMode.from_octal(@default_private_key_path.stat.mode) != "600"
1104
+ @logger.info("Changing permissions on private key to 0600")
1105
+ @default_private_key_path.chmod(0600)
1106
+ end
1107
+ end
1108
+
1109
+ # Now setup the key directory
1110
+ Dir.glob(File.expand_path("keys/vagrant.key.*", Vagrant.source_root)).each do |source|
1111
+ destination = default_private_keys_directory.join(File.basename(source))
1112
+ default_private_key_paths << destination
1113
+ next if File.exist?(destination)
1114
+ begin
1115
+ FileUtils.cp(source, destination)
1116
+ rescue Errno::EACCES
1117
+ raise Errors::CopyPrivateKeyFailed,
1118
+ source: source,
1119
+ destination: destination
1120
+ end
1121
+ end
1122
+
1123
+ if !Util::Platform.windows?
1124
+ default_private_key_paths.each do |key_path|
1125
+ if Util::FileMode.from_octal(key_path.stat.mode) != "600"
1126
+ @logger.info("Changing permissions on private key (#{key_path}) to 0600")
1127
+ key_path.chmod(0600)
1128
+ end
1129
+ end
1130
+ end
1131
+ end
1132
+
1133
+ # Finds the Vagrantfile in the given directory.
1134
+ #
1135
+ # @param [Pathname] path Path to search in.
1136
+ # @return [Pathname]
1137
+ def find_vagrantfile(search_path, filenames=nil)
1138
+ filenames ||= ["Vagrantfile", "vagrantfile"]
1139
+ filenames.each do |vagrantfile|
1140
+ current_path = search_path.join(vagrantfile)
1141
+ return current_path if current_path.file?
1142
+ end
1143
+
1144
+ nil
1145
+ end
1146
+
1147
+ # Returns the key used for the host capability for provider installs
1148
+ # of the given name.
1149
+ def provider_install_key(name)
1150
+ "provider_install_#{name}".to_sym
1151
+ end
1152
+
1153
+ # This upgrades a home directory that was in the v1.1 format to the
1154
+ # v1.5 format. It will raise exceptions if anything fails.
1155
+ def upgrade_home_path_v1_1
1156
+ if !ENV["VAGRANT_UPGRADE_SILENT_1_5"]
1157
+ @ui.ask(I18n.t("vagrant.upgrading_home_path_v1_5"))
1158
+ end
1159
+
1160
+ collection = BoxCollection.new(
1161
+ @home_path.join("boxes"), temp_dir_root: tmp_path)
1162
+ collection.upgrade_v1_1_v1_5
1163
+ end
1164
+
1165
+ # This upgrades a Vagrant 1.0.x "dotfile" to the new V2 format.
1166
+ #
1167
+ # This is a destructive process. Once the upgrade is complete, the
1168
+ # old dotfile is removed, and the environment becomes incompatible for
1169
+ # Vagrant 1.0 environments.
1170
+ #
1171
+ # @param [Pathname] path The path to the dotfile
1172
+ def upgrade_v1_dotfile(path)
1173
+ @logger.info("Upgrading V1 dotfile to V2 directory structure...")
1174
+
1175
+ # First, verify the file isn't empty. If it is an empty file, we
1176
+ # just delete it and go on with life.
1177
+ contents = path.read.strip
1178
+ if contents.strip == ""
1179
+ @logger.info("V1 dotfile was empty. Removing and moving on.")
1180
+ path.delete
1181
+ return
1182
+ end
1183
+
1184
+ # Otherwise, verify there is valid JSON in here since a Vagrant
1185
+ # environment would always ensure valid JSON. This is a sanity check
1186
+ # to make sure we don't nuke a dotfile that is not ours...
1187
+ @logger.debug("Attempting to parse JSON of V1 file")
1188
+ json_data = nil
1189
+ begin
1190
+ json_data = JSON.parse(contents)
1191
+ @logger.debug("JSON parsed successfully. Things are okay.")
1192
+ rescue JSON::ParserError
1193
+ # The file could've been tampered with since Vagrant 1.0.x is
1194
+ # supposed to ensure that the contents are valid JSON. Show an error.
1195
+ raise Errors::DotfileUpgradeJSONError,
1196
+ state_file: path.to_s
1197
+ end
1198
+
1199
+ # Alright, let's upgrade this guy to the new structure. Start by
1200
+ # backing up the old dotfile.
1201
+ backup_file = path.dirname.join(".vagrant.v1.#{Time.now.to_i}")
1202
+ @logger.info("Renaming old dotfile to: #{backup_file}")
1203
+ path.rename(backup_file)
1204
+
1205
+ # Now, we create the actual local data directory. This should succeed
1206
+ # this time since we renamed the old conflicting V1.
1207
+ setup_local_data_path(true)
1208
+
1209
+ if json_data["active"]
1210
+ @logger.debug("Upgrading to V2 style for each active VM")
1211
+ json_data["active"].each do |name, id|
1212
+ @logger.info("Upgrading dotfile: #{name} (#{id})")
1213
+
1214
+ # Create the machine configuration directory
1215
+ directory = @local_data_path.join("machines/#{name}/virtualbox")
1216
+ FileUtils.mkdir_p(directory)
1217
+
1218
+ # Write the ID file
1219
+ directory.join("id").open("w+") do |f|
1220
+ f.write(id)
1221
+ end
1222
+ end
1223
+ end
1224
+
1225
+ # Upgrade complete! Let the user know
1226
+ @ui.info(I18n.t("vagrant.general.upgraded_v1_dotfile",
1227
+ backup_path: backup_file.to_s))
1228
+ end
1229
+ end
1230
+ end