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
@@ -0,0 +1,36 @@
1
+ module Vagrant
2
+ module Action
3
+ module Builtin
4
+ # This middleware is used with Call to test if this machine
5
+ # has available provisioners
6
+ class HasProvisioner
7
+ def initialize(app, env)
8
+ @app = app
9
+ @logger = Log4r::Logger.new("vagrant::action::builtin::has_provisioner")
10
+ end
11
+
12
+ def call(env)
13
+ machine = env[:machine]
14
+
15
+ if machine.provider.capability?(:has_communicator)
16
+ has_communicator = machine.provider.capability(:has_communicator)
17
+ else
18
+ has_communicator = true
19
+ end
20
+
21
+ env[:skip] = []
22
+ if !has_communicator
23
+ machine.config.vm.provisioners.each do |p|
24
+ if p.communicator_required
25
+ env[:skip].push(p)
26
+ @logger.info("Skipping running provisioner #{p.name || 'no name'}, type: #{p.type}")
27
+ p.run = :never
28
+ end
29
+ end
30
+ end
31
+ @app.call(env)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -49,6 +49,7 @@ module Vagrant
49
49
  run: provisioner.run,
50
50
  before: provisioner.before,
51
51
  after: provisioner.after,
52
+ communicator_required: provisioner.communicator_required,
52
53
  }
53
54
 
54
55
  # Return the result
@@ -72,7 +72,7 @@ module Vagrant
72
72
  #
73
73
  # @param [Machine] machine The machine that the folders belong to
74
74
  # @param [Hash] folders The result from a {#synced_folders} call.
75
- def save_synced_folders(machine, folders, **opts)
75
+ def save_synced_folders(machine, folders, opts={})
76
76
  if opts[:merge]
77
77
  existing = cached_synced_folders(machine)
78
78
  if existing
@@ -97,11 +97,8 @@ module Vagrant
97
97
  end
98
98
  end
99
99
 
100
- folder_data = JSON.dump(folders)
101
-
102
- # Scrub any register credentials from the synced folders
103
- # configuration data to prevent accidental leakage
104
- folder_data = Util::CredentialScrubber.desensitize(folder_data)
100
+ # Remove implementation instances
101
+ folder_data = JSON.dump(folders.to_h)
105
102
 
106
103
  machine.data_dir.join("synced_folders").open("w") do |f|
107
104
  f.write(folder_data)
@@ -124,7 +121,7 @@ module Vagrant
124
121
  end
125
122
 
126
123
  config_folders = config.synced_folders
127
- folders = {}
124
+ folders = Vagrant::Plugin::V2::SyncedFolder::Collection.new
128
125
 
129
126
  # Determine all the synced folders as well as the implementation
130
127
  # they're going to use.
@@ -181,8 +178,10 @@ module Vagrant
181
178
 
182
179
  # Apply the scoped hash overrides to get the options
183
180
  folders.dup.each do |impl_name, fs|
181
+ impl = plugins[impl_name].first.new._initialize(machine, impl_name)
184
182
  new_fs = {}
185
183
  fs.each do |id, data|
184
+ data[:plugin] = impl
186
185
  id = data[:id] if data[:id]
187
186
  new_fs[id] = scoped_hash_override(data, impl_name)
188
187
  end
@@ -190,7 +189,7 @@ module Vagrant
190
189
  folders[impl_name] = new_fs
191
190
  end
192
191
 
193
- return folders
192
+ folders
194
193
  end
195
194
 
196
195
  # This finds the difference between two lists of synced folder
@@ -239,26 +238,26 @@ module Vagrant
239
238
  protected
240
239
 
241
240
  def cached_synced_folders(machine)
242
- JSON.parse(machine.data_dir.join("synced_folders").read).tap do |r|
243
- # We have to do all sorts of things to make the proper things
244
- # symbols and
245
- r.keys.each do |k|
246
- r[k].each do |ik, v|
247
- v.keys.each do |vk|
248
- v[vk.to_sym] = v[vk]
249
- v.delete(vk)
250
- end
241
+ import = JSON.parse(machine.data_dir.join("synced_folders").read)
242
+ import.each do |type, folders|
243
+ impl = plugins[type.to_sym].first.new._initialize(machine, type.to_sym)
244
+ folders.each { |_, v| v[:plugin] = impl }
245
+ end
246
+ # Symbolize the keys we want as symbols
247
+ import.keys.dup.each do |k|
248
+ import[k].values.each do |item|
249
+ item.keys.dup.each do |ik|
250
+ item[ik.to_sym] = item.delete(ik)
251
251
  end
