veewee 0.3.0.alpha8 → 0.3.0.alpha9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +5 -0
- data/Rakefile +41 -1
- data/bin/veewee +1 -1
- data/doc/kvm.md +9 -1
- data/doc/vagrant.md +5 -5
- data/lib/veewee/command/vagrant/basebox.rb +2 -0
- data/lib/veewee/command/vagrant/build.rb +3 -0
- data/lib/veewee/command/vagrant/export.rb +10 -0
- data/lib/veewee/command/vagrant/screenshot.rb +45 -0
- data/lib/veewee/command/virtualbox.rb +13 -0
- data/lib/veewee/config.rb +2 -2
- data/lib/veewee/provider/core/box/build.rb +29 -16
- data/lib/veewee/provider/core/box/exec.rb +4 -4
- data/lib/veewee/provider/core/box/floppy.rb +1 -1
- data/lib/veewee/provider/core/helper/iso.rb +14 -10
- data/lib/veewee/provider/core/helper/ssh.rb +6 -5
- data/lib/veewee/provider/core/helper/tcp.rb +5 -3
- data/lib/veewee/provider/kvm/box/destroy.rb +1 -1
- data/lib/veewee/provider/parallels/box/destroy.rb +1 -2
- data/lib/veewee/provider/virtualbox/box.rb +1 -0
- data/lib/veewee/provider/virtualbox/box/build.rb +1 -1
- data/lib/veewee/provider/virtualbox/box/destroy.rb +1 -3
- data/lib/veewee/provider/virtualbox/box/export_vagrant.rb +3 -2
- data/lib/veewee/provider/virtualbox/box/helper/console_type.rb +5 -5
- data/lib/veewee/provider/virtualbox/box/helper/natinterface.rb +1 -1
- data/lib/veewee/provider/virtualbox/box/screenshot.rb +24 -0
- data/lib/veewee/provider/virtualbox/box/up.rb +2 -3
- data/lib/veewee/provider/vmfusion/box/destroy.rb +1 -2
- data/lib/veewee/provider/vmfusion/box/helper/vnc.rb +1 -1
- data/lib/veewee/templates.rb +1 -1
- data/lib/veewee/version.rb +1 -1
- data/templates/CentOS-4.8-i386/definition.rb +1 -1
- data/templates/CentOS-5.5-i386-netboot/definition.rb +1 -1
- data/templates/CentOS-5.5-x86_64-netboot/definition.rb +1 -1
- data/templates/CentOS-5.7-i386-netboot/definition.rb +1 -1
- data/templates/CentOS-5.7-i386-netboot/ks.cfg +2 -0
- data/templates/CentOS-5.7-x86_64-netboot/definition.rb +1 -1
- data/templates/CentOS-5.7-x86_64-netboot/ks.cfg +3 -1
- data/templates/CentOS-5.8-i386-netboot/definition.rb +16 -0
- data/templates/CentOS-5.8-i386-netboot/ks.cfg +47 -0
- data/templates/CentOS-5.8-i386-netboot/postinstall.sh +53 -0
- data/templates/CentOS-5.8-i386/definition.rb +16 -0
- data/templates/CentOS-5.8-i386/ks.cfg +47 -0
- data/templates/CentOS-5.8-i386/postinstall.sh +53 -0
- data/templates/CentOS-5.8-x86_64-netboot/definition.rb +16 -0
- data/templates/CentOS-5.8-x86_64-netboot/ks.cfg +47 -0
- data/templates/CentOS-5.8-x86_64-netboot/postinstall.sh +53 -0
- data/templates/CentOS-5.8-x86_64/definition.rb +16 -0
- data/templates/CentOS-5.8-x86_64/ks.cfg +47 -0
- data/templates/CentOS-5.8-x86_64/postinstall.sh +60 -0
- data/templates/Debian-6.0.4-i386-netboot/ruby.sh +1 -1
- data/templates/Fedora-16-i386/definition.rb +1 -1
- data/templates/Fedora-16-x86_64/definition.rb +1 -1
- data/templates/archlinux-x86_64/definition.rb +1 -1
- data/templates/ubuntu-11.04-server-amd64/ruby.sh +4 -4
- data/templates/ubuntu-11.04-server-i386/postinstall.sh +12 -12
- data/templates/ubuntu-12.04-server-amd64-packages/definition.rb +3 -3
- data/templates/ubuntu-12.04-server-amd64/definition.rb +3 -3
- data/templates/ubuntu-12.04-server-i386/definition.rb +37 -0
- data/templates/ubuntu-12.04-server-i386/postinstall.sh +93 -0
- data/templates/ubuntu-12.04-server-i386/preseed.cfg +87 -0
- data/templates/windows-2008R2-amd64/definition.rb +1 -1
- metadata +20 -3
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -25,7 +25,7 @@ Rake::TestTask.new do |t|
|
|
25
25
|
end
|
26
26
|
|
27
27
|
desc 'Verify ISO'
|
28
|
-
task :iso, [:
|
28
|
+
task :iso, [:template_name] do |t,args|
|
29
29
|
require 'net/http'
|
30
30
|
#if args.to_hash.size!=1
|
31
31
|
#puts "needs one arguments: rake iso [\"yourname\"]"
|
@@ -63,3 +63,43 @@ task :iso, [:box_name] do |t,args|
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
66
|
+
|
67
|
+
desc 'Autobuilds all templates and runs validation.'
|
68
|
+
task :autotest, [:pattern] do |t,args|
|
69
|
+
|
70
|
+
# We overrule all timeouts for tcp and ssh
|
71
|
+
#ENV['VEEWEE_TIMEOUT']='600'
|
72
|
+
|
73
|
+
ve=Veewee::Environment.new()
|
74
|
+
ve.templates.each do |name,template|
|
75
|
+
|
76
|
+
# If pattern was given, only take the ones that match the pattern
|
77
|
+
unless args[:pattern].nil?
|
78
|
+
next unless name.match(args[:pattern])
|
79
|
+
end
|
80
|
+
|
81
|
+
begin
|
82
|
+
ve.definitions.define("auto",name, { 'force' => true})
|
83
|
+
vd=ve.definitions["auto"]
|
84
|
+
box=ve.providers["virtualbox"].get_box("auto")
|
85
|
+
puts "AUTO: Building #{name}"
|
86
|
+
box.build({"auto" => true,"force" => true, 'nogui' => true })
|
87
|
+
puts "AUTO: Validating #{name}"
|
88
|
+
box.validate_vagrant
|
89
|
+
puts "AUTO: Success #{name}"
|
90
|
+
box.destroy
|
91
|
+
rescue Exception => ex
|
92
|
+
puts "AUTO: Template #{name} failed - #{ex}"
|
93
|
+
if box.running?
|
94
|
+
begin
|
95
|
+
screenshot="screenshot-auto-#{name}.png"
|
96
|
+
puts "AUTO: Taking snapshot #{screenshot}"
|
97
|
+
box.screenshot(screenshot)
|
98
|
+
rescue Veewee::Error => ex
|
99
|
+
puts "AUTO: Error taking screenshot"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
data/bin/veewee
CHANGED
data/doc/kvm.md
CHANGED
data/doc/vagrant.md
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
Let's define a Ubuntu 10.10 server i386 basebox called myunbuntubox
|
3
3
|
this is essentially making a copy based on the templates provided above.
|
4
4
|
|
5
|
-
$ veewee vbox
|
5
|
+
$ veewee vbox define 'myubuntubox' 'ubuntu-10.10-server-i386'
|
6
6
|
The basebox 'myubuntubox' has been succesfully created from the template ''ubuntu-10.10-server-i386'
|
7
7
|
You can now edit the definition files stored in definitions/myubuntubox
|
8
8
|
or build the box with:
|
9
|
-
veewee vbox
|
9
|
+
veewee vbox build 'myubuntubox'
|
10
10
|
|
11
11
|
-> This copies over the templates/ubuntu-10.10-server-i386 to definition/myubuntubox
|
12
12
|
|
@@ -47,7 +47,7 @@ If you need to change values in the templates, be sure to run the rake undefine,
|
|
47
47
|
## Getting the cdrom file in place
|
48
48
|
Put your isofile inside the 'currentdir'/iso directory or if you don't run
|
49
49
|
|
50
|
-
$ veewee vbox
|
50
|
+
$ veewee vbox build 'myubuntubox'
|
51
51
|
|
52
52
|
- the build assumes your iso files are in 'currentdir'/iso
|
53
53
|
- if it can not find it will suggest to download the iso for you
|
@@ -55,7 +55,7 @@ Put your isofile inside the 'currentdir'/iso directory or if you don't run
|
|
55
55
|
|
56
56
|
## Build the new box:
|
57
57
|
|
58
|
-
$ veewee vbox
|
58
|
+
$ veewee vbox build 'myubuntubox'
|
59
59
|
|
60
60
|
- This will create a machine + disk according to the definition.rb
|
61
61
|
- Note: :os_type_id = The internal Name Virtualbox uses for that Distribution
|
@@ -108,7 +108,7 @@ If you don't use rvm, be sure to execute vagrant through bundle exec
|
|
108
108
|
|
109
109
|
Start of an existing one
|
110
110
|
|
111
|
-
$ veewee vbox
|
111
|
+
$ veewee vbox define 'mynewos' 'ubuntu...'
|
112
112
|
|
113
113
|
- Do changes in the currentdir/definitions/mynewos
|
114
114
|
- When it builds ok, move the definition/mynewos to a sensible directory under templates
|
@@ -12,6 +12,7 @@ require 'veewee/command/vagrant/define'
|
|
12
12
|
require 'veewee/command/vagrant/undefine'
|
13
13
|
require 'veewee/command/vagrant/validate'
|
14
14
|
require 'veewee/command/vagrant/export'
|
15
|
+
require 'veewee/command/vagrant/screenshot'
|
15
16
|
|
16
17
|
|
17
18
|
module Veewee
|
@@ -36,6 +37,7 @@ module Veewee
|
|
36
37
|
@subcommands.register(:undefine) { Veewee::Command::Vagrant::Undefine }
|
37
38
|
@subcommands.register(:export) { Veewee::Command::Vagrant::Export }
|
38
39
|
@subcommands.register(:validate) { Veewee::Command::Vagrant::Validate }
|
40
|
+
@subcommands.register(:screenshot) { Veewee::Command::Vagrant::Screenshot }
|
39
41
|
|
40
42
|
end
|
41
43
|
|
@@ -6,6 +6,8 @@ module Veewee
|
|
6
6
|
class Export < ::Vagrant::Command::Base
|
7
7
|
def execute
|
8
8
|
options = {}
|
9
|
+
options['include'] = []
|
10
|
+
options['vagrantfile'] = []
|
9
11
|
|
10
12
|
opts = OptionParser.new do |opts|
|
11
13
|
opts.banner = "Exports basebox to the vagrant box format"
|
@@ -20,6 +22,14 @@ module Veewee
|
|
20
22
|
options['force'] = f
|
21
23
|
end
|
22
24
|
|
25
|
+
opts.on( "--vagrantfile [FILE]", "vagrantfile") do |f|
|
26
|
+
options['vagrantfile'] = f
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on("-i", "--include [FILE]", "include") do |f|
|
30
|
+
options['include'] << f
|
31
|
+
end
|
32
|
+
|
23
33
|
end
|
24
34
|
|
25
35
|
# Parse the options
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Veewee
|
4
|
+
module Command
|
5
|
+
module Vagrant
|
6
|
+
class Screenshot < ::Vagrant::Command::Base
|
7
|
+
def execute
|
8
|
+
options = {}
|
9
|
+
|
10
|
+
opts = OptionParser.new do |opts|
|
11
|
+
opts.banner = "Grab a screenshot of a running basebox"
|
12
|
+
opts.separator ""
|
13
|
+
opts.separator "Usage: vagrant basebox screenshot <boxname> <pngfile>"
|
14
|
+
|
15
|
+
opts.on("-d", "--debug", "enable debugging") do |d|
|
16
|
+
options['debug'] = d
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("-f", "--force", "force overwrite") do |f|
|
20
|
+
options['force'] = f
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
# Parse the options
|
26
|
+
argv = parse_options(opts)
|
27
|
+
return if !argv
|
28
|
+
raise ::Vagrant::Errors::CLIInvalidUsage, :help => opts.help.chomp if argv.length < 2
|
29
|
+
|
30
|
+
begin
|
31
|
+
venv=Veewee::Environment.new(options)
|
32
|
+
venv.ui=@env.ui
|
33
|
+
box_name=argv[0]
|
34
|
+
pngfilename=argv[1]
|
35
|
+
venv.providers["virtualbox"].get_box(box_name).screenshot(pngfilename)
|
36
|
+
rescue Veewee::Error => ex
|
37
|
+
venv.ui.error(ex,:prefix => false)
|
38
|
+
exit -1
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -126,6 +126,19 @@ module Veewee
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
+
desc "screenshot [NAME] [PNGFILENAME]", "Takes a screenshot of the box"
|
130
|
+
def screenshot(box_name,pngfilename)
|
131
|
+
begin
|
132
|
+
venv=Veewee::Environment.new(options)
|
133
|
+
venv.ui = ::Veewee::UI::Shell.new(venv, shell)
|
134
|
+
|
135
|
+
venv.providers["virtualbox"].get_box(box_name).screenshot(pngfilename,options)
|
136
|
+
rescue Veewee::Error => ex
|
137
|
+
venv.ui.error(ex, :prefix => false)
|
138
|
+
exit -1
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
129
142
|
|
130
143
|
end
|
131
144
|
|
data/lib/veewee/config.rb
CHANGED
@@ -48,11 +48,11 @@ module Veewee
|
|
48
48
|
env.ui.error "Some method got an error in the configfile - Sorry"
|
49
49
|
env.ui.error $!
|
50
50
|
env.ui.error e.message
|
51
|
-
|
51
|
+
raise Veewee::Error "Some method got an error in the configfile - Sorry"
|
52
52
|
rescue Error => e
|
53
53
|
env.ui.error "Error processing configfile - Sorry"
|
54
54
|
env.ui.error e.message
|
55
|
-
|
55
|
+
raise Veewee::Error "Error processing configfile - Sorry"
|
56
56
|
end
|
57
57
|
return self
|
58
58
|
end
|
@@ -75,8 +75,11 @@ module Veewee
|
|
75
75
|
end
|
76
76
|
|
77
77
|
self.transfer_buildinfo(options)
|
78
|
-
self.handle_postinstall(options)
|
79
78
|
|
79
|
+
# Filtering post install files based upon --postinstall-include and --postinstall--exclude
|
80
|
+
definition.postinstall_files=filter_postinstall_files(options)
|
81
|
+
|
82
|
+
self.handle_postinstall(options)
|
80
83
|
|
81
84
|
ui.success "The box #{name} was built succesfully!"
|
82
85
|
ui.info "You can now login to the box with:"
|
@@ -158,8 +161,6 @@ module Veewee
|
|
158
161
|
# It requires a definition to find all the necessary information
|
159
162
|
def handle_kickstart(options)
|
160
163
|
|
161
|
-
# Filtering post install files based upon --postinstall-include and --postinstall--exclude
|
162
|
-
definition.postinstall_files=filter_postinstall_files(options)
|
163
164
|
# Handling the kickstart by web
|
164
165
|
kickstartfiles=definition.kickstart_file
|
165
166
|
|
@@ -191,32 +192,44 @@ module Veewee
|
|
191
192
|
# This function handles all the post-install scripts
|
192
193
|
# It requires a box(to login to) and a definition(listing the postinstall files)
|
193
194
|
def handle_postinstall(options)
|
194
|
-
|
195
|
-
|
195
|
+
|
196
|
+
# Transfer all postinstall files
|
196
197
|
definition.postinstall_files.each do |postinstall_file|
|
197
198
|
# Filenames of postinstall_files are relative to their definition
|
198
199
|
filename=File.join(definition.path,postinstall_file)
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
200
|
+
self.scp(filename,File.basename(filename))
|
201
|
+
self.exec("chmod +x \"#{File.basename(filename)}\"")
|
202
|
+
end
|
203
|
+
|
204
|
+
# Prepare a pre_poinstall file if needed (not nil , or not empty)
|
205
|
+
unless definition.pre_postinstall_file.to_s.empty?
|
206
|
+
pre_filename=File.join(definition.path, definition.pre_postinstall_file)
|
207
|
+
self.scp(pre_filename,File.basename(pre_filename))
|
208
|
+
self.exec("chmod +x \"#{File.basename(pre_filename)}\"")
|
209
|
+
# Inject the call to the real script by executing the first argument (it will be the postinstall script file name to be executed)
|
210
|
+
self.exec("execute=\"\\n# We must execute the script passed as the first argument\\n\\$1\" && printf \"%b\\n\" \"$execute\" >> #{File.basename(pre_filename)}")
|
211
|
+
end
|
212
|
+
|
213
|
+
# Now iterate over the postinstall files
|
214
|
+
definition.postinstall_files.each do |postinstall_file|
|
215
|
+
# Filenames of postinstall_files are relative to their definition
|
216
|
+
filename=File.join(definition.path,postinstall_file)
|
217
|
+
|
218
|
+
unless File.basename(postinstall_file).start_with?("_")
|
219
|
+
|
220
|
+
unless definition.pre_postinstall_file.to_s.empty?
|
203
221
|
# Filename of pre_postinstall_file are relative to their definition
|
204
222
|
pre_filename=File.join(definition.path, definition.pre_postinstall_file)
|
205
223
|
# Upload the pre postinstall script if not already transfered
|
206
|
-
if !transfered
|
207
|
-
self.scp(pre_filename,File.basename(pre_filename))
|
208
|
-
transfered = true
|
209
|
-
self.exec("chmod +x \"#{File.basename(pre_filename)}\"")
|
210
|
-
# Inject the call to the real script by executing the first argument (it will be the postinstall script file name to be executed)
|
211
|
-
self.exec("execute=\"\\n# We must execute the script passed as the first argument\\n\\$1\" && printf \"%b\\n\" \"$execute\" >> #{File.basename(pre_filename)}")
|
212
|
-
end
|
213
224
|
command = "./" + File.basename(pre_filename)
|
214
225
|
command = sudo(command) + " ./"+File.basename(filename)
|
215
226
|
else
|
216
227
|
command = "./"+File.basename(filename)
|
217
228
|
command = sudo(command)
|
218
229
|
end
|
230
|
+
|
219
231
|
self.exec(command)
|
232
|
+
|
220
233
|
else
|
221
234
|
env.logger.info "Skipping postinstallfile #{postinstall_file}"
|
222
235
|
end
|
@@ -18,13 +18,13 @@ module Veewee
|
|
18
18
|
result=self.ssh_execute(self.ip_address,command,new_options)
|
19
19
|
return result
|
20
20
|
rescue RuntimeError => ex
|
21
|
-
|
22
|
-
|
21
|
+
error= "Error executing command #{command} : #{ex}"
|
22
|
+
error+="\n"+ex
|
23
|
+
raise Veewee::SshError, error
|
23
24
|
end
|
24
25
|
end
|
25
26
|
rescue Net::SSH::AuthenticationFailed => ex
|
26
|
-
|
27
|
-
raise Veewee::SshError, ex
|
27
|
+
raise Veewee::SshError, "Authentication failure\n"+ex
|
28
28
|
end
|
29
29
|
|
30
30
|
end
|
@@ -20,7 +20,7 @@ module Veewee
|
|
20
20
|
env.logger.info "Removing previous floppy file"
|
21
21
|
FileUtils.rm(floppy_file)
|
22
22
|
end
|
23
|
-
command="java -jar #{javacode_dir}/dir2floppy.jar
|
23
|
+
command="java -jar #{javacode_dir}/dir2floppy.jar \"#{temp_dir}\" \"#{floppy_file}\""
|
24
24
|
shell_exec("#{command}")
|
25
25
|
end
|
26
26
|
end
|
@@ -37,7 +37,7 @@ module Veewee
|
|
37
37
|
:progress_proc => lambda {|s|
|
38
38
|
pbar.set s if pbar
|
39
39
|
}) { |src|
|
40
|
-
# We assume large 10K files, so this is tempfile object
|
40
|
+
# We assume large 10K files, so this is tempfile object
|
41
41
|
env.logger.info "#{src.class}"
|
42
42
|
ui.info "Moving #{src.path} to #{localfile}"
|
43
43
|
# Force the close of the src stream to release handle before moving
|
@@ -65,6 +65,17 @@ module Veewee
|
|
65
65
|
return checksum.hexdigest
|
66
66
|
end
|
67
67
|
|
68
|
+
def verify_md5sum(full_path)
|
69
|
+
filename = File.basename(full_path)
|
70
|
+
ui.info "Verifying md5 checksum : #{self.iso_md5}"
|
71
|
+
file_md5=hashsum(full_path)
|
72
|
+
|
73
|
+
unless file_md5==self.iso_md5
|
74
|
+
ui.error "The MD5 checksums for file #{filename } do not match: "
|
75
|
+
ui.error "- #{file_md5} (current) vs #{self.iso_md5} (specified)"
|
76
|
+
raise Veewee::Error, "The MD5 checksums for file #{filename } do not match: \n"+ "- #{file_md5} (current) vs #{self.iso_md5} (specified)"
|
77
|
+
end
|
78
|
+
end
|
68
79
|
|
69
80
|
def verify_iso(options)
|
70
81
|
filename=self.iso_file
|
@@ -123,19 +134,12 @@ module Veewee
|
|
123
134
|
raise Veewee::Error, "The provided iso #{full_path} is not readable"
|
124
135
|
end
|
125
136
|
|
126
|
-
ui.info "Verifying md5 checksum : #{self.iso_md5}"
|
127
|
-
file_md5=hashsum(full_path)
|
128
|
-
|
129
|
-
unless file_md5==self.iso_md5
|
130
|
-
ui.error "The MD5 checksums for file #{filename } do not match: "
|
131
|
-
ui.error "- #{file_md5} (current) vs #{self.iso_md5} (specified)"
|
132
|
-
raise Veewee::Error, "The MD5 checksums for file #{filename } do not match: \n"+ "- #{file_md5} (current) vs #{self.iso_md5} (specified)"
|
133
|
-
end
|
134
|
-
|
135
137
|
end
|
136
138
|
|
137
139
|
end
|
138
140
|
|
141
|
+
verify_md5sum(full_path) if options["md5check"] && !self.iso_md5.nil?
|
142
|
+
|
139
143
|
end
|
140
144
|
end #Module
|
141
145
|
|
@@ -25,16 +25,18 @@ module Veewee
|
|
25
25
|
defaults={ :port => '22', :timeout => 20000 }
|
26
26
|
|
27
27
|
options=defaults.merge(options)
|
28
|
+
timeout = options[:timeout]
|
29
|
+
timeout=ENV['VEEWEE_TIMEOUT'].to_i unless ENV['VEEWEE_TIMEOUT'].nil?
|
28
30
|
|
29
|
-
ui.info "Waiting for ssh login on #{ip} with user #{options[:user]} to sshd on port => #{options[:port]} to work, timeout=#{
|
31
|
+
ui.info "Waiting for ssh login on #{ip} with user #{options[:user]} to sshd on port => #{options[:port]} to work, timeout=#{timeout} sec"
|
30
32
|
|
31
33
|
begin
|
32
|
-
Timeout::timeout(
|
34
|
+
Timeout::timeout(timeout) do
|
33
35
|
connected=false
|
34
36
|
while !connected do
|
35
37
|
begin
|
36
38
|
env.ui.info ".",{:new_line => false , :prefix => false}
|
37
|
-
Net::SSH.start(ip, options[:user], { :port => options[:port] , :password => options[:password], :paranoid => false , :timeout =>
|
39
|
+
Net::SSH.start(ip, options[:user], { :port => options[:port] , :password => options[:password], :paranoid => false , :timeout => timeout }) do |ssh|
|
38
40
|
|
39
41
|
ui.info "\n", {:prefix => false}
|
40
42
|
block.call(ip);
|
@@ -46,8 +48,7 @@ module Veewee
|
|
46
48
|
end
|
47
49
|
end
|
48
50
|
rescue Timeout::Error
|
49
|
-
|
50
|
-
exit -1
|
51
|
+
raise Veewee::Error, "Ssh timeout #{timeout} sec has been reached."
|
51
52
|
end
|
52
53
|
ui.info ""
|
53
54
|
return false
|