vagrant-unbundled 2.2.7.0 → 2.2.16.0

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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +2 -0
  3. data/CHANGELOG.md +228 -0
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +50 -1
  8. data/contrib/README.md +1 -0
  9. data/contrib/sudoers/linux-suse +2 -2
  10. data/contrib/zsh/_vagrant +738 -0
  11. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  12. data/lib/vagrant.rb +28 -5
  13. data/lib/vagrant/action.rb +7 -0
  14. data/lib/vagrant/action/builder.rb +184 -38
  15. data/lib/vagrant/action/builtin/box_add.rb +24 -8
  16. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  17. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  18. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  19. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  20. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  21. data/lib/vagrant/action/builtin/disk.rb +14 -1
  22. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  23. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  24. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  25. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  26. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  27. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  28. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  29. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  30. data/lib/vagrant/action/hook.rb +76 -23
  31. data/lib/vagrant/action/runner.rb +12 -27
  32. data/lib/vagrant/action/warden.rb +28 -31
  33. data/lib/vagrant/box.rb +11 -4
  34. data/lib/vagrant/box_collection.rb +1 -1
  35. data/lib/vagrant/bundler.rb +310 -61
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/environment.rb +1 -0
  38. data/lib/vagrant/errors.rb +69 -1
  39. data/lib/vagrant/machine.rb +64 -11
  40. data/lib/vagrant/machine_index.rb +28 -1
  41. data/lib/vagrant/patches/net-ssh.rb +186 -0
  42. data/lib/vagrant/plugin/manager.rb +45 -16
  43. data/lib/vagrant/plugin/v2/command.rb +7 -2
  44. data/lib/vagrant/plugin/v2/components.rb +6 -0
  45. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  46. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  47. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  48. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  49. data/lib/vagrant/shared_helpers.rb +36 -0
  50. data/lib/vagrant/ui.rb +43 -2
  51. data/lib/vagrant/util.rb +2 -0
  52. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  53. data/lib/vagrant/util/caps.rb +48 -0
  54. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  55. data/lib/vagrant/util/curl_helper.rb +12 -8
  56. data/lib/vagrant/util/directory.rb +19 -0
  57. data/lib/vagrant/util/downloader.rb +10 -5
  58. data/lib/vagrant/util/guest_hosts.rb +68 -0
  59. data/lib/vagrant/util/guest_inspection.rb +9 -1
  60. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  61. data/lib/vagrant/util/io.rb +7 -27
  62. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  63. data/lib/vagrant/util/is_port_open.rb +8 -19
  64. data/lib/vagrant/util/map_command_options.rb +33 -0
  65. data/lib/vagrant/util/mime.rb +92 -0
  66. data/lib/vagrant/util/network_ip.rb +11 -1
  67. data/lib/vagrant/util/numeric.rb +28 -0
  68. data/lib/vagrant/util/platform.rb +10 -2
  69. data/lib/vagrant/util/powershell.rb +31 -15
  70. data/lib/vagrant/util/subprocess.rb +9 -1
  71. data/lib/vagrant/util/template_renderer.rb +2 -2
  72. data/lib/vagrant/util/uploader.rb +7 -4
  73. data/lib/vagrant/vagrantfile.rb +2 -2
  74. data/plugins/commands/autocomplete/command/install.rb +49 -0
  75. data/plugins/commands/autocomplete/command/root.rb +64 -0
  76. data/plugins/commands/autocomplete/plugin.rb +18 -0
  77. data/plugins/commands/cap/command.rb +5 -1
  78. data/plugins/commands/cloud/auth/login.rb +20 -23
  79. data/plugins/commands/cloud/auth/logout.rb +2 -10
  80. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  81. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
  82. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  83. data/plugins/commands/cloud/box/create.rb +33 -29
  84. data/plugins/commands/cloud/box/delete.rb +30 -24
  85. data/plugins/commands/cloud/box/show.rb +41 -31
  86. data/plugins/commands/cloud/box/update.rb +34 -26
  87. data/plugins/commands/cloud/client/client.rb +55 -79
  88. data/plugins/commands/cloud/list.rb +3 -4
  89. data/plugins/commands/cloud/locales/en.yml +15 -11
  90. data/plugins/commands/cloud/plugin.rb +10 -0
  91. data/plugins/commands/cloud/provider/create.rb +38 -28
  92. data/plugins/commands/cloud/provider/delete.rb +39 -29
  93. data/plugins/commands/cloud/provider/update.rb +37 -28
  94. data/plugins/commands/cloud/provider/upload.rb +53 -33
  95. data/plugins/commands/cloud/publish.rb +193 -106
  96. data/plugins/commands/cloud/search.rb +34 -21
  97. data/plugins/commands/cloud/util.rb +273 -161
  98. data/plugins/commands/cloud/version/create.rb +33 -28
  99. data/plugins/commands/cloud/version/delete.rb +35 -28
  100. data/plugins/commands/cloud/version/release.rb +35 -29
  101. data/plugins/commands/cloud/version/revoke.rb +36 -29
  102. data/plugins/commands/cloud/version/update.rb +29 -25
  103. data/plugins/commands/destroy/command.rb +7 -7
  104. data/plugins/commands/login/plugin.rb +0 -13
  105. data/plugins/commands/ssh_config/command.rb +1 -1
  106. data/plugins/communicators/ssh/communicator.rb +25 -24
  107. data/plugins/communicators/winrm/config.rb +1 -1
  108. data/plugins/communicators/winrm/helper.rb +1 -1
  109. data/plugins/communicators/winrm/shell.rb +1 -1
  110. data/plugins/communicators/winssh/communicator.rb +126 -38
  111. data/plugins/communicators/winssh/config.rb +3 -7
  112. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  113. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  114. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  115. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  116. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  117. data/plugins/guests/arch/cap/smb.rb +1 -1
  118. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  119. data/plugins/guests/centos/cap/flavor.rb +24 -0
  120. data/plugins/guests/centos/guest.rb +9 -0
  121. data/plugins/guests/centos/plugin.rb +20 -0
  122. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  123. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  124. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  125. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
  126. data/plugins/guests/darwin/plugin.rb +15 -0
  127. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  128. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  129. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  130. data/plugins/guests/fedora/guest.rb +4 -4
  131. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  132. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  133. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  134. data/plugins/guests/haiku/plugin.rb +15 -0
  135. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  136. data/plugins/guests/linux/cap/halt.rb +9 -1
  137. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  138. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  139. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
  140. data/plugins/guests/linux/cap/reboot.rb +36 -7
  141. data/plugins/guests/linux/plugin.rb +10 -0
  142. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  143. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  144. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  145. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  146. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  147. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  148. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  149. data/plugins/guests/openwrt/guest.rb +23 -0
  150. data/plugins/guests/openwrt/plugin.rb +61 -0
  151. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  152. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  153. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  154. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  155. data/plugins/guests/redhat/cap/smb.rb +20 -0
  156. data/plugins/guests/redhat/plugin.rb +5 -0
  157. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  158. data/plugins/guests/solaris11/plugin.rb +5 -0
  159. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  160. data/plugins/guests/windows/cap/public_key.rb +3 -3
  161. data/plugins/guests/windows/cap/reboot.rb +10 -5
  162. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/darwin/plugin.rb +10 -0
  164. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  165. data/plugins/hosts/linux/cap/nfs.rb +1 -0
  166. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  167. data/plugins/hosts/linux/plugin.rb +10 -0
  168. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  169. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  170. data/plugins/hosts/windows/plugin.rb +15 -0
  171. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  172. data/plugins/kernel_v2/config/disk.rb +67 -14
  173. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  174. data/plugins/kernel_v2/config/vm.rb +155 -21
  175. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  176. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  177. data/plugins/providers/docker/action.rb +8 -17
  178. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  179. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  180. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  181. data/plugins/providers/docker/communicator.rb +1 -1
  182. data/plugins/providers/docker/driver.rb +58 -7
  183. data/plugins/providers/docker/plugin.rb +5 -0
  184. data/plugins/providers/hyperv/action.rb +3 -1
  185. data/plugins/providers/hyperv/action/configure.rb +8 -0
  186. data/plugins/providers/hyperv/action/export.rb +4 -2
  187. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  188. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  189. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  190. data/plugins/providers/hyperv/config.rb +5 -0
  191. data/plugins/providers/hyperv/driver.rb +90 -9
  192. data/plugins/providers/hyperv/plugin.rb +25 -0
  193. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  194. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  195. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  196. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  197. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  198. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  199. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  200. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  201. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  202. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  203. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  204. data/plugins/providers/virtualbox/action.rb +13 -1
  205. data/plugins/providers/virtualbox/action/export.rb +4 -2
  206. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  207. data/plugins/providers/virtualbox/action/import.rb +8 -4
  208. data/plugins/providers/virtualbox/action/network.rb +12 -5
  209. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  210. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  211. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  212. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  213. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  214. data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
  215. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  216. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  217. data/plugins/providers/virtualbox/driver/meta.rb +16 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
  220. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  221. data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
  222. data/plugins/providers/virtualbox/plugin.rb +42 -0
  223. data/plugins/providers/virtualbox/provider.rb +2 -1
  224. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  225. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  226. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  227. data/plugins/provisioners/ansible/plugin.rb +5 -0
  228. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  229. data/plugins/provisioners/container/client.rb +203 -0
  230. data/plugins/provisioners/container/config.rb +83 -0
  231. data/plugins/provisioners/container/installer.rb +13 -0
  232. data/plugins/provisioners/container/plugin.rb +23 -0
  233. data/plugins/provisioners/container/provisioner.rb +28 -0
  234. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  235. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  236. data/plugins/provisioners/docker/client.rb +4 -175
  237. data/plugins/provisioners/docker/config.rb +2 -72
  238. data/plugins/provisioners/docker/installer.rb +3 -5
  239. data/plugins/provisioners/docker/plugin.rb +6 -6
  240. data/plugins/provisioners/docker/provisioner.rb +4 -10
  241. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  242. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  243. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  244. data/plugins/provisioners/podman/client.rb +12 -0
  245. data/plugins/provisioners/podman/config.rb +28 -0
  246. data/plugins/provisioners/podman/installer.rb +33 -0
  247. data/plugins/provisioners/podman/plugin.rb +38 -0
  248. data/plugins/provisioners/podman/provisioner.rb +52 -0
  249. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  250. data/plugins/provisioners/salt/provisioner.rb +4 -0
  251. data/plugins/provisioners/shell/config.rb +1 -6
  252. data/plugins/provisioners/shell/provisioner.rb +61 -26
  253. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  254. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  255. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  256. data/plugins/synced_folders/smb/plugin.rb +20 -0
  257. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  258. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  259. data/scripts/website_push_www.sh +1 -1
  260. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  261. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  262. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  263. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  264. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  265. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  266. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  267. data/templates/guests/linux/etc_fstab.erb +6 -0
  268. data/templates/guests/nixos/network.erb +5 -6
  269. data/templates/locales/en.yml +221 -5
  270. data/templates/locales/providers_docker.yml +4 -0
  271. data/templates/nfs/exports_darwin.erb +1 -1
  272. data/vagrant.gemspec +14 -20
  273. data/version.txt +1 -1
  274. metadata +5092 -8978
  275. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  276. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  277. data/plugins/commands/login/client.rb +0 -253
  278. data/plugins/commands/login/command.rb +0 -137
  279. data/plugins/commands/login/errors.rb +0 -24
  280. data/plugins/commands/login/locales/en.yml +0 -49
  281. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  282. data/scripts/website_push_docs.sh +0 -40