252
-
253
- r[k.to_sym] = r[k]
254
- r.delete(k)
255
252
  end
253
+ import[k.to_sym] = import.delete(k)
256
254
  end
255
+ Vagrant::Plugin::V2::SyncedFolder::Collection[import]
257
256
  rescue Errno::ENOENT
258
257
  # If the file doesn't exist, we probably just have a machine created
259
258
  # by a version of Vagrant that didn't cache shared folders. Report no
260
259
  # shared folders to be safe.
261
- return {}
260
+ Vagrant::Plugin::V2::SyncedFolder::Collection.new
262
261
  end
263
262
  end
264
263
  end
@@ -10,15 +10,19 @@ module Vagrant
10
10
  class SetHostname
11
11
  def initialize(app, env)
12
12
  @app = app
13
+ @logger = Log4r::Logger.new("vagrant::action::builtin::set_hostname")
13
14
  end
14
15
 
15
16
  def call(env)
16
17
  @app.call(env)
17
18
 
18
19
  hostname = env[:machine].config.vm.hostname
19
- if !hostname.nil?
20
+ allow_hosts_modification = env[:machine].config.vm.allow_hosts_modification
21
+ if !hostname.nil? && allow_hosts_modification
20
22
  env[:ui].info I18n.t("vagrant.actions.vm.hostname.setting")
21
23
  env[:machine].guest.capability(:change_host_name, hostname)
24
+ else
25
+ @logger.info("`allow_hosts_modification` set to false. Hosts modification has been disabled, skiping changing hostname.")
22
26
  end
23
27
  end
24
28
  end
@@ -128,6 +128,22 @@ module Vagrant
128
128
  # Save the synced folders
129
129
  save_synced_folders(env[:machine], original_folders, **save_opts)
130
130
  end
131
+
132
+ # Persist the mounts by adding them to fstab (only if the guest is available)
133
+ begin
134
+ persist_mount = env[:machine].guest.capability?(:persist_mount_shared_folder)
135
+ rescue Errors::MachineGuestNotReady
136
+ persist_mount = false
137
+ end
138
+ if persist_mount
139
+ # Persist the mounts by adding them to fstab
140
+ if env[:machine].config.vm.allow_fstab_modification
141
+ fstab_folders = original_folders
142
+ else
143
+ fstab_folders = nil
144
+ end
145
+ env[:machine].guest.capability(:persist_mount_shared_folder, fstab_folders)
146
+ end
131
147
  end
132
148
  end
133
149
  end
@@ -0,0 +1,37 @@
1
+ module Vagrant
2
+ module Action
3
+ module Builtin
4
+ # This class is used within the Builder class for injecting triggers into
5
+ # different parts of the call stack.
6
+ class Trigger
7
+ # @param [Class, String, Symbol] name Name of trigger to fire
8
+ # @param [Vagrant::Plugin::V2::Triger] triggers Trigger object
9
+ # @param [Symbol] timing When trigger should fire (:before/:after)
10
+ # @param [Symbol] type Type of trigger
11
+ def initialize(app, env, name, triggers, timing, type=:action, all: false)
12
+ @app = app
13
+ @env = env
14
+ @triggers = triggers
15
+ @name = name
16
+ @timing = timing
17
+ @type = type
18
+ @all = all
19
+
20
+ if ![:before, :after].include?(timing)
21
+ raise ArgumentError,
22
+ "Invalid value provided for `timing` (allowed: :before or :after)"
23
+ end
24
+ end
25
+
26
+ def call(env)
27
+ machine = env[:machine]
28
+ machine_name = machine.name if machine
29
+
30
+ @triggers.fire(@name, @timing, machine_name, @type, all: @all)
31
+ # Carry on
32
+ @app.call(env)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -7,23 +7,23 @@ module Vagrant
7
7
  # This is a hash of the middleware to prepend to a certain
8
8
  # other middleware.
