vagrantup 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/lib/vagrant.rb +1 -0
- data/lib/vagrant/command/destroy.rb +9 -2
- data/lib/vagrant/command/reload.rb +7 -2
- data/lib/vagrant/command/ssh_config.rb +1 -1
- data/lib/vagrant/command/start_mixins.rb +26 -0
- data/lib/vagrant/command/up.rb +8 -23
- data/lib/vagrant/driver/virtualbox.rb +1 -1
- data/lib/vagrant/environment.rb +7 -3
- data/lib/vagrant/errors.rb +15 -0
- data/lib/vagrant/guest.rb +1 -0
- data/lib/vagrant/guest/openbsd.rb +20 -0
- data/lib/vagrant/provisioners/puppet_server.rb +14 -1
- data/lib/vagrant/ui.rb +19 -5
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +2 -2
- data/templates/locales/en.yml +14 -0
- data/test/unit/support/isolated_environment.rb +8 -0
- data/test/unit/vagrant/environment_test.rb +25 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e371c7a61dc9b8d9400cec30e3ebbbc1cfdd1b0
|
4
|
+
data.tar.gz: 312202b025df0c9526443a07fdac7ebe12a66b7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06be04e82de2eb5bdde3c8a1461638b4861ba5d18924290d803c71248daad60a9474a38dc3baeda5dd5b3637f586dd4bc26cd823bdf0b639dbec06fd7fd82c8d
|
7
|
+
data.tar.gz: 34df0d3207ede54215a099f1a5ae60b89c4e05cd2f655106cb4ae4a1e5fad538432c5a1ae53d6a0fe8782d6c566a7cdc3c5a11982feb2fbfa45f2c97d8267971
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 1.0.1 (March 11, 2012)
|
2
|
+
|
3
|
+
- Fix crashing issue which manifested itself in multi-VM environments.
|
4
|
+
- Add missing `rubygems` require in `environment.rb` to avoid
|
5
|
+
possible load errors. [GH-781]
|
6
|
+
- `vagrant destroy` shows a nice error when called without a
|
7
|
+
TTY (and hence can't confirm). [GH-779]
|
8
|
+
- Fix an issue with the `:vagrantfile_name` option to `Vagrant::Environment`
|
9
|
+
not working properly. [GH-778]
|
10
|
+
- `VAGRANT_CWD` environmental variable can be used to set the CWD to
|
11
|
+
something other than the current directory.
|
12
|
+
- Downloading boxes from servers that don't send a content-length
|
13
|
+
now works properly. [GH-788]
|
14
|
+
- The `:facter` option now works for puppet server. [GH-790]
|
15
|
+
- The `--no-provision` and `--provision-with` flags are available to
|
16
|
+
`vagrant reload` now.
|
17
|
+
- `:openbsd` guest which supports only halting at the moment. [GH-773]
|
18
|
+
- `ssh-config -h` now shows help, instead of assuming a host is being
|
19
|
+
specified. For host, you can still use `--host`. [GH-793]
|
20
|
+
|
1
21
|
## 1.0.0 (March 6, 2012)
|
2
22
|
|
3
23
|
- `vagrant gem` should now be used to install Vagrant plugins that are
|
data/lib/vagrant.rb
CHANGED
@@ -178,6 +178,7 @@ Vagrant.guests.register(:fedora) { Vagrant::Guest::Fedora }
|
|
178
178
|
Vagrant.guests.register(:freebsd) { Vagrant::Guest::FreeBSD }
|
179
179
|
Vagrant.guests.register(:gentoo) { Vagrant::Guest::Gentoo }
|
180
180
|
Vagrant.guests.register(:linux) { Vagrant::Guest::Linux }
|
181
|
+
Vagrant.guests.register(:openbsd) { Vagrant::Guest::OpenBSD }
|
181
182
|
Vagrant.guests.register(:redhat) { Vagrant::Guest::Redhat }
|
182
183
|
Vagrant.guests.register(:solaris) { Vagrant::Guest::Solaris }
|
183
184
|
Vagrant.guests.register(:suse) { Vagrant::Guest::Suse }
|
@@ -30,8 +30,15 @@ module Vagrant
|
|
30
30
|
if options[:force]
|
31
31
|
do_destroy = true
|
32
32
|
else
|
33
|
-
choice =
|
34
|
-
|
33
|
+
choice = nil
|
34
|
+
begin
|
35
|
+
choice = @env.ui.ask(I18n.t("vagrant.commands.destroy.confirmation",
|
36
|
+
:name => vm.name))
|
37
|
+
rescue Errors::UIExpectsTTY
|
38
|
+
# We raise a more specific error but one which basically
|
39
|
+
# means the same thing.
|
40
|
+
raise Errors::DestroyRequiresForce
|
41
|
+
end
|
35
42
|
do_destroy = choice.upcase == "Y"
|
36
43
|
end
|
37
44
|
|
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
|
+
require 'vagrant/command/start_mixins'
|
4
|
+
|
3
5
|
module Vagrant
|
4
6
|
module Command
|
5
7
|
class Reload < Base
|
8
|
+
include StartMixins
|
9
|
+
|
6
10
|
def execute
|
7
11
|
options = {}
|
8
|
-
|
9
12
|
opts = OptionParser.new do |opts|
|
10
13
|
opts.banner = "Usage: vagrant reload [vm-name]"
|
14
|
+
opts.separator ""
|
15
|
+
build_start_options(opts, options)
|
11
16
|
end
|
12
17
|
|
13
18
|
# Parse the options
|
@@ -18,7 +23,7 @@ module Vagrant
|
|
18
23
|
with_target_vms(argv[0]) do |vm|
|
19
24
|
if vm.created?
|
20
25
|
@logger.info("Reloading: #{vm.name}")
|
21
|
-
vm.reload
|
26
|
+
vm.reload(options)
|
22
27
|
else
|
23
28
|
@logger.info("Not created: #{vm.name}. Not reloading.")
|
24
29
|
vm.ui.info I18n.t("vagrant.commands.common.vm_not_created")
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Command
|
3
|
+
module StartMixins
|
4
|
+
# This adds the standard `start` command line flags to the given
|
5
|
+
# OptionParser, storing the result in the `options` dictionary.
|
6
|
+
#
|
7
|
+
# @param [OptionParser] parser
|
8
|
+
# @param [Hash] options
|
9
|
+
def build_start_options(parser, options)
|
10
|
+
# Setup the defaults
|
11
|
+
options["provision.enabled"] = true
|
12
|
+
options["provision.types"] = nil
|
13
|
+
|
14
|
+
# Add the options
|
15
|
+
parser.on("--[no-]provision", "Enable or disable provisioning") do |p|
|
16
|
+
options["provision.enabled"] = p
|
17
|
+
end
|
18
|
+
|
19
|
+
parser.on("--provision-with x,y,z", Array,
|
20
|
+
"Enable only certain provisioners, by type.") do |list|
|
21
|
+
options["provision.types"] = list
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/vagrant/command/up.rb
CHANGED
@@ -1,49 +1,34 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
|
+
require 'vagrant/command/start_mixins'
|
4
|
+
|
3
5
|
module Vagrant
|
4
6
|
module Command
|
5
7
|
class Up < Base
|
6
|
-
|
7
|
-
options = {
|
8
|
-
:provision => true,
|
9
|
-
:provisioners => nil
|
10
|
-
}
|
8
|
+
include StartMixins
|
11
9
|
|
10
|
+
def execute
|
11
|
+
options = {}
|
12
12
|
opts = OptionParser.new do |opts|
|
13
13
|
opts.banner = "Usage: vagrant up [vm-name] [--[no-]provision] [-h]"
|
14
|
-
|
15
14
|
opts.separator ""
|
16
|
-
|
17
|
-
opts.on("--[no-]provision", "Enable or disable provisioning") do |p|
|
18
|
-
options[:provision] = p
|
19
|
-
end
|
20
|
-
|
21
|
-
opts.on("--provision-with x,y,z", Array,
|
22
|
-
"Enable only certain provisioners, by type.") do |list|
|
23
|
-
options[:provisioners] = list
|
24
|
-
end
|
15
|
+
build_start_options(opts, options)
|
25
16
|
end
|
26
17
|
|
27
18
|
# Parse the options
|
28
19
|
argv = parse_options(opts)
|
29
20
|
return if !argv
|
30
21
|
|
31
|
-
# Parameters to send to actions
|
32
|
-
action_params = {
|
33
|
-
"provision.enabled" => options[:provision],
|
34
|
-
"provision.types" => options[:provisioners]
|
35
|
-
}
|
36
|
-
|
37
22
|
# Go over each VM and bring it up
|
38
23
|
@logger.debug("'Up' each target VM...")
|
39
24
|
with_target_vms(argv[0]) do |vm|
|
40
25
|
if vm.created?
|
41
26
|
@logger.info("Booting: #{vm.name}")
|
42
27
|
vm.ui.info I18n.t("vagrant.commands.up.vm_created")
|
43
|
-
vm.start(
|
28
|
+
vm.start(options)
|
44
29
|
else
|
45
30
|
@logger.info("Creating: #{vm.name}")
|
46
|
-
vm.up(
|
31
|
+
vm.up(options)
|
47
32
|
end
|
48
33
|
end
|
49
34
|
end
|
data/lib/vagrant/environment.rb
CHANGED
@@ -2,6 +2,7 @@ require 'pathname'
|
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
4
|
require 'log4r'
|
5
|
+
require 'rubygems' # This is needed for plugin loading below.
|
5
6
|
|
6
7
|
require 'vagrant/util/file_mode'
|
7
8
|
require 'vagrant/util/platform'
|
@@ -55,13 +56,16 @@ module Vagrant
|
|
55
56
|
}.merge(opts || {})
|
56
57
|
|
57
58
|
# Set the default working directory to look for the vagrantfile
|
59
|
+
opts[:cwd] ||= ENV["VAGRANT_CWD"] if ENV.has_key?("VAGRANT_CWD")
|
58
60
|
opts[:cwd] ||= Dir.pwd
|
59
61
|
opts[:cwd] = Pathname.new(opts[:cwd])
|
62
|
+
raise Errors::EnvironmentNonExistentCWD if !opts[:cwd].directory?
|
60
63
|
|
61
|
-
# Set the
|
62
|
-
#
|
63
|
-
opts[:vagrantfile_name] ||= [
|
64
|
+
# Set the Vagrantfile name up. We append "Vagrantfile" and "vagrantfile" so that
|
65
|
+
# those continue to work as well, but anything custom will take precedence.
|
66
|
+
opts[:vagrantfile_name] ||= []
|
64
67
|
opts[:vagrantfile_name] = [opts[:vagrantfile_name]] if !opts[:vagrantfile_name].is_a?(Array)
|
68
|
+
opts[:vagrantfile_name] += ["Vagrantfile", "vagrantfile"]
|
65
69
|
|
66
70
|
# Set instance variables for all the configuration parameters.
|
67
71
|
@cwd = opts[:cwd]
|
data/lib/vagrant/errors.rb
CHANGED
@@ -148,6 +148,11 @@ module Vagrant
|
|
148
148
|
error_key(:deprecation)
|
149
149
|
end
|
150
150
|
|
151
|
+
class DestroyRequiresForce < VagrantError
|
152
|
+
status_code(74)
|
153
|
+
error_key(:destroy_requires_force)
|
154
|
+
end
|
155
|
+
|
151
156
|
class DotfileIsDirectory < VagrantError
|
152
157
|
status_code(46)
|
153
158
|
error_key(:dotfile_is_directory)
|
@@ -168,6 +173,11 @@ module Vagrant
|
|
168
173
|
error_key(:status_error, "vagrant.downloaders.http")
|
169
174
|
end
|
170
175
|
|
176
|
+
class EnvironmentNonExistentCWD < VagrantError
|
177
|
+
status_code(75)
|
178
|
+
error_key(:environment_non_existent_cwd)
|
179
|
+
end
|
180
|
+
|
171
181
|
class EnvironmentLockedError < VagrantError
|
172
182
|
status_code(52)
|
173
183
|
error_key(:environment_locked)
|
@@ -323,6 +333,11 @@ module Vagrant
|
|
323
333
|
error_key(:ssh_unavailable_windows)
|
324
334
|
end
|
325
335
|
|
336
|
+
class UIExpectsTTY < VagrantError
|
337
|
+
status_code(73)
|
338
|
+
error_key(:ui_expects_tty)
|
339
|
+
end
|
340
|
+
|
326
341
|
class VagrantInterrupt < VagrantError
|
327
342
|
status_code(40)
|
328
343
|
error_key(:interrupted)
|
data/lib/vagrant/guest.rb
CHANGED
@@ -9,6 +9,7 @@ module Vagrant
|
|
9
9
|
autoload :FreeBSD, 'vagrant/guest/freebsd'
|
10
10
|
autoload :Gentoo, 'vagrant/guest/gentoo'
|
11
11
|
autoload :Linux, 'vagrant/guest/linux'
|
12
|
+
autoload :OpenBSD, 'vagrant/guest/openbsd'
|
12
13
|
autoload :Redhat, 'vagrant/guest/redhat'
|
13
14
|
autoload :Solaris, 'vagrant/guest/solaris'
|
14
15
|
autoload :Suse, 'vagrant/guest/suse'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Guest
|
3
|
+
class OpenBSD < Base
|
4
|
+
def halt
|
5
|
+
vm.channel.sudo("shutdown -p -h now")
|
6
|
+
|
7
|
+
# Wait until the VM's state is actually powered off. If this doesn't
|
8
|
+
# occur within a reasonable amount of time then simply return which
|
9
|
+
# will cause Vagrant to force kill the machine.
|
10
|
+
count = 0
|
11
|
+
while vm.state != :poweroff
|
12
|
+
count += 1
|
13
|
+
|
14
|
+
return if count >= 30
|
15
|
+
sleep 1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -9,7 +9,9 @@ module Vagrant
|
|
9
9
|
attr_accessor :puppet_server
|
10
10
|
attr_accessor :puppet_node
|
11
11
|
attr_accessor :options
|
12
|
+
attr_accessor :facter
|
12
13
|
|
14
|
+
def facter; @facter ||= {}; end
|
13
15
|
def puppet_server; @puppet_server || "puppet"; end
|
14
16
|
def options; @options ||= []; end
|
15
17
|
end
|
@@ -53,7 +55,18 @@ module Vagrant
|
|
53
55
|
options += ["--certname", cn] if cn
|
54
56
|
options = options.join(" ")
|
55
57
|
|
56
|
-
|
58
|
+
# Build up the custom facts if we have any
|
59
|
+
facter = ""
|
60
|
+
if !config.facter.empty?
|
61
|
+
facts = []
|
62
|
+
config.facter.each do |key, value|
|
63
|
+
facts << "FACTER_#{key}='#{value}'"
|
64
|
+
end
|
65
|
+
|
66
|
+
facter = "#{facts.join(" ")} "
|
67
|
+
end
|
68
|
+
|
69
|
+
command = "#{facter}puppetd #{options} --server #{config.puppet_server}"
|
57
70
|
|
58
71
|
env[:ui].info I18n.t("vagrant.provisioners.puppet_server.running_puppetd")
|
59
72
|
env[:vm].channel.sudo(command) do |type, data|
|
data/lib/vagrant/ui.rb
CHANGED
@@ -31,7 +31,14 @@ module Vagrant
|
|
31
31
|
end
|
32
32
|
|
33
33
|
# This is a UI implementation that does nothing.
|
34
|
-
class Silent < Interface
|
34
|
+
class Silent < Interface
|
35
|
+
def ask(*args)
|
36
|
+
super
|
37
|
+
|
38
|
+
# Silent can't do this, obviously.
|
39
|
+
raise Errors::UIExpectsTTY
|
40
|
+
end
|
41
|
+
end
|
35
42
|
|
36
43
|
# This is a UI implementation that outputs the text as is. It
|
37
44
|
# doesn't add any color.
|
@@ -51,6 +58,9 @@ module Vagrant
|
|
51
58
|
def ask(message, opts=nil)
|
52
59
|
super(message)
|
53
60
|
|
61
|
+
# We can't ask questions when the output isn't a TTY.
|
62
|
+
raise Errors::UIExpectsTTY if !$stdin.tty?
|
63
|
+
|
54
64
|
# Setup the options so that the new line is suppressed
|
55
65
|
opts ||= {}
|
56
66
|
opts[:new_line] = false if !opts.has_key?(:new_line)
|
@@ -60,7 +70,7 @@ module Vagrant
|
|
60
70
|
say(:info, message, opts)
|
61
71
|
|
62
72
|
# Get the results and chomp off the newline
|
63
|
-
|
73
|
+
$stdin.gets.chomp
|
64
74
|
end
|
65
75
|
|
66
76
|
# This is used to output progress reports to the UI.
|
@@ -68,9 +78,13 @@ module Vagrant
|
|
68
78
|
# to the UI. Send `clear_line` to clear the line to show
|
69
79
|
# a continuous progress meter.
|
70
80
|
def report_progress(progress, total, show_parts=true)
|
71
|
-
|
72
|
-
|
73
|
-
|
81
|
+
if total && total > 0
|
82
|
+
percent = (progress.to_f / total.to_f) * 100
|
83
|
+
line = "Progress: #{percent.to_i}%"
|
84
|
+
line << " (#{progress} / #{total})" if show_parts
|
85
|
+
else
|
86
|
+
line = "Progress: #{progress}"
|
87
|
+
end
|
74
88
|
|
75
89
|
info(line, :new_line => false)
|
76
90
|
end
|
data/lib/vagrant/version.rb
CHANGED
data/lib/vagrant/vm.rb
CHANGED
data/templates/locales/en.yml
CHANGED
@@ -36,6 +36,10 @@ en:
|
|
36
36
|
|
37
37
|
%{message}
|
38
38
|
Note that this error message will not appear in the next version of Vagrant.
|
39
|
+
destroy_requires_force: |-
|
40
|
+
Destroy doesn't have a TTY to ask for confirmation. Please pass the
|
41
|
+
`--force` flag to force a destroy, otherwise attach a TTY so that
|
42
|
+
the destroy can be confirmed.
|
39
43
|
dotfile_is_directory: |-
|
40
44
|
The local file Vagrant uses to store data ".vagrant" already exists
|
41
45
|
and is a directory! If you are in your home directory, then please run
|
@@ -141,6 +145,11 @@ en:
|
|
141
145
|
Port: %{port}
|
142
146
|
Username: %{username}
|
143
147
|
Private key: %{key_path}
|
148
|
+
ui_expects_tty: |-
|
149
|
+
Vagrant is attempting to interface with the UI in a way that requires
|
150
|
+
a TTY. Most actions in Vagrant that require a TTY have configuration
|
151
|
+
switches to disable this requirement. Please do that or run Vagrant
|
152
|
+
with TTY.
|
144
153
|
vagrantfile_exists: |-
|
145
154
|
`Vagrantfile` already exists in this directory. Remove it before
|
146
155
|
running `vagrant init`.
|
@@ -274,6 +283,11 @@ en:
|
|
274
283
|
not_created: |-
|
275
284
|
The environment has not yet been created. Run `vagrant up` to
|
276
285
|
create the environment.
|
286
|
+
paused: |-
|
287
|
+
The VM is paused. This VM may have been paused via the VirtualBox
|
288
|
+
GUI or the VBoxManage command line interface. To unpause, please
|
289
|
+
use the VirtualBox GUI and/or VBoxManage command line interface so
|
290
|
+
that vagrant would be able to control the VM again.
|
277
291
|
poweroff: |-
|
278
292
|
The VM is powered off. To restart the VM, simply run `vagrant up`
|
279
293
|
running: |-
|
@@ -16,6 +16,14 @@ module Unit
|
|
16
16
|
Vagrant::Environment.new(options)
|
17
17
|
end
|
18
18
|
|
19
|
+
# This creates a file in the isolated environment. By default this file
|
20
|
+
# will be created in the working directory of the isolated environment.
|
21
|
+
def file(name, contents)
|
22
|
+
@workdir.join(name).open("w+") do |f|
|
23
|
+
f.write(contents)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
19
27
|
def vagrantfile(contents, root=nil)
|
20
28
|
root ||= @workdir
|
21
29
|
root.join("Vagrantfile").open("w+") do |f|
|
@@ -17,8 +17,18 @@ describe Vagrant::Environment do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it "is set to the cwd given" do
|
20
|
-
|
21
|
-
instance
|
20
|
+
directory = File.dirname(__FILE__)
|
21
|
+
instance = described_class.new(:cwd => directory)
|
22
|
+
instance.cwd.should == Pathname.new(directory)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "is set to the environmental variable VAGRANT_CWD" do
|
26
|
+
pending "A good temporary ENV thing"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "raises an exception if the CWD doesn't exist" do
|
30
|
+
expect { described_class.new(:cwd => "doesntexist") }.
|
31
|
+
to raise_error(Vagrant::Errors::EnvironmentNonExistentCWD)
|
22
32
|
end
|
23
33
|
end
|
24
34
|
|
@@ -120,6 +130,19 @@ VF
|
|
120
130
|
env.config.global.vagrant.dotfile_name.should == "foo"
|
121
131
|
end
|
122
132
|
|
133
|
+
it "should load from a custom Vagrantfile" do
|
134
|
+
environment = isolated_environment do |env|
|
135
|
+
env.file("non_standard_name", <<-VF)
|
136
|
+
Vagrant::Config.run do |config|
|
137
|
+
config.vagrant.dotfile_name = "custom"
|
138
|
+
end
|
139
|
+
VF
|
140
|
+
end
|
141
|
+
|
142
|
+
env = environment.create_vagrant_env(:vagrantfile_name => "non_standard_name")
|
143
|
+
env.config.global.vagrant.dotfile_name.should == "custom"
|
144
|
+
end
|
145
|
+
|
123
146
|
it "should load VM configuration" do
|
124
147
|
environment = isolated_environment do |env|
|
125
148
|
env.vagrantfile(<<-VF)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrantup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mitchell Hashimoto
|
@@ -313,6 +313,7 @@ files:
|
|
313
313
|
- lib/vagrant/command/resume.rb
|
314
314
|
- lib/vagrant/command/ssh.rb
|
315
315
|
- lib/vagrant/command/ssh_config.rb
|
316
|
+
- lib/vagrant/command/start_mixins.rb
|
316
317
|
- lib/vagrant/command/status.rb
|
317
318
|
- lib/vagrant/command/suspend.rb
|
318
319
|
- lib/vagrant/command/up.rb
|
@@ -354,6 +355,7 @@ files:
|
|
354
355
|
- lib/vagrant/guest/linux.rb
|
355
356
|
- lib/vagrant/guest/linux/config.rb
|
356
357
|
- lib/vagrant/guest/linux/error.rb
|
358
|
+
- lib/vagrant/guest/openbsd.rb
|
357
359
|
- lib/vagrant/guest/redhat.rb
|
358
360
|
- lib/vagrant/guest/solaris.rb
|
359
361
|
- lib/vagrant/guest/suse.rb
|