data/lib/vagrant/cli.rb CHANGED
@@ -62,9 +62,11 @@ module Vagrant
62
62
  # Initialize and execute the command class, returning the exit status.
63
63
  result = 0
64
64
  begin
65
- @triggers.fire_triggers(@sub_command.to_sym, :before, nil, :command) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
65
+ @triggers.fire(@sub_command, :before, nil, :command) if
66
+ Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
66
67
  result = command_class.new(@sub_args, @env).execute
67
- @triggers.fire_triggers(@sub_command.to_sym, :after, nil, :command) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
68
+ @triggers.fire(@sub_command, :after, nil, :command) if
69
+ Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
68
70
  rescue Interrupt
69
71
  @env.ui.info(I18n.t("vagrant.cli_interrupt"))
70
72
  result = 1
@@ -517,6 +517,7 @@ module Vagrant
517
517
  # @param [Action::Runner] action_runner A custom action runner for running hooks.
518
518
  def hook(name, opts=nil)
519
519
  @logger.info("Running hook: #{name}")
520
+
520
521
  opts ||= {}
521
522
  opts[:callable] ||= Action::Builder.new
522
523
  opts[:runner] ||= action_runner
@@ -100,7 +100,7 @@ module Vagrant
100
100
 
101
101
  def translate_error(opts)
