vagrant 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
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.