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.
- 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
|