9
9
  #
10
- # @return [Hash<Class, Array<Class>>]
10
+ # @return [Hash<Class, Array<Builder::StackItem>>]
11
11
  attr_reader :before_hooks
12
12
 
13
13
  # This is a hash of the middleware to append to a certain other
14
14
  # middleware.
15
15
  #
16
- # @return [Hash<Class, Array<Class>>]
16
+ # @return [Hash<Class, Array<Builder::StackItem>>]
17
17
  attr_reader :after_hooks
18
18
 
19
19
  # This is a list of the hooks to just prepend to the beginning
20
20
  #
21
- # @return [Array<Class>]
21
+ # @return [Array<Builder::StackItem>]
22
22
  attr_reader :prepend_hooks
23
23
 
24
24
  # This is a list of the hooks to just append to the end
25
25
  #
26
- # @return [Array<Class>]
26
+ # @return [Array<Builder::StackItem>]
27
27
  attr_reader :append_hooks
28
28
 
29
29
  def initialize
@@ -37,16 +37,32 @@ module Vagrant
37
37
  #
38
38
  # @param [Class] existing The existing middleware.
39
39
  # @param [Class] new The new middleware.
40
- def before(existing, new, *args, &block)
41
- @before_hooks[existing] << [new, args, block]
40
+ def before(existing, new, *args, **keywords, &block)
41
+ item = Builder::StackItem.new(
42
+ middleware: new,
43
+ arguments: Builder::MiddlewareArguments.new(
44
+ parameters: args,
45
+ keywords: keywords,
46
+ block: block
47
+ )
48
+ )
49
+ @before_hooks[existing] << item
42
50
  end
43
51
 
44
52
  # Add a middleware after an existing middleware.
45
53
  #
46
54
  # @param [Class] existing The existing middleware.
47
55
  # @param [Class] new The new middleware.
48
- def after(existing, new, *args, &block)
49
- @after_hooks[existing] << [new, args, block]
56
+ def after(existing, new, *args, **keywords, &block)
57
+ item = Builder::StackItem.new(
58
+ middleware: new,
59
+ arguments: Builder::MiddlewareArguments.new(
60
+ parameters: args,
61
+ keywords: keywords,
62
+ block: block
63
+ )
64
+ )
65
+ @after_hooks[existing] << item
50
66
  end
51
67
 
52
68
  # Append a middleware to the end of the stack. Note that if the
@@ -54,33 +70,68 @@ module Vagrant
54
70
  # be run.
55
71
  #
56
72
  # @param [Class] new The middleware to append.
57
- def append(new, *args, &block)
58
- @append_hooks << [new, args, block]
73
+ def append(new, *args, **keywords, &block)
74
+ item = Builder::StackItem.new(
75
+ middleware: new,
76
+ arguments: Builder::MiddlewareArguments.new(
77
+ parameters: args,
78
+ keywords: keywords,
79
+ block: block
80
+ )
81
+ )
82
+ @append_hooks << item
59
83
  end
60
84
 
61
85
  # Prepend a middleware to the beginning of the stack.
62
86
  #
63
87
  # @param [Class] new The new middleware to prepend.
64
- def prepend(new, *args, &block)
65
- @prepend_hooks << [new, args, block]
88
+ def prepend(new, *args, **keywords, &block)
89
+ item = Builder::StackItem.new(
90
+ middleware: new,
91
+ arguments: Builder::MiddlewareArguments.new(
92
+ parameters: args,
93
+ keywords: keywords,
94
+ block: block
95
+ )
96
+ )
97
+ @prepend_hooks << item
98
+ end
99
+
100
+ # @return [Boolean]
101
+ def empty?
102
+ before_hooks.empty? &&
103
+ after_hooks.empty? &&
104
+ prepend_hooks.empty? &&
105
+ append_hooks.empty?
66
106
  end
67
107
 
68
108
  # This applies the given hook to a builder. This should not be
69
109
  # called directly.
70
110
  #
71
111
  # @param [Builder] builder
72
- def apply(builder, options=nil)
73
- options ||= {}
74
-
112
+ def apply(builder, options={})
75
113
  if !options[:no_prepend_or_append]
76
114
  # Prepends first
