vagrant-unbundled 2.2.7.0 → 2.2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +2 -0
  3. data/CHANGELOG.md +228 -0
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +50 -1
  8. data/contrib/README.md +1 -0
  9. data/contrib/sudoers/linux-suse +2 -2
  10. data/contrib/zsh/_vagrant +738 -0
  11. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  12. data/lib/vagrant.rb +28 -5
  13. data/lib/vagrant/action.rb +7 -0
  14. data/lib/vagrant/action/builder.rb +184 -38
  15. data/lib/vagrant/action/builtin/box_add.rb +24 -8
  16. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  17. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  18. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  19. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  20. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  21. data/lib/vagrant/action/builtin/disk.rb +14 -1
  22. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  23. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  24. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  25. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  26. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  27. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  28. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  29. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  30. data/lib/vagrant/action/hook.rb +76 -23
  31. data/lib/vagrant/action/runner.rb +12 -27
  32. data/lib/vagrant/action/warden.rb +28 -31
  33. data/lib/vagrant/box.rb +11 -4
  34. data/lib/vagrant/box_collection.rb +1 -1
  35. data/lib/vagrant/bundler.rb +310 -61
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/environment.rb +1 -0
  38. data/lib/vagrant/errors.rb +69 -1
  39. data/lib/vagrant/machine.rb +64 -11
  40. data/lib/vagrant/machine_index.rb +28 -1
  41. data/lib/vagrant/patches/net-ssh.rb +186 -0
  42. data/lib/vagrant/plugin/manager.rb +45 -16
  43. data/lib/vagrant/plugin/v2/command.rb +7 -2
  44. data/lib/vagrant/plugin/v2/components.rb +6 -0
  45. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  46. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  47. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  48. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  49. data/lib/vagrant/shared_helpers.rb +36 -0
  50. data/lib/vagrant/ui.rb +43 -2
  51. data/lib/vagrant/util.rb +2 -0
  52. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  53. data/lib/vagrant/util/caps.rb +48 -0
  54. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  55. data/lib/vagrant/util/curl_helper.rb +12 -8
  56. data/lib/vagrant/util/directory.rb +19 -0
  57. data/lib/vagrant/util/downloader.rb +10 -5
  58. data/lib/vagrant/util/guest_hosts.rb +68 -0
  59. data/lib/vagrant/util/guest_inspection.rb +9 -1
  60. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  61. data/lib/vagrant/util/io.rb +7 -27
  62. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  63. data/lib/vagrant/util/is_port_open.rb +8 -19
  64. data/lib/vagrant/util/map_command_options.rb +33 -0
  65. data/lib/vagrant/util/mime.rb +92 -0
  66. data/lib/vagrant/util/network_ip.rb +11 -1
  67. data/lib/vagrant/util/numeric.rb +28 -0
  68. data/lib/vagrant/util/platform.rb +10 -2
  69. data/lib/vagrant/util/powershell.rb +31 -15
  70. data/lib/vagrant/util/subprocess.rb +9 -1
  71. data/lib/vagrant/util/template_renderer.rb +2 -2
  72. data/lib/vagrant/util/uploader.rb +7 -4
  73. data/lib/vagrant/vagrantfile.rb +2 -2
  74. data/plugins/commands/autocomplete/command/install.rb +49 -0
  75. data/plugins/commands/autocomplete/command/root.rb +64 -0
  76. data/plugins/commands/autocomplete/plugin.rb +18 -0
  77. data/plugins/commands/cap/command.rb +5 -1
  78. data/plugins/commands/cloud/auth/login.rb +20 -23
  79. data/plugins/commands/cloud/auth/logout.rb +2 -10
  80. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  81. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
  82. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  83. data/plugins/commands/cloud/box/create.rb +33 -29
  84. data/plugins/commands/cloud/box/delete.rb +30 -24
  85. data/plugins/commands/cloud/box/show.rb +41 -31
  86. data/plugins/commands/cloud/box/update.rb +34 -26
  87. data/plugins/commands/cloud/client/client.rb +55 -79
  88. data/plugins/commands/cloud/list.rb +3 -4
  89. data/plugins/commands/cloud/locales/en.yml +15 -11
  90. data/plugins/commands/cloud/plugin.rb +10 -0
  91. data/plugins/commands/cloud/provider/create.rb +38 -28
  92. data/plugins/commands/cloud/provider/delete.rb +39 -29
  93. data/plugins/commands/cloud/provider/update.rb +37 -28
  94. data/plugins/commands/cloud/provider/upload.rb +53 -33
  95. data/plugins/commands/cloud/publish.rb +193 -106
  96. data/plugins/commands/cloud/search.rb +34 -21
  97. data/plugins/commands/cloud/util.rb +273 -161
  98. data/plugins/commands/cloud/version/create.rb +33 -28
  99. data/plugins/commands/cloud/version/delete.rb +35 -28
  100. data/plugins/commands/cloud/version/release.rb +35 -29
  101. data/plugins/commands/cloud/version/revoke.rb +36 -29
  102. data/plugins/commands/cloud/version/update.rb +29 -25
  103. data/plugins/commands/destroy/command.rb +7 -7
  104. data/plugins/commands/login/plugin.rb +0 -13
  105. data/plugins/commands/ssh_config/command.rb +1 -1
  106. data/plugins/communicators/ssh/communicator.rb +25 -24
  107. data/plugins/communicators/winrm/config.rb +1 -1
  108. data/plugins/communicators/winrm/helper.rb +1 -1
  109. data/plugins/communicators/winrm/shell.rb +1 -1
  110. data/plugins/communicators/winssh/communicator.rb +126 -38
  111. data/plugins/communicators/winssh/config.rb +3 -7
  112. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  113. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  114. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  115. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  116. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  117. data/plugins/guests/arch/cap/smb.rb +1 -1
  118. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  119. data/plugins/guests/centos/cap/flavor.rb +24 -0
  120. data/plugins/guests/centos/guest.rb +9 -0
  121. data/plugins/guests/centos/plugin.rb +20 -0
  122. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  123. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  124. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  125. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
  126. data/plugins/guests/darwin/plugin.rb +15 -0
  127. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  128. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  129. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  130. data/plugins/guests/fedora/guest.rb +4 -4
  131. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  132. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  133. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  134. data/plugins/guests/haiku/plugin.rb +15 -0
  135. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  136. data/plugins/guests/linux/cap/halt.rb +9 -1
  137. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  138. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  139. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
  140. data/plugins/guests/linux/cap/reboot.rb +36 -7
  141. data/plugins/guests/linux/plugin.rb +10 -0
  142. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  143. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  144. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  145. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  146. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  147. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  148. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  149. data/plugins/guests/openwrt/guest.rb +23 -0
  150. data/plugins/guests/openwrt/plugin.rb +61 -0
  151. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  152. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  153. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  154. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  155. data/plugins/guests/redhat/cap/smb.rb +20 -0
  156. data/plugins/guests/redhat/plugin.rb +5 -0
  157. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  158. data/plugins/guests/solaris11/plugin.rb +5 -0
  159. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  160. data/plugins/guests/windows/cap/public_key.rb +3 -3
  161. data/plugins/guests/windows/cap/reboot.rb +10 -5
  162. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/darwin/plugin.rb +10 -0
  164. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  165. data/plugins/hosts/linux/cap/nfs.rb +1 -0
  166. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  167. data/plugins/hosts/linux/plugin.rb +10 -0
  168. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  169. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  170. data/plugins/hosts/windows/plugin.rb +15 -0
  171. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  172. data/plugins/kernel_v2/config/disk.rb +67 -14
  173. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  174. data/plugins/kernel_v2/config/vm.rb +155 -21
  175. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  176. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  177. data/plugins/providers/docker/action.rb +8 -17
  178. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  179. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  180. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  181. data/plugins/providers/docker/communicator.rb +1 -1
  182. data/plugins/providers/docker/driver.rb +58 -7
  183. data/plugins/providers/docker/plugin.rb +5 -0
  184. data/plugins/providers/hyperv/action.rb +3 -1
  185. data/plugins/providers/hyperv/action/configure.rb +8 -0
  186. data/plugins/providers/hyperv/action/export.rb +4 -2
  187. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  188. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  189. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  190. data/plugins/providers/hyperv/config.rb +5 -0
  191. data/plugins/providers/hyperv/driver.rb +90 -9
  192. data/plugins/providers/hyperv/plugin.rb +25 -0
  193. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  194. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  195. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  196. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  197. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  198. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  199. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  200. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  201. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  202. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  203. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  204. data/plugins/providers/virtualbox/action.rb +13 -1
  205. data/plugins/providers/virtualbox/action/export.rb +4 -2
  206. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  207. data/plugins/providers/virtualbox/action/import.rb +8 -4
  208. data/plugins/providers/virtualbox/action/network.rb +12 -5
  209. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  210. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  211. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  212. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  213. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  214. data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
  215. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  216. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  217. data/plugins/providers/virtualbox/driver/meta.rb +16 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
  220. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  221. data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
  222. data/plugins/providers/virtualbox/plugin.rb +42 -0
  223. data/plugins/providers/virtualbox/provider.rb +2 -1
  224. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  225. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  226. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
  227. data/plugins/provisioners/ansible/plugin.rb +5 -0
  228. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  229. data/plugins/provisioners/container/client.rb +203 -0
  230. data/plugins/provisioners/container/config.rb +83 -0
  231. data/plugins/provisioners/container/installer.rb +13 -0
  232. data/plugins/provisioners/container/plugin.rb +23 -0
  233. data/plugins/provisioners/container/provisioner.rb +28 -0
  234. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  235. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  236. data/plugins/provisioners/docker/client.rb +4 -175
  237. data/plugins/provisioners/docker/config.rb +2 -72
  238. data/plugins/provisioners/docker/installer.rb +3 -5
  239. data/plugins/provisioners/docker/plugin.rb +6 -6
  240. data/plugins/provisioners/docker/provisioner.rb +4 -10
  241. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  242. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  243. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  244. data/plugins/provisioners/podman/client.rb +12 -0
  245. data/plugins/provisioners/podman/config.rb +28 -0
  246. data/plugins/provisioners/podman/installer.rb +33 -0
  247. data/plugins/provisioners/podman/plugin.rb +38 -0
  248. data/plugins/provisioners/podman/provisioner.rb +52 -0
  249. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  250. data/plugins/provisioners/salt/provisioner.rb +4 -0
  251. data/plugins/provisioners/shell/config.rb +1 -6
  252. data/plugins/provisioners/shell/provisioner.rb +61 -26
  253. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  254. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  255. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  256. data/plugins/synced_folders/smb/plugin.rb +20 -0
  257. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  258. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  259. data/scripts/website_push_www.sh +1 -1
  260. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  261. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  262. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  263. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  264. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  265. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  266. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  267. data/templates/guests/linux/etc_fstab.erb +6 -0
  268. data/templates/guests/nixos/network.erb +5 -6
  269. data/templates/locales/en.yml +221 -5
  270. data/templates/locales/providers_docker.yml +4 -0
  271. data/templates/nfs/exports_darwin.erb +1 -1
  272. data/vagrant.gemspec +14 -20
  273. data/version.txt +1 -1
  274. metadata +5092 -8978
  275. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  276. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  277. data/plugins/commands/login/client.rb +0 -253
  278. data/plugins/commands/login/command.rb +0 -137
  279. data/plugins/commands/login/errors.rb +0 -24
  280. data/plugins/commands/login/locales/en.yml +0 -49
  281. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  282. data/scripts/website_push_docs.sh +0 -40
@@ -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 => e
172
- raise Errors::BundlerError, message: e.to_s
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 action and guest. Returns early
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] action Vagrant command to fire trigger on
36
+ # @param [Symbol] name Name of `type` thing to fire trigger on
37
37
  # @param [Symbol] stage :before or :after
38
- # @param [String] guest_name The guest that invoked firing the triggers
39
- def fire_triggers(action, stage, guest_name, type)
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 !action
46
- @logger.warn("Action given is nil, no triggers will fire")
47
- return
48
- else
49
- action = action.to_sym
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 == action || (t.command == :all && !t.ignore.include?(action))
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 == action || (t.command == :all && !t.ignore.include?(action))
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
- action: action,
87
+ name: name,
65
88
  stage: stage,
66
- guest_name: guest_name
89
+ type: type,
90
+ guest_name: guest
67
91
  end
68
92
 
69
- triggers = filter_triggers(triggers, guest_name, type)
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
- # Fires off all triggers in the given array
176
+ # Execute all triggers in the given array
137
177
  #
138
178
  # @param [Array] triggers An array of triggers to be fired
139
- def fire(triggers, guest_name)
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