vagrant-unbundled 2.2.7.0 → 2.2.16.0

Sign up to get free protection for your applications and to get access to all the features.
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