vagrant-unbundled 2.2.0.0 → 2.2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -4
  3. data/CHANGELOG.md +49 -0
  4. data/lib/vagrant/action/builtin/box_check_outdated.rb +1 -0
  5. data/lib/vagrant/action/builtin/config_validate.rb +1 -1
  6. data/lib/vagrant/box.rb +27 -0
  7. data/lib/vagrant/bundler.rb +7 -2
  8. data/lib/vagrant/cli.rb +4 -0
  9. data/lib/vagrant/config/v2/root.rb +6 -2
  10. data/lib/vagrant/plugin/v2/communicator.rb +7 -0
  11. data/lib/vagrant/plugin/v2/trigger.rb +5 -1
  12. data/lib/vagrant/util/network_ip.rb +1 -26
  13. data/lib/vagrant/util/platform.rb +19 -7
  14. data/lib/vagrant/util/powershell.rb +23 -25
  15. data/lib/vagrant/util/ssh.rb +18 -5
  16. data/lib/vagrant/vagrantfile.rb +13 -2
  17. data/plugins/commands/login/plugin.rb +0 -1
  18. data/plugins/commands/validate/command.rb +17 -2
  19. data/plugins/communicators/ssh/communicator.rb +22 -12
  20. data/plugins/communicators/winrm/communicator.rb +5 -1
  21. data/plugins/communicators/winrm/shell.rb +25 -1
  22. data/plugins/guests/debian/cap/change_host_name.rb +66 -10
  23. data/plugins/guests/windows/cap/change_host_name.rb +4 -12
  24. data/plugins/guests/windows/cap/reboot.rb +36 -6
  25. data/plugins/guests/windows/plugin.rb +5 -0
  26. data/plugins/kernel_v2/config/vm.rb +8 -4
  27. data/plugins/providers/docker/action/host_machine_sync_folders.rb +2 -3
  28. data/plugins/providers/hyperv/provider.rb +15 -3
  29. data/plugins/providers/hyperv/scripts/delete_vm.ps1 +3 -0
  30. data/plugins/providers/hyperv/scripts/get_network_config.ps1 +1 -1
  31. data/plugins/providers/hyperv/scripts/set_network_vlan.ps1 +0 -6
  32. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +1 -1
  33. data/plugins/providers/virtualbox/action.rb +2 -0
  34. data/plugins/providers/virtualbox/action/network.rb +33 -42
  35. data/plugins/providers/virtualbox/action/set_default_nic_type.rb +69 -0
  36. data/plugins/providers/virtualbox/config.rb +10 -0
  37. data/plugins/providers/virtualbox/driver/meta.rb +1 -0
  38. data/plugins/providers/virtualbox/driver/version_5_0.rb +17 -6
  39. data/plugins/providers/virtualbox/driver/version_5_2.rb +2 -2
  40. data/plugins/providers/virtualbox/driver/version_6_0.rb +105 -0
  41. data/plugins/providers/virtualbox/plugin.rb +1 -0
  42. data/plugins/providers/virtualbox/synced_folder.rb +2 -1
  43. data/plugins/provisioners/docker/cap/linux/docker_configure_vagrant_user.rb +1 -0
  44. data/plugins/provisioners/shell/config.rb +4 -1
  45. data/plugins/provisioners/shell/provisioner.rb +6 -0
  46. data/plugins/synced_folders/smb/synced_folder.rb +18 -5
  47. data/templates/locales/en.yml +19 -3
  48. data/vagrant.gemspec +3 -1
  49. data/version.txt +1 -1
  50. metadata +407 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eca7fc517602ce921c69b2a141cc57079df7b2a0834dc306e5820ea2bb107bee
4
- data.tar.gz: 41808cc7d78dfbb081da51f3eb544c797b672e3eecefb124c6e3c2d913281593
3
+ metadata.gz: '092370f794df41aa0635fd8a28ca6cfb3b3bda4b23b073bbab6387cf3e5bff1b'
4
+ data.tar.gz: de1fccf9d6d443c4338db2870508c36fe0dd0807069be31898124fee88c7a5a4
5
5
  SHA512:
