vagrant 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/config/default.rb +10 -4
- data/lib/vagrant/actions/vm/forward_ports.rb +10 -32
- data/lib/vagrant/actions/vm/network.rb +29 -0
- data/lib/vagrant/actions/vm/package.rb +2 -0
- data/lib/vagrant/actions/vm/shared_folders.rb +50 -13
- data/lib/vagrant/config.rb +11 -23
- data/lib/vagrant/environment.rb +1 -1
- data/lib/vagrant/ssh.rb +6 -12
- data/lib/vagrant/systems/base.rb +7 -0
- data/lib/vagrant/systems/linux.rb +21 -26
- data/lib/vagrant/util/template_renderer.rb +1 -1
- data/templates/strings.yml +17 -1
- data/templates/unison/crontab_entry.erb +1 -0
- data/templates/unison/script.erb +71 -0
- data/test/test_helper.rb +5 -4
- data/test/vagrant/actions/vm/forward_ports_test.rb +39 -85
- data/test/vagrant/actions/vm/network_test.rb +67 -13
- data/test/vagrant/actions/vm/package_test.rb +5 -0
- data/test/vagrant/actions/vm/shared_folders_test.rb +113 -44
- data/test/vagrant/config_test.rb +0 -33
- data/test/vagrant/environment_test.rb +4 -4
- data/test/vagrant/ssh_test.rb +2 -13
- data/test/vagrant/systems/linux_test.rb +38 -33
- data/test/vagrant/util/template_renderer_test.rb +6 -0
- data/vagrant.gemspec +53 -53
- metadata +69 -52
- data/templates/crontab_entry.erb +0 -1
- data/templates/sync.erb +0 -14
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ begin
|
|
10
10
|
gemspec.homepage = "http://github.com/mitchellh/vagrant"
|
11
11
|
gemspec.authors = ["Mitchell Hashimoto", "John Bender"]
|
12
12
|
|
13
|
-
gemspec.add_dependency('virtualbox', '~> 0.7.
|
13
|
+
gemspec.add_dependency('virtualbox', '~> 0.7.3')
|
14
14
|
gemspec.add_dependency('net-ssh', '>= 2.0.19')
|
15
15
|
gemspec.add_dependency('net-scp', '>= 1.0.2')
|
16
16
|
gemspec.add_dependency('json', '>= 1.2.0')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.2
|
data/config/default.rb
CHANGED
@@ -27,10 +27,16 @@ Vagrant::Config.run do |config|
|
|
27
27
|
# other Vagrantfiles, if they wish.
|
28
28
|
config.vm.share_folder("v-root", "/vagrant", ".")
|
29
29
|
|
30
|
-
|
31
|
-
config.
|
32
|
-
config.
|
33
|
-
config.
|
30
|
+
config.unison.folder_suffix = ".sync"
|
31
|
+
config.unison.script = "/tmp/vagrant-unison"
|
32
|
+
config.unison.options = "-terse -owner -group -batch"
|
33
|
+
config.unison.crontab_entry_file = "/tmp/vagrant-unison-crontab"
|
34
|
+
config.unison.log_file = "/tmp/v-unison-log-%s"
|
35
|
+
|
36
|
+
# TODO fix these
|
37
|
+
# config.vm.sync_opts = "-terse -group -owner -batch -silent"
|
38
|
+
# config.vm.sync_script = "/tmp/sync"
|
39
|
+
# config.vm.sync_crontab_entry_file = "/tmp/crontab-entry"
|
34
40
|
|
35
41
|
config.package.name = 'vagrant'
|
36
42
|
config.package.extension = '.box'
|
@@ -100,18 +100,10 @@ module Vagrant
|
|
100
100
|
def used_ports
|
101
101
|
result = VirtualBox::VM.all.collect do |vm|
|
102
102
|
if vm.running? && vm.uuid != runner.uuid
|
103
|
-
|
104
|
-
|
105
|
-
vm.forwarded_ports.collect do |fp|
|
103
|
+
vm.network_adapters.collect do |na|
|
104
|
+
na.nat_driver.forwarded_ports.collect do |fp|
|
106
105
|
fp.hostport.to_s
|
107
106
|
end
|
108
|
-
else
|
109
|
-
# VirtualBox 3.2.x uses forwarded ports via NAT engines
|
110
|
-
vm.network_adapters.collect do |na|
|
111
|
-
na.nat_driver.forwarded_ports.collect do |fp|
|
112
|
-
fp.hostport.to_s
|
113
|
-
end
|
114
|
-
end
|
115
107
|
end
|
116
108
|
end
|
117
109
|
end
|
@@ -121,34 +113,20 @@ module Vagrant
|
|
121
113
|
|
122
114
|
# Deletes existing forwarded ports.
|
123
115
|
def clear_ports
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
else
|
128
|
-
runner.vm.network_adapters.each do |na|
|
129
|
-
na.nat_driver.forwarded_ports.dup.each do |fp|
|
130
|
-
fp.destroy
|
131
|
-
end
|
116
|
+
runner.vm.network_adapters.each do |na|
|
117
|
+
na.nat_driver.forwarded_ports.dup.each do |fp|
|
118
|
+
fp.destroy
|
132
119
|
end
|
133
120
|
end
|
134
121
|
end
|
135
122
|
|
136
123
|
# Forwards a port.
|
137
124
|
def forward_port(name, options)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
port.instance = options[:adapter]
|
144
|
-
runner.vm.forwarded_ports << port
|
145
|
-
else
|
146
|
-
port = VirtualBox::NATForwardedPort.new
|
147
|
-
port.name = name
|
148
|
-
port.guestport = options[:guestport]
|
149
|
-
port.hostport = options[:hostport]
|
150
|
-
runner.vm.network_adapters[options[:adapter]].nat_driver.forwarded_ports << port
|
151
|
-
end
|
125
|
+
port = VirtualBox::NATForwardedPort.new
|
126
|
+
port.name = name
|
127
|
+
port.guestport = options[:guestport]
|
128
|
+
port.hostport = options[:hostport]
|
129
|
+
runner.vm.network_adapters[options[:adapter]].nat_driver.forwarded_ports << port
|
152
130
|
end
|
153
131
|
end
|
154
132
|
end
|
@@ -2,6 +2,13 @@ module Vagrant
|
|
2
2
|
module Actions
|
3
3
|
module VM
|
4
4
|
class Network < Base
|
5
|
+
def prepare
|
6
|
+
# Verify that the given network options are valid
|
7
|
+
runner.env.config.vm.network_options.compact.each do |network_options|
|
8
|
+
verify_no_bridge_collision(network_options)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
def before_destroy
|
6
13
|
# We need to check if the host only network specified by any
|
7
14
|
# of the adapters would not have any more clients if it was
|
@@ -55,6 +62,24 @@ module Vagrant
|
|
55
62
|
end
|
56
63
|
end
|
57
64
|
|
65
|
+
# Verifies that there is no collision with a bridged network interface
|
66
|
+
# for the given network options.
|
67
|
+
def verify_no_bridge_collision(net_options)
|
68
|
+
# First try to find a matching network
|
69
|
+
interfaces = VirtualBox::Global.global.host.network_interfaces
|
70
|
+
interfaces.each do |ni|
|
71
|
+
next if ni.interface_type == :host_only
|
72
|
+
|
73
|
+
result = if net_options[:name]
|
74
|
+
true if net_options[:name] == ni.name
|
75
|
+
else
|
76
|
+
true if matching_network?(ni, net_options)
|
77
|
+
end
|
78
|
+
|
79
|
+
raise ActionException.new(:network_collides) if result
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
58
83
|
# Returns the name of the proper host only network, or creates
|
59
84
|
# it if it does not exist. Vagrant determines if the host only
|
60
85
|
# network exists by comparing the netmask and the IP.
|
@@ -62,6 +87,10 @@ module Vagrant
|
|
62
87
|
# First try to find a matching network
|
63
88
|
interfaces = VirtualBox::Global.global.host.network_interfaces
|
64
89
|
interfaces.each do |ni|
|
90
|
+
# Ignore non-host only interfaces which may also match,
|
91
|
+
# since they're not valid options.
|
92
|
+
next if ni.interface_type != :host_only
|
93
|
+
|
65
94
|
if net_options[:name]
|
66
95
|
return ni.name if net_options[:name] == ni.name
|
67
96
|
else
|
@@ -10,6 +10,8 @@ module Vagrant
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def prepare
|
13
|
+
raise ActionException.new(:box_file_exists, :output_file => tar_path) if File.exist?(tar_path)
|
14
|
+
|
13
15
|
# Verify the existance of all the additional files, if any
|
14
16
|
include_files.each do |file|
|
15
17
|
raise ActionException.new(:package_include_file_doesnt_exist, :filename => file) unless File.exists?(file)
|
@@ -2,10 +2,34 @@ module Vagrant
|
|
2
2
|
module Actions
|
3
3
|
module VM
|
4
4
|
class SharedFolders < Base
|
5
|
+
# This method returns an actual list of VirtualBox shared
|
6
|
+
# folders to create and their proper path.
|
5
7
|
def shared_folders
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
runner.env.config.vm.shared_folders.inject({}) do |acc, data|
|
9
|
+
key, value = data
|
10
|
+
|
11
|
+
# This to prevent overwriting the actual shared folders data
|
12
|
+
value = value.dup
|
13
|
+
|
14
|
+
if value[:sync]
|
15
|
+
# Syncing this folder. Change the guestpath to reflect
|
16
|
+
# what we're actually mounting.
|
17
|
+
value[:original] = value.dup
|
18
|
+
value[:guestpath] = "#{value[:guestpath]}#{runner.env.config.unison.folder_suffix}"
|
19
|
+
end
|
20
|
+
|
21
|
+
acc[key] = value
|
22
|
+
acc
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# This method returns the list of shared folders which are to
|
27
|
+
# be synced via unison.
|
28
|
+
def unison_folders
|
29
|
+
shared_folders.inject({}) do |acc, data|
|
30
|
+
key, value = data
|
31
|
+
acc[key] = value if !!value[:sync]
|
32
|
+
acc
|
9
33
|
end
|
10
34
|
end
|
11
35
|
|
@@ -15,17 +39,30 @@ module Vagrant
|
|
15
39
|
end
|
16
40
|
|
17
41
|
def after_boot
|
42
|
+
mount_shared_folders
|
43
|
+
setup_unison
|
44
|
+
end
|
45
|
+
|
46
|
+
def mount_shared_folders
|
18
47
|
logger.info "Mounting shared folders..."
|
19
48
|
|
20
49
|
@runner.ssh.execute do |ssh|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
50
|
+
shared_folders.each do |name, data|
|
51
|
+
logger.info "-- #{name}: #{data[:guestpath]}"
|
52
|
+
@runner.system.mount_shared_folder(ssh, name, data[:guestpath])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def setup_unison
|
58
|
+
return if unison_folders.empty?
|
59
|
+
|
60
|
+
runner.ssh.execute do |ssh|
|
61
|
+
runner.system.prepare_unison(ssh)
|
62
|
+
|
63
|
+
logger.info "Creating unison crontab entries..."
|
64
|
+
unison_folders.each do |name, data|
|
65
|
+
runner.system.create_unison(ssh, data)
|
29
66
|
end
|
30
67
|
end
|
31
68
|
end
|
@@ -46,10 +83,10 @@ module Vagrant
|
|
46
83
|
def create_metadata
|
47
84
|
logger.info "Creating shared folders metadata..."
|
48
85
|
|
49
|
-
shared_folders.each do |name,
|
86
|
+
shared_folders.each do |name, data|
|
50
87
|
folder = VirtualBox::SharedFolder.new
|
51
88
|
folder.name = name
|
52
|
-
folder.host_path = hostpath
|
89
|
+
folder.host_path = File.expand_path(data[:hostpath], runner.env.root_path)
|
53
90
|
@runner.vm.shared_folders << folder
|
54
91
|
end
|
55
92
|
|
data/lib/vagrant/config.rb
CHANGED
@@ -77,6 +77,14 @@ module Vagrant
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
class UnisonConfig < Base
|
81
|
+
attr_accessor :folder_suffix
|
82
|
+
attr_accessor :script
|
83
|
+
attr_accessor :options
|
84
|
+
attr_accessor :crontab_entry_file
|
85
|
+
attr_accessor :log_file
|
86
|
+
end
|
87
|
+
|
80
88
|
class VMConfig < Base
|
81
89
|
include Util::StackedProcRunner
|
82
90
|
|
@@ -85,10 +93,6 @@ module Vagrant
|
|
85
93
|
attr_accessor :box_ovf
|
86
94
|
attr_accessor :base_mac
|
87
95
|
attr_accessor :boot_mode
|
88
|
-
attr_accessor :sync_opts
|
89
|
-
attr_accessor :sync_script
|
90
|
-
attr_accessor :sync_crontab_entry_file
|
91
|
-
attr_reader :sync_required
|
92
96
|
attr_reader :forwarded_ports
|
93
97
|
attr_reader :shared_folders
|
94
98
|
attr_reader :network_options
|
@@ -128,19 +132,11 @@ module Vagrant
|
|
128
132
|
forwarded_ports[name] = options
|
129
133
|
end
|
130
134
|
|
131
|
-
def share_folder(name, guestpath, hostpath
|
132
|
-
guestpath, opts[:sync] = shift(guestpath, opts[:sync])
|
133
|
-
|
134
|
-
# TODO if both are nil the exception information will be unusable
|
135
|
-
if opts[:sync] == guestpath
|
136
|
-
raise Exception.new("The sync directory #{opts[:sync]} is identical to the shifted shared folder mount point #{guestpath}")
|
137
|
-
end
|
138
|
-
|
135
|
+
def share_folder(name, guestpath, hostpath, opts=nil)
|
139
136
|
@shared_folders[name] = {
|
140
|
-
:syncpath => opts[:sync],
|
141
137
|
:guestpath => guestpath,
|
142
138
|
:hostpath => hostpath
|
143
|
-
}
|
139
|
+
}.merge(opts || {})
|
144
140
|
end
|
145
141
|
|
146
142
|
def network(ip, options=nil)
|
@@ -185,15 +181,6 @@ module Vagrant
|
|
185
181
|
defined_vms[name.to_sym].options.merge!(options)
|
186
182
|
defined_vms[name.to_sym].push_proc(&block)
|
187
183
|
end
|
188
|
-
|
189
|
-
def shift(orig, sync)
|
190
|
-
if sync
|
191
|
-
@sync_required = true
|
192
|
-
[orig + '-sync', sync == true ? orig : sync]
|
193
|
-
else
|
194
|
-
[orig, sync]
|
195
|
-
end
|
196
|
-
end
|
197
184
|
end
|
198
185
|
|
199
186
|
class PackageConfig < Base
|
@@ -228,6 +215,7 @@ module Vagrant
|
|
228
215
|
# Setup default configures
|
229
216
|
configures :package, PackageConfig
|
230
217
|
configures :ssh, SSHConfig
|
218
|
+
configures :unison, UnisonConfig
|
231
219
|
configures :vm, VMConfig
|
232
220
|
configures :vagrant, VagrantConfig
|
233
221
|
|
data/lib/vagrant/environment.rb
CHANGED
@@ -40,7 +40,7 @@ module Vagrant
|
|
40
40
|
version = VirtualBox.version
|
41
41
|
if version.nil?
|
42
42
|
error_and_exit(:virtualbox_not_detected)
|
43
|
-
elsif version.to_f < 3.
|
43
|
+
elsif version.to_f < 3.2
|
44
44
|
error_and_exit(:virtualbox_invalid_version, :version => version.to_s)
|
45
45
|
elsif version.to_s.downcase.include?("ose")
|
46
46
|
error_and_exit(:virtualbox_invalid_ose, :version => version.to_s)
|
data/lib/vagrant/ssh.rb
CHANGED
@@ -24,6 +24,7 @@ module Vagrant
|
|
24
24
|
end
|
25
25
|
|
26
26
|
options = {}
|
27
|
+
options[:port] = port(opts)
|
27
28
|
[:host, :username, :private_key_path].each do |param|
|
28
29
|
options[param] = opts[param] || env.config.ssh.send(param)
|
29
30
|
end
|
@@ -35,7 +36,7 @@ module Vagrant
|
|
35
36
|
# we simply exec.
|
36
37
|
pid = nil
|
37
38
|
pid = fork if Util::Platform.leopard?
|
38
|
-
Kernel.exec "ssh -p #{port
|
39
|
+
Kernel.exec "ssh -p #{options[:port]} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i #{options[:private_key_path]} #{options[:username]}@#{options[:host]}".strip if pid.nil?
|
39
40
|
Process.wait(pid) if pid
|
40
41
|
end
|
41
42
|
|
@@ -132,20 +133,13 @@ module Vagrant
|
|
132
133
|
return pnum if pnum
|
133
134
|
|
134
135
|
# Check if we have an SSH forwarded port
|
135
|
-
|
136
|
-
|
136
|
+
pnum = nil
|
137
|
+
env.vm.vm.network_adapters.each do |na|
|
138
|
+
pnum = na.nat_driver.forwarded_ports.detect do |fp|
|
137
139
|
fp.name == env.config.ssh.forwarded_port_key
|
138
140
|
end
|
139
|
-
else
|
140
|
-
# VirtualBox 3.2 specific
|
141
|
-
pnum = nil
|
142
|
-
env.vm.vm.network_adapters.each do |na|
|
143
|
-
pnum = na.nat_driver.forwarded_ports.detect do |fp|
|
144
|
-
fp.name == env.config.ssh.forwarded_port_key
|
145
|
-
end
|
146
141
|
|
147
|
-
|
148
|
-
end
|
142
|
+
break if pnum
|
149
143
|
end
|
150
144
|
|
151
145
|
return pnum.hostport if pnum
|
data/lib/vagrant/systems/base.rb
CHANGED
@@ -55,6 +55,13 @@ module Vagrant
|
|
55
55
|
# wants the folder mounted.
|
56
56
|
def mount_shared_folder(ssh, name, guestpath); end
|
57
57
|
|
58
|
+
# Prepares the system for unison folder syncing. This is called
|
59
|
+
# once once prior to any `create_unison` calls.
|
60
|
+
def prepare_unison(ssh); end
|
61
|
+
|
62
|
+
# Creates an entry for folder syncing via unison.
|
63
|
+
def create_unison(ssh, options); end
|
64
|
+
|
58
65
|
# Prepares the system for host only networks. This is called
|
59
66
|
# once prior to any `enable_host_only_network` calls.
|
60
67
|
def prepare_host_only_network; end
|
@@ -17,7 +17,7 @@ module Vagrant
|
|
17
17
|
attr_accessor :halt_check_interval
|
18
18
|
|
19
19
|
def initialize
|
20
|
-
@halt_timeout =
|
20
|
+
@halt_timeout = 30
|
21
21
|
@halt_check_interval = 1
|
22
22
|
end
|
23
23
|
end
|
@@ -49,24 +49,31 @@ module Vagrant
|
|
49
49
|
def mount_shared_folder(ssh, name, guestpath)
|
50
50
|
ssh.exec!("sudo mkdir -p #{guestpath}")
|
51
51
|
mount_folder(ssh, name, guestpath)
|
52
|
-
chown
|
52
|
+
ssh.exec!("sudo chown #{config.ssh.username} #{guestpath}")
|
53
53
|
end
|
54
54
|
|
55
|
-
def
|
56
|
-
|
57
|
-
:scriptname => config.vm.sync_script))
|
55
|
+
def prepare_unison(ssh)
|
56
|
+
ssh.exec!("which unison", :error_key => :unison_not_found)
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
ssh.exec!("sudo
|
62
|
-
ssh.exec!("
|
58
|
+
logger.info "Preparing system for unison sync..."
|
59
|
+
vm.ssh.upload!(StringIO.new(TemplateRenderer.render('/unison/script')), config.unison.script)
|
60
|
+
ssh.exec!("sudo chmod +x #{config.unison.script}")
|
61
|
+
ssh.exec!("sudo rm #{config.unison.crontab_entry_file}", :error_check => false)
|
63
62
|
end
|
64
63
|
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
def create_unison(ssh, opts)
|
65
|
+
sanitized_string = opts[:original][:guestpath].gsub(/[^a-zA-Z0-9_-]/, '-')
|
66
|
+
crontab_entry = TemplateRenderer.render('/unison/crontab_entry',
|
67
|
+
:from => opts[:guestpath],
|
68
|
+
:to => opts[:original][:guestpath],
|
69
|
+
:options => config.unison.options,
|
70
|
+
:script => config.unison.script,
|
71
|
+
:log_file => (config.unison.log_file % sanitized_string))
|
72
|
+
|
73
|
+
ssh.exec!("sudo rm -rf ~/.unison")
|
74
|
+
ssh.exec!("sudo rm -rf #{opts[:original][:guestpath]}")
|
75
|
+
ssh.exec!("sudo echo \"#{crontab_entry}\" >> #{config.unison.crontab_entry_file}")
|
76
|
+
ssh.exec!("crontab #{config.unison.crontab_entry_file}")
|
70
77
|
end
|
71
78
|
|
72
79
|
def prepare_host_only_network
|
@@ -117,21 +124,9 @@ module Vagrant
|
|
117
124
|
end
|
118
125
|
end
|
119
126
|
|
120
|
-
def chown(ssh, dir)
|
121
|
-
ssh.exec!("sudo chown #{config.ssh.username} #{dir}")
|
122
|
-
end
|
123
|
-
|
124
127
|
def config
|
125
128
|
vm.env.config
|
126
129
|
end
|
127
|
-
|
128
|
-
def render_sync
|
129
|
-
TemplateRenderer.render('sync')
|
130
|
-
end
|
131
|
-
|
132
|
-
def render_crontab_entry(opts)
|
133
|
-
TemplateRenderer.render('crontab_entry', opts)
|
134
|
-
end
|
135
130
|
end
|
136
131
|
end
|
137
132
|
end
|