vagrant 1.0.3 → 1.0.4

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.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 1.0.4 (September 13, 2012)
2
+
3
+ - VirtualBox 4.2 driver. [GH-1120]
4
+ - Correct `ssh-config` help to use `--host`, not `-h`.
5
+ - Use "127.0.0.1" instead of "localhost" for port checking to fix problem
6
+ where "localhost" is not properly setup. [GH-1057]
7
+ - Disable read timeout on Net::HTTP to avoid `rbuf_fill` error. [GH-1072]
8
+ - Retry SSH on `EHOSTUNREACH` errors.
9
+ - Add missing translation for "saving" state. [GH-1110]
10
+
1
11
  ## 1.0.3 (May 1, 2012)
2
12
 
3
13
  - Don't enable NAT DNS proxy on machines where resolv.conf already points
@@ -33,7 +33,7 @@ module Vagrant
33
33
  hostport = options[:hostport].to_i
34
34
  hostport = current[options[:name]] if current.has_key?(options[:name])
35
35
 
36
- if existing.include?(hostport) || is_port_open?("localhost", hostport)
36
+ if existing.include?(hostport) || is_port_open?("127.0.0.1", hostport)
37
37
  # We have a collision! Handle it
38
38
  send("handle_#{handler}".to_sym, options, existing)
39
39
  end
@@ -135,7 +135,7 @@ module Vagrant
135
135
 
136
136
  # Make a first pass to assign interface numbers by adapter location
137
137
  vm_adapters = @env[:vm].driver.read_network_interfaces
138
- vm_adapters.each do |number, adapter|
138
+ vm_adapters.sort.each do |number, adapter|
139
139
  if adapter[:type] != :none
140
140
  # Not used, so assign the interface number and increment
141
141
  adapter_to_interface[number] = current
@@ -11,11 +11,11 @@ module Vagrant
11
11
  options = {}
12
12
 
13
13
  opts = OptionParser.new do |opts|
14
- opts.banner = "Usage: vagrant ssh-config [vm-name] [-h name]"
14
+ opts.banner = "Usage: vagrant ssh-config [vm-name] [--host name]"
15
15
 
16
16
  opts.separator ""
17
17
 
18
- opts.on("--host COMMAND", "Name the host for the config..") do |h|
18
+ opts.on("--host NAME", "Name the host for the config..") do |h|
19
19
  options[:host] = h
20
20
  end
21
21
  end
@@ -131,8 +131,17 @@ module Vagrant
131
131
  # Connect to SSH, giving it a few tries
132
132
  connection = nil
133
133
  begin
134
+ # These are the exceptions that we retry because they represent
135
+ # errors that are generally fixed from a retry and don't
136
+ # necessarily represent immediate failure cases.
137
+ exceptions = [
138
+ Errno::ECONNREFUSED,
139
+ Errno::EHOSTUNREACH,
140
+ Net::SSH::Disconnect,
141
+ Timeout::Error
142
+ ]
143
+
134
144
  @logger.info("Connecting to SSH: #{ssh_info[:host]}:#{ssh_info[:port]}")
135
- exceptions = [Errno::ECONNREFUSED, Net::SSH::Disconnect]
136
145
  connection = retryable(:tries => @vm.config.ssh.max_tries, :on => exceptions) do
137
146
  Net::SSH.start(ssh_info[:host], ssh_info[:username], opts)
138
147
  end
@@ -19,6 +19,7 @@ module Vagrant
19
19
  proxy_uri = resolve_proxy(uri)
20
20
 
