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.
- checksums.yaml +4 -4
- data/.hashibot.hcl +2 -0
- data/CHANGELOG.md +228 -0
- data/Gemfile +1 -1
- data/README.md +9 -51
- data/RELEASE.md +1 -1
- data/bin/vagrant +50 -1
- data/contrib/README.md +1 -0
- data/contrib/sudoers/linux-suse +2 -2
- data/contrib/zsh/_vagrant +738 -0
- data/contrib/zsh/generate_zsh_completion.rb +165 -0
- data/lib/vagrant.rb +28 -5
- data/lib/vagrant/action.rb +7 -0
- data/lib/vagrant/action/builder.rb +184 -38
- data/lib/vagrant/action/builtin/box_add.rb +24 -8
- data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
- data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
- data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
- data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
- data/lib/vagrant/action/builtin/delayed.rb +26 -0
- data/lib/vagrant/action/builtin/disk.rb +14 -1
- data/lib/vagrant/action/builtin/handle_box.rb +3 -1
- data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
- data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
- data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
- data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
- data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
- data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
- data/lib/vagrant/action/builtin/trigger.rb +37 -0
- data/lib/vagrant/action/hook.rb +76 -23
- data/lib/vagrant/action/runner.rb +12 -27
- data/lib/vagrant/action/warden.rb +28 -31
- data/lib/vagrant/box.rb +11 -4
- data/lib/vagrant/box_collection.rb +1 -1
- data/lib/vagrant/bundler.rb +310 -61
- data/lib/vagrant/cli.rb +4 -2
- data/lib/vagrant/environment.rb +1 -0
- data/lib/vagrant/errors.rb +69 -1
- data/lib/vagrant/machine.rb +64 -11
- data/lib/vagrant/machine_index.rb +28 -1
- data/lib/vagrant/patches/net-ssh.rb +186 -0
- data/lib/vagrant/plugin/manager.rb +45 -16
- data/lib/vagrant/plugin/v2/command.rb +7 -2
- data/lib/vagrant/plugin/v2/components.rb +6 -0
- data/lib/vagrant/plugin/v2/manager.rb +67 -0
- data/lib/vagrant/plugin/v2/plugin.rb +13 -0
- data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
- data/lib/vagrant/plugin/v2/trigger.rb +64 -25
- data/lib/vagrant/shared_helpers.rb +36 -0
- data/lib/vagrant/ui.rb +43 -2
- data/lib/vagrant/util.rb +2 -0
- data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
- data/lib/vagrant/util/caps.rb +48 -0
- data/lib/vagrant/util/credential_scrubber.rb +1 -1
- data/lib/vagrant/util/curl_helper.rb +12 -8
- data/lib/vagrant/util/directory.rb +19 -0
- data/lib/vagrant/util/downloader.rb +10 -5
- data/lib/vagrant/util/guest_hosts.rb +68 -0
- data/lib/vagrant/util/guest_inspection.rb +9 -1
- data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
- data/lib/vagrant/util/io.rb +7 -27
- data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
- data/lib/vagrant/util/is_port_open.rb +8 -19
- data/lib/vagrant/util/map_command_options.rb +33 -0
- data/lib/vagrant/util/mime.rb +92 -0
- data/lib/vagrant/util/network_ip.rb +11 -1
- data/lib/vagrant/util/numeric.rb +28 -0
- data/lib/vagrant/util/platform.rb +10 -2
- data/lib/vagrant/util/powershell.rb +31 -15
- data/lib/vagrant/util/subprocess.rb +9 -1
- data/lib/vagrant/util/template_renderer.rb +2 -2
- data/lib/vagrant/util/uploader.rb +7 -4
- data/lib/vagrant/vagrantfile.rb +2 -2
- data/plugins/commands/autocomplete/command/install.rb +49 -0
- data/plugins/commands/autocomplete/command/root.rb +64 -0
- data/plugins/commands/autocomplete/plugin.rb +18 -0
- data/plugins/commands/cap/command.rb +5 -1
- data/plugins/commands/cloud/auth/login.rb +20 -23
- data/plugins/commands/cloud/auth/logout.rb +2 -10
- data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
- data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
- data/plugins/commands/cloud/auth/whoami.rb +18 -20
- data/plugins/commands/cloud/box/create.rb +33 -29
- data/plugins/commands/cloud/box/delete.rb +30 -24
- data/plugins/commands/cloud/box/show.rb +41 -31
- data/plugins/commands/cloud/box/update.rb +34 -26
- data/plugins/commands/cloud/client/client.rb +55 -79
- data/plugins/commands/cloud/list.rb +3 -4
- data/plugins/commands/cloud/locales/en.yml +15 -11
- data/plugins/commands/cloud/plugin.rb +10 -0
- data/plugins/commands/cloud/provider/create.rb +38 -28
- data/plugins/commands/cloud/provider/delete.rb +39 -29
- data/plugins/commands/cloud/provider/update.rb +37 -28
- data/plugins/commands/cloud/provider/upload.rb +53 -33
- data/plugins/commands/cloud/publish.rb +193 -106
- data/plugins/commands/cloud/search.rb +34 -21
- data/plugins/commands/cloud/util.rb +273 -161
- data/plugins/commands/cloud/version/create.rb +33 -28
- data/plugins/commands/cloud/version/delete.rb +35 -28
- data/plugins/commands/cloud/version/release.rb +35 -29
- data/plugins/commands/cloud/version/revoke.rb +36 -29
- data/plugins/commands/cloud/version/update.rb +29 -25
- data/plugins/commands/destroy/command.rb +7 -7
- data/plugins/commands/login/plugin.rb +0 -13
- data/plugins/commands/ssh_config/command.rb +1 -1
- data/plugins/communicators/ssh/communicator.rb +25 -24
- data/plugins/communicators/winrm/config.rb +1 -1
- data/plugins/communicators/winrm/helper.rb +1 -1
- data/plugins/communicators/winrm/shell.rb +1 -1
- data/plugins/communicators/winssh/communicator.rb +126 -38
- data/plugins/communicators/winssh/config.rb +3 -7
- data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
- data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
- data/plugins/guests/alt/cap/change_host_name.rb +40 -53
- data/plugins/guests/arch/cap/change_host_name.rb +5 -14
- data/plugins/guests/arch/cap/configure_networks.rb +27 -10
- data/plugins/guests/arch/cap/smb.rb +1 -1
- data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
- data/plugins/guests/centos/cap/flavor.rb +24 -0
- data/plugins/guests/centos/guest.rb +9 -0
- data/plugins/guests/centos/plugin.rb +20 -0
- data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
- data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
- data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
- data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
- data/plugins/guests/darwin/plugin.rb +15 -0
- data/plugins/guests/debian/cap/change_host_name.rb +12 -11
- data/plugins/guests/debian/cap/configure_networks.rb +14 -6
- data/plugins/guests/esxi/cap/public_key.rb +3 -1
- data/plugins/guests/fedora/guest.rb +4 -4
- data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
- data/plugins/guests/haiku/cap/rsync.rb +19 -0
- data/plugins/guests/haiku/plugin.rb +15 -0
- data/plugins/guests/linux/cap/change_host_name.rb +46 -0
- data/plugins/guests/linux/cap/halt.rb +9 -1
- data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
- data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
- data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
- data/plugins/guests/linux/cap/reboot.rb +36 -7
- data/plugins/guests/linux/plugin.rb +10 -0
- data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
- data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
- data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
- data/plugins/guests/openwrt/cap/halt.rb +16 -0
- data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
- data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
- data/plugins/guests/openwrt/cap/rsync.rb +35 -0
- data/plugins/guests/openwrt/guest.rb +23 -0
- data/plugins/guests/openwrt/plugin.rb +61 -0
- data/plugins/guests/photon/cap/change_host_name.rb +9 -15
- data/plugins/guests/pld/cap/change_host_name.rb +11 -17
- data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
- data/plugins/guests/redhat/cap/flavor.rb +3 -1
- data/plugins/guests/redhat/cap/smb.rb +20 -0
- data/plugins/guests/redhat/plugin.rb +5 -0
- data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
- data/plugins/guests/solaris11/plugin.rb +5 -0
- data/plugins/guests/suse/cap/change_host_name.rb +31 -9
- data/plugins/guests/windows/cap/public_key.rb +3 -3
- data/plugins/guests/windows/cap/reboot.rb +10 -5
- data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
- data/plugins/hosts/darwin/plugin.rb +10 -0
- data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
- data/plugins/hosts/linux/cap/nfs.rb +1 -0
- data/plugins/hosts/linux/cap/rdp.rb +1 -1
- data/plugins/hosts/linux/plugin.rb +10 -0
- data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
- data/plugins/hosts/windows/cap/rdp.rb +1 -1
- data/plugins/hosts/windows/plugin.rb +15 -0
- data/plugins/kernel_v2/config/cloud_init.rb +133 -0
- data/plugins/kernel_v2/config/disk.rb +67 -14
- data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
- data/plugins/kernel_v2/config/vm.rb +155 -21
- data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
- data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
- data/plugins/providers/docker/action.rb +8 -17
- data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
- data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
- data/plugins/providers/docker/cap/has_communicator.rb +11 -0
- data/plugins/providers/docker/communicator.rb +1 -1
- data/plugins/providers/docker/driver.rb +58 -7
- data/plugins/providers/docker/plugin.rb +5 -0
- data/plugins/providers/hyperv/action.rb +3 -1
- data/plugins/providers/hyperv/action/configure.rb +8 -0
- data/plugins/providers/hyperv/action/export.rb +4 -2
- data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
- data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
- data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/hyperv/config.rb +5 -0
- data/plugins/providers/hyperv/driver.rb +90 -9
- data/plugins/providers/hyperv/plugin.rb +25 -0
- data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
- data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
- data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
- data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
- data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
- data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
- data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
- data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
- data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
- data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
- data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
- data/plugins/providers/virtualbox/action.rb +13 -1
- data/plugins/providers/virtualbox/action/export.rb +4 -2
- data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
- data/plugins/providers/virtualbox/action/import.rb +8 -4
- data/plugins/providers/virtualbox/action/network.rb +12 -5
- data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
- data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
- data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
- data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
- data/plugins/providers/virtualbox/cap/mount_options.rb +40 -0
- data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
- data/plugins/providers/virtualbox/driver/base.rb +15 -0
- data/plugins/providers/virtualbox/driver/meta.rb +16 -2
- data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
- data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -0
- data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
- data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
- data/plugins/providers/virtualbox/plugin.rb +42 -0
- data/plugins/providers/virtualbox/provider.rb +2 -1
- data/plugins/providers/virtualbox/synced_folder.rb +1 -0
- data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
- data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +1 -1
- data/plugins/provisioners/ansible/plugin.rb +5 -0
- data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
- data/plugins/provisioners/container/client.rb +203 -0
- data/plugins/provisioners/container/config.rb +83 -0
- data/plugins/provisioners/container/installer.rb +13 -0
- data/plugins/provisioners/container/plugin.rb +23 -0
- data/plugins/provisioners/container/provisioner.rb +28 -0
- data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
- data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
- data/plugins/provisioners/docker/client.rb +4 -175
- data/plugins/provisioners/docker/config.rb +2 -72
- data/plugins/provisioners/docker/installer.rb +3 -5
- data/plugins/provisioners/docker/plugin.rb +6 -6
- data/plugins/provisioners/docker/provisioner.rb +4 -10
- data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
- data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
- data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
- data/plugins/provisioners/podman/client.rb +12 -0
- data/plugins/provisioners/podman/config.rb +28 -0
- data/plugins/provisioners/podman/installer.rb +33 -0
- data/plugins/provisioners/podman/plugin.rb +38 -0
- data/plugins/provisioners/podman/provisioner.rb +52 -0
- data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
- data/plugins/provisioners/salt/provisioner.rb +4 -0
- data/plugins/provisioners/shell/config.rb +1 -6
- data/plugins/provisioners/shell/provisioner.rb +61 -26
- data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
- data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
- data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
- data/plugins/synced_folders/smb/plugin.rb +20 -0
- data/plugins/synced_folders/smb/synced_folder.rb +2 -2
- data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
- data/scripts/website_push_www.sh +1 -1
- data/templates/commands/init/Vagrantfile.min.erb +3 -0
- data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
- data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
- data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
- data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
- data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
- data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
- data/templates/guests/linux/etc_fstab.erb +6 -0
- data/templates/guests/nixos/network.erb +5 -6
- data/templates/locales/en.yml +221 -5
- data/templates/locales/providers_docker.yml +4 -0
- data/templates/nfs/exports_darwin.erb +1 -1
- data/vagrant.gemspec +14 -20
- data/version.txt +1 -1
- metadata +5092 -8978
- data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
- data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
- data/plugins/commands/login/client.rb +0 -253
- data/plugins/commands/login/command.rb +0 -137
- data/plugins/commands/login/errors.rb +0 -24
- data/plugins/commands/login/locales/en.yml +0 -49
- data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
- data/scripts/website_push_docs.sh +0 -40
data/lib/vagrant/util/io.rb
CHANGED
@@ -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(
|
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
|
38
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
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
|
data/lib/vagrant/util/numeric.rb
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if
|
28
|
-
|
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
|
-
|
31
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@_powershell_executable =
|
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
|
-
|
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 '
|
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
|
-
|
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
|