6
- metadata.gz: 4c9588b9b89bb650b8973ab683c8b0ed011cde2b0078476dab14b9acfc121c7b409ce5dc4557330539177895bd04b0a237c9f348a80070e583a6453cd6f1621a
7
- data.tar.gz: bf0449d3b45d3edbbe91dcbf70272cb830d65a7e35b200f5b461eebcced575e3438e2f73620bcdf4fd7ccc75b9b3ecfce928da6382b95c5ac3e584ea1fe87f04
6
+ metadata.gz: 6d45f2df2f9252d0de117c8f019ca22a418fdd58c1f5f8f9e6996f4e6e1b0e69a00be132324a80f4edc8babe724b7a5f5ff282eee71f8e05c5903e785bf56f56
7
+ data.tar.gz: adec6283e9e94b6585ba7ba4e19b203806503fed7cdd6562be94caa86ff89a08797b8e94b5e744e4eab3580b692831071460c7b145f853536bc2f2c054c0ddac
@@ -10,10 +10,9 @@ addons:
10
10
  - bsdtar
11
11
 
12
12
  rvm:
13
- - 2.3.7
14
- - 2.4.4
15
- - 2.5.0
16
- - 2.5.1
13
+ - 2.3.8
14
+ - 2.4.5
15
+ - 2.5.3
17
16
 
18
17
  branches:
19
18
  only:
@@ -1,3 +1,52 @@
1
+ ## 2.2.2 (November 27, 2018)
2
+
3
+ BUG FIXES:
4
+
5
+ - providers/virtualbox: Update default_nic_type implementation and add warning [GH-10450]
6
+
7
+ ## 2.2.1 (November 15, 2018)
8
+
9
+ FEATURES:
10
+
11
+ - core/plugins: Add reset! method to communicator [GH-10399]
12
+ - providers/virtualbox: Add support for VirtualBox 6.0 [GH-10379]
13
+
14
+ IMPROVEMENTS:
15
+
16
+ - command/validate: Allow validation of config while ignoring provider [GH-10351]
17
+ - communicators/ssh: Prevent overly verbose output waiting for connection [GH-10321]
18
+ - communicators/ssh: Support ed25519 keys [GH-10365]
19
+ - communicators/ssh: Add reset! implementation [GH-10399]
20
+ - communicators/winrm: Add reset! implementation [GH-10399]
21
+ - core: Limit number of automatic box update checks [GH-10359]
22
+ - host/windows: Remove PATH check in WSL detection [GH-10313]
23
+ - providers/hyperv: Disable automatic checkpoints before deletion [GH-10406]
24
+ - providers/virtualbox: Add `automount` flag if specified with synced_folder [GH-10326]
25
+ - providers/virtualbox: Refactor host only network settings [GH-7699]
26
+ - providers/virtualbox: Support setting default NIC type for network adapters [GH-10383]
27
+ - providers/virtualbox: Update ssh_port helper to handle multiple matches [GH-10409]
28
+ - provisioners/shell: Add :reset option to allow communicator reset [GH-10399]
29
+ - synced_folders/smb: Allow for 'default' smb_username in prompt if set [GH-10319]
30
+ - util/network_ip: Simplify `network_address` helper [GH-7693]
31
+ - util/platform: Prevent hard failure during hyper-v enabled check [GH-10332]
32
+
33
+ BUG FIXES:
34
+
35
+ - command/login: Only show deprecation warning when command is invoked [GH-10374]
36
+ - core: Fallback to Vagrantfile defined box information [GH-10368]
37
+ - core/bundler: Update source ordering to properly resolve with new RubyGems [GH-10364]
38
+ - core/triggers: Only split inline script if host is non-Windows [GH-10405]
39
+ - communicator/winrm: Prepend computer name to username when running elevated commands [GH-10387]
40
+ - guest/debian: Fix halting issue when setting hostname by restarting networking on guest [GH-10301, GH-10330]
41
+ - guest/linux: Fix vagrant user access to docker after install [GH-10399]
42
+ - guest/windows: Add reboot capability to fix hostname race condition [GH-10347]
43
+ - guest/windows: Allow for reading key paths with spaces [GH-10389]
44
+ - host/windows: Fix powershell to properly handle paths with spaces [GH-10390]
45
+ - providers/docker: Deterministic host VM synced folder location for Docker VM [GH-10311]
46
+ - providers/hyperv: Fix network vlan configuration script [GH-10366]
47
+ - providers/hyperv: Properly output error message on failed guest import [GH-10404]
48
+ - providers/hyperv: Fix typo in network configuration detection script [GH-10410]
49
+
1
50
  ## 2.2.0 (October 16, 2018)
