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
@@ -51,7 +51,7 @@ module Vagrant
|
|
51
51
|
@globalized = true
|
52
52
|
@logger.debug("Enabling globalized plugins")
|
53
53
|
plugins = installed_plugins
|
54
|
-
bundler_init(plugins)
|
54
|
+
bundler_init(plugins, global: user_file.path)
|
55
55
|
plugins
|
56
56
|
end
|
57
57
|
|
@@ -66,7 +66,7 @@ module Vagrant
|
|
66
66
|
@local_file = StateFile.new(env.local_data_path.join("plugins.json"))
|
67
67
|
Vagrant::Bundler.instance.environment_path = env.local_data_path
|
68
68
|
plugins = local_file.installed_plugins
|
69
|
-
bundler_init(plugins)
|
69
|
+
bundler_init(plugins, local: local_file.path)
|
70
70
|
plugins
|
71
71
|
end
|
72
72
|
end
|
@@ -80,7 +80,7 @@ module Vagrant
|
|
80
80
|
#
|
81
81
|
# @param [Hash] plugins List of plugins
|
82
82
|
# @return [nil]
|
83
|
-
def bundler_init(plugins)
|
83
|
+
def bundler_init(plugins, **opts)
|
84
84
|
if !Vagrant.plugins_init?
|
85
85
|
@logger.warn("Plugin initialization is disabled")
|
86
86
|
return nil
|
@@ -99,7 +99,7 @@ module Vagrant
|
|
99
99
|
)
|
100
100
|
end
|
101
101
|
begin
|
102
|
-
Vagrant::Bundler.instance.init!(plugins)
|
102
|
+
Vagrant::Bundler.instance.init!(plugins, **opts)
|
103
103
|
rescue StandardError, ScriptError => err
|
104
104
|
@logger.error("Plugin initialization error - #{err.class}: #{err}")
|
105
105
|
err.backtrace.each do |backtrace_line|
|
@@ -150,17 +150,28 @@ module Vagrant
|
|
150
150
|
else
|
151
151
|
result = local_spec
|
152
152
|
end
|
153
|
-
# Add the plugin to the state file
|
154
|
-
plugin_file = opts[:env_local] ? @local_file : @user_file
|
155
|
-
plugin_file.add_plugin(
|
156
|
-
result.name,
|
157
|
-
version: opts[:version],
|
158
|
-
require: opts[:require],
|
159
|
-
sources: opts[:sources],
|
160
|
-
env_local: !!opts[:env_local],
|
161
|
-
installed_gem_version: result.version.to_s
|
162
|
-
)
|
163
153
|
|
154
|
+
if result
|
155
|
+
# Add the plugin to the state file
|
156
|
+
plugin_file = opts[:env_local] ? @local_file : @user_file
|
157
|
+
plugin_file.add_plugin(
|
158
|
+
result.name,
|
159
|
+
version: opts[:version],
|
160
|
+
require: opts[:require],
|
161
|
+
sources: opts[:sources],
|
162
|
+
env_local: !!opts[:env_local],
|
163
|
+
installed_gem_version: result.version.to_s
|
164
|
+
)
|
165
|
+
else
|
166
|
+
r = Gem::Dependency.new(name, opts[:version])
|
167
|
+
result = Gem::Specification.find { |s|
|
168
|
+
s.satisfies_requirement?(r) &&
|
169
|
+
s.activated?
|
170
|
+
}
|
171
|
+
raise Errors::PluginInstallFailed,
|
172
|
+
name: name if result.nil?
|
173
|
+
@logger.warn("Plugin install returned no result as no new plugins were installed.")
|
174
|
+
end
|
164
175
|
# After install clean plugin gems to remove any cruft. This is useful
|
165
176
|
# for removing outdated dependencies or other versions of an installed
|
166
177
|
# plugin if the plugin is upgraded/downgraded
|
@@ -168,8 +179,26 @@ module Vagrant
|
|
168
179
|
result
|
169
180
|
rescue Gem::GemNotFoundException
|
170
181
|
raise Errors::PluginGemNotFound, name: name
|
171
|
-
rescue Gem::Exception =>
|
172
|
-
|
182
|
+
rescue Gem::Exception => err
|
183
|
+
@logger.warn("Failed to install plugin: #{err}")
|
184
|
+
@logger.debug("#{err.class}: #{err}\n#{err.backtrace.join("\n")}")
|
185
|
+
# Try and determine a cause for the failure
|
186
|
+
case err.message
|
187
|
+
when /install development tools first/
|
188
|
+
raise Errors::PluginNeedsDeveloperTools
|
189
|
+
when /library not found in default locations/
|
190
|
+
lib = err.message.match(/(\w+) library not found in default locations/)
|
191
|
+
if lib.nil?
|
192
|
+
raise Errors::BundlerError, message: err.message
|
193
|
+
end
|
194
|
+
raise Errors::PluginMissingLibrary,
|
195
|
+
library: lib.captures.first,
|
196
|
+
name: name
|
197
|
+
when /find header files for ruby/
|
198
|
+
raise Errors::PluginMissingRubyDev
|
199
|
+
else
|
200
|
+
raise Errors::BundlerError, message: err.message
|
201
|
+
end
|
173
202
|
end
|
174
203
|
|
175
204
|
# Uninstalls the plugin with the given name.
|
@@ -51,7 +51,7 @@ module Vagrant
|
|
51
51
|
argv = @argv.dup
|
52
52
|
|
53
53
|
# Default opts to a blank optionparser if none is given
|
54
|
-
opts ||= OptionParser.new
|
54
|
+
opts ||= Vagrant::OptionParser.new
|
55
55
|
|
56
56
|
# Add the help option, which must be on every command.
|
57
57
|
opts.on_tail("-h", "--help", "Print this help") do
|
@@ -61,7 +61,7 @@ module Vagrant
|
|
61
61
|
|
62
62
|
opts.parse!(argv)
|
63
63
|
return argv
|
64
|
-
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
64
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument, OptionParser::AmbiguousOption
|
65
65
|
raise Errors::CLIInvalidOptions, help: opts.help.chomp
|
66
66
|
end
|
67
67
|
|
@@ -230,6 +230,11 @@ module Vagrant
|
|
230
230
|
color_index = 0
|
231
231
|
|
232
232
|
machines.each do |machine|
|
233
|
+
if (machine.state && machine.state.id != :not_created &&
|
234
|
+
!machine.index_uuid.nil? && !@env.machine_index.include?(machine.index_uuid))
|
235
|
+
machine.recover_machine(machine.state.id)
|
236
|
+
end
|
237
|
+
|
233
238
|
# Set the machine color
|
234
239
|
machine.ui.opts[:color] = color_order[color_index % color_order.length]
|
235
240
|
color_index += 1
|
@@ -64,6 +64,11 @@ module Vagrant
|
|
64
64
|
# @return [Registry<Symbol, Array<Class, Integer>>]
|
65
65
|
attr_reader :synced_folders
|
66
66
|
|
67
|
+
# This contains all the registered synced folder capabilities.
|
68
|
+
#
|
69
|
+
# @return [Hash<Symbol, Registry>]
|
70
|
+
attr_reader :synced_folder_capabilities
|
71
|
+
|
67
72
|
def initialize
|
68
73
|
# The action hooks hash defaults to []
|
69
74
|
@action_hooks = Hash.new { |h, k| h[k] = [] }
|
@@ -78,6 +83,7 @@ module Vagrant
|
|
78
83
|
@provider_capabilities = Hash.new { |h, k| h[k] = Registry.new }
|
79
84
|
@pushes = Registry.new
|
80
85
|
@synced_folders = Registry.new
|
86
|
+
@synced_folder_capabilities = Hash.new { |h, k| h[k] = Registry.new }
|
81
87
|
end
|
82
88
|
end
|
83
89
|
end
|
@@ -28,6 +28,59 @@ module Vagrant
|
|
28
28
|
result
|
29
29
|
end
|
30
30
|
|
31
|
+
# Find all hooks that are applicable for the given key. This
|
32
|
+
# lookup does not include hooks which are defined for ALL_ACTIONS.
|
33
|
+
# Key lookups will match on either string or symbol values. The
|
34
|
+
# provided keys is broken down into multiple parts for lookups,
|
35
|
+
# which allows defining hooks with an entire namespaced name,
|
36
|
+
# or a short suffx. For example:
|
37
|
+
#
|
38
|
+
# Assume we are given an action class
|
39
|
+
# key = Vagrant::Action::Builtin::SyncedFolders
|
40
|
+
#
|
41
|
+
# The list of keys that will be checked for hooks:
|
42
|
+
# ["Vagrant::Action::Builtin::SyncedFolders", "vagrant_action_builtin_synced_folders",
|
43
|
+
# "Action::Builtin::SyncedFolders", "action_builtin_synced_folders",
|
44
|
+
# "Builtin::SyncedFolders", "builtin_synced_folders",
|
45
|
+
# "SyncedFolders", "synced_folders"]
|
46
|
+
#
|
47
|
+
# @param key [Class, String] key Key for hook lookups
|
48
|
+
# @return [Array<Proc>]
|
49
|
+
def find_action_hooks(key)
|
50
|
+
result = []
|
51
|
+
|
52
|
+
generate_hook_keys(key).each do |k|
|
53
|
+
@registered.each do |plugin|
|
54
|
+
result += plugin.components.action_hooks[k]
|
55
|
+
result += plugin.components.action_hooks[k.to_sym]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
result
|
60
|
+
end
|
61
|
+
|
62
|
+
# Generate all valid lookup keys for given key
|
63
|
+
#
|
64
|
+
# @param [Class, String] key Base key for generation
|
65
|
+
# @return [Array<String>] all valid keys
|
66
|
+
def generate_hook_keys(key)
|
67
|
+
if key.is_a?(Class)
|
68
|
+
key = key.name.to_s
|
69
|
+
else
|
70
|
+
key = key.to_s
|
71
|
+
end
|
72
|
+
parts = key.split("::")
|
73
|
+
[].tap do |keys|
|
74
|
+
until parts.empty?
|
75
|
+
x = parts.join("::")
|
76
|
+
keys << x
|
77
|
+
y = x.gsub(/([a-z])([A-Z])/, '\1_\2').gsub('::', '_').downcase
|
78
|
+
keys << y if x != y
|
79
|
+
parts.shift
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
31
84
|
# This returns all the registered commands.
|
32
85
|
#
|
33
86
|
# @return [Registry<Symbol, Array<Proc, Hash>>]
|
@@ -204,7 +257,21 @@ module Vagrant
|
|
204
257
|
end
|
205
258
|
end
|
206
259
|
end
|
260
|
+
|
261
|
+
# This returns all the registered synced folder capabilities.
|
262
|
+
#
|
263
|
+
# @return [Hash]
|
264
|
+
def synced_folder_capabilities
|
265
|
+
results = Hash.new { |h, k| h[k] = Registry.new }
|
207
266
|
|
267
|
+
@registered.each do |plugin|
|
268
|
+
plugin.components.synced_folder_capabilities.each do |synced_folder, caps|
|
269
|
+
results[synced_folder].merge!(caps)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
results
|
274
|
+
end
|
208
275
|
# This registers a plugin. This should _NEVER_ be called by the public
|
209
276
|
# and should only be called from within Vagrant. Vagrant will
|
210
277
|
# automatically register V2 plugins when a name is set on the
|
@@ -71,6 +71,7 @@ module Vagrant
|
|
71
71
|
# @return [Array] List of the hooks for the given action.
|
72
72
|
def self.action_hook(name, hook_name=nil, &block)
|
73
73
|
# The name is currently not used but we want it for the future.
|
74
|
+
hook_name = hook_name.to_s if hook_name
|
74
75
|
|
75
76
|
hook_name ||= ALL_ACTIONS
|
76
77
|
components.action_hooks[hook_name.to_sym] << block
|
@@ -246,6 +247,18 @@ module Vagrant
|
|
246
247
|
nil
|
247
248
|
end
|
248
249
|
|
250
|
+
# Defines a capability for the given synced folder. The block should return
|
251
|
+
# a class/module that has a method with the capability name, ready
|
252
|
+
# to be executed. This means that if it is an instance method,
|
253
|
+
# the block should return an instance of the class.
|
254
|
+
#
|
255
|
+
# @param [String] synced_folder The name of the synced folder
|
256
|
+
# @param [String] cap The name of the capability
|
257
|
+
def self.synced_folder_capability(synced_folder, cap, &block)
|
258
|
+
components.synced_folder_capabilities[synced_folder.to_sym].register(cap.to_sym, &block)
|
259
|
+
nil
|
260
|
+
end
|
261
|
+
|
249
262
|
# Returns the internal data associated with this plugin. This
|
250
263
|
# should NOT be called by the general public.
|
251
264
|
#
|
@@ -3,6 +3,49 @@ module Vagrant
|
|
3
3
|
module V2
|
4
4
|
# This is the base class for a synced folder implementation.
|
5
5
|
class SyncedFolder
|
6
|
+
class Collection < Hash
|
7
|
+
|
8
|
+
# @return [Array<Symbol>] names of synced folder types
|
9
|
+
def types
|
10
|
+
keys
|
11
|
+
end
|
12
|
+
|
13
|
+
# Fetch the synced plugin folder of the given type
|
14
|
+
#
|
15
|
+
# @param [Symbol] t Synced folder type
|
16
|
+
# @return [Vagrant::Plugin::V2::SyncedFolder]
|
17
|
+
def type(t)
|
18
|
+
f = detect { |k, _| k.to_sym == t.to_sym }.last
|
19
|
+
raise KeyError, "Unknown synced folder type" if !f
|
20
|
+
f.values.first[:plugin]
|
21
|
+
end
|
22
|
+
|
23
|
+
# Converts to a regular Hash and removes
|
24
|
+
# plugin instances so the result is ready
|
25
|
+
# for serialization
|
26
|
+
#
|
27
|
+
# @return [Hash]
|
28
|
+
def to_h
|
29
|
+
c = lambda do |h|
|
30
|
+
h.keys.each do |k|
|
31
|
+
if h[k].is_a?(Hash)
|
32
|
+
h[k] = c.call(h[k].to_h.clone)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
h
|
36
|
+
end
|
37
|
+
h = c.call(super)
|
38
|
+
h.values.each do |f|
|
39
|
+
f.values.each do |g|
|
40
|
+
g.delete(:plugin)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
h
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
include CapabilityHost
|
48
|
+
|
6
49
|
# This is called early when the synced folder is set to determine
|
7
50
|
# if this implementation can be used for this machine. This should
|
8
51
|
# return true or false.
|
@@ -54,6 +97,13 @@ module Vagrant
|
|
54
97
|
# @param [Hash] opts
|
55
98
|
def cleanup(machine, opts)
|
56
99
|
end
|
100
|
+
|
101
|
+
def _initialize(machine, synced_folder_type)
|
102
|
+
plugins = Vagrant.plugin("2").manager.synced_folders
|
103
|
+
capabilities = Vagrant.plugin("2").manager.synced_folder_capabilities
|
104
|
+
initialize_capabilities!(synced_folder_type, plugins, capabilities, machine)
|
105
|
+
self
|
106
|
+
end
|
57
107
|
end
|
58
108
|
end
|
59
109
|
end
|
@@ -30,58 +30,98 @@ module Vagrant
|
|
30
30
|
@logger = Log4r::Logger.new("vagrant::trigger::#{self.class.to_s.downcase}")
|
31
31
|
end
|
32
32
|
|
33
|
-
# Fires all triggers, if any are defined for the
|
33
|
+
# Fires all triggers, if any are defined for the named type and guest. Returns early
|
34
34
|
# and logs a warning if the community plugin `vagrant-triggers` is installed
|
35
35
|
#
|
36
|
-
# @param [Symbol]
|
36
|
+
# @param [Symbol] name Name of `type` thing to fire trigger on
|
37
37
|
# @param [Symbol] stage :before or :after
|
38
|
-
# @param [String]
|
39
|
-
|
38
|
+
# @param [String] guest The guest that invoked firing the triggers
|
39
|
+
# @param [Symbol] type Type of trigger to fire (:action, :hook, :command)
|
40
|
+
def fire(name, stage, guest, type, all: false)
|
40
41
|
if community_plugin_detected?
|
41
42
|
@logger.warn("Community plugin `vagrant-triggers detected, so core triggers will not fire")
|
42
43
|
return
|
43
44
|
end
|
44
45
|
|
45
|
-
if !
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
46
|
+
return @logger.warn("Name given is nil, no triggers will fire") if !name
|
47
|
+
return @logger.warn("Name given cannot be symbolized, no triggers will fire") if
|
48
|
+
!name.respond_to?(:to_sym)
|
49
|
+
|
50
|
+
name = name.to_sym
|
51
51
|
|
52
52
|
# get all triggers matching action
|
53
|
-
triggers =
|
53
|
+
triggers = find(name, stage, guest, type, all: all)
|
54
|
+
|
55
|
+
if !triggers.empty?
|
56
|
+
@logger.info("Firing trigger for #{type} #{name} on guest #{guest}")
|
57
|
+
@ui.info(I18n.t("vagrant.trigger.start", type: type, stage: stage, name: name))
|
58
|
+
execute(triggers)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Find all triggers defined for the named type and guest.
|
63
|
+
#
|
64
|
+
# @param [Symbol] name Name of `type` thing to fire trigger on
|
65
|
+
# @param [Symbol] stage :before or :after
|
66
|
+
# @param [String] guest The guest that invoked firing the triggers
|
67
|
+
# @param [Symbol] type Type of trigger to fire
|
68
|
+
# @return [Array]
|
69
|
+
def find(name, stage, guest, type, all: false)
|
70
|
+
triggers = nil
|
71
|
+
name = nameify(name)
|
72
|
+
|
54
73
|
if stage == :before
|
55
74
|
triggers = config.before_triggers.select do |t|
|
56
|
-
t.command
|
75
|
+
(all && t.command.respond_to?(:to_sym) && t.command.to_sym == :all && !t.ignore.include?(name.to_sym)) ||
|
76
|
+
(type == :hook && matched_hook?(t.command, name)) ||
|
77
|
+
nameify(t.command) == name
|
57
78
|
end
|
58
79
|
elsif stage == :after
|
59
80
|
triggers = config.after_triggers.select do |t|
|
60
|
-
t.command
|
81
|
+
(all && t.command.respond_to?(:to_sym) && t.command.to_sym == :all && !t.ignore.include?(name.to_sym)) ||
|
82
|
+
(type == :hook && matched_hook?(t.command, name)) ||
|
83
|
+
nameify(t.command) == name
|
61
84
|
end
|
62
85
|
else
|
63
86
|
raise Errors::TriggersNoStageGiven,
|
64
|
-
|
87
|
+
name: name,
|
65
88
|
stage: stage,
|
66
|
-
|
89
|
+
type: type,
|
90
|
+
guest_name: guest
|
67
91
|
end
|
68
92
|
|
69
|
-
|
70
|
-
|
71
|
-
if !triggers.empty?
|
72
|
-
@logger.info("Firing trigger for action #{action} on guest #{guest_name}")
|
73
|
-
@ui.info(I18n.t("vagrant.trigger.start", type: type, stage: stage, action: action))
|
74
|
-
fire(triggers, guest_name)
|
75
|
-
end
|
93
|
+
filter_triggers(triggers, guest, type)
|
76
94
|
end
|
77
95
|
|
78
96
|
protected
|
79
97
|
|
98
|
+
# Convert object into name
|
99
|
+
#
|
100
|
+
# @param [Object, Class] object Object to name
|
101
|
+
# @return [String]
|
102
|
+
def nameify(object)
|
103
|
+
if object.is_a?(Class)
|
104
|
+
object.name.to_s
|
105
|
+
else
|
106
|
+
object.to_s
|
107
|
+
end
|
108
|
+
end
|
80
109
|
|
81
110
|
#-------------------------------------------------------------------
|
82
111
|
# Internal methods, don't call these.
|
83
112
|
#-------------------------------------------------------------------
|
84
113
|
|
114
|
+
# Generate all valid lookup keys for given action key
|
115
|
+
#
|
116
|
+
# @param [Class, String] key Base key for generation
|
117
|
+
# @return [Array<String>] all valid keys
|
118
|
+
def matched_hook?(key, subject)
|
119
|
+
subject = nameify(subject)
|
120
|
+
Vagrant.plugin("2").manager.generate_hook_keys(key).any? do |k|
|
121
|
+
k == subject
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
85
125
|
# Looks up if the community plugin `vagrant-triggers` is installed
|
86
126
|
# and also caches the result
|
87
127
|
#
|
@@ -133,12 +173,11 @@ module Vagrant
|
|
133
173
|
return triggers
|
134
174
|
end
|
135
175
|
|
136
|
-
#
|
176
|
+
# Execute all triggers in the given array
|
137
177
|
#
|
138
178
|
# @param [Array] triggers An array of triggers to be fired
|
139
|
-
def
|
179
|
+
def execute(triggers)
|
140
180
|
# ensure on_error is respected by exiting or continuing
|
141
|
-
|
142
181
|
triggers.each do |trigger|
|
143
182
|
@logger.debug("Running trigger #{trigger.id}...")
|
144
183
|
|