77
- @prepend_hooks.each do |klass, args, block|
78
- builder.insert(0, klass, *args, &block)
115
+ @prepend_hooks.each do |item|
116
+ if options[:root]
117
+ idx = builder.index(options[:root])
118
+ else
119
+ idx = 0
120
+ end
121
+ builder.insert(idx, item.middleware, *item.arguments.parameters,
122
+ **item.arguments.keywords, &item.arguments.block)
79
123
  end
80
124
 
81
125
  # Appends
82
- @append_hooks.each do |klass, args, block|
83
- builder.use(klass, *args, &block)
126
+ @append_hooks.each do |item|
127
+ if options[:root]
128
+ idx = builder.index(options[:root])
129
+ builder.insert(idx + 1, item.middleware, *item.arguments.parameters,
130
+ **item.arguments.keywords, &item.arguments.block)
131
+ else
132
+ builder.use(item.middleware, *item.arguments.parameters,
133
+ **item.arguments.keywords, &item.arguments.block)
134
+ end
84
135
  end
85
136
  end
86
137
 
@@ -88,8 +139,9 @@ module Vagrant
88
139
  @before_hooks.each do |key, list|
89
140
  next if !builder.index(key)
90
141
 
91
- list.each do |klass, args, block|
92
- builder.insert_before(key, klass, *args, &block)
142
+ list.each do |item|
143
+ builder.insert_before(key, item.middleware, *item.arguments.parameters,
144
+ **item.arguments.keywords, &item.arguments.block)
93
145
  end
94
146
  end
95
147
 
@@ -97,8 +149,9 @@ module Vagrant
97
149
  @after_hooks.each do |key, list|
98
150
  next if !builder.index(key)
99
151
 
100
- list.each do |klass, args, block|
101
- builder.insert_after(key, klass, *args, &block)
152
+ list.each do |item|
153
+ builder.insert_after(key, item.middleware, *item.arguments.parameters,
154
+ **item.arguments.keywords, &item.arguments.block)
102
155
  end
103
156
  end
104
157
  end
@@ -34,30 +34,19 @@ module Vagrant
34
34
  environment.merge!(@lazy_globals.call) if @lazy_globals
35
35
  environment.merge!(options || {})
36
36
 
37
- if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
38
- # NOTE: Triggers are initialized later in the Action::Runer because of
39
- # how `@lazy_globals` are evaluated. Rather than trying to guess where
40
- # the `env` is coming from, we can wait until they're merged into a single
41
- # hash above.
42
- env = environment[:env]
43
- machine = environment[:machine]
44
- machine_name = machine.name if machine
37
+ # NOTE: Triggers are initialized later in the Action::Runer because of
38
+ # how `@lazy_globals` are evaluated. Rather than trying to guess where
39
+ # the `env` is coming from, we can wait until they're merged into a single
40
+ # hash above.
41
+ env = environment[:env]
42
+ machine = environment[:machine]
45
43
 
46
- ui = Vagrant::UI::Prefixed.new(env.ui, "vagrant")
47
- triggers = Vagrant::Plugin::V2::Trigger.new(env, env.vagrantfile.config.trigger, machine, ui)
48
- end
49
-
50
- # Setup the action hooks
51
- hooks = Vagrant.plugin("2").manager.action_hooks(environment[:action_name])
52
- if !hooks.empty?
53
- @logger.info("Preparing hooks for middleware sequence...")
54
- environment[:action_hooks] = hooks.map do |hook_proc|
55
- Hook.new.tap do |h|
56
- hook_proc.call(h)
57
- end
58
- end
44
+ environment[:triggers] = machine.triggers if machine
59
45
 
60
- @logger.info("#{environment[:action_hooks].length} hooks defined.")
46
+ if env
47
+ ui = Vagrant::UI::Prefixed.new(env.ui, "vagrant")
48
+ environment[:triggers] ||= Vagrant::Plugin::V2::Trigger.
49
+ new(env, env.vagrantfile.config.trigger, machine, ui)
61
50
  end
62
51
 
63
52
  # Run the action chain in a busy block, marking the environment as
@@ -95,14 +84,10 @@ module Vagrant
95
84
 
96
85
  action_name = environment[:action_name]
97
86
 
