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
@@ -29,42 +29,22 @@ module Vagrant
29
29
  break if !results || results[0].empty?
30
30
 
31
31
  # Read!
32
- data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)
32
+ data << io.readpartial(READ_CHUNK_SIZE).encode(
33
+ "UTF-8", Encoding.default_external,
34
+ invalid: :replace,
35
+ undef: :replace
36
+ )
33
37
  else
34
38
  # Do a simple non-blocking read on the IO object
35
39
  data << io.read_nonblock(READ_CHUNK_SIZE)
36
40
  end
37
- rescue Exception => e
38
- # The catch-all rescue here is to support multiple Ruby versions,
39
- # since we use some Ruby 1.9 specific exceptions.
40
-
41
- breakable = false
42
- if e.is_a?(EOFError)
43
- # An `EOFError` means this IO object is done!
44
- breakable = true
45
- elsif defined?(::IO::WaitReadable) && e.is_a?(::IO::WaitReadable)
46
- # IO::WaitReadable is only available on Ruby 1.9+
47
-
48
- # An IO::WaitReadable means there may be more IO but this
49
- # IO object is not ready to be read from yet. No problem,
50
- # we read as much as we can, so we break.
51
- breakable = true
52
- elsif e.is_a?(Errno::EAGAIN)
53
- # Otherwise, we just look for the EAGAIN error which should be
54
- # all that IO::WaitReadable does in Ruby 1.9.
55
- breakable = true
56
- end
57
-
58
- # Break out if we're supposed to. Otherwise re-raise the error
59
- # because it is a real problem.
60
- break if breakable
61
- raise
41
+ rescue EOFError, Errno::EAGAIN, ::IO::WaitReadable
42
+ break
62
43
  end
63
44
  end
64
45
 
65
46
  data
66
47
  end
67
-
68
48
  end
69
49
  end
70
50
  end
@@ -0,0 +1,15 @@
1
+ module Vagrant
2
+ module Util
3
+ module IPv4Interfaces
4
+ def ipv4_interfaces
5
+ Socket.getifaddrs.select do |ifaddr|
6
+ ifaddr.addr && ifaddr.addr.ipv4?
7
+ end.map do |ifaddr|
8
+ [ifaddr.name, ifaddr.addr.ip_address]
9
+ end
10
+ end
11
+
12
+ extend IPv4Interfaces
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,4 @@
1
1
  require "socket"
2
- require "timeout"
3
2
 
4
3
  module Vagrant
5
4
  module Util
@@ -14,26 +13,16 @@ module Vagrant
14
13
  # @return [Boolean] `true` if the port is open (listening), `false`
15
14
  # otherwise.
16
15
  def is_port_open?(host, port)
17
- # We wrap this in a timeout because once in awhile the TCPSocket
18
- # _will_ hang, but this signals that the port is closed.
19
- Timeout.timeout(1) do
20
- # Attempt to make a connection
21
- s = TCPSocket.new(host, port)
22
-
23
- # A connection was made! Properly clean up the socket, not caring
24
- # at all if any exception is raised, because we already know the
25
- # result.
26
- s.close rescue nil
27
-
28
- # The port is open if we reached this point, since we were able
29
- # to connect.
30
- return true
16
+ begin
17
+ Socket.tcp(host, port, connect_timeout: 0.1).close
18
+ true
19
+ rescue Errno::ETIMEDOUT, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, \
20
+ Errno::ENETUNREACH, Errno::EACCES, Errno::ENOTCONN, Errno::EALREADY
21
+ false
31
22
  end
32
- rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, \
33
- Errno::ENETUNREACH, Errno::EACCES, Errno::ENOTCONN
34
- # Any of the above exceptions signal that the port is closed.
35
- return false
36
23
  end
24
+
25
+ extend IsPortOpen
37
26
  end
38
27
  end
39
28
  end
