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.
- checksums.yaml +4 -4
- data/.hashibot.hcl +2 -0
- data/CHANGELOG.md +228 -0
- data/Gemfile +1 -1
- data/README.md +9 -51
- data/RELEASE.md +1 -1
- data/bin/vagrant +50 -1
- data/contrib/README.md +1 -0
- data/contrib/sudoers/linux-suse +2 -2
- data/contrib/zsh/_vagrant +738 -0
- data/contrib/zsh/generate_zsh_completion.rb +165 -0
- data/lib/vagrant.rb +28 -5
- data/lib/vagrant/action.rb +7 -0
- data/lib/vagrant/action/builder.rb +184 -38
- data/lib/vagrant/action/builtin/box_add.rb +24 -8
- data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
- data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
- data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
- data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
- data/lib/vagrant/action/builtin/delayed.rb +26 -0
- data/lib/vagrant/action/builtin/disk.rb +14 -1
- data/lib/vagrant/action/builtin/handle_box.rb +3 -1
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
- data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
- data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
- data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
- data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
- data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
- data/lib/vagrant/action/builtin/trigger.rb +37 -0
- data/lib/vagrant/action/hook.rb +76 -23
- data/lib/vagrant/action/runner.rb +12 -27
- data/lib/vagrant/action/warden.rb +28 -31
- data/lib/vagrant/box.rb +11 -4
- data/lib/vagrant/box_collection.rb +1 -1
- data/lib/vagrant/bundler.rb +310 -61
- data/lib/vagrant/cli.rb +4 -2
- data/lib/vagrant/environment.rb +1 -0
- data/lib/vagrant/errors.rb +69 -1
- data/lib/vagrant/machine.rb +64 -11
- data/lib/vagrant/machine_index.rb +28 -1
- data/lib/vagrant/patches/net-ssh.rb +186 -0
- data/lib/vagrant/plugin/manager.rb +45 -16
- data/lib/vagrant/plugin/v2/command.rb +7 -2
- data/lib/vagrant/plugin/v2/components.rb +6 -0
- data/lib/vagrant/plugin/v2/manager.rb +67 -0
- data/lib/vagrant/plugin/v2/plugin.rb +13 -0
- data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
- data/lib/vagrant/plugin/v2/trigger.rb +64 -25
- data/lib/vagrant/shared_helpers.rb +36 -0
- data/lib/vagrant/ui.rb +43 -2
- data/lib/vagrant/util.rb +2 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
- data/lib/vagrant/util/caps.rb +48 -0
- data/lib/vagrant/util/credential_scrubber.rb +1 -1
- data/lib/vagrant/util/curl_helper.rb +12 -8
- data/lib/vagrant/util/directory.rb +19 -0
- data/lib/vagrant/util/downloader.rb +10 -5
- data/lib/vagrant/util/guest_hosts.rb +68 -0
- data/lib/vagrant/util/guest_inspection.rb +9 -1
- data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
- data/lib/vagrant/util/io.rb +7 -27
- data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
- data/lib/vagrant/util/is_port_open.rb +8 -19
- data/lib/vagrant/util/map_command_options.rb +33 -0
- data/lib/vagrant/util/mime.rb +92 -0
- data/lib/vagrant/util/network_ip.rb +11 -1
- data/lib/vagrant/util/numeric.rb +28 -0
- data/lib/vagrant/util/platform.rb +10 -2
- data/lib/vagrant/util/powershell.rb +31 -15
- data/lib/vagrant/util/subprocess.rb +9 -1
- data/lib/vagrant/util/template_renderer.rb +2 -2
- data/lib/vagrant/util/uploader.rb +7 -4
- data/lib/vagrant/vagrantfile.rb +2 -2
- data/plugins/commands/autocomplete/command/install.rb +49 -0
- data/plugins/commands/autocomplete/command/root.rb +64 -0
- data/plugins/commands/autocomplete/plugin.rb +18 -0
- data/plugins/commands/cap/command.rb +5 -1
- data/plugins/commands/cloud/auth/login.rb +20 -23
- data/plugins/commands/cloud/auth/logout.rb +2 -10
- data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
- data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
- data/plugins/commands/cloud/auth/whoami.rb +18 -20
- data/plugins/commands/cloud/box/create.rb +33 -29
- data/plugins/commands/cloud/box/delete.rb +30 -24
- data/plugins/commands/cloud/box/show.rb +41 -31
- data/plugins/commands/cloud/box/update.rb +34 -26
- data/plugins/commands/cloud/client/client.rb +55 -79
- data/plugins/commands/cloud/list.rb +3 -4
- data/plugins/commands/cloud/locales/en.yml +15 -11
- data/plugins/commands/cloud/plugin.rb +10 -0
- data/plugins/commands/cloud/provider/create.rb +38 -28
- data/plugins/commands/cloud/provider/delete.rb +39 -29
- data/plugins/commands/cloud/provider/update.rb +37 -28
- data/plugins/commands/cloud/provider/upload.rb +53 -33
- data/plugins/commands/cloud/publish.rb +193 -106
- data/plugins/commands/cloud/search.rb +34 -21
- data/plugins/commands/cloud/util.rb +273 -161
- data/plugins/commands/cloud/version/create.rb +33 -28
- data/plugins/commands/cloud/version/delete.rb +35 -28
- data/plugins/commands/cloud/version/release.rb +35 -29
- data/plugins/commands/cloud/version/revoke.rb +36 -29
- data/plugins/commands/cloud/version/update.rb +29 -25
- data/plugins/commands/destroy/command.rb +7 -7
- data/plugins/commands/login/plugin.rb +0 -13
- data/plugins/commands/ssh_config/command.rb +1 -1
- data/plugins/communicators/ssh/communicator.rb +25 -24
- data/plugins/communicators/winrm/config.rb +1 -1
- data/plugins/communicators/winrm/helper.rb +1 -1
- data/plugins/communicators/winrm/shell.rb +1 -1
- data/plugins/communicators/winssh/communicator.rb +126 -38
- data/plugins/communicators/winssh/config.rb +3 -7
- data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
- data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
- data/plugins/guests/alt/cap/change_host_name.rb +40 -53
- data/plugins/guests/arch/cap/change_host_name.rb +5 -14
- data/plugins/guests/arch/cap/configure_networks.rb +27 -10
- data/plugins/guests/arch/cap/smb.rb +1 -1
- data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
- data/plugins/guests/centos/cap/flavor.rb +24 -0
- data/plugins/guests/centos/guest.rb +9 -0
- data/plugins/guests/centos/plugin.rb +20 -0
- data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
- data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
- data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
- data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
- data/plugins/guests/darwin/plugin.rb +15 -0
- data/plugins/guests/debian/cap/change_host_name.rb +12 -11
- data/plugins/guests/debian/cap/configure_networks.rb +14 -6
- data/plugins/guests/esxi/cap/public_key.rb +3 -1
- data/plugins/guests/fedora/guest.rb +4 -4
- data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
- data/plugins/guests/haiku/cap/rsync.rb +19 -0
- data/plugins/guests/haiku/plugin.rb +15 -0
- data/plugins/guests/linux/cap/change_host_name.rb +46 -0
- data/plugins/guests/linux/cap/halt.rb +9 -1
- data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
- data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
- data/plugins/guests/linux/cap/reboot.rb +36 -7
- data/plugins/guests/linux/plugin.rb +10 -0
- data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
- data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
- data/plugins/guests/openwrt/cap/halt.rb +16 -0
- data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
- data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
- data/plugins/guests/openwrt/cap/rsync.rb +35 -0
- data/plugins/guests/openwrt/guest.rb +23 -0
- data/plugins/guests/openwrt/plugin.rb +61 -0
- data/plugins/guests/photon/cap/change_host_name.rb +9 -15
- data/plugins/guests/pld/cap/change_host_name.rb +11 -17
- data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
- data/plugins/guests/redhat/cap/flavor.rb +3 -1
- data/plugins/guests/redhat/cap/smb.rb +20 -0
- data/plugins/guests/redhat/plugin.rb +5 -0
- data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
- data/plugins/guests/solaris11/plugin.rb +5 -0
- data/plugins/guests/suse/cap/change_host_name.rb +31 -9
- data/plugins/guests/windows/cap/public_key.rb +3 -3
- data/plugins/guests/windows/cap/reboot.rb +10 -5
- data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
- data/plugins/hosts/darwin/plugin.rb +10 -0
- data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
- data/plugins/hosts/linux/cap/nfs.rb +1 -0
- data/plugins/hosts/linux/cap/rdp.rb +1 -1
- data/plugins/hosts/linux/plugin.rb +10 -0
- data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
- data/plugins/hosts/windows/cap/rdp.rb +1 -1
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v2/config/cloud_init.rb +133 -0
- data/plugins/kernel_v2/config/disk.rb +67 -14
- data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
- data/plugins/kernel_v2/config/vm.rb +155 -21
- data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
- data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
- data/plugins/providers/docker/action.rb +8 -17
- data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
- data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
- data/plugins/providers/docker/cap/has_communicator.rb +11 -0
- data/plugins/providers/docker/communicator.rb +1 -1
- data/plugins/providers/docker/driver.rb +58 -7
- data/plugins/providers/docker/plugin.rb +5 -0
- data/plugins/providers/hyperv/action.rb +3 -1
- data/plugins/providers/hyperv/action/configure.rb +8 -0
- data/plugins/providers/hyperv/action/export.rb +4 -2
- data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
- data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
- data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/hyperv/config.rb +5 -0
- data/plugins/providers/hyperv/driver.rb +90 -9
- data/plugins/providers/hyperv/plugin.rb +25 -0
- data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
- data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
- data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
- data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
- data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
- data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
- data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
- data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
- data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
- data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
- data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
- data/plugins/providers/virtualbox/action.rb +13 -1
- data/plugins/providers/virtualbox/action/export.rb +4 -2
- data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
- data/plugins/providers/virtualbox/action/import.rb +8 -4
- data/plugins/providers/virtualbox/action/network.rb +12 -5
- data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
- data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
- data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
- data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
- data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/virtualbox/driver/base.rb +15 -0
- data/plugins/providers/virtualbox/driver/meta.rb +16 -2
- data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
- data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
- data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
- data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +2 -1
- data/plugins/providers/virtualbox/synced_folder.rb +1 -0
- data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
- data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
- data/plugins/provisioners/ansible/plugin.rb +5 -0
- data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
- data/plugins/provisioners/container/client.rb +203 -0
- data/plugins/provisioners/container/config.rb +83 -0
- data/plugins/provisioners/container/installer.rb +13 -0
- data/plugins/provisioners/container/plugin.rb +23 -0
- data/plugins/provisioners/container/provisioner.rb +28 -0
- data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
- data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
- data/plugins/provisioners/docker/client.rb +4 -175
- data/plugins/provisioners/docker/config.rb +2 -72
- data/plugins/provisioners/docker/installer.rb +3 -5
- data/plugins/provisioners/docker/plugin.rb +6 -6
- data/plugins/provisioners/docker/provisioner.rb +4 -10
- data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
- data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
- data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
- data/plugins/provisioners/podman/client.rb +12 -0
- data/plugins/provisioners/podman/config.rb +28 -0
- data/plugins/provisioners/podman/installer.rb +33 -0
- data/plugins/provisioners/podman/plugin.rb +38 -0
- data/plugins/provisioners/podman/provisioner.rb +52 -0
- data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
- data/plugins/provisioners/salt/provisioner.rb +4 -0
- data/plugins/provisioners/shell/config.rb +1 -6
- data/plugins/provisioners/shell/provisioner.rb +61 -26
- data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
- data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
- data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
- data/plugins/synced_folders/smb/plugin.rb +20 -0
- data/plugins/synced_folders/smb/synced_folder.rb +2 -2
- data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
- data/scripts/website_push_www.sh +1 -1
- data/templates/commands/init/Vagrantfile.min.erb +3 -0
- data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
- data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
- data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
- data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
- data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
- data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
- data/templates/guests/linux/etc_fstab.erb +6 -0
- data/templates/guests/nixos/network.erb +5 -6
- data/templates/locales/en.yml +221 -5
- data/templates/locales/providers_docker.yml +4 -0
- data/templates/nfs/exports_darwin.erb +1 -1
- data/vagrant.gemspec +14 -20
- data/version.txt +1 -1
- metadata +5092 -8978
- data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
- data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
- data/plugins/commands/login/client.rb +0 -253
- data/plugins/commands/login/command.rb +0 -137
- data/plugins/commands/login/errors.rb +0 -24
- data/plugins/commands/login/locales/en.yml +0 -49
- data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
- 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.
|
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.
|
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
|
data/lib/vagrant/environment.rb
CHANGED
@@ -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
|
data/lib/vagrant/errors.rb
CHANGED
@@ -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
|
data/lib/vagrant/machine.rb
CHANGED
@@ -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=
|
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
|
-
|
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]
|
480
|
-
info[: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,
|
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
|