vagrant-unbundled 2.2.6.1 → 2.2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +14 -0
  3. data/CHANGELOG.md +153 -2
  4. data/README.md +5 -7
  5. data/bin/vagrant +23 -0
  6. data/contrib/README.md +1 -0
  7. data/contrib/bash/completion.sh +13 -1
  8. data/contrib/sudoers/linux-suse +2 -2
  9. data/contrib/zsh/_vagrant +736 -0
  10. data/contrib/zsh/generate_zsh_completion.rb +166 -0
  11. data/lib/vagrant.rb +25 -0
  12. data/lib/vagrant/action.rb +8 -0
  13. data/lib/vagrant/action/builder.rb +193 -38
  14. data/lib/vagrant/action/builtin/box_add.rb +15 -7
  15. data/lib/vagrant/action/builtin/box_check_outdated.rb +12 -15
  16. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  17. data/lib/vagrant/action/builtin/cloud_init_setup.rb +127 -0
  18. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  19. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  20. data/lib/vagrant/action/builtin/disk.rb +52 -0
  21. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  22. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  23. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  24. data/lib/vagrant/action/builtin/mixin_provisioners.rb +20 -1
  25. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  26. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  27. data/lib/vagrant/action/builtin/ssh_run.rb +21 -3
  28. data/lib/vagrant/action/builtin/synced_folders.rb +10 -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 +11 -26
  32. data/lib/vagrant/action/warden.rb +28 -22
  33. data/lib/vagrant/box.rb +5 -4
  34. data/lib/vagrant/box_metadata.rb +17 -3
  35. data/lib/vagrant/bundler.rb +265 -53
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/errors.rb +61 -1
  38. data/lib/vagrant/machine.rb +56 -6
  39. data/lib/vagrant/machine_index.rb +27 -1
  40. data/lib/vagrant/plugin/manager.rb +25 -14
  41. data/lib/vagrant/plugin/v2/command.rb +6 -2
  42. data/lib/vagrant/plugin/v2/components.rb +6 -0
  43. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  44. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  45. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  46. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  47. data/lib/vagrant/shared_helpers.rb +28 -0
  48. data/lib/vagrant/ui.rb +51 -5
  49. data/lib/vagrant/util.rb +1 -0
  50. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  51. data/lib/vagrant/util/caps.rb +48 -0
  52. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  53. data/lib/vagrant/util/curl_helper.rb +8 -5
  54. data/lib/vagrant/util/directory.rb +19 -0
  55. data/lib/vagrant/util/downloader.rb +7 -3
  56. data/lib/vagrant/util/file_checksum.rb +6 -2
  57. data/lib/vagrant/util/guest_hosts.rb +68 -0
  58. data/lib/vagrant/util/guest_inspection.rb +9 -1
  59. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  60. data/lib/vagrant/util/io.rb +7 -27
  61. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  62. data/lib/vagrant/util/is_port_open.rb +8 -20
  63. data/lib/vagrant/util/map_command_options.rb +33 -0
  64. data/lib/vagrant/util/network_ip.rb +11 -1
  65. data/lib/vagrant/util/numeric.rb +69 -0
  66. data/lib/vagrant/util/platform.rb +8 -1
  67. data/lib/vagrant/util/powershell.rb +1 -1
  68. data/lib/vagrant/util/subprocess.rb +9 -1
  69. data/lib/vagrant/vagrantfile.rb +1 -1
  70. data/plugins/commands/autocomplete/command/install.rb +49 -0
  71. data/plugins/commands/autocomplete/command/root.rb +64 -0
  72. data/plugins/commands/autocomplete/plugin.rb +18 -0
  73. data/plugins/commands/box/command/outdated.rb +14 -2
  74. data/plugins/commands/cloud/locales/en.yml +1 -1
  75. data/plugins/commands/cloud/publish.rb +1 -1
  76. data/plugins/commands/destroy/command.rb +6 -2
  77. data/plugins/commands/snapshot/command/save.rb +13 -8
  78. data/plugins/commands/ssh_config/command.rb +1 -1
  79. data/plugins/communicators/ssh/communicator.rb +25 -24
  80. data/plugins/communicators/winrm/config.rb +1 -1
  81. data/plugins/communicators/winrm/helper.rb +1 -1
  82. data/plugins/communicators/winrm/shell.rb +1 -1
  83. data/plugins/communicators/winssh/communicator.rb +126 -38
  84. data/plugins/communicators/winssh/config.rb +3 -7
  85. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  86. data/plugins/guests/alpine/cap/rsync.rb +1 -1
  87. data/plugins/guests/alpine/plugin.rb +16 -0
  88. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  89. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  90. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  91. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  92. data/plugins/guests/centos/cap/flavor.rb +24 -0
  93. data/plugins/guests/centos/guest.rb +9 -0
  94. data/plugins/guests/centos/plugin.rb +20 -0
  95. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  96. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +99 -13
  97. data/plugins/guests/darwin/plugin.rb +5 -0
  98. data/plugins/guests/debian/cap/change_host_name.rb +11 -11
  99. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  100. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  101. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  102. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  103. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  104. data/plugins/guests/haiku/plugin.rb +15 -0
  105. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  106. data/plugins/guests/linux/cap/halt.rb +9 -1
  107. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +16 -0
  108. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +4 -11
  109. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +62 -0
  110. data/plugins/guests/linux/cap/reboot.rb +48 -0
  111. data/plugins/guests/linux/plugin.rb +20 -0
  112. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  113. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  114. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  115. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  116. data/plugins/guests/redhat/cap/change_host_name.rb +10 -5
  117. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  118. data/plugins/guests/redhat/cap/nfs_client.rb +2 -2
  119. data/plugins/guests/redhat/cap/smb.rb +20 -0
  120. data/plugins/guests/redhat/plugin.rb +5 -0
  121. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  122. data/plugins/guests/solaris11/plugin.rb +5 -0
  123. data/plugins/guests/suse/cap/change_host_name.rb +13 -12
  124. data/plugins/guests/windows/cap/public_key.rb +3 -3
  125. data/plugins/guests/windows/cap/reboot.rb +2 -1
  126. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  127. data/plugins/hosts/darwin/cap/nfs.rb +11 -0
  128. data/plugins/hosts/darwin/plugin.rb +15 -0
  129. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  130. data/plugins/hosts/linux/cap/nfs.rb +21 -2
  131. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  132. data/plugins/hosts/linux/plugin.rb +10 -0
  133. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  134. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  135. data/plugins/hosts/windows/plugin.rb +15 -0
  136. data/plugins/kernel_v2/config/cloud_init.rb +126 -0
  137. data/plugins/kernel_v2/config/disk.rb +221 -0
  138. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  139. data/plugins/kernel_v2/config/vm.rb +225 -11
  140. data/plugins/kernel_v2/config/vm_provisioner.rb +17 -3
  141. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  142. data/plugins/providers/docker/action.rb +8 -17
  143. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  144. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  145. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  146. data/plugins/providers/docker/communicator.rb +1 -1
  147. data/plugins/providers/docker/driver.rb +73 -10
  148. data/plugins/providers/docker/errors.rb +4 -0
  149. data/plugins/providers/docker/executor/local.rb +7 -1
  150. data/plugins/providers/docker/plugin.rb +5 -0
  151. data/plugins/providers/hyperv/action.rb +2 -0
  152. data/plugins/providers/hyperv/action/configure.rb +8 -0
  153. data/plugins/providers/hyperv/action/export.rb +4 -2
  154. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  155. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  156. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  157. data/plugins/providers/hyperv/config.rb +5 -0
  158. data/plugins/providers/hyperv/driver.rb +90 -9
  159. data/plugins/providers/hyperv/plugin.rb +25 -0
  160. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  161. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  162. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  163. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  164. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  165. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  166. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  167. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  168. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  169. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  170. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  171. data/plugins/providers/virtualbox/action.rb +14 -1
  172. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +10 -1
  173. data/plugins/providers/virtualbox/action/export.rb +4 -2
  174. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  175. data/plugins/providers/virtualbox/action/import.rb +8 -4
  176. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  177. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  178. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  179. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  180. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  181. data/plugins/providers/virtualbox/cap/mount_options.rb +35 -0
  182. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  183. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  184. data/plugins/providers/virtualbox/driver/meta.rb +17 -2
  185. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  186. data/plugins/providers/virtualbox/driver/version_6_1.rb +39 -0
  187. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  188. data/plugins/providers/virtualbox/model/storage_controller_array.rb +100 -0
  189. data/plugins/providers/virtualbox/plugin.rb +38 -0
  190. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  191. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  192. data/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +20 -3
  193. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +4 -5
  194. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +2 -2
  195. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +2 -2
  196. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +8 -4
  197. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +2 -2
  198. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +2 -1
  199. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +3 -3
  200. data/plugins/provisioners/ansible/plugin.rb +5 -0
  201. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  202. data/plugins/provisioners/container/client.rb +203 -0
  203. data/plugins/provisioners/container/config.rb +83 -0
  204. data/plugins/provisioners/container/installer.rb +13 -0
  205. data/plugins/provisioners/container/plugin.rb +23 -0
  206. data/plugins/provisioners/container/provisioner.rb +28 -0
  207. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  208. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  209. data/plugins/provisioners/docker/client.rb +4 -175
  210. data/plugins/provisioners/docker/config.rb +2 -72
  211. data/plugins/provisioners/docker/installer.rb +3 -5
  212. data/plugins/provisioners/docker/plugin.rb +6 -6
  213. data/plugins/provisioners/docker/provisioner.rb +4 -10
  214. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  215. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  216. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  217. data/plugins/provisioners/podman/client.rb +12 -0
  218. data/plugins/provisioners/podman/config.rb +28 -0
  219. data/plugins/provisioners/podman/installer.rb +33 -0
  220. data/plugins/provisioners/podman/plugin.rb +38 -0
  221. data/plugins/provisioners/podman/provisioner.rb +52 -0
  222. data/plugins/provisioners/salt/provisioner.rb +4 -0
  223. data/plugins/provisioners/shell/config.rb +1 -6
  224. data/plugins/provisioners/shell/provisioner.rb +61 -26
  225. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  226. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  227. data/plugins/synced_folders/smb/cap/mount_options.rb +36 -0
  228. data/plugins/synced_folders/smb/plugin.rb +10 -0
  229. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  230. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  231. data/templates/commands/init/Vagrantfile.erb +1 -1
  232. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  233. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  234. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  235. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  236. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  237. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  238. data/templates/guests/linux/etc_fstab.erb +6 -0
  239. data/templates/locales/en.yml +235 -6
  240. data/templates/locales/providers_docker.yml +6 -0
  241. data/templates/nfs/exports_darwin.erb +7 -0
  242. data/vagrant.gemspec +12 -12
  243. data/version.txt +1 -1
  244. metadata +3937 -3686
  245. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  246. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  247. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