@@ -0,0 +1,33 @@
1
+ module Vagrant
2
+ module Util
3
+ class MapCommandOptions
4
+ # Given a hash map of user specified argments, will generate
5
+ # a list. Set the key to the command flag, and the value to
6
+ # it's value. If the value is boolean (true), only the flag is
7
+ # added. eg.
8
+ # {a: "opt-a", b: true} -> ["--a", "opt-a", "--b"]
9
+ #
10
+ # @param [Hash] map of commands
11
+ # @param [String] string prepended to cmd line flags (keys)
12
+ #
13
+ # @return[Array<String>] commands in list form
14
+ def self.map_to_command_options(map, cmd_flag="--")
15
+ opt_list = []
16
+ if map == nil
17
+ return opt_list
18
+ end
19
+ map.each do |k, v|
20
+ # If the value is true (bool) add the key as the cmd flag
21
+ if v.is_a?(TrueClass)
22
+ opt_list.push("#{cmd_flag}#{k}")
23
+ # If the value is a string, add the key as the flag, and value as the flags argument
24
+ elsif v.is_a?(String)
25
+ opt_list.push("#{cmd_flag}#{k}")
26
+ opt_list.push(v)
27
+ end
28
+ end
29
+ return opt_list
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,92 @@
1
+ require 'mime/types'
2
+ require 'securerandom'
3
+
4
+ module Vagrant
5
+ module Util
6
+ module Mime
7
+ class Multipart
8
+
9
+ # @return [Array<String>] collection of content part of the multipart mime
10
+ attr_accessor :content
11
+
12
+ # @return [String] type of the content
13
+ attr_accessor :content_type
14
+
15
+ # @return [Hash] headers for the mime
16
+ attr_accessor :headers
17
+
18
+ # @param [String] (optional) mime content type
19
+ # @param [String] (optional) mime version
20
+ def initialize(content_type="multipart/mixed")
21
+ @content_id = "#{Time.now.to_i}@#{SecureRandom.alphanumeric(24)}.local"
22
+ @boundary = "Boundary_#{SecureRandom.alphanumeric(24)}"
23
+ @content_type = MIME::Types[content_type].first
24
+ @content = []
25
+ @headers = {
26
+ "Content-ID"=> "<#{@content_id}>",
27
+ "Content-Type"=> "#{content_type}; boundary=#{@boundary}",
28
+ }
29
+ end
30
+
31
+ # Add an entry to the multipart mime
32
+ #
33
+ # @param entry to add
34
+ def add(entry)
35
+ content << entry
36
+ end
37
+
38
+ # Output MimeEntity as a string
39
+ #
40
+ # @return [String] mime data
41
+ def to_s
42
+ output_string = ""
43
+ headers.each do |k, v|
44
+ output_string += "#{k}: #{v}\n"
45
+ end
46
+ output_string += "\n--#{@boundary}\n"
47
+ @content.each do |entry|
48
+ output_string += entry.to_s
49
+ output_string += "\n--#{@boundary}\n"
50
+ end
51
+ output_string
52
+ end
53
+ end
54
+
55
+ class Entity
56
+
57
+ # @return [String] entity content
58
+ attr_reader :content
59
+
60
+ # @return [String] type of the entity content
61
+ attr_reader :content_type
62
+
63
+ # @return [String] content disposition
64
+ attr_accessor :disposition
65
+
66
+ # @param [String] entity content
67
+ # @param [String] type of the entity content
68
+ def initialize(content, content_type)
69
+ if !MIME::Types.include?(content_type)
70
+ MIME::Types.add(MIME::Type.new(content_type))
71
+ end
72
+ @content = content
73
+ @content_type = MIME::Types[content_type].first
74
+ @content_id = "#{Time.now.to_i}@#{SecureRandom.alphanumeric(24)}.local"
75
+ end
76
+
77
+ # Output MimeEntity as a string
78
+ #
79
+ # @return [String] mime data
80
+ def to_s
81
+ output_string = "Content-ID: <#{@content_id}>\n"
82
+ output_string += "Content-Type: #{@content_type}\n"
83
+ if disposition
84
+ output_string += "Content-Disposition: #{@disposition}\n"
85
+ end
86
+ output_string += "\n#{content}"
87
+ output_string
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -3,11 +3,21 @@ require "ipaddr"
3
3
  module Vagrant
4
4
  module Util
5
5
  module NetworkIP
6
+
7
+ DEFAULT_MASK = "255.255.255.0".freeze
8
+
9
+ LOGGER = Log4r::Logger.new("vagrant::util::NetworkIP")
10
+
6
11
  # Returns the network address of the given IP and subnet.
7
12
  #
8
13
  # @return [String]
9
14
  def network_address(ip, subnet)