102
102
  return nil if !opts[:_key]
103
- I18n.t("#{opts[:_namespace]}.#{opts[:_key]}", opts)
103
+ I18n.t("#{opts[:_namespace]}.#{opts[:_key]}", **opts)
104
104
  end
105
105
  end
106
106
 
@@ -248,6 +248,10 @@ module Vagrant
248
248
  error_key(:bundler_error)
249
249
  end
250
250
 
251
+ class SourceSpecNotFound < BundlerError
252
+ error_key(:source_spec_not_found)
253
+ end
254
+
251
255
  class CantReadMACAddresses < VagrantError
252
256
  error_key(:cant_read_mac_addresses)
253
257
  end
@@ -300,6 +304,14 @@ module Vagrant
300
304
  error_key(:clone_machine_not_found)
301
305
  end
302
306
 
307
+ class CloudInitNotFound < VagrantError
308
+ error_key(:cloud_init_not_found)
309
+ end
310
+
311
+ class CloudInitCommandFailed < VagrantError
312
+ error_key(:cloud_init_command_failed)
313
+ end
314
+
303
315
  class CommandDeprecated < VagrantError
304
316
  error_key(:command_deprecated)
305
317
  end
@@ -336,6 +348,10 @@ module Vagrant
336
348
  error_key(:corrupt_machine_index)
