vagrant-unbundled 2.2.7.0 → 2.2.16.0

Sign up to get free protection for your applications and to get access to all the features.
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