10
- IPAddr.new(ip).mask(subnet).to_s
15
+ begin
16
+ IPAddr.new(ip).mask(subnet).to_s
17
+ rescue IPAddr::InvalidPrefixError
18
+ LOGGER.warn("Provided mask '#{subnet}' is invalid. Falling back to using mask '#{DEFAULT_MASK}'")
19
+ IPAddr.new(ip).mask(DEFAULT_MASK).to_s
20
+ end
11
21
  end
12
22
  end
13
23
  end
@@ -49,6 +49,34 @@ module Vagrant
49
49
  bytes
50
50
  end
51
51
 
52
+ # Convert bytes to a user friendly string representation
53
+ #
54
+ # @param [Numeric] bytes Number of bytes to represent
55
+ # @return [String] user friendly output
56
+ def bytes_to_string(bytes)
57
+ # We want to locate the size that will return the
58
+ # smallest whole value number
59
+ BYTES_CONVERSION_MAP.sort { |a, b|
60
+ b.last <=> a.last
61
+ }.each do |suffix, size|
62
+ val = bytes.to_f / size
63
+ next if val < 1
64
+ val = sprintf("%.2f", val)
65
+ val.slice!(-1, 1) while val.end_with?("0")
66
+ val.slice!(-1, 1) if val.end_with?(".")
67
+ return "#{val}#{suffix}"
68
+ end
69
+ "#{bytes} byte#{"s" if bytes > 1}"
70
+ end
71
+
72
+ # Rounds actual value to two decimal places
73
+ #
74
+ # @param [Integer] bytes
75
+ # @return [Integer] megabytes - bytes representation in megabytes
76
+ def bytes_to_megabytes(bytes)
77
+ (bytes / MEGABYTE.to_f).round(2)
78
+ end
79
+
52
80
  # @private
53
81
  # Reset the cached values for platform. This is not considered a public
54
82
  # API and should only be used for testing.
@@ -213,13 +213,20 @@ module Vagrant
213
213
  return path if !cygwin?
214
214
 
215
215
  # Replace all "\" with "/", otherwise cygpath doesn't work.
216
- path = path.gsub("\\", "/")
216
+ path = unix_windows_path(path)
217
217
 
218
218
  # Call out to cygpath and gather the result
219
219
  process = Subprocess.execute("cygpath", "-w", "-l", "-a", path.to_s)
220
220
  return process.stdout.chomp
221
221
  end
222
222
 
223
+ # This takes any path and converts Windows-style path separators
224
+ # to Unix-like path separators.
225
+ # @return [String]
226
+ def unix_windows_path(path)
227
+ path.gsub("\\", "/")
228
+ end
229
+
223
230
  # This checks if the filesystem is case sensitive. This is not a
224
231
  # 100% correct check, since it is possible that the temporary
225
232
  # directory runs a different filesystem than the root directory.
@@ -547,6 +554,7 @@ module Vagrant
547
554
  # Get list of local mount paths that are DrvFs file systems
548
555
  #
549
556
  # @return [Array<String>]
557
+ # @todo(chrisroberts): Constantize types for check
550
558
  def wsl_drvfs_mounts
551
559
  if !defined?(@_wsl_drvfs_mounts)
552
560
  @_wsl_drvfs_mounts = []
@@ -554,7 +562,7 @@ module Vagrant
554
562
  result = Util::Subprocess.execute("mount")
555
563
  result.stdout.each_line do |line|
556
564
  info = line.match(MOUNT_PATTERN)
557
- if info && info[:type] == "drvfs"
565
+ if info && (info[:type] == "drvfs" || info[:type] == "9p")
558
566
  @_wsl_drvfs_mounts << info[:mount]
559
567
  end
560
568
  end
@@ -14,28 +14,44 @@ module Vagrant
14
14
  MINIMUM_REQUIRED_VERSION = 3
15
15
  # Number of seconds to wait while attempting to get powershell version
16
16
  DEFAULT_VERSION_DETECTION_TIMEOUT = 30
17
+ # Names of the powershell executable
18
+ POWERSHELL_NAMES = ["powershell", "pwsh"].map(&:freeze).freeze
19
+ # Paths to powershell executable
20
+ POWERSHELL_PATHS = [
21
+ "%WINDIR%/WindowsPowerShell/v1.0",
22
+ "%PROGRAMFILES%/PowerShell/7",
23
+ "%PROGRAMFILES%/PowerShell/6"
24
+ ].map(&:freeze).freeze
25
+
17
26
  LOGGER = Log4r::Logger.new("vagrant::util::powershell")