@@ -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
@@ -25,12 +25,31 @@ module Vagrant
25
25
  # Store in the type map so that --provision-with works properly
26
26
  @_provisioner_types[result] = provisioner.type
27
27
 
28
+ # Set top level provisioner name to provisioner configs name if top level name not set.
29
+ # This is mostly for handling the shell provisioner, if a user has set its name like:
30
+ #
31
+ # config.vm.provision "shell", name: "my_provisioner"
32
+ #
33
+ # Where `name` is a shell config option, not a top level provisioner class option
34
+ #
35
+ # Note: `name` is set to a symbol, since it is converted to one via #Config::VM.provision
36
+ provisioner_name = provisioner.name
37
+ if !provisioner_name
38
+ if provisioner.config.respond_to?(:name) &&
39
+ provisioner.config.name
40
+ provisioner_name = provisioner.config.name.to_sym
41
+ end
42
+ else
43
+ provisioner_name = provisioner_name.to_sym
44
+ end
45
+
28
46
  # Build up the options
29
47
  options = {
30
- name: provisioner.name,
48
+ name: provisioner_name,
31
49
  run: provisioner.run,
32
50
  before: provisioner.before,
33
51
  after: provisioner.after,
52
+ communicator_required: provisioner.communicator_required,
34
53
  }
