solutious-rudy 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +20 -6
- data/README.rdoc +3 -3
- data/Rudyfile +27 -41
- data/bin/rudy +8 -3
- data/lib/rudy.rb +2 -2
- data/lib/rudy/cli/routines.rb +4 -20
- data/lib/rudy/config.rb +1 -0
- data/lib/rudy/config/objects.rb +29 -33
- data/lib/rudy/huxtable.rb +9 -1
- data/lib/rudy/routines.rb +121 -104
- data/lib/rudy/routines/helper.rb +26 -5
- data/lib/rudy/routines/helpers/scripthelper.rb +56 -31
- data/lib/rudy/routines/helpers/userhelper.rb +2 -2
- data/lib/rudy/routines/passthrough.rb +11 -11
- data/lib/rudy/routines/reboot.rb +1 -1
- data/lib/rudy/routines/startup.rb +1 -1
- data/rudy.gemspec +5 -16
- metadata +4 -24
- data/examples/README.md +0 -10
- data/examples/debian-sinatra-passenger/commands.rb +0 -19
- data/examples/debian-sinatra-passenger/machines.rb +0 -32
- data/examples/debian-sinatra-passenger/routines.rb +0 -30
- data/examples/debian-sinatra-thin/commands.rb +0 -17
- data/examples/debian-sinatra-thin/machines.rb +0 -35
- data/examples/debian-sinatra-thin/routines.rb +0 -72
- data/lib/rudy/scm.rb +0 -75
- data/lib/rudy/scm/git.rb +0 -217
- data/lib/rudy/scm/svn.rb +0 -110
data/lib/rudy/routines.rb
CHANGED
@@ -8,8 +8,11 @@ module Rudy
|
|
8
8
|
|
9
9
|
class Base
|
10
10
|
include Rudy::Huxtable
|
11
|
-
|
12
|
-
|
11
|
+
|
12
|
+
# * +cmdname+ The name of the command specified on the command line
|
13
|
+
# * +option+ An OpenStruct of named command line options
|
14
|
+
# * +argv+ An Array of command line argument
|
15
|
+
def initialize(cmdname, option, argv, *args)
|
13
16
|
a, s, r = @@global.accesskey, @@global.secretkey, @@global.region
|
14
17
|
@sdb = Rudy::AWS::SDB.new(a, s, r)
|
15
18
|
@rinst = Rudy::AWS::EC2::Instances.new(a, s, r)
|
@@ -17,11 +20,12 @@ module Rudy
|
|
17
20
|
@rkey = Rudy::AWS::EC2::KeyPairs.new(a, s, r)
|
18
21
|
@rvol = Rudy::AWS::EC2::Volumes.new(a, s, r)
|
19
22
|
@rsnap = Rudy::AWS::EC2::Snapshots.new(a, s, r)
|
23
|
+
@cmdname, @option, @argv = cmdname, option, argv
|
24
|
+
@option ||= OpenStruct.new
|
20
25
|
init(*args)
|
21
26
|
end
|
22
27
|
|
23
|
-
def init
|
24
|
-
end
|
28
|
+
def init; raise "Must override init"; end
|
25
29
|
|
26
30
|
def execute
|
27
31
|
raise "Override execute method"
|
@@ -39,6 +43,8 @@ module Rudy
|
|
39
43
|
# machine between the disk routine and after blocks. The block receives
|
40
44
|
# two argument: an instance of Rudy::Machine and one of Rye::Box.
|
41
45
|
def generic_machine_runner(machine_action, routine=nil, skip_check=false, skip_header=false, &routine_action)
|
46
|
+
is_available= false
|
47
|
+
|
42
48
|
if @@global.offline
|
43
49
|
rmach = Rudy::Machines::Offline.new
|
44
50
|
skip_check = true
|
@@ -74,15 +80,15 @@ module Rudy
|
|
74
80
|
}
|
75
81
|
|
76
82
|
|
77
|
-
lbox = Rye::Box.new('localhost')
|
83
|
+
lbox = Rye::Box.new('localhost', :info => (@@global.verbose > 3), :debug => false)
|
78
84
|
sconf = fetch_script_config
|
79
85
|
|
80
86
|
enjoy_every_sandwich {
|
81
87
|
if Rudy::Routines::ScriptHelper.before_local?(routine) # before_local
|
82
88
|
# Runs "before_local" scripts of routines config.
|
83
|
-
|
89
|
+
task_separator("LOCAL SHELL")
|
84
90
|
lbox.cd Dir.pwd # Run local command block from current working directory
|
85
|
-
Rudy::Routines::ScriptHelper.before_local(routine, sconf, lbox)
|
91
|
+
Rudy::Routines::ScriptHelper.before_local(routine, sconf, lbox, @option, @argv)
|
86
92
|
end
|
87
93
|
}
|
88
94
|
|
@@ -90,9 +96,9 @@ module Rudy
|
|
90
96
|
if Rudy::Routines::ScriptHelper.script_local?(routine) # script_local
|
91
97
|
# Runs "script_local" scripts of routines config.
|
92
98
|
# NOTE: This is synonymous with before_local
|
93
|
-
|
99
|
+
task_separator("LOCAL SHELL")
|
94
100
|
lbox.cd Dir.pwd # Run local command block from current working directory
|
95
|
-
Rudy::Routines::ScriptHelper.script_local(routine, sconf, lbox)
|
101
|
+
Rudy::Routines::ScriptHelper.script_local(routine, sconf, lbox, @option, @argv)
|
96
102
|
end
|
97
103
|
}
|
98
104
|
|
@@ -131,80 +137,86 @@ module Rudy
|
|
131
137
|
next # The short circuit
|
132
138
|
end
|
133
139
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
Rudy::Utils.
|
140
|
+
if !skip_check && has_remote_task?(routine)
|
141
|
+
enjoy_every_sandwich {
|
142
|
+
msg = preliminary_separator("Waiting for SSH daemon...")
|
143
|
+
ret = Rudy::Utils.waiter(2, 1, STDOUT, msg, 0) {
|
144
|
+
Rudy::Utils.service_available?(machine.dns_public, 22)
|
145
|
+
}
|
146
|
+
is_available = ret
|
138
147
|
}
|
139
148
|
end
|
140
149
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
+
if is_available
|
151
|
+
# TODO: trap rbox errors. We could get an authentication error.
|
152
|
+
opts = { :keys => root_keypairpath, :user => remote_user, :info => @@global.verbose > 0 }
|
153
|
+
begin
|
154
|
+
rbox = Rye::Box.new(machine.dns_public, opts)
|
155
|
+
Rudy::Utils.waiter(2, 10, STDOUT, nil, 0) { rbox.connect }
|
156
|
+
rescue Rye::NoHost => ex
|
157
|
+
STDERR.puts "No host: #{ex.message}"
|
158
|
+
exit 65
|
159
|
+
end
|
150
160
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
161
|
+
unless skip_check
|
162
|
+
# Set the hostname if specified in the machines config.
|
163
|
+
# :rudy -> change to Rudy's machine name
|
164
|
+
# :default -> leave the hostname as it is
|
165
|
+
# Anything else other than nil -> change to that value
|
166
|
+
# NOTE: This will set hostname every time a routine is
|
167
|
+
# run so we may want to make this an explicit action.
|
168
|
+
enjoy_every_sandwich {
|
169
|
+
hn = current_machine_hostname || :rudy
|
170
|
+
if hn != :default
|
171
|
+
hn = machine.name if hn == :rudy
|
172
|
+
print preliminary_separator("Setting hostname to #{hn}... ")
|
173
|
+
rbox.hostname(hn)
|
174
|
+
puts "done"
|
175
|
+
end
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
|
180
|
+
## NOTE: This prevents shutdown from doing its thing and prob
|
181
|
+
## isn't necessary.
|
182
|
+
##unless has_remote_task?(routine)
|
183
|
+
## puts "[no remote tasks]"
|
184
|
+
## next
|
185
|
+
##end
|
186
|
+
|
158
187
|
enjoy_every_sandwich {
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
print preliminary_separator("Setting hostame to #{hn}... ")
|
163
|
-
rbox.hostname(hn)
|
164
|
-
puts "done"
|
188
|
+
if Rudy::Routines::UserHelper.adduser?(routine) # adduser
|
189
|
+
task_separator("ADD USER")
|
190
|
+
Rudy::Routines::UserHelper.adduser(routine, machine, rbox)
|
165
191
|
end
|
166
192
|
}
|
167
|
-
end
|
168
193
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
enjoy_every_sandwich {
|
177
|
-
if Rudy::Routines::UserHelper.adduser?(routine) # adduser
|
178
|
-
puts task_separator("ADD USER")
|
179
|
-
Rudy::Routines::UserHelper.adduser(routine, machine, rbox)
|
180
|
-
end
|
181
|
-
}
|
182
|
-
|
183
|
-
enjoy_every_sandwich {
|
184
|
-
if Rudy::Routines::UserHelper.authorize?(routine) # authorize
|
185
|
-
puts task_separator("AUTHORIZE USER")
|
186
|
-
Rudy::Routines::UserHelper.authorize(routine, machine, rbox)
|
187
|
-
end
|
188
|
-
}
|
194
|
+
enjoy_every_sandwich {
|
195
|
+
if Rudy::Routines::UserHelper.authorize?(routine) # authorize
|
196
|
+
task_separator("AUTHORIZE USER")
|
197
|
+
Rudy::Routines::UserHelper.authorize(routine, machine, rbox)
|
198
|
+
end
|
199
|
+
}
|
189
200
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
201
|
+
enjoy_every_sandwich {
|
202
|
+
if Rudy::Routines::ScriptHelper.before?(routine) # before
|
203
|
+
task_separator("REMOTE SHELL")
|
204
|
+
Rudy::Routines::ScriptHelper.before(routine, sconf, machine, rbox, @option, @argv)
|
205
|
+
end
|
206
|
+
}
|
196
207
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
208
|
+
enjoy_every_sandwich {
|
209
|
+
if Rudy::Routines::DiskHelper.disks?(routine) # disk
|
210
|
+
task_separator("DISKS")
|
211
|
+
if rbox.ostype == "sunos"
|
212
|
+
puts "Sorry, Solaris disks are not supported yet!"
|
213
|
+
else
|
214
|
+
Rudy::Routines::DiskHelper.execute(routine, machine, rbox)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
}
|
207
218
|
|
219
|
+
end
|
208
220
|
|
209
221
|
enjoy_every_sandwich {
|
210
222
|
# Startup, shutdown, release, deploy, etc...
|
@@ -212,38 +224,40 @@ module Rudy
|
|
212
224
|
}
|
213
225
|
|
214
226
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
227
|
+
if is_available
|
228
|
+
# The "after" blocks are synonymous with "script" blocks.
|
229
|
+
# For some routines, like startup, it makes sense to an
|
230
|
+
# "after" block b/c "script" is ambiguous. In generic
|
231
|
+
# routines, there is no concept of before or after. The
|
232
|
+
# definition is the entire routine so we use "script".
|
233
|
+
# NOTE: If both after and script are supplied they will
|
234
|
+
# both be executed.
|
235
|
+
enjoy_every_sandwich {
|
236
|
+
if Rudy::Routines::ScriptHelper.script?(routine) # script
|
237
|
+
task_separator("REMOTE SHELL")
|
238
|
+
# Runs "after" scripts of routines config
|
239
|
+
Rudy::Routines::ScriptHelper.script(routine, sconf, machine, rbox, @option, @argv)
|
240
|
+
end
|
241
|
+
}
|
229
242
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
243
|
+
enjoy_every_sandwich {
|
244
|
+
if Rudy::Routines::ScriptHelper.after?(routine) # after
|
245
|
+
task_separator("REMOTE SHELL")
|
246
|
+
# Runs "after" scripts of routines config
|
247
|
+
Rudy::Routines::ScriptHelper.after(routine, sconf, machine, rbox, @option, @argv)
|
248
|
+
end
|
249
|
+
}
|
237
250
|
|
238
|
-
|
251
|
+
rbox.disconnect
|
252
|
+
end
|
239
253
|
end
|
240
|
-
|
254
|
+
|
241
255
|
enjoy_every_sandwich {
|
242
256
|
if Rudy::Routines::ScriptHelper.after_local?(routine) # after_local
|
243
|
-
|
257
|
+
task_separator("LOCAL SHELL")
|
244
258
|
lbox.cd Dir.pwd # Run local command block from current working directory
|
245
259
|
# Runs "after_local" scripts of routines config
|
246
|
-
Rudy::Routines::ScriptHelper.after_local(routine, sconf, lbox)
|
260
|
+
Rudy::Routines::ScriptHelper.after_local(routine, sconf, lbox, @option, @argv)
|
247
261
|
end
|
248
262
|
}
|
249
263
|
|
@@ -259,7 +273,7 @@ module Rudy
|
|
259
273
|
return unless depends
|
260
274
|
unless depends.empty?
|
261
275
|
depends.each_with_index do |d, index|
|
262
|
-
|
276
|
+
task_separator("DEPENDENCY: #{d}")
|
263
277
|
routine_dependency = fetch_routine_config(d)
|
264
278
|
unless routine_dependency
|
265
279
|
STDERR.puts " Unknown routine: #{d}".color(:red)
|
@@ -302,7 +316,7 @@ module Rudy
|
|
302
316
|
def task_separator(title)
|
303
317
|
dashes = 59 - title.size
|
304
318
|
dashes = 0 if dashes < 1
|
305
|
-
("%s--- %s %s" % [$/, title, '-'*dashes])
|
319
|
+
puts ("%s--- %s %s" % [$/, title, '-'*dashes]) if @@global.verbose > 2
|
306
320
|
end
|
307
321
|
|
308
322
|
def machine_separator(name, awsid)
|
@@ -323,7 +337,14 @@ module Rudy
|
|
323
337
|
rescue => ex
|
324
338
|
STDERR.puts " Error: #{ex.message}".color(:red)
|
325
339
|
STDERR.puts ex.backtrace if Rudy.debug?
|
326
|
-
|
340
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
341
|
+
if choice.match(/\AS/i)
|
342
|
+
return
|
343
|
+
elsif choice.match(/\AR/i)
|
344
|
+
retry
|
345
|
+
else
|
346
|
+
exit 12
|
347
|
+
end
|
327
348
|
rescue Interrupt
|
328
349
|
puts "Aborting..."
|
329
350
|
exit 12
|
@@ -331,10 +352,6 @@ module Rudy
|
|
331
352
|
ret
|
332
353
|
end
|
333
354
|
|
334
|
-
def keep_going?
|
335
|
-
Annoy.pose_question(" Keep going?\a ", /yes|y|ya|sure|you bet!/i, STDERR)
|
336
|
-
end
|
337
|
-
|
338
355
|
end
|
339
356
|
end
|
340
357
|
end
|
data/lib/rudy/routines/helper.rb
CHANGED
@@ -13,14 +13,35 @@ module Rudy
|
|
13
13
|
print_response(ret)
|
14
14
|
rescue IOError => ex
|
15
15
|
STDERR.puts " Connection Error (#{ex.message})".color(:red)
|
16
|
-
|
16
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
17
|
+
if choice.match(/\AS/i)
|
18
|
+
return
|
19
|
+
elsif choice.match(/\AR/i)
|
20
|
+
retry
|
21
|
+
else
|
22
|
+
exit 12
|
23
|
+
end
|
17
24
|
rescue Rye::CommandError => ex
|
18
25
|
print_response(ex)
|
19
|
-
|
26
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
27
|
+
if choice.match(/\AS/i)
|
28
|
+
return
|
29
|
+
elsif choice.match(/\AR/i)
|
30
|
+
retry
|
31
|
+
else
|
32
|
+
exit 12
|
33
|
+
end
|
20
34
|
rescue Rye::CommandNotFound => ex
|
21
35
|
STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
|
22
36
|
STDERR.puts ex.backtrace if Rudy.debug?
|
23
|
-
|
37
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
38
|
+
if choice.match(/\AS/i)
|
39
|
+
return
|
40
|
+
elsif choice.match(/\AR/i)
|
41
|
+
retry
|
42
|
+
else
|
43
|
+
exit 12
|
44
|
+
end
|
24
45
|
end
|
25
46
|
|
26
47
|
ret
|
@@ -31,11 +52,11 @@ module Rudy
|
|
31
52
|
end
|
32
53
|
|
33
54
|
# Returns a formatted string for printing command info
|
34
|
-
def command_separator(cmd, user)
|
55
|
+
def command_separator(cmd, user, host)
|
35
56
|
cmd ||= ""
|
36
57
|
cmd, user = cmd.to_s, user.to_s
|
37
58
|
prompt = user == "root" ? "#" : "$"
|
38
|
-
("%s
|
59
|
+
("%s@%s%s %s" % [user, host, prompt, cmd.bright])
|
39
60
|
end
|
40
61
|
|
41
62
|
private
|
@@ -13,8 +13,8 @@ module Rudy; module Routines;
|
|
13
13
|
|
14
14
|
# TODO: refactor using this_method
|
15
15
|
|
16
|
-
def before_local(routine, sconf, rbox)
|
17
|
-
execute_command(:before_local, routine, sconf, 'localhost', rbox)
|
16
|
+
def before_local(routine, sconf, rbox, option=nil, argv=nil)
|
17
|
+
execute_command(:before_local, routine, sconf, 'localhost', rbox, option, argv)
|
18
18
|
end
|
19
19
|
def before_local?(routine)
|
20
20
|
# before_local generally doesn't take a user name like the remote
|
@@ -24,8 +24,8 @@ module Rudy; module Routines;
|
|
24
24
|
} if routine[:before_local].is_a?(Proc)
|
25
25
|
execute_command?(:before_local, routine)
|
26
26
|
end
|
27
|
-
def script_local(routine, sconf, rbox)
|
28
|
-
execute_command(:script_local, routine, sconf, 'localhost', rbox)
|
27
|
+
def script_local(routine, sconf, rbox, option=nil, argv=nil)
|
28
|
+
execute_command(:script_local, routine, sconf, 'localhost', rbox, option, argv)
|
29
29
|
end
|
30
30
|
def script_local?(routine)
|
31
31
|
# before_local generally doesn't take a user name like the remote
|
@@ -36,8 +36,8 @@ module Rudy; module Routines;
|
|
36
36
|
execute_command?(:script_local, routine)
|
37
37
|
end
|
38
38
|
|
39
|
-
def after_local(routine, sconf, rbox)
|
40
|
-
execute_command(:after_local, routine, sconf, 'localhost', rbox)
|
39
|
+
def after_local(routine, sconf, rbox, option=nil, argv=nil)
|
40
|
+
execute_command(:after_local, routine, sconf, 'localhost', rbox, option, argv)
|
41
41
|
end
|
42
42
|
def after_local?(routine)
|
43
43
|
routine[:after_local] = { # See before_local note
|
@@ -46,21 +46,21 @@ module Rudy; module Routines;
|
|
46
46
|
execute_command?(:after_local, routine)
|
47
47
|
end
|
48
48
|
|
49
|
-
def before(routine, sconf, machine, rbox)
|
49
|
+
def before(routine, sconf, machine, rbox, option=nil, argv=nil)
|
50
50
|
raise "ScriptHelper: Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
51
|
-
execute_command(:before, routine, sconf, machine.name, rbox)
|
51
|
+
execute_command(:before, routine, sconf, machine.name, rbox, option, argv)
|
52
52
|
end
|
53
53
|
def before?(routine); execute_command?(:before, routine); end
|
54
54
|
|
55
|
-
def after(routine, sconf, machine, rbox)
|
55
|
+
def after(routine, sconf, machine, rbox, option=nil, argv=nil)
|
56
56
|
raise "ScriptHelper: Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
57
|
-
execute_command(:after, routine, sconf, machine.name, rbox)
|
57
|
+
execute_command(:after, routine, sconf, machine.name, rbox, option, argv)
|
58
58
|
end
|
59
59
|
def after?(routine); execute_command?(:after, routine); end
|
60
60
|
|
61
|
-
def script(routine, sconf, machine, rbox)
|
61
|
+
def script(routine, sconf, machine, rbox, option=nil, argv=nil)
|
62
62
|
raise "ScriptHelper: Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
63
|
-
execute_command(:script, routine, sconf, machine.name, rbox)
|
63
|
+
execute_command(:script, routine, sconf, machine.name, rbox, option, argv)
|
64
64
|
end
|
65
65
|
def script?(routine); execute_command?(:script, routine); end
|
66
66
|
|
@@ -76,7 +76,12 @@ module Rudy; module Routines;
|
|
76
76
|
return false unless hasconf
|
77
77
|
unless routine[timing].kind_of?(Hash)
|
78
78
|
STDERR.puts "No user supplied for #{timing} block".color(:red)
|
79
|
-
|
79
|
+
choice = Annoy.get_user_input('(S)kip (A)bort: ')
|
80
|
+
if choice.match(/\AS/i)
|
81
|
+
return
|
82
|
+
else
|
83
|
+
exit 12
|
84
|
+
end
|
80
85
|
return false
|
81
86
|
end
|
82
87
|
routine[timing].each_pair do |user,proc|
|
@@ -95,13 +100,13 @@ module Rudy; module Routines;
|
|
95
100
|
# * +sconf+ is a config hash from machines config (ignored if nil)
|
96
101
|
# * +hostname+ machine hostname that we're working on
|
97
102
|
# * +rbox+ a Rye::Box instance for the machine we're working on
|
98
|
-
def execute_command(timing, routine, sconf, hostname, rbox)
|
103
|
+
def execute_command(timing, routine, sconf, hostname, rbox, option=nil, argv=nil)
|
99
104
|
raise "ScriptHelper: Not a Rye::Box" unless rbox.is_a?(Rye::Box)
|
100
105
|
raise "ScriptHelper: #{timing}?" unless @@script_types.member?(timing)
|
101
106
|
|
102
107
|
# The config file that gets created on each remote machine
|
103
108
|
# will be created in the user's home directory.
|
104
|
-
script_config_remote_path = File.join(rbox.getenv['HOME'], @@script_config_file_name)
|
109
|
+
script_config_remote_path = File.join(rbox.getenv['HOME'] || '', @@script_config_file_name)
|
105
110
|
|
106
111
|
if sconf && !sconf.empty?
|
107
112
|
tf = Tempfile.new(@@script_config_file_name)
|
@@ -148,32 +153,52 @@ module Rudy; module Routines;
|
|
148
153
|
}
|
149
154
|
|
150
155
|
begin
|
151
|
-
# We define hooks so we can
|
152
|
-
#
|
153
|
-
#
|
154
|
-
#
|
155
|
-
|
156
|
-
|
157
|
-
|
156
|
+
# We define hooks so we can still print each command and its output
|
157
|
+
# when running the command blocks. NOTE: We only print this in
|
158
|
+
# verbosity mode. We intentionally set and unset the hooks
|
159
|
+
# so the other commands (config file copy) don't get printed.
|
160
|
+
if @@global.verbose > 0
|
161
|
+
# This block gets called for every command method call.
|
162
|
+
rbox.pre_command_hook do |cmd, args, user, host|
|
163
|
+
puts command_separator(rbox.preview_command(cmd, args), user, host)
|
164
|
+
end
|
158
165
|
end
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
166
|
+
if @@global.verbose > 1
|
167
|
+
# And this one gets called after each command method call.
|
168
|
+
rbox.post_command_hook do |ret|
|
169
|
+
puts ' ' << ret.stdout.join("#{$/} ") if !ret.stdout.empty?
|
170
|
+
print_response(ret)
|
171
|
+
end
|
163
172
|
end
|
164
173
|
|
165
174
|
### EXECUTE THE COMMANDS BLOCK
|
166
|
-
rbox.batch(&proc)
|
175
|
+
rbox.batch(option, argv, &proc)
|
167
176
|
|
168
|
-
rbox.pre_command_hook = nil
|
169
|
-
rbox.post_command_hook = nil
|
170
177
|
rescue Rye::CommandError => ex
|
171
178
|
print_response(ex)
|
172
|
-
|
179
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
180
|
+
if choice.match(/\AS/i)
|
181
|
+
return
|
182
|
+
elsif choice.match(/\AR/i)
|
183
|
+
retry
|
184
|
+
else
|
185
|
+
exit 12
|
186
|
+
end
|
173
187
|
rescue Rye::CommandNotFound => ex
|
174
188
|
STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
|
175
189
|
STDERR.puts ex.backtrace if Rudy.debug?
|
176
|
-
|
190
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
191
|
+
if choice.match(/\AS/i)
|
192
|
+
return
|
193
|
+
elsif choice.match(/\AR/i)
|
194
|
+
retry
|
195
|
+
else
|
196
|
+
exit 12
|
197
|
+
end
|
198
|
+
ensure
|
199
|
+
rbox.pre_command_hook = nil
|
200
|
+
rbox.post_command_hook = nil
|
201
|
+
rbox.enable_safe_mode # In case it was disabled
|
177
202
|
end
|
178
203
|
|
179
204
|
rbox.cd # reset to home dir
|