vagrant-unbundled 2.3.2.0 → 2.3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +12 -12
- data/LICENSE +1 -3
- data/lib/vagrant/errors.rb +4 -0
- data/lib/vagrant/util/install_cli_autocomplete.rb +3 -3
- data/lib/vagrant.rb +0 -3
- data/pkg/vagrant-unbundled-2.3.2.0.gem +0 -0
- data/plugins/commands/serve/command.rb +1 -1
- data/plugins/guests/solaris/cap/remove_public_key.rb +2 -2
- data/plugins/hosts/gentoo/host.rb +1 -1
- data/plugins/hosts/slackware/host.rb +1 -1
- data/plugins/providers/virtualbox/action/network.rb +8 -5
- data/plugins/providers/virtualbox/driver/base.rb +3 -1
- data/plugins/providers/virtualbox/driver/version_5_0.rb +40 -36
- data/plugins/providers/virtualbox/driver/version_7_0.rb +223 -5
- data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +1 -1
- data/plugins/provisioners/ansible/provisioner/host.rb +1 -1
- data/plugins/provisioners/chef/config/chef_zero.rb +1 -1
- data/plugins/synced_folders/rsync/helper.rb +1 -0
- data/templates/locales/en.yml +4 -0
- data/thirdparty/proto/api-common-protos/.bazelrc +2 -0
- data/thirdparty/proto/api-common-protos/.git +1 -0
- data/thirdparty/proto/api-common-protos/.gitignore +11 -0
- data/thirdparty/proto/api-common-protos/BUILD.bazel +129 -0
- data/thirdparty/proto/api-common-protos/CODE_OF_CONDUCT.md +43 -0
- data/thirdparty/proto/api-common-protos/CONTRIBUTING.md +42 -0
- data/thirdparty/proto/api-common-protos/Dockerfile +18 -0
- data/thirdparty/proto/api-common-protos/LICENSE +201 -0
- data/thirdparty/proto/api-common-protos/README.md +113 -0
- data/thirdparty/proto/api-common-protos/SECURITY.md +7 -0
- data/thirdparty/proto/api-common-protos/WORKSPACE +154 -0
- data/thirdparty/proto/api-common-protos/google/api/BUILD.bazel +246 -0
- data/thirdparty/proto/api-common-protos/google/api/README.md +46 -0
- data/thirdparty/proto/api-common-protos/google/api/annotations.proto +31 -0
- data/thirdparty/proto/api-common-protos/google/api/auth.proto +181 -0
- data/thirdparty/proto/api-common-protos/google/api/backend.proto +51 -0
- data/thirdparty/proto/api-common-protos/google/api/billing.proto +67 -0
- data/thirdparty/proto/api-common-protos/google/api/client.proto +99 -0
- data/thirdparty/proto/api-common-protos/google/api/config_change.proto +85 -0
- data/thirdparty/proto/api-common-protos/google/api/consumer.proto +83 -0
- data/thirdparty/proto/api-common-protos/google/api/context.proto +63 -0
- data/thirdparty/proto/api-common-protos/google/api/control.proto +33 -0
- data/thirdparty/proto/api-common-protos/google/api/distribution.proto +213 -0
- data/thirdparty/proto/api-common-protos/google/api/documentation.proto +157 -0
- data/thirdparty/proto/api-common-protos/google/api/endpoint.proto +71 -0
- data/thirdparty/proto/api-common-protos/google/api/field_behavior.proto +84 -0
- data/thirdparty/proto/api-common-protos/google/api/http.proto +318 -0
- data/thirdparty/proto/api-common-protos/google/api/httpbody.proto +76 -0
- data/thirdparty/proto/api-common-protos/google/api/label.proto +49 -0
- data/thirdparty/proto/api-common-protos/google/api/launch_stage.proto +67 -0
- data/thirdparty/proto/api-common-protos/google/api/log.proto +55 -0
- data/thirdparty/proto/api-common-protos/google/api/logging.proto +83 -0
- data/thirdparty/proto/api-common-protos/google/api/metric.proto +192 -0
- data/thirdparty/proto/api-common-protos/google/api/monitored_resource.proto +116 -0
- data/thirdparty/proto/api-common-protos/google/api/monitoring.proto +89 -0
- data/thirdparty/proto/api-common-protos/google/api/quota.proto +259 -0
- data/thirdparty/proto/api-common-protos/google/api/resource.proto +299 -0
- data/thirdparty/proto/api-common-protos/google/api/routing.proto +461 -0
- data/thirdparty/proto/api-common-protos/google/api/service.proto +175 -0
- data/thirdparty/proto/api-common-protos/google/api/source_info.proto +32 -0
- data/thirdparty/proto/api-common-protos/google/api/system_parameter.proto +96 -0
- data/thirdparty/proto/api-common-protos/google/api/usage.proto +92 -0
- data/thirdparty/proto/api-common-protos/google/cloud/extended_operations.proto +150 -0
- data/thirdparty/proto/api-common-protos/google/iam/README.md +14 -0
- data/thirdparty/proto/api-common-protos/google/iam/admin/v1/iam.proto +1087 -0
- data/thirdparty/proto/api-common-protos/google/iam/v1/iam_policy.proto +145 -0
- data/thirdparty/proto/api-common-protos/google/iam/v1/logging/audit_data.proto +34 -0
- data/thirdparty/proto/api-common-protos/google/iam/v1/options.proto +41 -0
- data/thirdparty/proto/api-common-protos/google/iam/v1/policy.proto +240 -0
- data/thirdparty/proto/api-common-protos/google/logging/type/README.md +12 -0
- data/thirdparty/proto/api-common-protos/google/logging/type/http_request.proto +92 -0
- data/thirdparty/proto/api-common-protos/google/logging/type/log_severity.proto +72 -0
- data/thirdparty/proto/api-common-protos/google/longrunning/README.md +31 -0
- data/thirdparty/proto/api-common-protos/google/longrunning/operations.proto +247 -0
- data/thirdparty/proto/api-common-protos/google/rpc/README.md +18 -0
- data/thirdparty/proto/api-common-protos/google/rpc/code.proto +186 -0
- data/thirdparty/proto/api-common-protos/google/rpc/context/attribute_context.proto +287 -0
- data/thirdparty/proto/api-common-protos/google/rpc/error_details.proto +246 -0
- data/thirdparty/proto/api-common-protos/google/rpc/status.proto +47 -0
- data/thirdparty/proto/api-common-protos/google/type/README.md +7 -0
- data/thirdparty/proto/api-common-protos/google/type/calendar_period.proto +57 -0
- data/thirdparty/proto/api-common-protos/google/type/color.proto +170 -0
- data/thirdparty/proto/api-common-protos/google/type/date.proto +50 -0
- data/thirdparty/proto/api-common-protos/google/type/datetime.proto +97 -0
- data/thirdparty/proto/api-common-protos/google/type/dayofweek.proto +51 -0
- data/thirdparty/proto/api-common-protos/google/type/expr.proto +51 -0
- data/thirdparty/proto/api-common-protos/google/type/fraction.proto +34 -0
- data/thirdparty/proto/api-common-protos/google/type/latlng.proto +37 -0
- data/thirdparty/proto/api-common-protos/google/type/money.proto +43 -0
- data/thirdparty/proto/api-common-protos/google/type/month.proto +66 -0
- data/thirdparty/proto/api-common-protos/google/type/postal_address.proto +135 -0
- data/thirdparty/proto/api-common-protos/google/type/quaternion.proto +95 -0
- data/thirdparty/proto/api-common-protos/google/type/timeofday.proto +44 -0
- data/thirdparty/proto/api-common-protos/renovate.json +5 -0
- data/thirdparty/proto/api-common-protos/repository_rules.bzl +222 -0
- data/vagrant.gemspec +4 -4
- data/version.txt +1 -1
- metadata +89 -20
- data/lib/vagrant/patches/net-ssh.rb +0 -286
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d80f12bb6896767fb93de74dca7ff025aeb935c32bf6a2ab202b30582329ea1
|
4
|
+
data.tar.gz: ff5d56384a90926d3393a85400f3b34579f1e901b348318ae71b0219b8a29049
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c84b9f9edc34fcecd13ca1b740903d1074242e0797cef80d849055959ea95da61b77eb07fe86ba5e53cf3db23aeddec02d91459972101fc2bd18efa026a690e6
|
7
|
+
data.tar.gz: 3cf8aebc8ff49c47dc52c47bf4ef329ed7fd3e2109c72aacbc06d751aafbecdb2e10be61f2405015683031bb5a9ca9bbf639d8b0c08809078eb72a9a1f060fcc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## 2.3.3 (November 15, 2022)
|
2
|
+
|
3
|
+
IMPROVEMENTS:
|
4
|
+
|
5
|
+
- core: Bump net-ssh dependency to 7.0 and remove patches [GH-12979]
|
6
|
+
- synced_folders/rsync: Include ssh `extra_args` value [GH-12973]
|
7
|
+
|
8
|
+
BUG FIXES:
|
9
|
+
|
10
|
+
- command/serve: Force root level namespace for Google constant [GH-12989]
|
11
|
+
- guest/solaris: Fix insecure key authorized keys removal [GH-12740]
|
12
|
+
- provider/virtualbox: Fix `:private_network` support for VirtualBox 7 on macOS [GH-12983]
|
13
|
+
- provider/virtualbox: Prevent localization of command output [GH-12994]
|
14
|
+
- provisioner/ansible: Update setup packages in debian capability [GH-12832]
|
15
|
+
|
1
16
|
## 2.3.2 (October 18, 2022)
|
2
17
|
|
3
18
|
FEATURES:
|
data/Gemfile.lock
CHANGED
@@ -12,7 +12,7 @@ GIT
|
|
12
12
|
PATH
|
13
13
|
remote: .
|
14
14
|
specs:
|
15
|
-
vagrant-unbundled (2.3.
|
15
|
+
vagrant-unbundled (2.3.3.0)
|
16
16
|
bcrypt_pbkdf (~> 1.1)
|
17
17
|
childprocess (~> 4.1.0)
|
18
18
|
ed25519 (~> 1.3.0)
|
@@ -26,9 +26,9 @@ PATH
|
|
26
26
|
log4r (~> 1.1.9, < 1.1.11)
|
27
27
|
mime-types (~> 3.3)
|
28
28
|
net-ftp (~> 0.1)
|
29
|
-
net-scp (~>
|
30
|
-
net-sftp (~>
|
31
|
-
net-ssh (
|
29
|
+
net-scp (~> 4.0)
|
30
|
+
net-sftp (~> 4.0)
|
31
|
+
net-ssh (~> 7.0)
|
32
32
|
rb-kqueue (~> 0.2.0)
|
33
33
|
rexml (~> 3.2)
|
34
34
|
rgl (~> 0.5.7)
|
@@ -50,10 +50,10 @@ GEM
|
|
50
50
|
diff-lcs (1.5.0)
|
51
51
|
ed25519 (1.3.0)
|
52
52
|
erubi (1.11.0)
|
53
|
-
excon (0.
|
53
|
+
excon (0.94.0)
|
54
54
|
fake_ftp (0.3.0)
|
55
55
|
ffi (1.15.5)
|
56
|
-
google-protobuf (3.21.
|
56
|
+
google-protobuf (3.21.9)
|
57
57
|
googleapis-common-protos-types (1.4.0)
|
58
58
|
google-protobuf (~> 3.14)
|
59
59
|
grpc (1.50.0)
|
@@ -87,11 +87,11 @@ GEM
|
|
87
87
|
time
|
88
88
|
net-protocol (0.1.3)
|
89
89
|
timeout
|
90
|
-
net-scp (
|
91
|
-
net-ssh (>= 2.6.5, <
|
92
|
-
net-sftp (
|
93
|
-
net-ssh (>= 5.0.0, <
|
94
|
-
net-ssh (
|
90
|
+
net-scp (4.0.0)
|
91
|
+
net-ssh (>= 2.6.5, < 8.0.0)
|
92
|
+
net-sftp (4.0.0)
|
93
|
+
net-ssh (>= 5.0.0, < 8.0.0)
|
94
|
+
net-ssh (7.0.1)
|
95
95
|
nori (2.6.0)
|
96
96
|
pairing_heap (1.0.0)
|
97
97
|
rake (13.0.6)
|
@@ -160,7 +160,7 @@ DEPENDENCIES
|
|
160
160
|
fake_ftp (~> 0.3.0)
|
161
161
|
grpc-tools (~> 1.41)
|
162
162
|
rake (~> 13.0)
|
163
|
-
rspec (~> 3.11
|
163
|
+
rspec (~> 3.11)
|
164
164
|
rspec-its (~> 1.3.0)
|
165
165
|
vagrant-spec!
|
166
166
|
vagrant-unbundled!
|
data/LICENSE
CHANGED
data/lib/vagrant/errors.rb
CHANGED
@@ -1020,6 +1020,10 @@ module Vagrant
|
|
1020
1020
|
error_key(:virtualbox_install_incomplete)
|
1021
1021
|
end
|
1022
1022
|
|
1023
|
+
class VirtualBoxMachineFolderNotFound < VagrantError
|
1024
|
+
error_key(:virtualbox_machine_folder_not_found)
|
1025
|
+
end
|
1026
|
+
|
1023
1027
|
class VirtualBoxNoName < VagrantError
|
1024
1028
|
error_key(:virtualbox_no_name)
|
1025
1029
|
end
|
@@ -3,7 +3,7 @@ module Vagrant
|
|
3
3
|
# Generic installation of content to shell config file
|
4
4
|
class InstallShellConfig
|
5
5
|
|
6
|
-
|
6
|
+
PREPEND_STRING = "# >>>> Vagrant command completion (start)".freeze
|
7
7
|
APPEND_STRING = "# <<<< Vagrant command completion (end)".freeze
|
8
8
|
|
9
9
|
attr_accessor :prepend_string
|
@@ -12,7 +12,7 @@ module Vagrant
|
|
12
12
|
attr_accessor :config_paths
|
13
13
|
|
14
14
|
def initialize(string_insert, config_paths)
|
15
|
-
@prepend_string =
|
15
|
+
@prepend_string = PREPEND_STRING
|
16
16
|
@string_insert = string_insert
|
17
17
|
@append_string = APPEND_STRING
|
18
18
|
@config_paths = config_paths
|
@@ -29,7 +29,7 @@ module Vagrant
|
|
29
29
|
@logger.info("Searching for config in home #{home}")
|
30
30
|
@config_paths.each do |path|
|
31
31
|
config_file = File.join(home, path)
|
32
|
-
if File.
|
32
|
+
if File.exist?(config_file)
|
33
33
|
@logger.info("Found config file #{config_file}")
|
34
34
|
return config_file
|
35
35
|
end
|
data/lib/vagrant.rb
CHANGED
Binary file
|
@@ -21,7 +21,7 @@ module VagrantPlugins
|
|
21
21
|
# Simple constant aliases to reduce namespace typing
|
22
22
|
SDK = Hashicorp::Vagrant::Sdk
|
23
23
|
SRV = Hashicorp::Vagrant
|
24
|
-
Empty = Google::Protobuf::Empty
|
24
|
+
Empty = ::Google::Protobuf::Empty
|
25
25
|
|
26
26
|
autoload :Broker, Vagrant.source_root.join("plugins/commands/serve/broker").to_s
|
27
27
|
autoload :Client, Vagrant.source_root.join("plugins/commands/serve/client").to_s
|
@@ -5,14 +5,14 @@ module VagrantPlugins
|
|
5
5
|
module Cap
|
6
6
|
class RemovePublicKey
|
7
7
|
def self.remove_public_key(machine, contents)
|
8
|
-
#
|
8
|
+
# "sed -i" is specific to GNU sed and is not a posix standard option
|
9
9
|
contents = contents.chomp
|
10
10
|
contents = Vagrant::Util::ShellQuote.escape(contents, "'")
|
11
11
|
|
12
12
|
machine.communicate.tap do |comm|
|
13
13
|
if comm.test("test -f ~/.ssh/authorized_keys")
|
14
14
|
comm.execute(
|
15
|
-
"sed
|
15
|
+
"cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys.temp && sed '/^.*#{contents}.*$/d' ~/.ssh/authorized_keys.temp > ~/.ssh/authorized_keys && rm ~/.ssh/authorized_keys.temp")
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -21,6 +21,8 @@ module VagrantPlugins
|
|
21
21
|
VBOX_NET_CONF = "/etc/vbox/networks.conf".freeze
|
22
22
|
# Version of VirtualBox that introduced hostonly network range restrictions
|
23
23
|
HOSTONLY_VALIDATE_VERSION = Gem::Version.new("6.1.28")
|
24
|
+
# Version of VirtualBox on darwin platform that ignores restrictions
|
25
|
+
DARWIN_IGNORE_HOSTONLY_VALIDATE_VERSION = Gem::Version.new("7.0.0")
|
24
26
|
# Default valid range for hostonly networks
|
25
27
|
HOSTONLY_DEFAULT_RANGE = [IPAddr.new("192.168.56.0/21").freeze].freeze
|
26
28
|
|
@@ -479,10 +481,7 @@ module VagrantPlugins
|
|
479
481
|
#-----------------------------------------------------------------
|
480
482
|
# This creates a host only network for the given configuration.
|
481
483
|
def hostonly_create_network(config)
|
482
|
-
@env[:machine].provider.driver.create_host_only_network(
|
483
|
-
adapter_ip: config[:adapter_ip],
|
484
|
-
netmask: config[:netmask]
|
485
|
-
)
|
484
|
+
@env[:machine].provider.driver.create_host_only_network(config)
|
486
485
|
end
|
487
486
|
|
488
487
|
# This finds a matching host only network for the given configuration.
|
@@ -517,7 +516,11 @@ module VagrantPlugins
|
|
517
516
|
# placed on the valid ranges
|
518
517
|
def validate_hostonly_ip!(ip, driver)
|
519
518
|
return if Gem::Version.new(driver.version) < HOSTONLY_VALIDATE_VERSION ||
|
520
|
-
|
519
|
+
(
|
520
|
+
Vagrant::Util::Platform.darwin? &&
|
521
|
+
Gem::Version.new(driver.version) >= DARWIN_IGNORE_HOSTONLY_VALIDATE_VERSION
|
522
|
+
) ||
|
523
|
+
Vagrant::Util::Platform.windows?
|
521
524
|
|
522
525
|
ip = IPAddr.new(ip.to_s) if !ip.is_a?(IPAddr)
|
523
526
|
valid_ranges = load_net_conf
|
@@ -460,7 +460,9 @@ module VagrantPlugins
|
|
460
460
|
end
|
461
461
|
|
462
462
|
# Append in the options for subprocess
|
463
|
-
|
463
|
+
# NOTE: We include the LANG env var set to C to prevent command output
|
464
|
+
# from being localized
|
465
|
+
command << { notify: [:stdout, :stderr], env: {LANG: "C"}}
|
464
466
|
|
465
467
|
Vagrant::Util::Busy.busy(int_callback) do
|
466
468
|
Vagrant::Util::Subprocess.execute(@vboxmanage_path, *command, &block)
|
@@ -104,15 +104,15 @@ module VagrantPlugins
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
107
|
+
# Creates a disk. Default format is VDI unless overridden
|
108
|
+
#
|
109
|
+
# @param [String] disk_file
|
110
|
+
# @param [Integer] disk_size - size in bytes
|
111
|
+
# @param [String] disk_format - format of disk, defaults to "VDI"
|
112
112
|
# @param [Hash] opts - additional options
|
113
|
-
|
114
|
-
|
115
|
-
|
113
|
+
def create_disk(disk_file, disk_size, disk_format="VDI", **opts)
|
114
|
+
execute("createmedium", '--filename', disk_file, '--sizebyte', disk_size.to_i.to_s, '--format', disk_format)
|
115
|
+
end
|
116
116
|
|
117
117
|
|
118
118
|
def create_host_only_network(options)
|
@@ -322,22 +322,22 @@ module VagrantPlugins
|
|
322
322
|
|
323
323
|
if adapter[:bridge]
|
324
324
|
args.concat(["--bridgeadapter#{adapter[:adapter]}",
|
325
|
-
|
325
|
+
adapter[:bridge], "--cableconnected#{adapter[:adapter]}", "on"])
|
326
326
|
end
|
327
327
|
|
328
328
|
if adapter[:hostonly]
|
329
329
|
args.concat(["--hostonlyadapter#{adapter[:adapter]}",
|
330
|
-
|
330
|
+
adapter[:hostonly], "--cableconnected#{adapter[:adapter]}", "on"])
|
331
331
|
end
|
332
332
|
|
333
333
|
if adapter[:intnet]
|
334
334
|
args.concat(["--intnet#{adapter[:adapter]}",
|
335
|
-
|
335
|
+
adapter[:intnet], "--cableconnected#{adapter[:adapter]}", "on"])
|
336
336
|
end
|
337
337
|
|
338
338
|
if adapter[:mac_address]
|
339
339
|
args.concat(["--macaddress#{adapter[:adapter]}",
|
340
|
-
|
340
|
+
adapter[:mac_address]])
|
341
341
|
end
|
342
342
|
|
343
343
|
if adapter[:nic_type]
|
@@ -361,7 +361,7 @@ module VagrantPlugins
|
|
361
361
|
|
362
362
|
# If the file already exists we'll throw a custom error
|
363
363
|
raise Vagrant::Errors::VirtualBoxFileExists,
|
364
|
-
|
364
|
+
stderr: e.extra_data[:stderr]
|
365
365
|
end
|
366
366
|
end
|
367
367
|
end
|
@@ -370,14 +370,14 @@ module VagrantPlugins
|
|
370
370
|
args = []
|
371
371
|
ports.each do |options|
|
372
372
|
pf_builder = [options[:name],
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
373
|
+
options[:protocol] || "tcp",
|
374
|
+
options[:hostip] || "",
|
375
|
+
options[:hostport],
|
376
|
+
options[:guestip] || "",
|
377
|
+
options[:guestport]]
|
378
378
|
|
379
379
|
args.concat(["--natpf#{options[:adapter] || 1}",
|
380
|
-
|
380
|
+
pf_builder.join(",")])
|
381
381
|
end
|
382
382
|
|
383
383
|
execute("modifyvm", @uuid, *args, retryable: true) if !args.empty?
|
@@ -507,11 +507,11 @@ module VagrantPlugins
|
|
507
507
|
# since this comes first.
|
508
508
|
current_nic = $1.to_i if line =~ /^nic(\d+)=".+?"$/
|
509
509
|
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
510
|
+
# If we care about active VMs only, then we check the state
|
511
|
+
# to verify the VM is running.
|
512
|
+
if active_only && line =~ /^VMState="(.+?)"$/ && $1.to_s != "running"
|
513
|
+
return []
|
514
|
+
end
|
515
515
|
|
516
516
|
# Parse out the forwarded port information
|
517
517
|
# Forwarding(1)="172.22.8.201tcp32977,tcp,172.22.8.201,32977,,3777"
|
@@ -600,7 +600,7 @@ module VagrantPlugins
|
|
600
600
|
|
601
601
|
if !valid_ip_address?(ip)
|
602
602
|
raise Vagrant::Errors::VirtualBoxGuestPropertyNotFound,
|
603
|
-
|
603
|
+
guest_property: "/VirtualBox/GuestInfo/Net/#{adapter_number}/V4/IP"
|
604
604
|
end
|
605
605
|
|
606
606
|
return ip
|
@@ -662,13 +662,17 @@ module VagrantPlugins
|
|
662
662
|
end
|
663
663
|
|
664
664
|
def read_machine_folder
|
665
|
-
execute("list", "systemproperties", retryable: true)
|
666
|
-
|
667
|
-
|
668
|
-
|
665
|
+
info = execute("list", "systemproperties", retryable: true)
|
666
|
+
info.each_line do |line|
|
667
|
+
match = line.match(/Default machine folder:\s+(?<folder>.+?)$/i)
|
668
|
+
next if match.nil?
|
669
|
+
return match[:folder]
|
669
670
|
end
|
670
671
|
|
671
|
-
|
672
|
+
@logger.warn("failed to determine machine folder from system properties")
|
673
|
+
@logger.debug("processed output for machine folder lookup:\n#{info}")
|
674
|
+
|
675
|
+
raise Vagrant::Errors::VirtualBoxMachineFolderNotFound
|
672
676
|
end
|
673
677
|
|
674
678
|
def read_network_interfaces
|
@@ -771,7 +775,7 @@ module VagrantPlugins
|
|
771
775
|
# We got VERR_ALREADY_EXISTS. This means that we're renaming to
|
772
776
|
# a VM name that already exists. Raise a custom error.
|
773
777
|
raise Vagrant::Errors::VirtualBoxNameExists,
|
774
|
-
|
778
|
+
stderr: e.extra_data[:stderr]
|
775
779
|
end
|
776
780
|
end
|
777
781
|
end
|
@@ -791,9 +795,9 @@ module VagrantPlugins
|
|
791
795
|
hostpath = Vagrant::Util::Platform.windows_path(folder[:hostpath])
|
792
796
|
end
|
793
797
|
args = ["--name",
|
794
|
-
|
795
|
-
|
796
|
-
|
798
|
+
folder[:name],
|
799
|
+
"--hostpath",
|
800
|
+
hostpath]
|
797
801
|
args << "--transient" if folder.key?(:transient) && folder[:transient]
|
798
802
|
|
799
803
|
args << "--automount" if folder.key?(:automount) && folder[:automount]
|
@@ -866,8 +870,8 @@ module VagrantPlugins
|
|
866
870
|
|
867
871
|
# If we reached this point then it didn't work out.
|
868
872
|
raise Vagrant::Errors::VBoxManageError,
|
869
|
-
|
870
|
-
|
873
|
+
command: command.inspect,
|
874
|
+
stderr: r.stderr
|
871
875
|
end
|
872
876
|
end
|
873
877
|
|
@@ -6,12 +6,214 @@ module VagrantPlugins
|
|
6
6
|
module Driver
|
7
7
|
# Driver for VirtualBox 7.0.x
|
8
8
|
class Version_7_0 < Version_6_1
|
9
|
+
# VirtualBox version requirement for using host only networks
|
10
|
+
# instead of host only interfaces
|
11
|
+
HOSTONLY_NET_REQUIREMENT=Gem::Requirement.new(">= 7")
|
12
|
+
# Prefix of name used for host only networks
|
13
|
+
HOSTONLY_NAME_PREFIX="vagrantnet-vbox"
|
14
|
+
DEFAULT_NETMASK="255.255.255.0"
|
15
|
+
|
9
16
|
def initialize(uuid)
|
10
17
|
super
|
11
18
|
|
12
19
|
@logger = Log4r::Logger.new("vagrant::provider::virtualbox_7_0")
|
13
20
|
end
|
14
21
|
|
22
|
+
def read_bridged_interfaces
|
23
|
+
ifaces = super
|
24
|
+
return ifaces if !use_host_only_nets?
|
25
|
+
|
26
|
+
# Get a list of all subnets which are in use for hostonly networks
|
27
|
+
hostonly_ifaces = read_host_only_networks.map do |net|
|
28
|
+
IPAddr.new(net[:lowerip]).mask(net[:networkmask])
|
29
|
+
end
|
30
|
+
|
31
|
+
# Prune any hostonly interfaces in the list
|
32
|
+
ifaces.delete_if { |i|
|
33
|
+
addr = IPAddr.new(i[:ip]).mask(i[:netmask])
|
34
|
+
hostonly_ifaces.include?(addr)
|
35
|
+
}
|
36
|
+
|
37
|
+
ifaces
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_unused_host_only_networks
|
41
|
+
return super if !use_host_only_nets?
|
42
|
+
|
43
|
+
# First get the list of existing host only network names
|
44
|
+
network_names = read_host_only_networks.map { |net| net[:name] }
|
45
|
+
# Prune the network names to only include ones we manage
|
46
|
+
network_names.delete_if { |name| !name.start_with?(HOSTONLY_NAME_PREFIX) }
|
47
|
+
|
48
|
+
@logger.debug("managed host only network names: #{network_names}")
|
49
|
+
|
50
|
+
return if network_names.empty?
|
51
|
+
|
52
|
+
# Next get the list of host only networks currently in use
|
53
|
+
inuse_names = []
|
54
|
+
execute("list", "vms", retryable: true).split("\n").each do |line|
|
55
|
+
match = line.match(/^".+?"\s+\{(?<vmid>.+?)\}$/)
|
56
|
+
next if match.nil?
|
57
|
+
begin
|
58
|
+
info = execute("showvminfo", match[:vmid].to_s, "--machinereadable", retryable: true)
|
59
|
+
info.split("\n").each do |vmline|
|
60
|
+
if vmline.start_with?("hostonly-network")
|
61
|
+
net_name = vmline.split("=", 2).last.to_s.gsub('"', "")
|
62
|
+
inuse_names << net_name
|
63
|
+
end
|
64
|
+
end
|
65
|
+
rescue Vagrant::Errors::VBoxManageError => err
|
66
|
+
raise if !err.extra_data[:stderr].include?("VBOX_E_OBJECT_NOT_FOUND")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
@logger.debug("currently in use network names: #{inuse_names}")
|
71
|
+
|
72
|
+
# Now remove all the networks not in use
|
73
|
+
(network_names - inuse_names).each do |name|
|
74
|
+
execute("hostonlynet", "remove", "--name", name, retryable: true)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def enable_adapters(adapters)
|
79
|
+
return super if !use_host_only_nets?
|
80
|
+
|
81
|
+
hostonly_adapters = adapters.find_all { |adapter| adapter[:hostonly] }
|
82
|
+
other_adapters = adapters - hostonly_adapters
|
83
|
+
super(other_adapters) if !other_adapters.empty?
|
84
|
+
|
85
|
+
if !hostonly_adapters.empty?
|
86
|
+
args = []
|
87
|
+
hostonly_adapters.each do |adapter|
|
88
|
+
args.concat(["--nic#{adapter[:adapter]}", "hostonlynet"])
|
89
|
+
args.concat(["--host-only-net#{adapter[:adapter]}", adapter[:hostonly],
|
90
|
+
"--cableconnected#{adapter[:adapter]}", "on"])
|
91
|
+
end
|
92
|
+
|
93
|
+
execute("modifyvm", @uuid, *args, retryable: true)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def create_host_only_network(options)
|
98
|
+
# If we are not on macOS, just setup the hostonly interface
|
99
|
+
return super if !use_host_only_nets?
|
100
|
+
|
101
|
+
opts = {
|
102
|
+
netmask: options.fetch(:netmask, DEFAULT_NETMASK),
|
103
|
+
}
|
104
|
+
|
105
|
+
if options[:type] == :dhcp
|
106
|
+
opts[:lower] = options[:dhcp_lower]
|
107
|
+
opts[:upper] = options[:dhcp_upper]
|
108
|
+
else
|
109
|
+
addr = IPAddr.new(options[:adapter_ip])
|
110
|
+
opts[:upper] = opts[:lower] = addr.mask(opts[:netmask]).to_range.first.to_s
|
111
|
+
end
|
112
|
+
|
113
|
+
name_idx = read_host_only_networks.map { |hn|
|
114
|
+
next if !hn[:name].start_with?(HOSTONLY_NAME_PREFIX)
|
115
|
+
hn[:name].sub(HOSTONLY_NAME_PREFIX, "").to_i
|
116
|
+
}.compact.max.to_i + 1
|
117
|
+
opts[:name] = HOSTONLY_NAME_PREFIX + name_idx.to_s
|
118
|
+
|
119
|
+
execute("hostonlynet", "add",
|
120
|
+
"--name", opts[:name],
|
121
|
+
"--netmask", opts[:netmask],
|
122
|
+
"--lower-ip", opts[:lower],
|
123
|
+
"--upper-ip", opts[:upper],
|
124
|
+
retryable: true)
|
125
|
+
|
126
|
+
{
|
127
|
+
name: opts[:name],
|
128
|
+
ip: options[:adapter_ip],
|
129
|
+
netmask: opts[:netmask],
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
# Disabled when host only nets are in use
|
134
|
+
def reconfig_host_only(options)
|
135
|
+
return super if !use_host_only_nets?
|
136
|
+
end
|
137
|
+
|
138
|
+
# Disabled when host only nets are in use since
|
139
|
+
# the host only nets will provide the dhcp server
|
140
|
+
def remove_dhcp_server(*_, **_)
|
141
|
+
super if !use_host_only_nets?
|
142
|
+
end
|
143
|
+
|
144
|
+
# Disabled when host only nets are in use since
|
145
|
+
# the host only nets will provide the dhcp server
|
146
|
+
def create_dhcp_server(*_, **_)
|
147
|
+
super if !use_host_only_nets?
|
148
|
+
end
|
149
|
+
|
150
|
+
def read_host_only_interfaces
|
151
|
+
return super if !use_host_only_nets?
|
152
|
+
|
153
|
+
# When host only nets are in use, read them and
|
154
|
+
# reformat the information to line up with how
|
155
|
+
# the interfaces is structured
|
156
|
+
read_host_only_networks.map do |net|
|
157
|
+
addr = IPAddr.new(net[:lowerip])
|
158
|
+
net[:netmask] = net[:networkmask]
|
159
|
+
if addr.ipv4?
|
160
|
+
net[:ip] = addr.mask(net[:netmask]).succ.to_s
|
161
|
+
net[:ipv6] = ""
|
162
|
+
else
|
163
|
+
net[:ip] = ""
|
164
|
+
net[:ipv6] = addr.mask(net[:netmwask]).succ.to_s
|
165
|
+
net[:ipv6_prefix] = net[:netmask]
|
166
|
+
end
|
167
|
+
|
168
|
+
net[:status] = net[:state] == "Enabled" ? "Up" : "Down"
|
169
|
+
|
170
|
+
net
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def read_network_interfaces
|
175
|
+
return super if !use_host_only_nets?
|
176
|
+
|
177
|
+
{}.tap do |nics|
|
178
|
+
execute("showvminfo", @uuid, "--machinereadable", retryable: true).each_line do |line|
|
179
|
+
if m = line.match(/nic(?<adapter>\d+)="(?<type>.+?)"$/)
|
180
|
+
nics[m[:adapter].to_i] ||= {}
|
181
|
+
if m[:type] == "hostonlynetwork"
|
182
|
+
nics[m[:adapter].to_i][:type] = :hostonly
|
183
|
+
else
|
184
|
+
nics[m[:adapter].to_i][:type] = m[:type].to_sym
|
185
|
+
end
|
186
|
+
elsif m = line.match(/^bridgeadapter(?<adapter>\d+)="(?<network>.+?)"$/)
|
187
|
+
nics[m[:adapter].to_i] ||= {}
|
188
|
+
nics[m[:adapter].to_i][:bridge] = m[:network]
|
189
|
+
elsif m = line.match(/^hostonly-network(?<adapter>\d+)="(?<network>.+?)"$/)
|
190
|
+
nics[m[:adapter].to_i] ||= {}
|
191
|
+
nics[m[:adapter].to_i][:hostonly] = m[:network]
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# Generate list of host only networks
|
198
|
+
def read_host_only_networks
|
199
|
+
networks = []
|
200
|
+
current = nil
|
201
|
+
execute("list", "hostonlynets", retryable: true).split("\n").each do |line|
|
202
|
+
line.chomp!
|
203
|
+
next if line.empty?
|
204
|
+
key, value = line.split(":", 2).map(&:strip)
|
205
|
+
key = key.downcase
|
206
|
+
if key == "name"
|
207
|
+
networks.push(current) if !current.nil?
|
208
|
+
current = Vagrant::Util::HashWithIndifferentAccess.new
|
209
|
+
end
|
210
|
+
current[key] = value
|
211
|
+
end
|
212
|
+
networks.push(current) if !current.nil?
|
213
|
+
|
214
|
+
networks
|
215
|
+
end
|
216
|
+
|
15
217
|
# The initial VirtualBox 7.0 release has an issue with displaying port
|
16
218
|
# forward information. When a single port forward is defined, the forwarding
|
17
219
|
# information can be found in the `showvminfo` output. Once more than a
|
@@ -20,11 +222,8 @@ module VagrantPlugins
|
|
20
222
|
# file from the `showvminfo` output and extract the port forward information
|
21
223
|
# from there instead.
|
22
224
|
def read_forwarded_ports(uuid=nil, active_only=false)
|
23
|
-
|
24
|
-
|
25
|
-
# Only use this override for the 7.0.0 release. If it is still broken
|
26
|
-
# on the 7.0.1 release we can modify the version check.
|
27
|
-
return super if @version != "7.0.0"
|
225
|
+
# Only use this override for the 7.0.0 release.
|
226
|
+
return super if get_version.to_s != "7.0.0"
|
28
227
|
|
29
228
|
uuid ||= @uuid
|
30
229
|
|
@@ -61,6 +260,25 @@ module VagrantPlugins
|
|
61
260
|
|
62
261
|
results
|
63
262
|
end
|
263
|
+
|
264
|
+
private
|
265
|
+
|
266
|
+
# Returns if hostonlynets are enabled on the current
|
267
|
+
# host platform
|
268
|
+
#
|
269
|
+
# @return [Boolean]
|
270
|
+
def use_host_only_nets?
|
271
|
+
Vagrant::Util::Platform.darwin? &&
|
272
|
+
HOSTONLY_NET_REQUIREMENT.satisfied_by?(get_version)
|
273
|
+
end
|
274
|
+
|
275
|
+
# VirtualBox version in use
|
276
|
+
#
|
277
|
+
# @return [Gem::Version]
|
278
|
+
def get_version
|
279
|
+
return @version if @version
|
280
|
+
@version = Gem::Version.new(Meta.new.version)
|
281
|
+
end
|
64
282
|
end
|
65
283
|
end
|
66
284
|
end
|