35
54
 
36
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
@@ -36,17 +36,35 @@ module Vagrant
36
36
 
37
37
  # Get the command and wrap it in a login shell
38
38
  command = ShellQuote.escape(env[:ssh_run_command], "'")
39
- command = "#{env[:machine].config.ssh.shell} -c '#{command}'"
39
+
40
+ if env[:machine].config.vm.communicator == :winssh
41
+ shell = env[:machine].config.winssh.shell
42
+ else
43
+ shell = env[:machine].config.ssh.shell
44
+ end
45
+
46
+ if shell == "cmd"
47
+ # Add an extra space to the command so cmd.exe quoting works
48
+ # properly
49
+ command = "#{shell} /C #{command} "
50
+ elsif shell == "powershell"
51
+ command = "$ProgressPreference = \"SilentlyContinue\"; #{command}"
52
+ command = Base64.strict_encode64(command.encode("UTF-16LE", "UTF-8"))
53
+ command = "#{shell} -encodedCommand #{command}"
54
+ else
55
+ command = "#{shell} -c '#{command}'"
56
+ end
40
57
 
41
58
  # Execute!
42
59
  opts = env[:ssh_opts] || {}
43
60
  opts[:extra_args] ||= []
44
61
 
45
62
  # Allow the user to specify a tty or non-tty manually, but if they
46
- # don't then we default to a TTY
63
+ # don't then we default to a TTY unless they are using WinSSH
47
64
  if !opts[:extra_args].include?("-t") &&
48
65
  !opts[:extra_args].include?("-T") &&
49
- env[:tty]
66
+ env[:tty] &&
67
+ env[:machine].config.vm.communicator != :winssh
50
68
  opts[:extra_args] << "-t"
51
69
  end
52
70
 
@@ -128,6 +128,16 @@ 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
133
+ if env[:machine].guest.capability?(:persist_mount_shared_folder)
134
+ if env[:machine].config.vm.allow_fstab_modification
135
+ fstab_folders = original_folders
136
+ else
137
+ fstab_folders = nil
138
+ end
139
+ env[:machine].guest.capability(:persist_mount_shared_folder, fstab_folders)
140
+ end
131
141
  end
132
142
  end
133
143
  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
88
  @logger.info("Running action: #{environment[: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