21
21
  http = Net::HTTP.new(uri.host, uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
22
+ http.read_timeout = nil # Disable the read timeout, just let it try to download
22
23
 
23
24
  if uri.scheme == "https"
24
25
  http.use_ssl = true
@@ -3,5 +3,6 @@ module Vagrant
3
3
  autoload :VirtualBox, 'vagrant/driver/virtualbox'
4
4
  autoload :VirtualBox_4_0, 'vagrant/driver/virtualbox_4_0'
5
5
  autoload :VirtualBox_4_1, 'vagrant/driver/virtualbox_4_1'
6
+ autoload :VirtualBox_4_2, 'vagrant/driver/virtualbox_4_2'
6
7
  end
7
8
  end
@@ -44,7 +44,8 @@ module Vagrant
44
44
  @logger.debug("Finding driver for VirtualBox version: #{@version}")
45
45
  driver_map = {
46
46
  "4.0" => VirtualBox_4_0,
47
- "4.1" => VirtualBox_4_1
47
+ "4.1" => VirtualBox_4_1,
48
+ "4.2" => VirtualBox_4_2
48
49
  }
49
50
 
50
51
  driver_klass = nil
@@ -0,0 +1,459 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/driver/virtualbox_base'
4
+
5
+ module Vagrant
6
+ module Driver
7
+ # Driver for VirtualBox 4.2.x
8
+ class VirtualBox_4_2 < VirtualBoxBase
9
+ def initialize(uuid)
10
+ super()
11
+
12
+ @logger = Log4r::Logger.new("vagrant::driver::virtualbox_4_2")
13
+ @uuid = uuid
14
+ end
15
+
16
+ def clear_forwarded_ports
17
+ args = []
18
+ read_forwarded_ports(@uuid).each do |nic, name, _, _|
19
+ args.concat(["--natpf#{nic}", "delete", name])
20
+ end
21
+
22
+ execute("modifyvm", @uuid, *args) if !args.empty?
23
+ end
24
+
25
+ def clear_shared_folders
26
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
27
+ info.split("\n").each do |line|
28
+ if line =~ /^SharedFolderNameMachineMapping\d+="(.+?)"$/
29
+ execute("sharedfolder", "remove", @uuid, "--name", $1.to_s)
30
+ end
31
+ end
32
+ end
33
+
34
+ def create_dhcp_server(network, options)
35
+ execute("dhcpserver", "add", "--ifname", network,
36
+ "--ip", options[:dhcp_ip],
37
+ "--netmask", options[:netmask],
38
+ "--lowerip", options[:dhcp_lower],
39
+ "--upperip", options[:dhcp_upper],
40
+ "--enable")
41
+ end
42
+
43
+ def create_host_only_network(options)
44
+ # Create the interface
45
+ execute("hostonlyif", "create") =~ /^Interface '(.+?)' was successfully created$/
46
+ name = $1.to_s
47
+
48
+ # Configure it
49
+ execute("hostonlyif", "ipconfig", name,
50
+ "--ip", options[:adapter_ip],
51
+ "--netmask", options[:netmask])
52
+
53
+ # Return the details
54
+ return {
55
+ :name => name,
56
+ :ip => options[:adapter_ip],
57
+ :netmask => options[:netmask],
58
+ :dhcp => nil
59
+ }
60
+ end
61
+
62
+ def delete
63
+ execute("unregistervm", @uuid, "--delete")
64
+ end
65
+
66
+ def delete_unused_host_only_networks
67
+ networks = []
68
+ execute("list", "hostonlyifs").split("\n").each do |line|
69
+ networks << $1.to_s if line =~ /^Name:\s+(.+?)$/
70
+ end
71
+
72
+ execute("list", "vms").split("\n").each do |line|
73
+ if line =~ /^".+?"\s+\{(.+?)\}$/
74
+ info = execute("showvminfo", $1.to_s, "--machinereadable", :retryable => true)
75
+ info.split("\n").each do |line|
76
+ if line =~ /^hostonlyadapter\d+="(.+?)"$/
77
+ networks.delete($1.to_s)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ networks.each do |name|
84
+ # First try to remove any DHCP servers attached. We use `raw` because
85
+ # it is okay if this fails. It usually means that a DHCP server was
86
+ # never attached.
87
+ raw("dhcpserver", "remove", "--ifname", name)
88
+
89
+ # Delete the actual host only network interface.
90
+ execute("hostonlyif", "remove", name)
91
+ end
92
+ end
93
+
94
+ def discard_saved_state
95
+ execute("discardstate", @uuid)
96
+ end
97
+
98
+ def enable_adapters(adapters)
99
+ args = []
100
+ adapters.each do |adapter|
101
+ args.concat(["--nic#{adapter[:adapter]}", adapter[:type].to_s])
102
+
103
+ if adapter[:bridge]
104
+ args.concat(["--bridgeadapter#{adapter[:adapter]}",
105
+ adapter[:bridge]])
106
+ end
107
+
108
+ if adapter[:hostonly]
109
+ args.concat(["--hostonlyadapter#{adapter[:adapter]}",
110
+ adapter[:hostonly]])
111
+ end
112
+
113
+ if adapter[:mac_address]
114
+ args.concat(["--macaddress#{adapter[:adapter]}",
115
+ adapter[:mac_address]])
116
+ end
117
+
118
+ if adapter[:nic_type]
119
+ args.concat(["--nictype#{adapter[:adapter]}", adapter[:nic_type].to_s])
120
+ end
121
+ end
122
+
123
+ execute("modifyvm", @uuid, *args)
124
+ end
125
+
126
+ def execute_command(command)
127
+ raw(*command)
128
+ end
129
+
130
+ def export(path)
131
+ # TODO: Progress
132
+ execute("export", @uuid, "--output", path.to_s)
133
+ end
134
+
135
+ def forward_ports(ports)
136
+ args = []
137
+ ports.each do |options|
138
+ pf_builder = [options[:name],
139
+ options[:protocol] || "tcp",
140
+ "",
141
+ options[:hostport],
142
+ "",
143
+ options[:guestport]]
144
+
145
+ args.concat(["--natpf#{options[:adapter] || 1}",
146
+ pf_builder.join(",")])
147
+ end
148
+
149
+ execute("modifyvm", @uuid, *args) if !args.empty?
150
+ end
151
+
152
+ def halt
153
+ execute("controlvm", @uuid, "poweroff")
154
+ end
155
+
156
+ def import(ovf)
157
+ output = ""
158
+ total = ""
159
+ last = 0
160
+ execute("import", ovf) do |type, data|
161
+ if type == :stdout
162
+ # Keep track of the stdout so that we can get the VM name
163
+ output << data
164
+ elsif type == :stderr
165
+ # Append the data so we can see the full view
166
+ total << data
167
+
168
+ # Break up the lines. We can't get the progress until we see an "OK"
169
+ lines = total.split("\n")
170
+ if lines.include?("OK.")
171
+ # The progress of the import will be in the last line. Do a greedy
172
+ # regular expression to find what we're looking for.
173
+ if lines.last =~ /.+(\d{2})%/
174
+ current = $1.to_i
175
+ if current > last
176
+ last = current
177
+ yield current if block_given?
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ # Find the name of the VM name
185
+ if output !~ /Suggested VM name "(.+?)"/
186
+ @logger.error("Couldn't find VM name in the output.")
187
+ return nil
188
+ end
189
+
190
+ name = $1.to_s
191
+
192
+ output = execute("list", "vms")
193
+ if output =~ /^"#{Regexp.escape(name)}" \{(.+?)\}$/
194
+ return $1.to_s
195
+ end
196
+
197
+ nil
198
+ end
199
+
200
+ def read_forwarded_ports(uuid=nil, active_only=false)
201
+ uuid ||= @uuid
202
+
203
+ @logger.debug("read_forward_ports: uuid=#{uuid} active_only=#{active_only}")
204
+
205
+ results = []
206
+ current_nic = nil
207
+ info = execute("showvminfo", uuid, "--machinereadable", :retryable => true)
208
+ info.split("\n").each do |line|
209
+ # This is how we find the nic that a FP is attached to,
210
+ # since this comes first.
211
+ current_nic = $1.to_i if line =~ /^nic(\d+)=".+?"$/
212
+
213
+ # If we care about active VMs only, then we check the state
214
+ # to verify the VM is running.
215
+ if active_only && line =~ /^VMState="(.+?)"$/ && $1.to_s != "running"
216
+ return []
217
+ end
218
+
219
+ # Parse out the forwarded port information
220
+ if line =~ /^Forwarding.+?="(.+?),.+?,.*?,(.+?),.*?,(.+?)"$/
221
+ result = [current_nic, $1.to_s, $2.to_i, $3.to_i]
222
+ @logger.debug(" - #{result.inspect}")
223
+ results << result
224
+ end
225
+ end
226
+
227
+ results
228
+ end
229
+
230
+ def read_bridged_interfaces
231
+ execute("list", "bridgedifs").split("\n\n").collect do |block|
232
+ info = {}
233
+
234
+ block.split("\n").each do |line|
235
+ if line =~ /^Name:\s+(.+?)$/
236
+ info[:name] = $1.to_s
237
+ elsif line =~ /^IPAddress:\s+(.+?)$/
238
+ info[:ip] = $1.to_s
239
+ elsif line =~ /^NetworkMask:\s+(.+?)$/
240
+ info[:netmask] = $1.to_s
241
+ elsif line =~ /^Status:\s+(.+?)$/
242
+ info[:status] = $1.to_s
243
+ end
244
+ end
245
+
246
+ # Return the info to build up the results
247
+ info
248
+ end
249
+ end
250
+
251
+ def read_guest_additions_version
252
+ output = execute("guestproperty", "get", @uuid, "/VirtualBox/GuestAdd/Version",
253
+ :retryable => true)
254
+ if output =~ /^Value: (.+?)$/
255
+ # Split the version by _ since some distro versions modify it
256
+ # to look like this: 4.1.2_ubuntu, and the distro part isn't
257
+ # too important.
258
+ value = $1.to_s
259
+ return value.split("_").first
260
+ end
261
+
262
+ return nil
263
+ end
264
+
265
+ def read_host_only_interfaces
266
+ dhcp = {}
267
+ execute("list", "dhcpservers", :retryable => true).split("\n\n").each do |block|
268
+ info = {}
269
+
270
+ block.split("\n").each do |line|
271
+ if line =~ /^NetworkName:\s+HostInterfaceNetworking-(.+?)$/
272
+ info[:network] = $1.to_s
273
+ elsif line =~ /^IP:\s+(.+?)$/
274
+ info[:ip] = $1.to_s
275
+ elsif line =~ /^lowerIPAddress:\s+(.+?)$/
276
+ info[:lower] = $1.to_s
277
+ elsif line =~ /^upperIPAddress:\s+(.+?)$/
278
+ info[:upper] = $1.to_s
279
+ end
280
+ end
281
+
282
+ # Set the DHCP info
283
+ dhcp[info[:network]] = info
284
+ end
285
+
286
+ execute("list", "hostonlyifs", :retryable => true).split("\n\n").collect do |block|
287
+ info = {}
288
+
289
+ block.split("\n").each do |line|
290
+ if line =~ /^Name:\s+(.+?)$/
291
+ info[:name] = $1.to_s
292
+ elsif line =~ /^IPAddress:\s+(.+?)$/
293
+ info[:ip] = $1.to_s
294
+ elsif line =~ /^NetworkMask:\s+(.+?)$/
295
+ info[:netmask] = $1.to_s
296
+ elsif line =~ /^Status:\s+(.+?)$/
297
+ info[:status] = $1.to_s
298
+ end
299
+ end
300
+
301
+ # Set the DHCP info if it exists
302
+ info[:dhcp] = dhcp[info[:name]] if dhcp[info[:name]]
303
+
304
+ info
305
+ end
306
+ end
307
+
308
+ def read_mac_address
309
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
310
+ info.split("\n").each do |line|
311
+ return $1.to_s if line =~ /^macaddress1="(.+?)"$/
312
+ end
313
+
314
+ nil
315
+ end
316
+
317
+ def read_machine_folder
318
+ execute("list", "systemproperties", :retryable => true).split("\n").each do |line|
319
+ if line =~ /^Default machine folder:\s+(.+?)$/i
320
+ return $1.to_s
321
+ end
322
+ end
323
+
324
+ nil
325
+ end
326
+
327
+ def read_network_interfaces
328
+ nics = {}
329
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
330
+ info.split("\n").each do |line|
331
+ if line =~ /^nic(\d+)="(.+?)"$/
332
+ adapter = $1.to_i
333
+ type = $2.to_sym
334
+
335
+ nics[adapter] ||= {}
336
+ nics[adapter][:type] = type
337
+ elsif line =~ /^hostonlyadapter(\d+)="(.+?)"$/
338
+ adapter = $1.to_i
339
+ network = $2.to_s
340
+
341
+ nics[adapter] ||= {}
342
+ nics[adapter][:hostonly] = network
343
+ elsif line =~ /^bridgeadapter(\d+)="(.+?)"$/
344
+ adapter = $1.to_i
345
+ network = $2.to_s
346
+
347
+ nics[adapter] ||= {}
348
+ nics[adapter][:bridge] = network
349
+ end
350
+ end
351
+
352
+ nics
353
+ end
354
+
355
+ def read_state
356
+ output = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
357
+ if output =~ /^name="<inaccessible>"$/
358
+ return :inaccessible
359
+ elsif output =~ /^VMState="(.+?)"$/
360
+ return $1.to_sym
361
+ end
362
+
363
+ nil
364
+ end
365
+
366
+ def read_used_ports
367
+ ports = []
368
+ execute("list", "vms", :retryable => true).split("\n").each do |line|
369
+ if line =~ /^".+?" \{(.+?)\}$/
370
+ uuid = $1.to_s
371
+
372
+ # Ignore our own used ports
373
+ next if uuid == @uuid
374
+
375
+ read_forwarded_ports(uuid, true).each do |_, _, hostport, _|
376
+ ports << hostport
377
+ end
378
+ end
379
+ end
380
+
381
+ ports
382
+ end
383
+
384
+ def read_vms
385
+ results = []
386
+ execute("list", "vms", :retryable => true).split("\n").each do |line|
387
+ if line =~ /^".+?" \{(.+?)\}$/
388
+ results << $1.to_s
389
+ end
390
+ end
391
+
392
+ results
393
+ end
394
+
395
+ def set_mac_address(mac)
396
+ execute("modifyvm", @uuid, "--macaddress1", mac)
397
+ end
398
+
399
+ def set_name(name)
400
+ execute("modifyvm", @uuid, "--name", name)
401
+ end
402
+
403
+ def share_folders(folders)
404
+ folders.each do |folder|
405
+ args = ["--name",
406
+ folder[:name],
407
+ "--hostpath",
408
+ folder[:hostpath]]
409
+ args << "--transient" if folder.has_key?(:transient) && folder[:transient]
410
+ execute("sharedfolder", "add", @uuid, *args)
411
+ end
412
+ end
413
+
414
+ def ssh_port(expected_port)
415
+ @logger.debug("Searching for SSH port: #{expected_port.inspect}")
416
+
417
+ # Look for the forwarded port only by comparing the guest port
418
+ read_forwarded_ports.each do |_, _, hostport, guestport|
419
+ return hostport if guestport == expected_port
420
+ end
421
+
422
+ nil
423
+ end
424
+
425
+ def start(mode)
426
+ command = ["startvm", @uuid, "--type", mode.to_s]
427
+ r = raw(*command)
428
+
429
+ if r.exit_code == 0 || r.stdout =~ /VM ".+?" has been successfully started/
430
+ # Some systems return an exit code 1 for some reason. For that
431
+ # we depend on the output.
432
+ return true
433
+ end
434
+
435
+ # If we reached this point then it didn't work out.
436
+ raise Errors::VBoxManageError, :command => command.inspect
437
+ end
438
+
439
+ def suspend
440
+ execute("controlvm", @uuid, "savestate")
441
+ end
442
+
443
+ def verify!
444
+ # This command sometimes fails if kernel drivers aren't properly loaded
445
+ # so we just run the command and verify that it succeeded.
446
+ execute("list", "hostonlyifs")
447
+ end
448
+
449
+ def verify_image(path)
450
+ r = raw("import", path.to_s, "--dry-run")
451
+ return r.exit_code == 0
452
+ end
453
+
454
+ def vm_exists?(uuid)
455
+ raw("showvminfo", uuid).exit_code == 0
456
+ end
457
+ end
458
+ end
459
+ end
@@ -2,5 +2,5 @@ module Vagrant
2
2
  # This will always be up to date with the current version of Vagrant,
3
3
  # since it is used to generate the gemspec and is also the source of
4
4
  # the version for `vagrant -v`
5
- VERSION = "1.0.3"
5
+ VERSION = "1.0.4"
6
6
  end
@@ -299,6 +299,10 @@ en:
299
299
  shut it down forcefully, or you can run `vagrant suspend` to simply
300
300
  suspend the virtual machine. In either case, to restart it again,
301
301
  simply run `vagrant up`.
302
+ saving: |-
303
+ The VM is currently saving its state. In a few moments this state
304
+ should transition to "saved." Please run `vagrant status` again
305
+ in a few seconds.
302
306
  saved: |-
303
307
  To resume this VM, simply run `vagrant up`.
304
308
  stuck: |-
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 3
10
- version: 1.0.3
9
+ - 4
10
+ version: 1.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mitchell Hashimoto
@@ -16,12 +16,11 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-05-02 00:00:00 Z
19
+ date: 2012-09-14 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: archive-tar-minitar
23
23
  prerelease: false
24
- type: :runtime
25
24
  requirement: &id001 !ruby/object:Gem::Requirement
26
25
  none: false
27
26
  requirements:
@@ -33,11 +32,11 @@ dependencies:
33
32
  - 5
34
33
  - 2
35
34
  version: 0.5.2
35
+ type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: childprocess
39
39
  prerelease: false
40
- type: :runtime
41
40
  requirement: &id002 !ruby/object:Gem::Requirement
42
41
  none: false
43
42
  requirements:
@@ -49,11 +48,11 @@ dependencies:
49
48
  - 3
50
49
  - 1
51
50
  version: 0.3.1
51
+ type: :runtime
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: erubis
55
55
  prerelease: false
56
- type: :runtime
57
56
  requirement: &id003 !ruby/object:Gem::Requirement
58
57
  none: false
59
58
  requirements:
@@ -65,11 +64,11 @@ dependencies:
65
64
  - 7
66
65
  - 0
67
66
  version: 2.7.0
67
+ type: :runtime
68
68
  version_requirements: *id003
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: i18n
71
71
  prerelease: false
72
- type: :runtime
73
72
  requirement: &id004 !ruby/object:Gem::Requirement
74
73
  none: false
75
74
  requirements:
@@ -81,11 +80,11 @@ dependencies:
81
80
  - 6
82
81
  - 0
83
82
  version: 0.6.0
83
+ type: :runtime
84
84
  version_requirements: *id004
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: json
87
87
  prerelease: false
88
- type: :runtime
89
88
  requirement: &id005 !ruby/object:Gem::Requirement
90
89
  none: false
91
90
  requirements:
@@ -97,11 +96,11 @@ dependencies:
97
96
  - 5
98
97
  - 1
99
98
  version: 1.5.1
99
+ type: :runtime
100
100
  version_requirements: *id005
101
101
  - !ruby/object:Gem::Dependency
102
102
  name: log4r
103
103
  prerelease: false
104
- type: :runtime
105
104
  requirement: &id006 !ruby/object:Gem::Requirement
106
105
  none: false
107
106
  requirements:
@@ -113,11 +112,11 @@ dependencies:
113
112
  - 1
114
113
  - 9
115
114
  version: 1.1.9
115
+ type: :runtime
116
116
  version_requirements: *id006
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: net-ssh
119
119
  prerelease: false
120
- type: :runtime
121
120
  requirement: &id007 !ruby/object:Gem::Requirement
122
121
  none: false
123
122
  requirements:
@@ -129,11 +128,11 @@ dependencies:
129
128
  - 2
130
129
  - 2
131
130
  version: 2.2.2
131
+ type: :runtime
132
132
  version_requirements: *id007
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: net-scp
135
135
  prerelease: false
136
- type: :runtime
137
136
  requirement: &id008 !ruby/object:Gem::Requirement
138
137
  none: false
139
138
  requirements:
@@ -145,11 +144,11 @@ dependencies:
145
144
  - 0
146
145
  - 4
147
146
  version: 1.0.4
147
+ type: :runtime
148
148
  version_requirements: *id008
149
149
  - !ruby/object:Gem::Dependency
150
150
  name: rake
151
151
  prerelease: false
152
- type: :development
153
152
  requirement: &id009 !ruby/object:Gem::Requirement
154
153
  none: false
155
154
  requirements:
@@ -159,11 +158,11 @@ dependencies:
159
158
  segments:
160
159
  - 0
161
160
  version: "0"
161
+ type: :development
162
162
  version_requirements: *id009
163
163
  - !ruby/object:Gem::Dependency
164
164
  name: contest
165
165
  prerelease: false
166
- type: :development
167
166
  requirement: &id010 !ruby/object:Gem::Requirement
168
167
  none: false
169
168
  requirements:
@@ -175,11 +174,11 @@ dependencies:
175
174
  - 1
176
175
  - 2
177
176
  version: 0.1.2
177
+ type: :development
178
178
  version_requirements: *id010
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: minitest
181
181
  prerelease: false
182
- type: :development
183
182
  requirement: &id011 !ruby/object:Gem::Requirement
184
183
  none: false
185
184
  requirements:
@@ -191,11 +190,11 @@ dependencies:
191
190
  - 5
192
191
  - 1
193
192
  version: 2.5.1
193
+ type: :development
194
194
  version_requirements: *id011
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: mocha
197
197
  prerelease: false
198
- type: :development
199
198
  requirement: &id012 !ruby/object:Gem::Requirement
200
199
  none: false
201
200
  requirements:
@@ -205,11 +204,11 @@ dependencies:
205
204
  segments:
206
205
  - 0
207
206
  version: "0"
207
+ type: :development
208
208
  version_requirements: *id012
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: rspec-core
211
211
  prerelease: false
212
- type: :development
213
212
  requirement: &id013 !ruby/object:Gem::Requirement
214
213
  none: false
215
214
  requirements:
@@ -221,11 +220,11 @@ dependencies:
221
220
  - 8
222
221
  - 0
223
222
  version: 2.8.0
223
+ type: :development
224
224
  version_requirements: *id013
225
225
  - !ruby/object:Gem::Dependency
226
226
  name: rspec-expectations
227
227
  prerelease: false
228
- type: :development
229
228
  requirement: &id014 !ruby/object:Gem::Requirement
230
229
  none: false
231
230
  requirements:
@@ -237,11 +236,11 @@ dependencies:
237
236
  - 8
238
237
  - 0
239
238
  version: 2.8.0
239
+ type: :development
240
240
  version_requirements: *id014
241
241
  - !ruby/object:Gem::Dependency
242
242
  name: rspec-mocks
243
243
  prerelease: false
244
- type: :development
245
244
  requirement: &id015 !ruby/object:Gem::Requirement
246
245
  none: false
247
246
  requirements:
@@ -253,6 +252,7 @@ dependencies:
253
252
  - 8
254
253
  - 0
255
254
  version: 2.8.0
255
+ type: :development
256
256
  version_requirements: *id015
257
257
  description: Vagrant is a tool for building and distributing virtualized development environments.
258
258
  email:
@@ -377,6 +377,7 @@ files:
377
377
  - lib/vagrant/driver/virtualbox.rb
378
378
  - lib/vagrant/driver/virtualbox_4_0.rb
379
379
  - lib/vagrant/driver/virtualbox_4_1.rb
380
+ - lib/vagrant/driver/virtualbox_4_2.rb
380
381
  - lib/vagrant/driver/virtualbox_base.rb
381
382
  - lib/vagrant/environment.rb
382
383
  - lib/vagrant/errors.rb
@@ -707,7 +708,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
707
708
  requirements: []
708
709
 
709
710
  rubyforge_project: vagrant
710
- rubygems_version: 1.8.6
711
+ rubygems_version: 1.8.24
711
712
  signing_key:
712
713
  specification_version: 3
713
714
  summary: Build and distribute virtualized development environments.