337
349
  end
338
350
 
351
+ class CreateIsoHostCapNotFound < VagrantError
352
+ error_key(:create_iso_host_cap_not_found)
353
+ end
354
+
339
355
  class DarwinMountFailed < VagrantError
340
356
  error_key(:darwin_mount_failed)
341
357
  end
@@ -396,6 +412,10 @@ module Vagrant
396
412
  error_key(:auto_empty, "vagrant.actions.vm.forward_ports")
397
413
  end
398
414
 
415
+ class ForwardPortHostIPNotFound < VagrantError
416
+ error_key(:host_ip_not_found, "vagrant.actions.vm.forward_ports")
417
+ end
418
+
399
419
  class ForwardPortCollision < VagrantError
400
420
  error_key(:collision_error, "vagrant.actions.vm.forward_ports")
401
421
  end
@@ -420,6 +440,10 @@ module Vagrant
420
440
  error_key(:host_explicit_not_detected)
421
441
  end
422
442
 
443
+ class ISOBuildFailed < VagrantError
444
+ error_key(:iso_build_failed)
445
+ end
446
+
423
447
  class LinuxMountFailed < VagrantError
424
448
  error_key(:linux_mount_failed)
425
449
  end
@@ -460,6 +484,10 @@ module Vagrant
460
484
  error_key(:multi_vm_target_required)
461
485
  end
462
486
 
487
+ class NetplanNoAvailableRenderers < VagrantError
488
+ error_key(:netplan_no_available_renderers)
489
+ end
490
+
463
491
  class NetSSHException < VagrantError
464
492
  error_key(:net_ssh_exception)
465
493
  end
@@ -608,6 +636,18 @@ module Vagrant
608
636
  error_key(:provisioner_winrm_unsupported)
609
637
  end
610
638
 
639
+ class PluginNeedsDeveloperTools < VagrantError
640
+ error_key(:plugin_needs_developer_tools)
641
+ end
642
+
643
+ class PluginMissingLibrary < VagrantError
644
+ error_key(:plugin_missing_library)
645
+ end
646
+
647
+ class PluginMissingRubyDev < VagrantError
648
+ error_key(:plugin_missing_ruby_dev)
649
+ end
650
+
611
651
  class PluginGemNotFound < VagrantError
612
652
  error_key(:plugin_gem_not_found)
613
653
  end
@@ -616,6 +656,10 @@ module Vagrant
616
656
  error_key(:plugin_install_license_not_found)
617
657
  end
618
658
 
659
+ class PluginInstallFailed < VagrantError
660
+ error_key(:plugin_install_failed)
661
+ end
662
+
619
663
  class PluginInstallSpace < VagrantError
620
664
  error_key(:plugin_install_space)
621
665
  end
@@ -780,6 +824,10 @@ module Vagrant
780
824
  error_key(:ssh_key_type_not_supported)
781
825
  end
782
826
 
827
+ class SSHNoExitStatus < VagrantError
828
+ error_key(:ssh_no_exit_status)
829
+ end
830
+
783
831
  class SSHNoRoute < VagrantError
784
832
  error_key(:ssh_no_route)
785
833
  end