98
- triggers.fire_triggers(action_name, :before, machine_name, :hook) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
99
-
100
87
  # We place a process lock around every action that is called
101
- @logger.info("Running action: #{environment[:action_name]} #{callable_id}")
88
+ @logger.info("Running action: #{action_name} #{callable_id}")
102
89
  Util::Busy.busy(int_callback) { callable.call(environment) }
103
90
 
104
- triggers.fire_triggers(action_name, :after, machine_name, :hook) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
105
-
106
91
  # Return the environment in case there are things in there that
107
92
  # the caller wants to use.
108
93
  environment
@@ -1,7 +1,5 @@
1
1
  require "log4r"
2
2
  require 'vagrant/util/experimental'
3
- require 'vagrant/action/builtin/before_trigger'
4
- require 'vagrant/action/builtin/after_trigger'
5
3
 
6
4
  module Vagrant
7
5
  module Action
@@ -47,21 +45,12 @@ module Vagrant
47
45
  raise Errors::VagrantInterrupt if env[:interrupted]
48
46
  action = @actions.shift
49
47
  @logger.info("Calling IN action: #{action}")
50
-
51
- if !action.is_a?(Proc) && env[:hook]
52
- hook_name = action.class.name.split("::").last.
53
- gsub(/([a-z])([A-Z])/, '\1_\2').gsub('-', '_').downcase
54
- end
55
-
56
- env[:hook].call("before_#{hook_name}".to_sym) if hook_name
57
48
  @stack.unshift(action).first.call(env)
58
- env[:hook].call("after_#{hook_name}".to_sym) if hook_name
59
-
60
49
  raise Errors::VagrantInterrupt if env[:interrupted]
61
50
  @logger.info("Calling OUT action: #{action}")
62
- rescue SystemExit
63
- # This means that an "exit" or "abort" was called. In these cases,
64
- # we just exit immediately.
51
+ rescue SystemExit, NoMemoryError
52
+ # This means that an "exit" or "abort" was called, or we have run out
53
+ # of memory. In these cases, we just exit immediately.
65
54
  raise
66
55
  rescue Exception => e
67
56
  # We guard this so that the Warden only outputs this once for
@@ -103,26 +92,34 @@ module Vagrant
103
92
  # A somewhat confusing function which simply initializes each
104
93
  # middleware properly to call the next middleware in the sequence.
105
94
  def finalize_action(action, env)
106
- klass, args, block = action
95
+ if action.is_a?(Builder::StackItem)
96
+ klass = action.middleware
97
+ args = action.arguments.parameters
98
+ keywords = action.arguments.keywords
99
+ block = action.arguments.block
100
+ else
101
+ klass = action
102
+ args = []
103
+ keywords = {}
104
+ end
107
105
 
108
- # Default the arguments to an empty array. Otherwise in Ruby 1.8
109
- # a `nil` args will actually pass `nil` into the class.
110
- args ||= []
106
+ args = nil if args.empty?
107
+ keywords = nil if keywords.empty?
111
108
 
112
109
  if klass.is_a?(Class)
113
- # A action klass which is to be instantiated with the
114
- # app, env, and any arguments given
115
-
116
- # We wrap the action class in two Trigger method calls so that
117
- # action triggers can fire before and after each given action in the stack.
118
- klass_name = klass.name
119
- [Vagrant::Action::Builtin::BeforeTriggerAction.new(self, env,
120
- klass_name,
121
- @triggers),
122
- klass.new(self, env, *args, &block),
123
- Vagrant::Action::Builtin::AfterTriggerAction.new(self, env,
124
- klass_name,
125
- @triggers)]
110
+ # NOTE: We need to detect if we are passing args and/or
111
+ # keywords and do it explicitly. Earlier versions
112
+ # are not as lax about splatting keywords when the
113
+ # target method is not expecting them.
114
+ if args && keywords
115
+ klass.new(self, env, *args, **keywords, &block)
116
+ elsif args
117
+ klass.new(self, env, *args, &block)
118
+ elsif keywords
119
+ klass.new(self, env, **keywords, &block)
120
+ else
121
+ klass.new(self, env, &block)
122
+ end
126
123
  elsif klass.respond_to?(:call)
127
124
  # Make it a lambda which calls the item then forwards
128
125
  # up the chain