vagrant-unbundled 2.2.0.0 → 2.2.2.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/.travis.yml +3 -4
- data/CHANGELOG.md +49 -0
- data/lib/vagrant/action/builtin/box_check_outdated.rb +1 -0
- data/lib/vagrant/action/builtin/config_validate.rb +1 -1
- data/lib/vagrant/box.rb +27 -0
- data/lib/vagrant/bundler.rb +7 -2
- data/lib/vagrant/cli.rb +4 -0
- data/lib/vagrant/config/v2/root.rb +6 -2
- data/lib/vagrant/plugin/v2/communicator.rb +7 -0
- data/lib/vagrant/plugin/v2/trigger.rb +5 -1
- data/lib/vagrant/util/network_ip.rb +1 -26
- data/lib/vagrant/util/platform.rb +19 -7
- data/lib/vagrant/util/powershell.rb +23 -25
- data/lib/vagrant/util/ssh.rb +18 -5
- data/lib/vagrant/vagrantfile.rb +13 -2
- data/plugins/commands/login/plugin.rb +0 -1
- data/plugins/commands/validate/command.rb +17 -2
- data/plugins/communicators/ssh/communicator.rb +22 -12
- data/plugins/communicators/winrm/communicator.rb +5 -1
- data/plugins/communicators/winrm/shell.rb +25 -1
- data/plugins/guests/debian/cap/change_host_name.rb +66 -10
- data/plugins/guests/windows/cap/change_host_name.rb +4 -12
- data/plugins/guests/windows/cap/reboot.rb +36 -6
- data/plugins/guests/windows/plugin.rb +5 -0
- data/plugins/kernel_v2/config/vm.rb +8 -4
- data/plugins/providers/docker/action/host_machine_sync_folders.rb +2 -3
- data/plugins/providers/hyperv/provider.rb +15 -3
- data/plugins/providers/hyperv/scripts/delete_vm.ps1 +3 -0
- data/plugins/providers/hyperv/scripts/get_network_config.ps1 +1 -1
- data/plugins/providers/hyperv/scripts/set_network_vlan.ps1 +0 -6
- data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +1 -1
- data/plugins/providers/virtualbox/action.rb +2 -0
- data/plugins/providers/virtualbox/action/network.rb +33 -42
- data/plugins/providers/virtualbox/action/set_default_nic_type.rb +69 -0
- data/plugins/providers/virtualbox/config.rb +10 -0
- data/plugins/providers/virtualbox/driver/meta.rb +1 -0
- data/plugins/providers/virtualbox/driver/version_5_0.rb +17 -6
- data/plugins/providers/virtualbox/driver/version_5_2.rb +2 -2
- data/plugins/providers/virtualbox/driver/version_6_0.rb +105 -0
- data/plugins/providers/virtualbox/plugin.rb +1 -0
- data/plugins/providers/virtualbox/synced_folder.rb +2 -1
- data/plugins/provisioners/docker/cap/linux/docker_configure_vagrant_user.rb +1 -0
- data/plugins/provisioners/shell/config.rb +4 -1
- data/plugins/provisioners/shell/provisioner.rb +6 -0
- data/plugins/synced_folders/smb/synced_folder.rb +18 -5
- data/templates/locales/en.yml +19 -3
- data/vagrant.gemspec +3 -1
- data/version.txt +1 -1
- metadata +407 -12
@@ -9,6 +9,9 @@ $ErrorActionPreference = "Stop"
|
|
9
9
|
|
10
10
|
try {
|
11
11
|
$VM = Hyper-V\Get-VM -Id $VmId
|
12
|
+
if((Get-Command Hyper-V\Set-VM).Parameters["AutomaticCheckpointsEnabled"] -ne $null) {
|
13
|
+
Hyper-V\Set-VM -VM $VM -AutomaticCheckpointsEnabled $false -ErrorAction SilentlyContinue
|
14
|
+
}
|
12
15
|
Hyper-V\Remove-VM $VM -Force
|
13
16
|
} catch {
|
14
17
|
Write-ErrorMessage "Failed to delete VM: ${PSItem}"
|
@@ -35,7 +35,7 @@ try {
|
|
35
35
|
foreach ($macaddr in $macaddresses) {
|
36
36
|
$macaddress = $macaddr.MacAddress -replace '(.{2})(?!$)', '${1}-'
|
37
37
|
$addr = Get-NetNeighbor -LinkLayerAddress $macaddress -ErrorAction SilentlyContinue | select IPAddress
|
38
|
-
if ($
|
38
|
+
if ($addr) {
|
39
39
|
$ip_address = $addr.IPAddress
|
40
40
|
if ($ip_address.Contains(".")) {
|
41
41
|
$ip4_address = $ip_address
|
@@ -7,12 +7,6 @@ param (
|
|
7
7
|
[int]$VlanId
|
8
8
|
)
|
9
9
|
|
10
|
-
# Include the following modules
|
11
|
-
$presentDir = Split-Path -parent $PSCommandPath
|
12
|
-
$modules = @()
|
13
|
-
$modules += $presentDir + "\utils\write_messages.ps1"
|
14
|
-
forEach ($module in $modules) { . $module }
|
15
|
-
|
16
10
|
try {
|
17
11
|
$vm = Hyper-V\Get-VM -Id $VmId -ErrorAction "stop"
|
18
12
|
Hyper-V\Set-VMNetworkAdapterVlan $vm -Access -Vlanid $VlanId
|
@@ -85,7 +85,7 @@ function New-VagrantVMVMCX {
|
|
85
85
|
VhdDestinationPath = Join-Path $DataPath "Virtual Hard Disks";
|
86
86
|
VirtualMachinePath = $DataPath;
|
87
87
|
}
|
88
|
-
$VMConfig = (Hyper-V\Compare-VM -Copy -GenerateNewID @NewVMConfig)
|
88
|
+
$VMConfig = (Hyper-V\Compare-VM -Copy -GenerateNewID @NewVMConfig -ErrorAction SilentlyContinue)
|
89
89
|
|
90
90
|
# If the config is empty it means the import failed. Attempt to provide
|
91
91
|
# context for failure
|
@@ -42,6 +42,7 @@ module VagrantPlugins
|
|
42
42
|
autoload :PrepareForwardedPortCollisionParams, File.expand_path("../action/prepare_forwarded_port_collision_params", __FILE__)
|
43
43
|
autoload :Resume, File.expand_path("../action/resume", __FILE__)
|
44
44
|
autoload :SaneDefaults, File.expand_path("../action/sane_defaults", __FILE__)
|
45
|
+
autoload :SetDefaultNICType, File.expand_path("../action/set_default_nic_type", __FILE__)
|
45
46
|
autoload :SetName, File.expand_path("../action/set_name", __FILE__)
|
46
47
|
autoload :SnapshotDelete, File.expand_path("../action/snapshot_delete", __FILE__)
|
47
48
|
autoload :SnapshotRestore, File.expand_path("../action/snapshot_restore", __FILE__)
|
@@ -71,6 +72,7 @@ module VagrantPlugins
|
|
71
72
|
b.use SyncedFolderCleanup
|
72
73
|
b.use SyncedFolders
|
73
74
|
b.use PrepareNFSSettings
|
75
|
+
b.use SetDefaultNICType
|
74
76
|
b.use ClearNetworkInterfaces
|
75
77
|
b.use Network
|
76
78
|
b.use NetworkFixIPv6
|
@@ -261,16 +261,26 @@ module VagrantPlugins
|
|
261
261
|
|
262
262
|
begin
|
263
263
|
ip = IPAddr.new(options[:ip])
|
264
|
-
|
265
|
-
|
266
|
-
|
264
|
+
if ip.ipv4?
|
265
|
+
options[:netmask] ||= "255.255.255.0"
|
266
|
+
elsif ip.ipv6?
|
267
|
+
options[:netmask] ||= 64
|
267
268
|
|
268
|
-
|
269
|
-
|
269
|
+
# Append a 6 to the end of the type
|
270
|
+
options[:type] = "#{options[:type]}6".to_sym
|
271
|
+
else
|
272
|
+
raise IPAddr::AddressFamilyError, 'unknown address family'
|
273
|
+
end
|
270
274
|
|
271
275
|
# Calculate our network address for the given IP/netmask
|
272
|
-
netaddr
|
276
|
+
netaddr = IPAddr.new("#{options[:ip]}/#{options[:netmask]}")
|
277
|
+
rescue IPAddr::Error => e
|
278
|
+
raise Vagrant::Errors::NetworkAddressInvalid,
|
279
|
+
address: options[:ip], mask: options[:netmask],
|
280
|
+
error: e.message
|
281
|
+
end
|
273
282
|
|
283
|
+
if ip.ipv4?
|
274
284
|
# Verify that a host-only network subnet would not collide
|
275
285
|
# with a bridged networking interface.
|
276
286
|
#
|
@@ -287,44 +297,24 @@ module VagrantPlugins
|
|
287
297
|
interface_name: interface[:name]
|
288
298
|
end
|
289
299
|
end
|
290
|
-
|
291
|
-
# Split the IP address into its components
|
292
|
-
ip_parts = netaddr.split(".").map { |i| i.to_i }
|
293
|
-
|
294
|
-
# Calculate the adapter IP, which we assume is the IP ".1" at
|
295
|
-
# the end usually.
|
296
|
-
adapter_ip = ip_parts.dup
|
297
|
-
adapter_ip[3] += 1
|
298
|
-
options[:adapter_ip] ||= adapter_ip.join(".")
|
299
|
-
elsif ip.ipv6?
|
300
|
-
# Default subnet prefix length
|
301
|
-
options[:netmask] ||= 64
|
302
|
-
|
303
|
-
# Set adapter IP to <prefix>::1
|
304
|
-
options[:adapter_ip] ||= (ip.mask(options[:netmask].to_i) | 1).to_s
|
305
|
-
|
306
|
-
# Append a 6 to the end of the type
|
307
|
-
options[:type] = "#{options[:type]}6".to_sym
|
308
|
-
else
|
309
|
-
raise "BUG: Unknown IP type: #{ip.inspect}"
|
310
300
|
end
|
311
301
|
|
302
|
+
# Calculate the adapter IP which is the network address with
|
303
|
+
# the final bit + 1. Usually it is "x.x.x.1" for IPv4 and
|
304
|
+
# "<prefix>::1" for IPv6
|
305
|
+
options[:adapter_ip] ||= (netaddr | 1).to_s
|
306
|
+
|
312
307
|
dhcp_options = {}
|
313
308
|
if options[:type] == :dhcp
|
314
|
-
# Calculate the DHCP server IP
|
315
|
-
#
|
316
|
-
dhcp_ip
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
dhcp_lower
|
322
|
-
|
323
|
-
dhcp_options[:dhcp_lower] = options[:dhcp_lower] || dhcp_lower.join(".")
|
324
|
-
|
325
|
-
dhcp_upper = ip_parts.dup
|
326
|
-
dhcp_upper[3] = 254
|
327
|
-
dhcp_options[:dhcp_upper] = options[:dhcp_upper] || dhcp_upper.join(".")
|
309
|
+
# Calculate the DHCP server IP and lower & upper bound
|
310
|
+
# Example: for "192.168.22.64/26" network range those are:
|
311
|
+
# dhcp_ip: "192.168.22.66",
|
312
|
+
# dhcp_lower: "192.168.22.67"
|
313
|
+
# dhcp_upper: "192.168.22.126"
|
314
|
+
ip_range = netaddr.to_range
|
315
|
+
dhcp_options[:dhcp_ip] = options[:dhcp_ip] || (ip_range.first | 2).to_s
|
316
|
+
dhcp_options[:dhcp_lower] = options[:dhcp_lower] || (ip_range.first | 3).to_s
|
317
|
+
dhcp_options[:dhcp_upper] = options[:dhcp_upper] || (ip_range.last(2).first).to_s
|
328
318
|
end
|
329
319
|
|
330
320
|
return {
|
@@ -413,15 +403,16 @@ module VagrantPlugins
|
|
413
403
|
end
|
414
404
|
|
415
405
|
def nat_config(options)
|
416
|
-
return
|
406
|
+
return options.merge(
|
417
407
|
auto_config: false
|
418
|
-
|
408
|
+
)
|
419
409
|
end
|
420
410
|
|
421
411
|
def nat_adapter(config)
|
422
412
|
return {
|
423
413
|
adapter: config[:adapter],
|
424
414
|
type: :nat,
|
415
|
+
nic_type: config[:nic_type],
|
425
416
|
}
|
426
417
|
end
|
427
418
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProviderVirtualBox
|
5
|
+
module Action
|
6
|
+
# This sets the default NIC type used for network adapters created
|
7
|
+
# on the guest. Also includes a check of NIC types in use and VirtualBox
|
8
|
+
# version to determine if E1000 NIC types are vulnerable.
|
9
|
+
#
|
10
|
+
# NOTE: Vulnerability was fixed here: https://www.virtualbox.org/changeset/75330/vbox
|
11
|
+
class SetDefaultNICType
|
12
|
+
# Defines versions of VirtualBox with susceptible implementation
|
13
|
+
# of the E1000 devices.
|
14
|
+
E1000_SUSCEPTIBLE = Gem::Requirement.new("<= 5.2.22").freeze
|
15
|
+
|
16
|
+
def initialize(app, env)
|
17
|
+
@logger = Log4r::Logger.new("vagrant::plugins::virtualbox::set_default_nic_type")
|
18
|
+
@app = app
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(env)
|
22
|
+
default_nic_type = env[:machine].provider_config.default_nic_type
|
23
|
+
|
24
|
+
e1000_in_use = [
|
25
|
+
# simple check on default_nic_type
|
26
|
+
->{ default_nic_type.nil? || default_nic_type.to_s.start_with?("8254") },
|
27
|
+
# check provider defined adapters
|
28
|
+
->{ env[:machine].provider_config.network_adapters.values.detect{ |_, opts|
|
29
|
+
opts[:nic_type].to_s.start_with?("8254") } },
|
30
|
+
# finish with inspecting configured networks
|
31
|
+
->{ env[:machine].config.vm.networks.detect{ |_, opts|
|
32
|
+
opts.fetch(:virtualbox__nic_type, opts[:nic_type]).to_s.start_with?("8254") } }
|
33
|
+
]
|
34
|
+
|
35
|
+
# Check if VirtualBox E1000 implementation is vulnerable
|
36
|
+
if E1000_SUSCEPTIBLE.satisfied_by?(Gem::Version.new(env[:machine].provider.driver.version))
|
37
|
+
@logger.info("Detected VirtualBox version with susceptible E1000 implementation (`#{E1000_SUSCEPTIBLE}`)")
|
38
|
+
if e1000_in_use.any?(&:call)
|
39
|
+
env[:ui].warn I18n.t("vagrant.actions.vm.set_default_nic_type.e1000_warning")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if default_nic_type
|
44
|
+
@logger.info("Default NIC type for VirtualBox interfaces `#{default_nic_type}`")
|
45
|
+
# Update network adapters defined in provider configuration
|
46
|
+
env[:machine].provider_config.network_adapters.each do |slot, args|
|
47
|
+
_, opts = args
|
48
|
+
if opts && !opts.key?(:nic_type)
|
49
|
+
@logger.info("Setting default NIC type (`#{default_nic_type}`) adapter `#{slot}` - `#{args}`")
|
50
|
+
opts[:nic_type] = default_nic_type
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Update generally defined networks
|
55
|
+
env[:machine].config.vm.networks.each do |type, options|
|
56
|
+
next if !type.to_s.end_with?("_network")
|
57
|
+
if !options.key?(:nic_type) && !options.key?(:virtualbox__nic_type)
|
58
|
+
@logger.info("Setting default NIC type (`#{default_nic_type}`) for `#{type}` - `#{options}`")
|
59
|
+
options[:virtualbox__nic_type] = default_nic_type
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
@app.call(env)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -19,6 +19,13 @@ module VagrantPlugins
|
|
19
19
|
# @return [Array]
|
20
20
|
attr_reader :customizations
|
21
21
|
|
22
|
+
# Set the default type of NIC hardware to be used for network
|
23
|
+
# devices. By default this is `nil` and VirtualBox's default
|
24
|
+
# will be used.
|
25
|
+
#
|
26
|
+
# @return [String]
|
27
|
+
attr_accessor :default_nic_type
|
28
|
+
|
22
29
|
# If true, unused network interfaces will automatically be deleted.
|
23
30
|
# This defaults to false because the detection does not work across
|
24
31
|
# multiple users, and because on Windows this operation requires
|
@@ -68,6 +75,7 @@ module VagrantPlugins
|
|
68
75
|
@auto_nat_dns_proxy = UNSET_VALUE
|
69
76
|
@check_guest_additions = UNSET_VALUE
|
70
77
|
@customizations = []
|
78
|
+
@default_nic_type = UNSET_VALUE
|
71
79
|
@destroy_unused_network_interfaces = UNSET_VALUE
|
72
80
|
@functional_vboxsf = UNSET_VALUE
|
73
81
|
@name = UNSET_VALUE
|
@@ -158,6 +166,8 @@ module VagrantPlugins
|
|
158
166
|
|
159
167
|
# The default name is just nothing, and we default it
|
160
168
|
@name = nil if @name == UNSET_VALUE
|
169
|
+
|
170
|
+
@default_nic_type = nil if @default_nic_type == UNSET_VALUE
|
161
171
|
end
|
162
172
|
|
163
173
|
def validate(machine)
|
@@ -674,6 +674,8 @@ module VagrantPlugins
|
|
674
674
|
hostpath]
|
675
675
|
args << "--transient" if folder.key?(:transient) && folder[:transient]
|
676
676
|
|
677
|
+
args << "--automount" if folder.key?(:automount) && folder[:automount]
|
678
|
+
|
677
679
|
if folder[:SharedFoldersEnableSymlinksCreate]
|
678
680
|
# Enable symlinks on the shared folder
|
679
681
|
execute("setextradata", @uuid, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/#{folder[:name]}", "1", retryable: true)
|
@@ -687,12 +689,21 @@ module VagrantPlugins
|
|
687
689
|
def ssh_port(expected_port)
|
688
690
|
@logger.debug("Searching for SSH port: #{expected_port.inspect}")
|
689
691
|
|
690
|
-
# Look for the forwarded port
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
692
|
+
# Look for the forwarded port. Valid based on the guest port, but will do
|
693
|
+
# scoring based matching to determine best value when multiple results are
|
694
|
+
# available.
|
695
|
+
matches = read_forwarded_ports.map do |_, name, hostport, guestport, host_ip|
|
696
|
+
next if guestport != expected_port
|
697
|
+
match = [0, hostport]
|
698
|
+
match[0] += 1 if name == "ssh"
|
699
|
+
match[0] += 1 if name.downcase == "ssh"
|
700
|
+
match[0] += 1 if host_ip == "127.0.0.1"
|
701
|
+
match
|
702
|
+
end.compact
|
703
|
+
|
704
|
+
result = matches.sort_by(&:first).last
|
705
|
+
|
706
|
+
result.last if result
|
696
707
|
end
|
697
708
|
|
698
709
|
def resume
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.expand_path("../
|
1
|
+
require File.expand_path("../version_5_0", __FILE__)
|
2
2
|
|
3
3
|
module VagrantPlugins
|
4
4
|
module ProviderVirtualBox
|
5
5
|
module Driver
|
6
6
|
# Driver for VirtualBox 5.2.x
|
7
|
-
class Version_5_2 <
|
7
|
+
class Version_5_2 < Version_5_0
|
8
8
|
def initialize(uuid)
|
9
9
|
super
|
10
10
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.expand_path("../version_5_0", __FILE__)
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProviderVirtualBox
|
5
|
+
module Driver
|
6
|
+
# Driver for VirtualBox 6.0.x
|
7
|
+
class Version_6_0 < Version_5_0
|
8
|
+
def initialize(uuid)
|
9
|
+
super
|
10
|
+
|
11
|
+
@logger = Log4r::Logger.new("vagrant::provider::virtualbox_6_0")
|
12
|
+
end
|
13
|
+
|
14
|
+
def import(ovf)
|
15
|
+
ovf = Vagrant::Util::Platform.windows_path(ovf)
|
16
|
+
|
17
|
+
output = ""
|
18
|
+
total = ""
|
19
|
+
last = 0
|
20
|
+
|
21
|
+
# Dry-run the import to get the suggested name and path
|
22
|
+
@logger.debug("Doing dry-run import to determine parallel-safe name...")
|
23
|
+
output = execute("import", "-n", ovf)
|
24
|
+
result = /Suggested VM name "(.+?)"/.match(output)
|
25
|
+
if !result
|
26
|
+
raise Vagrant::Errors::VirtualBoxNoName, output: output
|
27
|
+
end
|
28
|
+
suggested_name = result[1].to_s
|
29
|
+
|
30
|
+
# Append millisecond plus a random to the path in case we're
|
31
|
+
# importing the same box elsewhere.
|
32
|
+
specified_name = "#{suggested_name}_#{(Time.now.to_f * 1000.0).to_i}_#{rand(100000)}"
|
33
|
+
@logger.debug("-- Parallel safe name: #{specified_name}")
|
34
|
+
|
35
|
+
# Build the specified name param list
|
36
|
+
name_params = [
|
37
|
+
"--vsys", "0",
|
38
|
+
"--vmname", specified_name,
|
39
|
+
]
|
40
|
+
|
41
|
+
# Target path for disks is no longer a full path. Extract the path for the
|
42
|
+
# settings file to determine the base directory which we can then use to
|
43
|
+
# build the disk paths
|
44
|
+
result = /Suggested VM settings file name "(?<settings_path>.+?)"/.match(output)
|
45
|
+
if !result
|
46
|
+
@logger.warn("Failed to locate base path for disks. Using current working directory.")
|
47
|
+
base_path = "."
|
48
|
+
else
|
49
|
+
base_path = File.dirname(result[:settings_path])
|
50
|
+
end
|
51
|
+
|
52
|
+
@logger.info("Base path for disk import: #{base_path}")
|
53
|
+
|
54
|
+
# Extract the disks list and build the disk target params
|
55
|
+
disk_params = []
|
56
|
+
disks = output.scan(/(\d+): Hard disk image: source image=.+, target path=(.+),/)
|
57
|
+
disks.each do |unit_num, path|
|
58
|
+
path = File.join(base_path, File.basename(path))
|
59
|
+
disk_params << "--vsys"
|
60
|
+
disk_params << "0"
|
61
|
+
disk_params << "--unit"
|
62
|
+
disk_params << unit_num
|
63
|
+
disk_params << "--disk"
|
64
|
+
if Vagrant::Util::Platform.windows?
|
65
|
+
# we use the block form of sub here to ensure that if the specified_name happens to end with a number (which is fairly likely) then
|
66
|
+
# we won't end up having the character sequence of a \ followed by a number be interpreted as a back reference. For example, if
|
67
|
+
# specified_name were "abc123", then "\\abc123\\".reverse would be "\\321cba\\", and the \3 would be treated as a back reference by the sub
|
68
|
+
disk_params << path.reverse.sub("\\#{suggested_name}\\".reverse) { "\\#{specified_name}\\".reverse }.reverse # Replace only last occurrence
|
69
|
+
else
|
70
|
+
disk_params << path.reverse.sub("/#{suggested_name}/".reverse, "/#{specified_name}/".reverse).reverse # Replace only last occurrence
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
execute("import", ovf , *name_params, *disk_params, retryable: true) do |type, data|
|
75
|
+
if type == :stdout
|
76
|
+
# Keep track of the stdout so that we can get the VM name
|
77
|
+
output << data
|
78
|
+
elsif type == :stderr
|
79
|
+
# Append the data so we can see the full view
|
80
|
+
total << data.gsub("\r", "")
|
81
|
+
|
82
|
+
# Break up the lines. We can't get the progress until we see an "OK"
|
83
|
+
lines = total.split("\n")
|
84
|
+
if lines.include?("OK.")
|
85
|
+
# The progress of the import will be in the last line. Do a greedy
|
86
|
+
# regular expression to find what we're looking for.
|
87
|
+
match = /.+(\d{2})%/.match(lines.last)
|
88
|
+
if match
|
89
|
+
current = match[1].to_i
|
90
|
+
if current > last
|
91
|
+
last = current
|
92
|
+
yield current if block_given?
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
return get_machine_id specified_name
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -58,6 +58,7 @@ module VagrantPlugins
|
|
58
58
|
autoload :Version_5_0, File.expand_path("../driver/version_5_0", __FILE__)
|
59
59
|
autoload :Version_5_1, File.expand_path("../driver/version_5_1", __FILE__)
|
60
60
|
autoload :Version_5_2, File.expand_path("../driver/version_5_2", __FILE__)
|
61
|
+
autoload :Version_6_0, File.expand_path("../driver/version_6_0", __FILE__)
|
61
62
|
end
|
62
63
|
|
63
64
|
module Model
|
@@ -124,7 +124,8 @@ module VagrantPlugins
|
|
124
124
|
name: os_friendly_id(id),
|
125
125
|
hostpath: hostpath.to_s,
|
126
126
|
transient: transient,
|
127
|
-
SharedFoldersEnableSymlinksCreate: enable_symlink_create
|
127
|
+
SharedFoldersEnableSymlinksCreate: enable_symlink_create,
|
128
|
+
automount: !!data[:automount]
|
128
129
|
}
|
129
130
|
end
|
130
131
|
end
|