18
27
 
19
28
  # @return [String|nil] a powershell executable, depending on environment
20
29
  def self.executable
21
30
  if !defined?(@_powershell_executable)
22
- @_powershell_executable = "powershell"
31
+ # First start with detecting executable on configured path
32
+ POWERSHELL_NAMES.detect do |psh|
33
+ return @_powershell_executable = psh if Which.which(psh)
34
+ psh += ".exe"
35
+ return @_powershell_executable = psh if Which.which(psh)
36
+ end
23
37
 
24
- if Which.which(@_powershell_executable).nil?
25
- # Try to use WSL interoperability if PowerShell is not symlinked to
26
- # the container.
27
- if Platform.wsl?
28
- @_powershell_executable += ".exe"
38
+ # Now attempt with paths
39
+ paths = POWERSHELL_PATHS.map do |ppath|
40
+ result = Util::Subprocess.execute("cmd.exe", "/c", "echo #{ppath}")
41
+ result.stdout.gsub("\"", "").strip if result.exit_code == 0
42
+ end.compact
29
43
 
30
- if Which.which(@_powershell_executable).nil?
31
- @_powershell_executable = "/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe"
44
+ paths.each do |psh_path|
45
+ POWERSHELL_NAMES.each do |psh|
46
+ path = File.join(psh_path, psh)
47
+ return @_powershell_executable = path if Which.which(path)
32
48
 
33
- if Which.which(@_powershell_executable).nil?
34
- @_powershell_executable = nil
35
- end
36
- end
37
- else
38
- @_powershell_executable = nil
49
+ path += ".exe"
50
+ return @_powershell_executable = path if Which.which(path)
51
+
52
+ # Finally test the msys2 style path
53
+ path = path.sub(/^([A-Za-z]):/, "/mnt/\\1")
54
+ return @_powershell_executable = path if Which.which(path)
39
55
  end
40
56
  end
41
57
  end
@@ -231,7 +247,7 @@ module Vagrant
231
247
  "-PassThru -WindowStyle Hidden -Wait -Verb RunAs; if($p){ exit $p.ExitCode; }else{ exit 1 }"
232
248
 
233
249
  cmd = [
234
- "powershell",
250
+ executable,
235
251
  "-NoLogo",
236
252
  "-NoProfile",
237
253
  "-NonInteractive",
@@ -90,6 +90,8 @@ module Vagrant
90
90
  process.io.stdout = stdout_writer
91
91
  process.io.stderr = stderr_writer
92
92
  process.duplex = true
93
+ process.leader = true if @options[:detach]
94
+ process.detach = true if @options[:detach]
93
95
 
94
96
  # Special installer-related things
95
97
  if Vagrant.in_installer?
@@ -158,6 +160,12 @@ module Vagrant
158
160
  raise LaunchError.new(ex.message)
159
161
  end
160
162
 
163
+ # If running with the detach option, no need to capture IO or
164
+ # ensure program exists.
165
+ if @options[:detach]
166
+ return
167
+ end
168
+
161
169
  # Make sure the stdin does not buffer
162
170
  process.io.stdin.sync = true
163
171
 
@@ -261,7 +269,7 @@ module Vagrant
261
269
  # Return an exit status container
262
270
  return Result.new(process.exit_code, io_data[:stdout], io_data[:stderr])
263
271
  ensure
264
- if process && process.alive?
272
+ if process && process.alive? && !@options[:detach]
265
273
  # Make sure no matter what happens, the process exits
266
274
  process.stop(2)
267
275
  end
@@ -1,7 +1,7 @@
1
1
  require 'ostruct'
2
2
  require "pathname"
3
3
 
4
- require 'erubis'
4
+ require 'erubi'
5
5
 
6
6
  module Vagrant
7
7
  module Util
@@ -73,7 +73,7 @@ module Vagrant
73
73
  #
74
74
  # @return [String]
75
75
  def render_string
76
- Erubis::Eruby.new(template, trim: true).result(binding)
76
+ binding.eval(Erubi::Engine.new(template, trim: true).src)
77
77
  end
78
78
 
79
79
  # Returns the full path to the template, taking into account the gem directory