@@ -904,6 +952,26 @@ module Vagrant
904
952
  error_key(:virtualbox_broken_version_040214)
905
953
  end
906
954
 
955
+ class VirtualBoxDisksDefinedExceedLimit < VagrantError
956
+ error_key(:virtualbox_disks_defined_exceed_limit)
957
+ end
958
+
959
+ class VirtualBoxDisksControllerNotFound < VagrantError
960
+ error_key(:virtualbox_disks_controller_not_found)
961
+ end
962
+
963
+ class VirtualBoxDisksNoSupportedControllers < VagrantError
964
+ error_key(:virtualbox_disks_no_supported_controllers)
965
+ end
966
+
967
+ class VirtualBoxDisksPrimaryNotFound < VagrantError
968
+ error_key(:virtualbox_disks_primary_not_found)
969
+ end
970
+
971
+ class VirtualBoxDisksUnsupportedController < VagrantError
972
+ error_key(:virtualbox_disks_unsupported_controller)
973
+ end
974
+
907
975
  class VirtualBoxGuestPropertyNotFound < VagrantError
908
976
  error_key(:virtualbox_guest_property_not_found)
909
977
  end
@@ -1,4 +1,5 @@
1
1
  require_relative "util/ssh"
2
+ require_relative "action/builtin/mixin_synced_folders"
2
3
 
3
4
  require "digest/md5"
4
5
  require "thread"
@@ -10,6 +11,8 @@ module Vagrant
10
11
  # API for querying the state and making state changes to the machine, which
11
12
  # is backed by any sort of provider (VirtualBox, VMware, etc.).
12
13
  class Machine
14
+ extend Vagrant::Action::Builtin::MixinSyncedFolders
15
+
13
16
  # The box that is backing this machine.
14
17
  #
15
18
  # @return [Box]
@@ -62,6 +65,11 @@ module Vagrant
62
65
  # @return [Hash]
63
66
  attr_reader :provider_options
64
67
 
68
+ # The triggers with machine specific configuration applied
69
+ #
70
+ # @return [Vagrant::Plugin::V2::Trigger]
71
+ attr_reader :triggers
72
+
65
73
  # The UI for outputting in the scope of this machine.
66
74
  #
67
75
  # @return [UI]
@@ -160,8 +168,6 @@ module Vagrant
160
168
  # as extra data set on the environment hash for the middleware
161
169
  # runner.
162
170
  def action(name, opts=nil)
163
- @triggers.fire_triggers(name, :before, @name.to_s, :action)
164
-
165
171
  @logger.info("Calling action: #{name} on provider #{@provider}")
166
172
 
167
173
  opts ||= {}
@@ -210,8 +216,6 @@ module Vagrant
210
216
  ui.machine("action", name.to_s, "end")
211
217
  action_result
212
218
  end
213
-
214
- @triggers.fire_triggers(name, :after, @name.to_s, :action)
215
219
  # preserve returning environment after machine action runs
216
220
  return return_env
217
221
  rescue Errors::EnvironmentLockedError
@@ -227,14 +231,18 @@ module Vagrant
227
231
  # @param [Proc] callable
228
232
  # @param [Hash] extra_env Extra env for the action env.
229
233
  # @return [Hash] The resulting env
230
- def action_raw(name, callable, extra_env=nil)
234
+ def action_raw(name, callable, extra_env={})
235
+ if !extra_env.is_a?(Hash)
236
+ extra_env = {}
237
+ end
238
+
231
239
  # Run the action with the action runner on the environment
232
- env = {
240
+ env = {ui: @ui}.merge(extra_env).merge(
241
+ raw_action_name: name,
233
242
  action_name: "machine_action_#{name}".to_sym,
234
243
  machine: self,
235
- machine_action: name,
236
- ui: @ui,
237
- }.merge(extra_env || {})
244
+ machine_action: name
245
+ )
238
246
  @env.action_runner.run(callable, env)
239
247
  end
240
248
 
@@ -476,8 +484,9 @@ module Vagrant
476
484
 
477
485
  # We also set some fields that are purely controlled by Vagrant
478
486
  info[:forward_agent] = @config.ssh.forward_agent
479
- info[:forward_x11] = @config.ssh.forward_x11
480
- info[:forward_env] = @config.ssh.forward_env
487
+ info[:forward_x11] = @config.ssh.forward_x11
488
+ info[:forward_env] = @config.ssh.forward_env
489
+ info[:connect_timeout] = @config.ssh.connect_timeout
481
490
 
