vagrant 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +18 -0
- data/README.md +1 -1
- data/config/default.rb +1 -1
- data/lib/vagrant/action/builtin.rb +1 -0
- data/lib/vagrant/action/vm.rb +1 -0
- data/lib/vagrant/action/vm/host_name.rb +21 -0
- data/lib/vagrant/command/ssh_config.rb +5 -0
- data/lib/vagrant/config/vm.rb +1 -0
- data/lib/vagrant/provisioners.rb +1 -0
- data/lib/vagrant/provisioners/chef.rb +3 -3
- data/lib/vagrant/provisioners/chef_server.rb +5 -4
- data/lib/vagrant/provisioners/chef_solo.rb +3 -3
- data/lib/vagrant/provisioners/puppet.rb +5 -4
- data/lib/vagrant/provisioners/puppet_server.rb +4 -6
- data/lib/vagrant/provisioners/shell.rb +52 -0
- data/lib/vagrant/ssh.rb +7 -1
- data/lib/vagrant/ssh/session.rb +57 -24
- data/lib/vagrant/systems.rb +1 -0
- data/lib/vagrant/systems/base.rb +4 -0
- data/lib/vagrant/systems/debian.rb +9 -0
- data/lib/vagrant/systems/freebsd.rb +84 -0
- data/lib/vagrant/systems/gentoo.rb +1 -1
- data/lib/vagrant/systems/redhat.rb +11 -3
- data/lib/vagrant/version.rb +1 -1
- data/lib/vagrant/vm.rb +5 -4
- data/templates/locales/en.yml +17 -4
- data/templates/ssh_config.erb +1 -1
- data/test/vagrant/action/vm/host_name_test.rb +36 -0
- data/test/vagrant/provisioners/chef_server_test.rb +3 -3
- data/test/vagrant/provisioners/chef_solo_test.rb +2 -2
- data/test/vagrant/provisioners/chef_test.rb +3 -3
- data/test/vagrant/provisioners/puppet_server_test.rb +5 -6
- data/test/vagrant/provisioners/puppet_test.rb +2 -2
- data/test/vagrant/provisioners/shell_test.rb +68 -0
- data/test/vagrant/ssh_test.rb +1 -0
- data/vagrant.gemspec +2 -2
- metadata +13 -8
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
## 0.7.1 (January 28, 2011)
|
2
|
+
|
3
|
+
- Change error output with references to VirtualBox 3.2 to 4.0.
|
4
|
+
- Internal SSH through net-ssh now uses `IdentitiesOnly` thanks to
|
5
|
+
upstream net-ssh fix.
|
6
|
+
- Fix issue causing warnings to show with `forwardx11` enabled for SSH. [GH-279]
|
7
|
+
- FreeBSD support for host only networks, NFS, halting, etc. [GH-275]
|
8
|
+
- Make SSH commands which use sudo compatible with sudo < 1.7.0. [GH-278]
|
9
|
+
- Fix broken puppet server provisioner which called a nonexistent
|
10
|
+
method.
|
11
|
+
- Default SSH host changed from `localhost` to `127.0.0.1` since
|
12
|
+
`localhost` is not always loopback.
|
13
|
+
- New `shell` provisioner which simply uploads and executes a script as
|
14
|
+
root on the VM.
|
15
|
+
- Gentoo host only networking no longer fails if alrady setup. [GH-286]
|
16
|
+
- Set the host name of your guest OS with `config.vm.host_name` [GH-273]
|
17
|
+
- `vagrant ssh-config` now outputs the configured `config.ssh.host`
|
18
|
+
|
1
19
|
## 0.7.0 (January 19, 2011)
|
2
20
|
|
3
21
|
- VirtualBox 4.0 support. Support for VirtualBox 3.2 is _dropped_, since
|
data/README.md
CHANGED
@@ -32,7 +32,7 @@ the box doesn't already exist on your system.
|
|
32
32
|
## Getting Started Guide and Video
|
33
33
|
|
34
34
|
To learn how to build a fully functional rails development environment, view the
|
35
|
-
[getting started guide](http://vagrantup.com/getting-started/index.html).
|
35
|
+
[getting started guide](http://vagrantup.com/docs/getting-started/index.html).
|
36
36
|
|
37
37
|
There is also a fairly short (12 minute) [getting started video](http://vimeo.com/9976342) which
|
38
38
|
explains how to build a fully functional LAMP development environment, which
|
data/config/default.rb
CHANGED
data/lib/vagrant/action/vm.rb
CHANGED
@@ -15,6 +15,7 @@ module Vagrant
|
|
15
15
|
autoload :Export, 'vagrant/action/vm/export'
|
16
16
|
autoload :ForwardPorts, 'vagrant/action/vm/forward_ports'
|
17
17
|
autoload :Halt, 'vagrant/action/vm/halt'
|
18
|
+
autoload :HostName, 'vagrant/action/vm/host_name'
|
18
19
|
autoload :Import, 'vagrant/action/vm/import'
|
19
20
|
autoload :MatchMACAddress, 'vagrant/action/vm/match_mac_address'
|
20
21
|
autoload :Network, 'vagrant/action/vm/network'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Vagrant
|
2
|
+
class Action
|
3
|
+
module VM
|
4
|
+
class HostName
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
@app.call(env)
|
11
|
+
|
12
|
+
host_name = env["config"].vm.host_name
|
13
|
+
if !host_name.nil?
|
14
|
+
env.ui.info I18n.t("vagrant.actions.vm.host_name.setting")
|
15
|
+
env["vm"].system.change_host_name(host_name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -9,8 +9,13 @@ module Vagrant
|
|
9
9
|
vm = target_vms.first
|
10
10
|
raise Errors::VMNotCreatedError if !vm.created?
|
11
11
|
|
12
|
+
# We need to fix the file permissions of the key if they aren't set
|
13
|
+
# properly, otherwise if the user attempts to SSH in, it won't work!
|
14
|
+
vm.ssh.check_key_permissions(vm.env.config.ssh.private_key_path)
|
15
|
+
|
12
16
|
$stdout.puts(Util::TemplateRenderer.render("ssh_config", {
|
13
17
|
:host_key => options[:host] || "vagrant",
|
18
|
+
:ssh_host => vm.env.config.ssh.host,
|
14
19
|
:ssh_user => vm.env.config.ssh.username,
|
15
20
|
:ssh_port => vm.ssh.port,
|
16
21
|
:private_key_path => vm.env.config.ssh.private_key_path
|
data/lib/vagrant/config/vm.rb
CHANGED
data/lib/vagrant/provisioners.rb
CHANGED
@@ -12,14 +12,14 @@ module Vagrant
|
|
12
12
|
vm.ssh.execute do |ssh|
|
13
13
|
# Checks for the existence of chef binary and error if it
|
14
14
|
# doesn't exist.
|
15
|
-
ssh.
|
15
|
+
ssh.sudo!("which #{binary}", :error_class => ChefError, :_key => :chef_not_detected, :binary => binary)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def chown_provisioning_folder
|
20
20
|
vm.ssh.execute do |ssh|
|
21
|
-
ssh.
|
22
|
-
ssh.
|
21
|
+
ssh.sudo!("mkdir -p #{config.provisioning_path}")
|
22
|
+
ssh.sudo!("chown #{env.config.ssh.username} #{config.provisioning_path}")
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -50,7 +50,7 @@ module Vagrant
|
|
50
50
|
path = Pathname.new(config.client_key_path)
|
51
51
|
|
52
52
|
vm.ssh.execute do |ssh|
|
53
|
-
ssh.
|
53
|
+
ssh.sudo!("mkdir -p #{path.dirname}")
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -70,13 +70,14 @@ module Vagrant
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def run_chef_client
|
73
|
-
|
73
|
+
commands = ["cd #{config.provisioning_path}",
|
74
|
+
"chef-client -c client.rb -j dna.json"]
|
74
75
|
|
75
76
|
env.ui.info I18n.t("vagrant.provisioners.chef.running_client")
|
76
77
|
vm.ssh.execute do |ssh|
|
77
|
-
ssh.
|
78
|
+
ssh.sudo!(commands) do |channel, type, data|
|
78
79
|
if type == :exit_status
|
79
|
-
ssh.check_exit_status(data,
|
80
|
+
ssh.check_exit_status(data, commands)
|
80
81
|
else
|
81
82
|
env.ui.info("#{data}: #{type}")
|
82
83
|
end
|
@@ -60,12 +60,12 @@ module Vagrant
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def run_chef_solo
|
63
|
-
|
63
|
+
commands = ["cd #{config.provisioning_path}", "chef-solo -c solo.rb -j dna.json"]
|
64
64
|
|
65
65
|
env.ui.info I18n.t("vagrant.provisioners.chef.running_solo")
|
66
66
|
vm.ssh.execute do |ssh|
|
67
|
-
ssh.
|
68
|
-
ssh.check_exit_status(data,
|
67
|
+
ssh.sudo!(commands) do |channel, type, data|
|
68
|
+
ssh.check_exit_status(data, commands) if type == :exit_status
|
69
69
|
env.ui.info("#{data}: #{type}") if type != :exit_status
|
70
70
|
end
|
71
71
|
end
|
@@ -107,7 +107,7 @@ module Vagrant
|
|
107
107
|
|
108
108
|
def verify_binary(binary)
|
109
109
|
vm.ssh.execute do |ssh|
|
110
|
-
ssh.
|
110
|
+
ssh.sudo!("which #{binary}", :error_class => PuppetError, :_key => :puppet_not_detected, :binary => binary)
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
@@ -117,14 +117,15 @@ module Vagrant
|
|
117
117
|
options << config.computed_manifest_file
|
118
118
|
options = options.join(" ")
|
119
119
|
|
120
|
-
|
120
|
+
commands = ["cd #{manifests_guest_path}",
|
121
|
+
"puppet #{options}"]
|
121
122
|
|
122
123
|
env.ui.info I18n.t("vagrant.provisioners.puppet.running_puppet", :manifest => config.computed_manifest_file)
|
123
124
|
|
124
125
|
vm.ssh.execute do |ssh|
|
125
|
-
ssh.
|
126
|
+
ssh.sudo! commands do |ch, type, data|
|
126
127
|
if type == :exit_status
|
127
|
-
ssh.check_exit_status(data,
|
128
|
+
ssh.check_exit_status(data, commands)
|
128
129
|
else
|
129
130
|
env.ui.info(data)
|
130
131
|
end
|
@@ -26,9 +26,7 @@ module Vagrant
|
|
26
26
|
|
27
27
|
def verify_binary(binary)
|
28
28
|
vm.ssh.execute do |ssh|
|
29
|
-
ssh.
|
30
|
-
sh.execute("sudo -i which #{binary}", :error_class => PuppetServerError, :_key => :puppetd_not_detected, :binary => binary)
|
31
|
-
end
|
29
|
+
ssh.sudo!("which #{binary}", :error_class => PuppetServerError, :_key => :puppetd_not_detected, :binary => binary)
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
@@ -41,13 +39,13 @@ module Vagrant
|
|
41
39
|
cn = env.config.vm.box
|
42
40
|
end
|
43
41
|
|
44
|
-
|
42
|
+
commands = "puppetd #{options} --server #{config.puppet_server} --certname #{cn}"
|
45
43
|
|
46
44
|
env.ui.info I18n.t("vagrant.provisioners.puppet_server.running_puppetd")
|
47
45
|
|
48
46
|
vm.ssh.execute do |ssh|
|
49
|
-
ssh.
|
50
|
-
ssh.check_exit_status(data,
|
47
|
+
ssh.sudo!(commands) do |channel, type, data|
|
48
|
+
ssh.check_exit_status(data, commands) if type == :exit_status
|
51
49
|
env.ui.info(data) if type != :exit_status
|
52
50
|
end
|
53
51
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Provisioners
|
3
|
+
class Shell < Base
|
4
|
+
register :shell
|
5
|
+
|
6
|
+
class Config < Vagrant::Config::Base
|
7
|
+
attr_accessor :path
|
8
|
+
attr_accessor :upload_path
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@upload_path = "/tmp/vagrant-shell"
|
12
|
+
end
|
13
|
+
|
14
|
+
def expanded_path
|
15
|
+
Pathname.new(path).expand_path(env.root_path) if path
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate(errors)
|
19
|
+
super
|
20
|
+
|
21
|
+
if !path
|
22
|
+
errors.add(I18n.t("vagrant.provisioners.shell.path_not_set"))
|
23
|
+
elsif !expanded_path.file?
|
24
|
+
errors.add(I18n.t("vagrant.provisioners.shell.path_invalid", :path => expanded_path))
|
25
|
+
end
|
26
|
+
|
27
|
+
if !upload_path
|
28
|
+
errors.add(I18n.t("vagrant.provisioners.shell.upload_path_not_set"))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def provision!
|
34
|
+
commands = ["chmod +x #{config.upload_path}", config.upload_path]
|
35
|
+
|
36
|
+
# Upload the script to the VM
|
37
|
+
vm.ssh.upload!(config.expanded_path.to_s, config.upload_path)
|
38
|
+
|
39
|
+
# Execute it with sudo
|
40
|
+
vm.ssh.execute do |ssh|
|
41
|
+
ssh.sudo!(commands) do |ch, type, data|
|
42
|
+
if type == :exit_status
|
43
|
+
ssh.check_exit_status(data, commands)
|
44
|
+
else
|
45
|
+
env.ui.info(data)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/vagrant/ssh.rb
CHANGED
@@ -44,7 +44,12 @@ module Vagrant
|
|
44
44
|
"-o StrictHostKeyChecking=no", "-o IdentitiesOnly=yes",
|
45
45
|
"-i #{options[:private_key_path]}"]
|
46
46
|
command_options << "-o ForwardAgent=yes" if env.config.ssh.forward_agent
|
47
|
-
|
47
|
+
|
48
|
+
if env.config.ssh.forward_x11
|
49
|
+
# Both are required so that no warnings are shown regarding X11
|
50
|
+
command_options << "-o ForwardX11=yes"
|
51
|
+
command_options << "-o ForwardX11Trusted=yes"
|
52
|
+
end
|
48
53
|
|
49
54
|
# Some hackery going on here. On Mac OS X Leopard (10.5), exec fails
|
50
55
|
# (GH-51). As a workaround, we fork and wait. On all other platforms,
|
@@ -70,6 +75,7 @@ module Vagrant
|
|
70
75
|
Net::SSH.start(env.config.ssh.host,
|
71
76
|
env.config.ssh.username,
|
72
77
|
opts.merge( :keys => [env.config.ssh.private_key_path],
|
78
|
+
:keys_only => true,
|
73
79
|
:user_known_hosts_file => [],
|
74
80
|
:paranoid => false,
|
75
81
|
:config => false)) do |ssh|
|
data/lib/vagrant/ssh/session.rb
CHANGED
@@ -22,11 +22,55 @@ module Vagrant
|
|
22
22
|
false
|
23
23
|
end
|
24
24
|
|
25
|
+
# Executes a given command on the SSH session using `sudo` and
|
26
|
+
# blocks until the command completes. This takes the same parameters
|
27
|
+
# as {#exec!}. The only difference is that the command can be an
|
28
|
+
# array of commands, which will be placed into the same script.
|
29
|
+
#
|
30
|
+
# This is different than just calling {#exec!} with `sudo`, since
|
31
|
+
# this command is tailor-made to be compliant with older versions
|
32
|
+
# of `sudo`.
|
33
|
+
def sudo!(commands, options=nil, &block)
|
34
|
+
session.open_channel do |ch|
|
35
|
+
ch.exec("sudo -i sh") do |ch2, success|
|
36
|
+
# Output each command as if they were entered on the command line
|
37
|
+
[commands].flatten.each do |command|
|
38
|
+
ch2.send_data "#{command}\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Remember to exit or we'll hang!
|
42
|
+
ch2.send_data "exit\n"
|
43
|
+
|
44
|
+
# Setup the callbacks with our options so we get all the
|
45
|
+
# stdout/stderr and error checking goodies
|
46
|
+
setup_channel_callbacks(ch2, commands, options, block)
|
47
|
+
end
|
48
|
+
|
49
|
+
ch.wait
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
25
53
|
# Executes a given command on the SSH session and blocks until
|
26
54
|
# the command completes. This is an almost line for line copy of
|
27
55
|
# the actual `exec!` implementation, except that this
|
28
56
|
# implementation also reports `:exit_status` to the block if given.
|
29
57
|
def exec!(command, options=nil, &block)
|
58
|
+
retryable(:tries => 5, :on => IOError, :sleep => 0.5) do
|
59
|
+
metach = session.open_channel do |channel|
|
60
|
+
channel.exec(command) do |ch, success|
|
61
|
+
raise "could not execute command: #{command.inspect}" unless success
|
62
|
+
setup_channel_callbacks(ch, command, options, block)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
metach.wait
|
67
|
+
metach[:result]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Sets up the channel callbacks to properly check exit statuses and
|
72
|
+
# callback on stdout/stderr.
|
73
|
+
def setup_channel_callbacks(channel, command, options, block)
|
30
74
|
options = { :error_check => true }.merge(options || {})
|
31
75
|
|
32
76
|
block ||= Proc.new do |ch, type, data|
|
@@ -36,41 +80,30 @@ module Vagrant
|
|
36
80
|
ch[:result] << data if [:stdout, :stderr].include?(type)
|
37
81
|
end
|
38
82
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# Output stdout data to the block
|
45
|
-
channel.on_data do |ch2, data|
|
46
|
-
block.call(ch2, :stdout, data)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Output stderr data to the block
|
50
|
-
channel.on_extended_data do |ch2, type, data|
|
51
|
-
block.call(ch2, :stderr, data)
|
52
|
-
end
|
83
|
+
# Output stdout data to the block
|
84
|
+
channel.on_data do |ch2, data|
|
85
|
+
block.call(ch2, :stdout, data)
|
86
|
+
end
|
53
87
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
end
|
88
|
+
# Output stderr data to the block
|
89
|
+
channel.on_extended_data do |ch2, type, data|
|
90
|
+
block.call(ch2, :stderr, data)
|
91
|
+
end
|
60
92
|
|
61
|
-
|
62
|
-
|
93
|
+
# Output exit status information to the block
|
94
|
+
channel.on_request("exit-status") do |ch2, data|
|
95
|
+
block.call(ch2, :exit_status, data.read_long)
|
63
96
|
end
|
64
97
|
end
|
65
98
|
|
66
99
|
# Checks for an erroroneous exit status and raises an exception
|
67
100
|
# if so.
|
68
|
-
def check_exit_status(exit_status,
|
101
|
+
def check_exit_status(exit_status, commands, options=nil)
|
69
102
|
if exit_status != 0
|
70
103
|
options = {
|
71
104
|
:_error_class => Errors::VagrantError,
|
72
105
|
:_key => :ssh_bad_exit_status,
|
73
|
-
:command =>
|
106
|
+
:command => [commands].flatten.join("\n")
|
74
107
|
}.merge(options || {})
|
75
108
|
|
76
109
|
raise options[:_error_class], options
|
data/lib/vagrant/systems.rb
CHANGED
data/lib/vagrant/systems/base.rb
CHANGED
@@ -21,6 +21,15 @@ module Vagrant
|
|
21
21
|
ssh.exec!("sudo /sbin/ifup eth#{net_options[:adapter]}")
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
def change_host_name(name)
|
26
|
+
vm.ssh.execute do |ssh|
|
27
|
+
if !ssh.test?("sudo hostname | grep '#{name}'")
|
28
|
+
ssh.exec!("sudo sed -i 's/.*$/#{name}/' /etc/hostname")
|
29
|
+
ssh.exec!("sudo service hostname start")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
24
33
|
end
|
25
34
|
end
|
26
35
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Systems
|
3
|
+
# A general Vagrant system implementation for "freebsd".
|
4
|
+
#
|
5
|
+
# Contributed by Kenneth Vestergaard <kvs@binarysolutions.dk>
|
6
|
+
class FreeBSD < Base
|
7
|
+
# A custom config class which will be made accessible via `config.freebsd`
|
8
|
+
# This is not necessary for all system implementers, of course. However,
|
9
|
+
# generally, Vagrant tries to make almost every aspect of its execution
|
10
|
+
# configurable, and this assists that goal.
|
11
|
+
class FreeBSDConfig < Vagrant::Config::Base
|
12
|
+
configures :freebsd
|
13
|
+
|
14
|
+
attr_accessor :halt_timeout
|
15
|
+
attr_accessor :halt_check_interval
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@halt_timeout = 30
|
19
|
+
@halt_check_interval = 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Here for whenever it may be used.
|
24
|
+
class FreeBSDError < Errors::VagrantError
|
25
|
+
error_namespace("vagrant.systems.freebsd")
|
26
|
+
end
|
27
|
+
|
28
|
+
def halt
|
29
|
+
vm.env.ui.info I18n.t("vagrant.systems.freebsd.attempting_halt")
|
30
|
+
vm.ssh.execute do |ssh|
|
31
|
+
ssh.exec!("sudo shutdown -p now")
|
32
|
+
end
|
33
|
+
|
34
|
+
# Wait until the VM's state is actually powered off. If this doesn't
|
35
|
+
# occur within a reasonable amount of time (15 seconds by default),
|
36
|
+
# then simply return and allow Vagrant to kill the machine.
|
37
|
+
count = 0
|
38
|
+
while vm.vm.state != :powered_off
|
39
|
+
count += 1
|
40
|
+
|
41
|
+
return if count >= vm.env.config.freebsd.halt_timeout
|
42
|
+
sleep vm.env.config.freebsd.halt_check_interval
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# TODO: Error/warning about this.
|
47
|
+
# def mount_shared_folder(ssh, name, guestpath)
|
48
|
+
# ssh.exec!("sudo mkdir -p #{guestpath}")
|
49
|
+
# # Using a custom mount method here; could use improvement.
|
50
|
+
# ssh.exec!("sudo mount -t vboxfs v-root #{guestpath}")
|
51
|
+
# ssh.exec!("sudo chown #{vm.env.config.ssh.username} #{guestpath}")
|
52
|
+
# end
|
53
|
+
|
54
|
+
def mount_nfs(ip, folders)
|
55
|
+
folders.each do |name, opts|
|
56
|
+
vm.ssh.execute do |ssh|
|
57
|
+
ssh.exec!("sudo mkdir -p #{opts[:guestpath]}")
|
58
|
+
ssh.exec!("sudo mount #{ip}:#{opts[:hostpath]} #{opts[:guestpath]}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def prepare_host_only_network(net_options=nil)
|
64
|
+
# Remove any previous host only network additions to the
|
65
|
+
# interface file.
|
66
|
+
vm.ssh.execute do |ssh|
|
67
|
+
# Clear out any previous entries
|
68
|
+
ssh.exec!("sudo sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/rc.conf > /tmp/rc.conf")
|
69
|
+
ssh.exec!("sudo mv /tmp/rc.conf /etc/rc.conf")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def enable_host_only_network(net_options)
|
74
|
+
entry = "#VAGRANT-BEGIN\nifconfig_em#{net_options[:adapter]}=\"inet #{net_options[:ip]} netmask #{net_options[:netmask]}\"\n#VAGRANT-END\n"
|
75
|
+
vm.ssh.upload!(StringIO.new(entry), "/tmp/vagrant-network-entry")
|
76
|
+
|
77
|
+
vm.ssh.execute do |ssh|
|
78
|
+
ssh.exec!("sudo su -m root -c 'cat /tmp/vagrant-network-entry >> /etc/rc.conf'")
|
79
|
+
ssh.exec!("sudo ifconfig em#{net_options[:adapter]} inet #{net_options[:ip]} netmask #{net_options[:netmask]}")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -16,7 +16,7 @@ module Vagrant
|
|
16
16
|
vm.ssh.upload!(StringIO.new(entry), "/tmp/vagrant-network-entry")
|
17
17
|
|
18
18
|
vm.ssh.execute do |ssh|
|
19
|
-
ssh.exec!("sudo ln -
|
19
|
+
ssh.exec!("sudo ln -fs /etc/init.d/net.lo /etc/init.d/net.eth#{net_options[:adapter]}")
|
20
20
|
ssh.exec!("sudo /etc/init.d/net.eth#{net_options[:adapter]} stop 2> /dev/null")
|
21
21
|
ssh.exec!("sudo su -c 'cat /tmp/vagrant-network-entry >> /etc/conf.d/net'")
|
22
22
|
ssh.exec!("sudo /etc/init.d/net.eth#{net_options[:adapter]} start")
|
@@ -23,9 +23,17 @@ module Vagrant
|
|
23
23
|
ssh.exec!("sudo /sbin/ifup eth#{net_options[:adapter]}")
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
def change_host_name(name)
|
28
|
+
vm.ssh.execute do |ssh|
|
29
|
+
# Only do this if the hostname is not already set
|
30
|
+
if !ssh.test?("sudo hostname | grep '#{name}'")
|
31
|
+
ssh.exec!("sudo sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
|
32
|
+
ssh.exec!("sudo hostname #{name}")
|
33
|
+
ssh.exec!("sudo sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} @' /etc/hosts")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
26
37
|
end
|
27
38
|
end
|
28
39
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
data/lib/vagrant/version.rb
CHANGED
data/lib/vagrant/vm.rb
CHANGED
@@ -58,10 +58,11 @@ module Vagrant
|
|
58
58
|
elsif system.is_a?(Symbol)
|
59
59
|
# Hard-coded internal systems
|
60
60
|
mapping = {
|
61
|
-
:debian
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
61
|
+
:debian => Systems::Debian,
|
62
|
+
:freebsd => Systems::FreeBSD,
|
63
|
+
:gentoo => Systems::Gentoo,
|
64
|
+
:redhat => Systems::Redhat,
|
65
|
+
:linux => Systems::Linux,
|
65
66
|
:solaris => Systems::Solaris
|
66
67
|
}
|
67
68
|
|
data/templates/locales/en.yml
CHANGED
@@ -102,7 +102,7 @@ en:
|
|
102
102
|
|
103
103
|
For a more detailed guide please consult:
|
104
104
|
|
105
|
-
http://vagrantup.com/docs/getting-started/windows
|
105
|
+
http://vagrantup.com/docs/getting-started/setup/windows.html
|
106
106
|
|
107
107
|
system:
|
108
108
|
invalid_class: |-
|
@@ -133,10 +133,10 @@ en:
|
|
133
133
|
virtualbox_not_detected: |-
|
134
134
|
Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
|
135
135
|
If VirtualBox is installed, it may be an incorrect version. Vagrant currently
|
136
|
-
requires VirtualBox
|
136
|
+
requires VirtualBox 4.0.x. Please install the proper version to continue.
|
137
137
|
virtualbox_not_detected_win64: |-
|
138
138
|
Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed
|
139
|
-
with version
|
139
|
+
with version 4.0.0 or higher.
|
140
140
|
|
141
141
|
Additionally, it appears you're on 64-bit Windows. If this is the case, and
|
142
142
|
VirtualBox is properly installed with the correct version, then please make
|
@@ -320,6 +320,8 @@ en:
|
|
320
320
|
Skipping port forwarding '%{name}'.
|
321
321
|
halt:
|
322
322
|
force: Forcing shutdown of VM...
|
323
|
+
host_name:
|
324
|
+
setting: "Setting host name..."
|
323
325
|
import:
|
324
326
|
importing: Importing base box '%{name}'...
|
325
327
|
failure: |-
|
@@ -489,6 +491,11 @@ en:
|
|
489
491
|
Puppet properly installed.
|
490
492
|
running_puppetd: "Running Puppet agent..."
|
491
493
|
|
494
|
+
shell:
|
495
|
+
path_not_set: "`path` parameter pointing to script file to execute for shell provisioner is required"
|
496
|
+
path_invalid: "`path` for shell provisioner does not exist on the host system: %{path}"
|
497
|
+
upload_path_not_set: "`upload_path` must be set for the shell provisioner."
|
498
|
+
|
492
499
|
systems:
|
493
500
|
base:
|
494
501
|
unsupported_host_only: |-
|
@@ -499,7 +506,10 @@ en:
|
|
499
506
|
Most of the time this is simply due to the fact that no one has contributed
|
500
507
|
back the SSH commands necessary to set this up. Please report a bug and this
|
501
508
|
will be fixed for your distro.
|
502
|
-
|
509
|
+
unsupported_host_name: |-
|
510
|
+
Setting host name is currently only supported on Debian, Ubuntu and RedHat.
|
511
|
+
If you'd like your guest OS to be supported, please open a ticket on the
|
512
|
+
project.
|
503
513
|
linux:
|
504
514
|
attempting_halt: "Attempting graceful shutdown of linux..."
|
505
515
|
mount_fail: "Failed to mount shared folders. `vboxsf` was not available."
|
@@ -512,3 +522,6 @@ en:
|
|
512
522
|
|
513
523
|
solaris:
|
514
524
|
attempting_halt: "Attempting graceful shutdown of solaris..."
|
525
|
+
|
526
|
+
freebsd:
|
527
|
+
attempting_halt: "Attempting graceful shutdown of FreeBSD..."
|
data/templates/ssh_config.erb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class HostNameVMActionTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
@klass = Vagrant::Action::VM::HostName
|
6
|
+
@app, @env = action_env
|
7
|
+
@instance = @klass.new(@app, @env)
|
8
|
+
|
9
|
+
@vm = mock("vm")
|
10
|
+
@env["vm"] = @vm
|
11
|
+
|
12
|
+
@internal_vm = mock("internal")
|
13
|
+
@vm.stubs(:vm).returns(@internal_vm)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "not run anything if no host name is set" do
|
17
|
+
@env["config"].vm.host_name = nil
|
18
|
+
@env["vm"].expects(:system).never
|
19
|
+
@app.expects(:call).with(@env).once
|
20
|
+
|
21
|
+
@instance.call(@env)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "change host name if set" do
|
25
|
+
@env["config"].vm.host_name = "foo"
|
26
|
+
|
27
|
+
system = mock("system")
|
28
|
+
@vm.stubs(:system).returns(system)
|
29
|
+
|
30
|
+
seq = sequence("host_seq")
|
31
|
+
@app.expects(:call).with(@env).in_sequence(seq)
|
32
|
+
system.expects(:change_host_name).with(@env["config"].vm.host_name).in_sequence(seq)
|
33
|
+
|
34
|
+
@instance.call(@env)
|
35
|
+
end
|
36
|
+
end
|
@@ -117,7 +117,7 @@ class ChefServerProvisionerTest < Test::Unit::TestCase
|
|
117
117
|
|
118
118
|
should "create the folder using the dirname of the path" do
|
119
119
|
ssh = mock("ssh")
|
120
|
-
ssh.expects(:
|
120
|
+
ssh.expects(:sudo!).with("mkdir -p #{@path.dirname}").once
|
121
121
|
@vm.ssh.expects(:execute).yields(ssh)
|
122
122
|
@action.create_client_key_folder
|
123
123
|
end
|
@@ -173,12 +173,12 @@ class ChefServerProvisionerTest < Test::Unit::TestCase
|
|
173
173
|
end
|
174
174
|
|
175
175
|
should "cd into the provisioning directory and run chef client" do
|
176
|
-
@ssh.expects(:
|
176
|
+
@ssh.expects(:sudo!).with(["cd #{@config.provisioning_path}", "chef-client -c client.rb -j dna.json"]).once
|
177
177
|
@action.run_chef_client
|
178
178
|
end
|
179
179
|
|
180
180
|
should "check the exit status if that is given" do
|
181
|
-
@ssh.stubs(:
|
181
|
+
@ssh.stubs(:sudo!).yields(nil, :exit_status, :foo)
|
182
182
|
@ssh.expects(:check_exit_status).with(:foo, anything).once
|
183
183
|
@action.run_chef_client
|
184
184
|
end
|
@@ -206,12 +206,12 @@ class ChefSoloProvisionerTest < Test::Unit::TestCase
|
|
206
206
|
end
|
207
207
|
|
208
208
|
should "cd into the provisioning directory and run chef solo" do
|
209
|
-
@ssh.expects(:
|
209
|
+
@ssh.expects(:sudo!).with(["cd #{@config.provisioning_path}", "chef-solo -c solo.rb -j dna.json"]).once
|
210
210
|
@action.run_chef_solo
|
211
211
|
end
|
212
212
|
|
213
213
|
should "check the exit status if that is given" do
|
214
|
-
@ssh.stubs(:
|
214
|
+
@ssh.stubs(:sudo!).yields(nil, :exit_status, :foo)
|
215
215
|
@ssh.expects(:check_exit_status).with(:foo, anything).once
|
216
216
|
@action.run_chef_solo
|
217
217
|
end
|
@@ -73,7 +73,7 @@ class ChefProvisionerTest < Test::Unit::TestCase
|
|
73
73
|
|
74
74
|
should "verify binary exists" do
|
75
75
|
binary = "foo"
|
76
|
-
@ssh.expects(:
|
76
|
+
@ssh.expects(:sudo!).with("which #{binary}", anything)
|
77
77
|
@action.verify_binary(binary)
|
78
78
|
end
|
79
79
|
end
|
@@ -82,8 +82,8 @@ class ChefProvisionerTest < Test::Unit::TestCase
|
|
82
82
|
should "create and chown the folder to the ssh user" do
|
83
83
|
ssh_seq = sequence("ssh_seq")
|
84
84
|
ssh = mock("ssh")
|
85
|
-
ssh.expects(:
|
86
|
-
ssh.expects(:
|
85
|
+
ssh.expects(:sudo!).with("mkdir -p #{@config.provisioning_path}").once.in_sequence(ssh_seq)
|
86
|
+
ssh.expects(:sudo!).with("chown #{@env.config.ssh.username} #{@config.provisioning_path}").once.in_sequence(ssh_seq)
|
87
87
|
@vm.ssh.expects(:execute).yields(ssh)
|
88
88
|
@action.chown_provisioning_folder
|
89
89
|
end
|
@@ -25,13 +25,12 @@ class PuppetServerProvisionerTest < Test::Unit::TestCase
|
|
25
25
|
setup do
|
26
26
|
@ssh = mock("ssh")
|
27
27
|
@shell = mock("shell")
|
28
|
-
@ssh.stubs(:shell).yields(@shell)
|
29
28
|
@vm.ssh.stubs(:execute).yields(@ssh)
|
30
29
|
end
|
31
30
|
|
32
31
|
should "verify binary exists" do
|
33
32
|
binary = "foo"
|
34
|
-
@
|
33
|
+
@ssh.expects(:sudo!).with("which #{binary}", anything)
|
35
34
|
@action.verify_binary(binary)
|
36
35
|
end
|
37
36
|
end
|
@@ -44,24 +43,24 @@ class PuppetServerProvisionerTest < Test::Unit::TestCase
|
|
44
43
|
end
|
45
44
|
|
46
45
|
should "run the puppetd client" do
|
47
|
-
@ssh.expects(:
|
46
|
+
@ssh.expects(:sudo!).with("puppetd --server #{@config.puppet_server} --certname #{@cn}").once
|
48
47
|
@action.run_puppetd_client
|
49
48
|
end
|
50
49
|
|
51
50
|
should "run puppetd with given options when given as an array" do
|
52
51
|
@config.options = ["--modulepath", "modules", "--verbose"]
|
53
|
-
@ssh.expects(:
|
52
|
+
@ssh.expects(:sudo!).with("puppetd --modulepath modules --verbose --server #{@config.puppet_server} --certname #{@cn}").once
|
54
53
|
@action.run_puppetd_client
|
55
54
|
end
|
56
55
|
|
57
56
|
should "run puppetd with the options when given as a string" do
|
58
57
|
@config.options = "--modulepath modules --verbose"
|
59
|
-
@ssh.expects(:
|
58
|
+
@ssh.expects(:sudo!).with("puppetd --modulepath modules --verbose --server #{@config.puppet_server} --certname #{@cn}").once
|
60
59
|
@action.run_puppetd_client
|
61
60
|
end
|
62
61
|
|
63
62
|
should "check the exit status if that is given" do
|
64
|
-
@ssh.stubs(:
|
63
|
+
@ssh.stubs(:sudo!).yields(nil, :exit_status, :foo)
|
65
64
|
@ssh.expects(:check_exit_status).with(:foo, anything).once
|
66
65
|
@action.run_puppetd_client
|
67
66
|
end
|
@@ -138,7 +138,7 @@ class PuppetProvisionerTest < Test::Unit::TestCase
|
|
138
138
|
|
139
139
|
should "verify binary exists" do
|
140
140
|
binary = "foo"
|
141
|
-
@ssh.expects(:
|
141
|
+
@ssh.expects(:sudo!).with("which #{binary}", anything)
|
142
142
|
@action.verify_binary(binary)
|
143
143
|
end
|
144
144
|
end
|
@@ -151,7 +151,7 @@ class PuppetProvisionerTest < Test::Unit::TestCase
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def expect_puppet_command(command)
|
154
|
-
@ssh.expects(:
|
154
|
+
@ssh.expects(:sudo!).with(["cd #{@action.manifests_guest_path}", command])
|
155
155
|
end
|
156
156
|
|
157
157
|
should "cd into the pp_path directory and run puppet" do
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ShellProvisionerTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
clean_paths
|
6
|
+
|
7
|
+
@klass = Vagrant::Provisioners::Shell
|
8
|
+
@action_env = Vagrant::Action::Environment.new(vagrant_env.vms[:default].env)
|
9
|
+
@config = @klass::Config.new
|
10
|
+
@config.top = Vagrant::Config::Top.new(@action_env.env)
|
11
|
+
@action = @klass.new(@action_env, @config)
|
12
|
+
|
13
|
+
@config.path = "foo"
|
14
|
+
end
|
15
|
+
|
16
|
+
context "config" do
|
17
|
+
setup do
|
18
|
+
@errors = Vagrant::Config::ErrorRecorder.new
|
19
|
+
|
20
|
+
# Start in a valid state (verified by a test below)
|
21
|
+
@config.path = "foo"
|
22
|
+
File.open(@config.expanded_path, "w") { |f| f.puts "HELLO" }
|
23
|
+
end
|
24
|
+
|
25
|
+
should "be valid" do
|
26
|
+
@config.validate(@errors)
|
27
|
+
assert @errors.errors.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
should "be invalid if the path is not set" do
|
31
|
+
@config.path = nil
|
32
|
+
|
33
|
+
@config.validate(@errors)
|
34
|
+
assert !@errors.errors.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
should "be invalid if the path does not exist" do
|
38
|
+
@config.path = "bar"
|
39
|
+
|
40
|
+
@config.validate(@errors)
|
41
|
+
assert !@errors.errors.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
should "be invalid if the upload path is not set" do
|
45
|
+
@config.upload_path = nil
|
46
|
+
|
47
|
+
@config.validate(@errors)
|
48
|
+
assert !@errors.errors.empty?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "provisioning" do
|
53
|
+
setup do
|
54
|
+
@ssh = mock("ssh")
|
55
|
+
@action.vm.ssh.stubs(:execute).yields(@ssh)
|
56
|
+
end
|
57
|
+
|
58
|
+
should "upload the file, chmod, then execute it" do
|
59
|
+
commands = ["chmod +x #{@config.upload_path}", @config.upload_path]
|
60
|
+
|
61
|
+
p_seq = sequence("provisioning")
|
62
|
+
@action.vm.ssh.expects(:upload!).with(@config.expanded_path.to_s, @config.upload_path).in_sequence(p_seq)
|
63
|
+
@ssh.expects(:sudo!).with(commands).in_sequence(p_seq)
|
64
|
+
|
65
|
+
@action.provision!
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/test/vagrant/ssh_test.rb
CHANGED
@@ -147,6 +147,7 @@ class SshTest < Test::Unit::TestCase
|
|
147
147
|
assert_equal @env.config.ssh.username, username
|
148
148
|
assert_equal @ssh.port, opts[:port]
|
149
149
|
assert_equal [@env.config.ssh.private_key_path], opts[:keys]
|
150
|
+
assert opts[:keys_only]
|
150
151
|
true
|
151
152
|
end
|
152
153
|
@ssh.execute
|
data/vagrant.gemspec
CHANGED
@@ -18,11 +18,11 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_dependency "erubis", "~> 2.6.6"
|
19
19
|
s.add_dependency "json", "~> 1.4.6"
|
20
20
|
s.add_dependency "mario", "~> 0.0.6"
|
21
|
-
s.add_dependency "net-ssh", "~> 2.0
|
21
|
+
s.add_dependency "net-ssh", "~> 2.1.0"
|
22
22
|
s.add_dependency "net-scp", "~> 1.0.4"
|
23
23
|
s.add_dependency "i18n", "~> 0.5.0"
|
24
24
|
s.add_dependency "thor", "~> 0.14.6"
|
25
|
-
s.add_dependency "virtualbox", "~> 0.8.
|
25
|
+
s.add_dependency "virtualbox", "~> 0.8.3"
|
26
26
|
|
27
27
|
s.add_development_dependency "rake"
|
28
28
|
s.add_development_dependency "contest", ">= 0.1.2"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 1
|
9
|
+
version: 0.7.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mitchell Hashimoto
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-28 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -87,9 +87,9 @@ dependencies:
|
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
segments:
|
89
89
|
- 2
|
90
|
+
- 1
|
90
91
|
- 0
|
91
|
-
|
92
|
-
version: 2.0.23
|
92
|
+
version: 2.1.0
|
93
93
|
type: :runtime
|
94
94
|
prerelease: false
|
95
95
|
version_requirements: *id005
|
@@ -148,8 +148,8 @@ dependencies:
|
|
148
148
|
segments:
|
149
149
|
- 0
|
150
150
|
- 8
|
151
|
-
-
|
152
|
-
version: 0.8.
|
151
|
+
- 3
|
152
|
+
version: 0.8.3
|
153
153
|
type: :runtime
|
154
154
|
prerelease: false
|
155
155
|
version_requirements: *id009
|
@@ -266,6 +266,7 @@ files:
|
|
266
266
|
- lib/vagrant/action/vm/forward_ports.rb
|
267
267
|
- lib/vagrant/action/vm/forward_ports_helpers.rb
|
268
268
|
- lib/vagrant/action/vm/halt.rb
|
269
|
+
- lib/vagrant/action/vm/host_name.rb
|
269
270
|
- lib/vagrant/action/vm/import.rb
|
270
271
|
- lib/vagrant/action/vm/match_mac_address.rb
|
271
272
|
- lib/vagrant/action/vm/network.rb
|
@@ -331,11 +332,13 @@ files:
|
|
331
332
|
- lib/vagrant/provisioners/chef_solo.rb
|
332
333
|
- lib/vagrant/provisioners/puppet.rb
|
333
334
|
- lib/vagrant/provisioners/puppet_server.rb
|
335
|
+
- lib/vagrant/provisioners/shell.rb
|
334
336
|
- lib/vagrant/ssh.rb
|
335
337
|
- lib/vagrant/ssh/session.rb
|
336
338
|
- lib/vagrant/systems.rb
|
337
339
|
- lib/vagrant/systems/base.rb
|
338
340
|
- lib/vagrant/systems/debian.rb
|
341
|
+
- lib/vagrant/systems/freebsd.rb
|
339
342
|
- lib/vagrant/systems/gentoo.rb
|
340
343
|
- lib/vagrant/systems/linux.rb
|
341
344
|
- lib/vagrant/systems/linux/config.rb
|
@@ -394,6 +397,7 @@ files:
|
|
394
397
|
- test/vagrant/action/vm/forward_ports_helpers_test.rb
|
395
398
|
- test/vagrant/action/vm/forward_ports_test.rb
|
396
399
|
- test/vagrant/action/vm/halt_test.rb
|
400
|
+
- test/vagrant/action/vm/host_name_test.rb
|
397
401
|
- test/vagrant/action/vm/import_test.rb
|
398
402
|
- test/vagrant/action/vm/match_mac_address_test.rb
|
399
403
|
- test/vagrant/action/vm/network_test.rb
|
@@ -437,6 +441,7 @@ files:
|
|
437
441
|
- test/vagrant/provisioners/chef_test.rb
|
438
442
|
- test/vagrant/provisioners/puppet_server_test.rb
|
439
443
|
- test/vagrant/provisioners/puppet_test.rb
|
444
|
+
- test/vagrant/provisioners/shell_test.rb
|
440
445
|
- test/vagrant/ssh/session_test.rb
|
441
446
|
- test/vagrant/ssh_test.rb
|
442
447
|
- test/vagrant/systems/base_test.rb
|
@@ -466,7 +471,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
466
471
|
requirements:
|
467
472
|
- - ">="
|
468
473
|
- !ruby/object:Gem::Version
|
469
|
-
hash:
|
474
|
+
hash: 1780875607345345301
|
470
475
|
segments:
|
471
476
|
- 0
|
472
477
|
version: "0"
|