2
51
 
3
52
  FEATURES:
@@ -40,6 +40,7 @@ module Vagrant
40
40
  # Have download options specified in the environment override
41
41
  # options specified for the machine.
42
42
  download_options = {
43
+ automatic_check: true,
43
44
  ca_cert: env[:ca_cert] || machine.config.vm.box_download_ca_cert,
44
45
  ca_path: env[:ca_path] || machine.config.vm.box_download_ca_path,
45
46
  client_cert: env[:client_cert] ||
@@ -12,7 +12,7 @@ module Vagrant
12
12
 
13
13
  def call(env)
14
14
  if !env.key?(:config_validate) || env[:config_validate]
15
- errors = env[:machine].config.validate(env[:machine])
15
+ errors = env[:machine].config.validate(env[:machine], env[:ignore_provider])
16
16
 
17
17
  if errors && !errors.empty?
18
18
  raise Errors::ConfigInvalid,
@@ -16,6 +16,9 @@ module Vagrant
16
16
  class Box
17
17
  include Comparable
18
18
 
19
+ # Number of seconds to wait between checks for box updates
20
+ BOX_UPDATE_CHECK_INTERVAL = 3600
21
+
19
22
  # The box name. This is the logical name used when adding the box.
20
23
  #
21
24
  # @return [String]
@@ -154,6 +157,11 @@ module Vagrant
154
157
  raise Errors::BoxUpdateNoMetadata, name: @name
155
158
  end
156
159
 
160
+ if download_options.delete(:automatic_check) && !automatic_update_check_allowed?
161
+ @logger.info("Skipping box update check")
162
+ return
163
+ end
164
+
157
165
  version += ", " if version
158
166
  version ||= ""
159
167
  version += "> #{@version}"
@@ -164,6 +172,25 @@ module Vagrant
164
172
  [md, newer, newer.provider(@provider)]
165
173
  end
166
174
 
175
+ # Check if a box update check is allowed. Uses a file
176
+ # in the box data directory to track when the last auto
177
+ # update check was performed and returns true if the
178
+ # BOX_UPDATE_CHECK_INTERVAL has passed.
179
+ #
180
+ # @return [Boolean]
181
+ def automatic_update_check_allowed?
182
+ check_path = directory.join("box_update_check")
183
+ if check_path.exist?
184
+ last_check_span = Time.now.to_i - check_path.mtime.to_i
185
+ if last_check_span < BOX_UPDATE_CHECK_INTERVAL
186
+ @logger.info("box update check is under the interval threshold")
187
+ return false
188
+ end
189
+ end
190
+ FileUtils.touch(check_path)
191
+ true
192
+ end
193
+
167
194
  # This repackages this box and outputs it to the given path.
168
195
  #
169
196
  # @param [Pathname] path The full path (filename included) of where
@@ -24,8 +24,8 @@ module Vagrant
24
24
 
25
25
  # Default gem repositories
26
26
  DEFAULT_GEM_SOURCES = [
27
- "https://rubygems.org/".freeze,
28
- HASHICORP_GEMSTORE
27
+ HASHICORP_GEMSTORE,
28
+ "https://rubygems.org/".freeze
29
29
  ].freeze
30
30
 
31
31
  def self.instance
@@ -62,7 +62,12 @@ module Vagrant
62
62
 
63
63
  # Add HashiCorp RubyGems source
64
64
  if !Gem.sources.include?(HASHICORP_GEMSTORE)
65
+ current_sources = Gem.sources.sources.dup
66
+ Gem.sources.clear
65
67
  Gem.sources << HASHICORP_GEMSTORE
68
+ current_sources.each do |src|
69
+ Gem.sources << src
70
+ end
66
71
  end
67
72
 
68
73
  # Generate dependencies for all registered plugins
@@ -23,6 +23,10 @@ module Vagrant
23
23
  return 0
24
24
  end
25
25
 
26
+ if @sub_command == "login"
27
+ $stderr.puts "WARNING: This command has been deprecated and aliased to `vagrant cloud auth login`"
28
+ end
29
+
26
30
  # If we reached this far then we must have a subcommand. If not,
27
31
  # then we also just print the help and exit.
28
32
  command_plugin = nil
@@ -60,14 +60,18 @@ module Vagrant
60
60
  #
61
61
  # @param [Environment] env
62
62
  # @return [Hash]
63
- def validate(machine)
63
+ def validate(machine, ignore_provider=nil)
64
64
  # Go through each of the configuration keys and validate
65
65
  errors = {}
66
66
  @keys.each do |_key, instance|
67
67
  if instance.respond_to?(:validate)
68
68
  # Validate this single item, and if we have errors then
69
69
  # we merge them into our total errors list.
70
- result = instance.validate(machine)
70
+ if _key == :vm
71
+ result = instance.validate(machine, ignore_provider)
72
+ else
73
+ result = instance.validate(machine)
74
+ end
71
75
  if result && !result.empty?
72
76
  errors = Util.merge_errors(errors, result)
73
77
  end
@@ -117,6 +117,13 @@ module Vagrant
117
117
  # @see #execute
118
118
  def test(command, opts=nil)
119
119
  end
120
+
121
+ # Reset the communicator. For communicators which establish
122
+ # a persistent connection to the remote machine, this connection
123
+ # should be terminated and re-established. The communicator
124
+ # instance should be in a "fresh" state after calling this method.
125
+ def reset!
126
+ end
120
127
  end
121
128
  end
122
129
  end
@@ -161,7 +161,11 @@ module Vagrant
161
161
  # @param [Provisioners::Shell::Config] config A Shell provisioner config
162
162
  def run(config, on_error, exit_codes)
163
163
  if config.inline
164
- cmd = Shellwords.split(config.inline)
164
+ if Vagrant::Util::Platform.windows?
165
+ cmd = config.inline
166
+ else
167
+ cmd = Shellwords.split(config.inline)
168
+ end
165
169
 
166
170
  @machine.ui.detail(I18n.t("vagrant.trigger.run.inline", command: config.inline))
167
171
  else
@@ -5,34 +5,9 @@ module Vagrant
5
5
  module NetworkIP
6
6
  # Returns the network address of the given IP and subnet.
7
7
  #
8
- # If the IP address is an IPv6 address, subnet should be a prefix
9
- # length such as "64".
10
- #
11
8
  # @return [String]
12
9
  def network_address(ip, subnet)
13
- # If this is an IPv6 address, then just mask it
14
- if subnet.to_s =~ /^\d+$/
15
- ip = IPAddr.new(ip)
16
- return ip.mask(subnet.to_i).to_s
17
- end
18
-
19
- ip = ip_parts(ip)
20
- netmask = ip_parts(subnet)
21
-
22
- # Bitwise-AND each octet to get the network address
23
- # in octets and join each part with a period to get
24
- # the resulting network address.
25
- ip.map { |part| part & netmask.shift }.join(".")
26
- end
27
-
28
- protected
29
-
30
- # Splits an IP into the four octets and returns each as an
31
- # integer in an array.
32
- #
33
- # @return [Array<Integer>]
34
- def ip_parts(ip)
35
- ip.split(".").map { |i| i.to_i }
10
+ IPAddr.new(ip).mask(subnet).to_s
36
11
  end
37
12
  end
38
13
  end
@@ -13,6 +13,14 @@ module Vagrant
13
13
  # This class just contains some platform checking code.
14
14
  class Platform
15
15
  class << self
16
+
17
+ def logger
18
+ if !defined?(@_logger)
19
+ @_logger = Log4r::Logger.new("vagrant::util::platform")
20
+ end
21
+ @_logger
22
+ end
23
+
16
24
  def cygwin?
17
25
  if !defined?(@_cygwin)
18
26
  @_cygwin = ENV["VAGRANT_DETECTED_OS"].to_s.downcase.include?("cygwin") ||
@@ -35,11 +43,10 @@ module Vagrant
35
43
  if !defined?(@_wsl)
36
44
  @_wsl = false
37
45
  SilenceWarnings.silence! do
38
- # Use PATH values to check for `/mnt/c` path indicative of WSL
39
- if ENV.fetch("PATH", "").downcase.include?("/mnt/c")
40
- # Validate WSL via uname output
41
- uname = Subprocess.execute("uname", "-r")
42
- if uname.exit_code == 0 && uname.stdout.downcase.include?("microsoft")
46
+ # Find 'microsoft' in /proc/version indicative of WSL
47
+ if File.file?('/proc/version')
48
+ osversion = File.open('/proc/version', &:gets)
49
+ if osversion.downcase.include?("microsoft")
43
50
  @_wsl = true
44
51
  end
45
52
  end
@@ -134,8 +141,13 @@ module Vagrant
134
141
  @_windows_hyperv_enabled = -> {
135
142
  ["Get-WindowsOptionalFeature", "Get-WindowsFeature"].each do |cmd_name|
136
143
  ps_cmd = "$(#{cmd_name} -FeatureName Microsoft-Hyper-V-Hypervisor).State"
137
- output = Vagrant::Util::PowerShell.execute_cmd(ps_cmd)
138
- return true if output == "Enabled"
144
+ begin
145
+ output = Vagrant::Util::PowerShell.execute_cmd(ps_cmd)
146
+ return true if output == "Enabled"
147
+ rescue Errors::PowerShellInvalidVersion
148
+ logger.warn("Invalid PowerShell version detected during Hyper-V enable check")
149
+ return false
150
+ end
139
151
  end
140
152
  return false
141
153
  }.call
@@ -1,3 +1,4 @@
1
+ require "base64"
1
2
  require "tmpdir"
2
3
  require_relative "subprocess"
3
4
  require_relative "which"
@@ -208,18 +209,26 @@ module Vagrant
208
209
  # @return [Array<String>]
209
210
  def self.powerup_command(path, args, opts)
210
211
  Dir.mktmpdir("vagrant") do |dpath|
211
- all_args = ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", path] + args
212
- arg_list = "@('" + all_args.join("', '") + "')"
212
+ all_args = [path] + args.flatten.map{ |a|
213
+ a.gsub(/^['"](.+)['"]$/, "\\1")
214
+ }
215
+ arg_list = "\"" + all_args.join("\" \"") + "\""
213
216
  stdout = File.join(dpath, "stdout.txt")
214
217
  stderr = File.join(dpath, "stderr.txt")
215
- exitcode = File.join(dpath, "exitcode.txt")
216
218
 
217
- script = "$sp = Start-Process -FilePath powershell -ArgumentList #{arg_list} " \
218
- "-PassThru -Wait -RedirectStandardOutput '#{stdout}' -RedirectStandardError '#{stderr}' -WindowStyle Hidden; " \
219
- "if($sp){ Set-Content -Path '#{exitcode}' -Value $sp.ExitCode;exit $sp.ExitCode; }else{ exit 1 }"
219
+ script = "& #{arg_list} ; exit $LASTEXITCODE;"
220
+ script_content = Base64.urlsafe_encode64(script.encode("UTF-16LE", "UTF-8"))
220
221
 
221
- # escape quotes so we can nest our script within a start-process
222
- script.gsub!("'", "''")
222
+ # Wrap so we can redirect output to read later
223
+ wrapper = "$p = Start-Process -FilePath powershell -ArgumentList @('-NoLogo', '-NoProfile', " \
224
+ "'-NonInteractive', '-ExecutionPolicy', 'Bypass', '-EncodedCommand', '#{script_content}') " \
225
+ "-PassThru -WindowStyle Hidden -Wait -RedirectStandardOutput '#{stdout}' -RedirectStandardError '#{stderr}'; " \
226
+ "if($p){ exit $p.ExitCode; }else{ exit 1 }"
227
+ wrapper_content = Base64.urlsafe_encode64(wrapper.encode("UTF-16LE", "UTF-8"))
228
+
229
+ powerup = "$p = Start-Process -FilePath powershell -ArgumentList @('-NoLogo', '-NoProfile', " \
230
+ "'-NonInteractive', '-ExecutionPolicy', 'Bypass', '-EncodedCommand', '#{wrapper_content}') " \
231
+ "-PassThru -WindowStyle Hidden -Wait -Verb RunAs; if($p){ exit $p.ExitCode; }else{ exit 1 }"
223
232
 
224
233
  cmd = [
225
234
  "powershell",
@@ -227,31 +236,20 @@ module Vagrant
227
236
  "-NoProfile",
228
237
  "-NonInteractive",
229
238
  "-ExecutionPolicy", "Bypass",
230
- "-Command", "$p = Start-Process -FilePath powershell -ArgumentList " \
231
- "@('-NoLogo', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-Command', '#{script}') " \
232
- "-PassThru -Wait -WindowStyle Hidden -Verb RunAs; if($p){ exit $p.ExitCode; }else{ exit 1 }"
239
+ "-Command", powerup
233
240
  ]
234
241
 
235
242
  result = Subprocess.execute(*cmd.push(opts))
243
+ r_stdout = result.stdout
236
244
  if File.exist?(stdout)
237
- r_stdout = File.read(stdout)
238
- else
239
- r_stdout = result.stdout
245
+ r_stdout += File.read(stdout)
240
246
  end
247
+ r_stderr = result.stderr
241
248
  if File.exist?(stderr)
242
- r_stderr = File.read(stderr)
243
- else
244
- r_stderr = result.stderr
249
+ r_stderr += File.read(stderr)
245
250
  end
246
251
 
247
- code = 1
248
- if File.exist?(exitcode)
249
- code_txt = File.read(exitcode).strip
250
- if code_txt.match(/^\d+$/)
251
- code = code_txt.to_i
252
- end
253
- end
254
- Subprocess::Result.new(code, r_stdout, r_stderr)
252
+ Subprocess::Result.new(result.exit_code, r_stdout, r_stderr)
255
253
  end
256
254
  end
257
255
 
@@ -150,11 +150,24 @@ module Vagrant
150
150
  if !plain_mode && options[:private_key_path]
151
151
  options[:private_key_path].each do |path|
152
152
 
153
- # Use '-o' instead of '-i' because '-i' does not call
154
- # percent_expand in misc.c, but '-o' does. when passing the path,
155
- # replace '%' in the path with '%%' to escape the '%'
156
- path = path.to_s.gsub('%', '%%')
157
- command_options += ["-o", "IdentityFile=\"#{path}\""]
153
+ private_key_arr = []
154
+
155
+ if path.include?('%')
156
+ if path.include?(' ') && Platform.windows?
157
+ LOGGER.warn("Paths with spaces and % on windows is not supported and will fail to read the file")
158
+ end
159
+ # Use '-o' instead of '-i' because '-i' does not call
160
+ # percent_expand in misc.c, but '-o' does. when passing the path,
161
+ # replace '%' in the path with '%%' to escape the '%'
162
+ path = path.to_s.gsub('%', '%%')
163
+ private_key_arr = ["-o", "IdentityFile=\"#{path}\""]
164
+ else
165
+ # Pass private key file directly with '-i', which properly supports
166
+ # paths with spaces on Windows guests
167
+ private_key_arr = ["-i", path]
168
+ end
169
+
170
+ command_options += private_key_arr
158
171
  end
159
172
  end
160
173
 
@@ -170,8 +170,8 @@ module Vagrant
170
170
 
171
171
  # Track the original box so we know if we changed
172
172
  box = nil
173
- original_box = config.vm.box
174
- original_version = config.vm.box_version
173
+ initial_box = original_box = config.vm.box
174
+ initial_version = original_version = config.vm.box_version
175
175
 
176
176
  # Check if this machine has a local box metadata file
177
177
  # describing the existing guest. If so, load it and
@@ -232,6 +232,17 @@ module Vagrant
232
232
  # Load the box and provider overrides
233
233
  load_box_proc.call
234
234
 
235
+ # NOTE: In cases where the box_meta file contains stale information
236
+ # and the reference box no longer exists, fall back to initial
237
+ # configuration and attempt to load that
238
+ if box.nil?
239
+ @logger.warn("Failed to locate #{config.vm.box} with version #{config.vm.box_version}")
240
+ @logger.warn("Performing lookup with inital values #{initial_box} with version #{initial_version}")
241
+ config.vm.box = original_box = initial_box
242
+ config.vm.box_version = original_box = initial_version
243
+ load_box_proc.call
244
+ end
245
+
235
246
  # Ensure box attributes are set to original values in
236
247
  # case they were modified by the local box metadata
237
248
  config.vm.box = original_box