482
491
  info[:ssh_command] = @config.ssh.ssh_command if @config.ssh.ssh_command
483
492
 
@@ -553,6 +562,41 @@ module Vagrant
553
562
  result
554
563
  end
555
564
 
565
+ # Returns the state of this machine. The state is queried from the
566
+ # backing provider, so it can be any arbitrary symbol.
567
+ #
568
+ # @param [Symbol] state of machine
569
+ # @return [Entry] entry of recovered machine
570
+ def recover_machine(state)
571
+ entry = @env.machine_index.get(index_uuid)
572
+ if entry
573
+ @env.machine_index.release(entry)
574
+ return entry
575
+ end
576
+
577
+ entry = MachineIndex::Entry.new(id=index_uuid, {})
578
+ entry.local_data_path = @env.local_data_path
579
+ entry.name = @name.to_s
580
+ entry.provider = @provider_name.to_s
581
+ entry.state = state
582
+ entry.vagrantfile_path = @env.root_path
583
+ entry.vagrantfile_name = @env.vagrantfile_name
584
+
585
+ if @box
586
+ entry.extra_data["box"] = {
587
+ "name" => @box.name,
588
+ "provider" => @box.provider.to_s,
589
+ "version" => @box.version.to_s,
590
+ }
591
+ end
592
+
593
+ @state_mutex.synchronize do
594
+ entry = @env.machine_index.recover(entry)
595
+ @env.machine_index.release(entry)
596
+ end
597
+ return entry
598
+ end
599
+
556
600
  # Returns the user ID that created this machine. This is specific to
557
601
  # the host machine that this was created on.
558
602
  #
@@ -578,6 +622,15 @@ module Vagrant
578
622
  end
579
623
  end
580
624
 
625
+ # This returns the set of shared folders that should be done for
626
+ # this machine. It returns the folders in a hash keyed by the
627
+ # implementation class for the synced folders.
628
+ #
629
+ # @return [Hash<Symbol, Hash<String, Hash>>]
630
+ def synced_folders
631
+ self.class.synced_folders(self)
632
+ end
633
+
581
634
  protected
582
635
 
583
636
  # Returns the path to the file that stores the UID.
@@ -231,12 +231,39 @@ module Vagrant
231
231
  Entry.new(id, struct)
232
232
  end
233
233
 
234
+ # Reinsert a machine into the global index if it has
235
+ # a valid existing uuid but does not currently exist
236
+ # in the index.
237
+ #
238
+ # @param [Entry] entry
239
+ # @return [Entry]
240
+ def recover(entry)
241
+ @lock.synchronize do
242
+ with_index_lock do
243
+ # Reload the data
244
+ unlocked_reload
245
+ # Don't recover if entry already exists in the global
246
+ return entry if find_by_prefix(entry.id)
247
+
248
+ lock_file = lock_machine(entry.id)
249
+ if !lock_file
250
+ raise Errors::MachineLocked,
251
+ name: entry.name,
252
+ provider: entry.provider
253
+ end
254
+ @machine_locks[entry.id] = lock_file
255
+ end
256
+ end
257
+ return set(entry)
258
+ end
259
+
234
260
  protected
235
261
 
236
262
  # Finds a machine where the UUID is prefixed by the given string.
237
263
  #
238
264
  # @return [Hash]
239
265
  def find_by_prefix(prefix)
266
+ return if !prefix || prefix == ""
240
267
  @machines.each do |uuid, data|
241
268
  return data.merge("id" => uuid) if uuid.start_with?(prefix)
242
269
  end
@@ -452,7 +479,7 @@ module Vagrant
452
479
  # Creates a {Vagrant::Environment} for this entry.
453
480
  #
454
481
  # @return [Vagrant::Environment]
455
- def vagrant_env(home_path, **opts)
482
+ def vagrant_env(home_path, opts={})
456
483
  Vagrant::Util::SilenceWarnings.silence! do
457
484
  Environment.new({
458
485
  cwd: @vagrantfile_path,
@@ -0,0 +1,186 @@
1
+ require "net/ssh"
2
+
3
+ # Only patch if we have version 6.1.0 loaded as
4
+ # these patches pull 6.1.0 up to the as of now
5
+ # current 6.2.0 beta
6
+ if Net::SSH::Version::STRING == "6.1.0"
7
+ require "net/ssh/authentication/methods/publickey"
8
+ Net::SSH::Authentication::Methods::Publickey.class_eval do
9
+ def rsa_compat_build_request(pub_key, *args)
10
+ s_ver_str = session.transport.server_version.version.match(/OpenSSH_(?<version>\d+\.\d+)/)[:version]
11
+ begin
12
+ s_ver = Gem::Version.new(s_ver_str)
13
+ if s_ver >= Gem::Version.new("7.2") && pub_key.is_a?(OpenSSL::PKey::RSA)
14
+ pub_key.deprecated_ssh_rsa = true
15
+ debug { "public key has been marked for deprecated ssh-rsa SHA1 behavior" }
16
+ info = key_manager.known_identities[pub_key]
17
+ if info && info[:key]
18
+ info[:key].deprecated_ssh_rsa = true
19
+ debug { "private key has been marked for deprecated ssh-rsa SHA1 behavior" }
20
+ else
21
+ warn { "cannot deprecate ssh rsa on private key, not loaded (#{info[:file]})" }
22
+ end
23
+ end
24
+ rescue ArgumentError
25
+ warn { "failed to parse OpenSSH version (raw: #{session.transport.server_version.version} attempted: #{s_ver_str}" }
26
+ end
27
+ _raw_build_request(pub_key, *args)
28
+ end
29
+ alias_method :_raw_build_request, :build_request
30
+ alias_method :build_request, :rsa_compat_build_request
31
+ end
32
+
33
+ require "net/ssh/authentication/agent"
34
+ # net/ssh/authentication/agent
35
+ Net::SSH::Authentication::Agent.class_eval do
36
+ SSH2_AGENT_LOCK = 22
37
+ SSH2_AGENT_UNLOCK = 23
38
+
39
+ # lock the ssh agent with password
40
+ def lock(password)
41
+ type, = send_and_wait(SSH2_AGENT_LOCK, :string, password)
42
+ raise AgentError, "could not lock agent" if type != SSH_AGENT_SUCCESS
43
+ end
44
+
45
+ # unlock the ssh agent with password
46
+ def unlock(password)
47
+ type, = send_and_wait(SSH2_AGENT_UNLOCK, :string, password)
48
+ raise AgentError, "could not unlock agent" if type != SSH_AGENT_SUCCESS
49
+ end
50
+ end
51
+
52
+ require "net/ssh/authentication/certificate"
53
+ # net/ssh/authentication/certificate
54
+ Net::SSH::Authentication::Certificate.class_eval do
55
+ def ssh_do_verify(sig, data, options = {})
56
+ key.ssh_do_verify(sig, data, options)
57
+ end
58
+ end
59
+
60
+ require "net/ssh/authentication/ed25519"
61
+ # net/ssh/authentication/ed25519
62
+ Net::SSH::Authentication::ED25519::PubKey.class_eval do
63
+ def ssh_do_verify(sig, data, options = {})
64
+ @verify_key.verify(sig,data)
65
+ end
66
+ end
67
+
68
+ require "net/ssh/transport/algorithms"
69
+ # net/ssh/transport/algorithms
70
+ Net::SSH::Transport::Algorithms::DEFAULT_ALGORITHMS[:host_key].push("rsa-sha2-256").push("rsa-sha2-512")
71
+
72
+ require "net/ssh/transport/cipher_factory"
73
+ # net/ssh/transport/cipher_factory
74
+ Net::SSH::Transport::CipherFactory::SSH_TO_OSSL["aes256-ctr"] = ::OpenSSL::Cipher.ciphers.include?("aes-256-ctr") ? "aes-256-ctr" : "aes-256-ecb"
75
+ Net::SSH::Transport::CipherFactory::SSH_TO_OSSL["aes192-ctr"] = ::OpenSSL::Cipher.ciphers.include?("aes-192-ctr") ? "aes-192-ctr" : "aes-192-ecb"
76
+ Net::SSH::Transport::CipherFactory::SSH_TO_OSSL["aes128-ctr"] = ::OpenSSL::Cipher.ciphers.include?("aes-128-ctr") ? "aes-128-ctr" : "aes-128-ecb"
77
+
78
+ require "net/ssh/transport/kex/abstract"
79
+ # net/ssh/transport/kex/abstract
80
+ Net::SSH::Transport::Kex::Abstract.class_eval do
81
+ def matching?(key_ssh_type, host_key_alg)
82
+ return true if key_ssh_type == host_key_alg
83
+ return true if key_ssh_type == 'ssh-rsa' && ['rsa-sha2-512', 'rsa-sha2-256'].include?(host_key_alg)
84
+ end
85
+
86
+ def verify_server_key(key) #:nodoc:
87
+ unless matching?(key.ssh_type, algorithms.host_key)
88
+ raise Net::SSH::Exception, "host key algorithm mismatch '#{key.ssh_type}' != '#{algorithms.host_key}'"
89
+ end
90
+
91
+ blob, fingerprint = generate_key_fingerprint(key)
92
+
93
+ unless connection.host_key_verifier.verify(key: key, key_blob: blob, fingerprint: fingerprint, session: connection)
94
+ raise Net::SSH::Exception, 'host key verification failed'
95
+ end
96
+ end
97
+
98
+ def verify_signature(result) #:nodoc:
99
+ response = build_signature_buffer(result)
100
+
101
+ hash = digester.digest(response.to_s)
102
+
103
+ server_key = result[:server_key]
104
+ server_sig = result[:server_sig]
105
+ unless connection.host_key_verifier.verify_signature { server_key.ssh_do_verify(server_sig, hash, host_key: algorithms.host_key) }
106
+ raise Net::SSH::Exception, 'could not verify server signature'
107
+ end
108
+
109
+ hash
110
+ end
111
+ end
112
+
113
+ require "net/ssh/transport/openssl"
114
+ # net/ssh/transport/openssl
115
+ OpenSSL::PKey::RSA.class_eval do
116
+ attr_accessor :deprecated_ssh_rsa
117
+
118
+ def ssh_do_verify(sig, data, options = {})
119
+ digester =
120
+ if options[:host_key] == "rsa-sha2-512"
121
+ OpenSSL::Digest::SHA512.new
122
+ elsif options[:host_key] == "rsa-sha2-256"
123
+ OpenSSL::Digest::SHA256.new
124
+ else
125
+ OpenSSL::Digest::SHA1.new
126
+ end
127
+
128
+ verify(digester, sig, data)
129
+ end
130
+
131
+ def ssh_type
132
+ deprecated_ssh_rsa ? signature_algorithm : "ssh-rsa"
133
+ end
134
+
135
+ def signature_algorithm
136
+ "rsa-sha2-256"
137
+ end
138
+
139
+ def ssh_do_sign(data)
140
+ if deprecated_ssh_rsa
141
+ sign(OpenSSL::Digest::SHA256.new, data)
142
+ else
143
+ sign(OpenSSL::Digest::SHA1.new, data)
144
+ end
145
+ end
146
+ end
147
+
148
+ OpenSSL::PKey::DSA.class_eval do
149
+ def ssh_do_verify(sig, data, options = {})
150
+ sig_r = sig[0,20].unpack("H*")[0].to_i(16)
151
+ sig_s = sig[20,20].unpack("H*")[0].to_i(16)
152
+ a1sig = OpenSSL::ASN1::Sequence([
153
+ OpenSSL::ASN1::Integer(sig_r),
154
+ OpenSSL::ASN1::Integer(sig_s)
155
+ ])
156
+ return verify(OpenSSL::Digest::SHA1.new, a1sig.to_der, data)
157
+ end
158
+ end
159
+
160
+ OpenSSL::PKey::EC.class_eval do
161
+ def ssh_do_verify(sig, data, options = {})
162
+ digest = digester.digest(data)
163
+ a1sig = nil
164
+
165
+ begin
166
+ sig_r_len = sig[0, 4].unpack('H*')[0].to_i(16)
167
+ sig_l_len = sig[4 + sig_r_len, 4].unpack('H*')[0].to_i(16)
168
+
169
+ sig_r = sig[4, sig_r_len].unpack('H*')[0]
170
+ sig_s = sig[4 + sig_r_len + 4, sig_l_len].unpack('H*')[0]
171
+
172
+ a1sig = OpenSSL::ASN1::Sequence([
173
+ OpenSSL::ASN1::Integer(sig_r.to_i(16)),
174
+ OpenSSL::ASN1::Integer(sig_s.to_i(16))
175
+ ])
176
+ rescue StandardError
177
+ end
178
+
179
+ if a1sig.nil?
180
+ return false
181
+ else
182
+ dsa_verify_asn1(digest, a1sig.to_der)
183
+ end
184
+ end
185
+ end
186
+ end