rudy 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +10 -0
- data/Rudyfile +2 -2
- data/lib/rudy.rb +1 -1
- data/lib/rudy/cli/candy.rb +1 -1
- data/lib/rudy/cli/machines.rb +2 -0
- data/lib/rudy/cli/routines.rb +3 -3
- data/lib/rudy/config/objects.rb +13 -1
- data/lib/rudy/huxtable.rb +2 -2
- data/lib/rudy/routines.rb +3 -3
- data/lib/rudy/routines/helper.rb +3 -3
- data/lib/rudy/routines/helpers/scripthelper.rb +4 -27
- data/lib/rudy/routines/shutdown.rb +4 -2
- data/rudy.gemspec +13 -4
- metadata +55 -5
data/CHANGES.txt
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
RUDY, CHANGES
|
2
2
|
|
3
3
|
|
4
|
+
#### 0.8.4 (2009-06-04) ###############################
|
5
|
+
|
6
|
+
* FIXED: Fixed nil exception in fetch_machine_param
|
7
|
+
* CHANGE: Disabled check for private key for shutdown routine.
|
8
|
+
If the private key doesn't exist it prevents shutting down.
|
9
|
+
* CHANGE: Re-enabled the check to make sure command config is parsed only one time
|
10
|
+
* CHANGE: Some UI tweaks, some minor integration stuff with Rye
|
11
|
+
* CHANGE: Caesars::Config verbose mode is now enabled at Rudy verbose level 2
|
12
|
+
|
13
|
+
|
4
14
|
#### 0.8.3 (2009-06-03) ###############################
|
5
15
|
|
6
16
|
* CHANGE: Now requires rye-0.7.3 (disable_safe_mode method)
|
data/Rudyfile
CHANGED
@@ -118,12 +118,12 @@ routines do
|
|
118
118
|
after :rudy do # Run remote SSH commands after startup
|
119
119
|
mkdir :p, 'great' # $ mkdir -p great
|
120
120
|
touch 'great/scott' # $ touch great/scott
|
121
|
-
ls :l, :a
|
121
|
+
ls :l, :a # $ ls -l -a *
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
125
|
shutdown do # $ rudy shutdown
|
126
|
-
|
126
|
+
before :root do # Run remote SSH commands before shutdown
|
127
127
|
uptime
|
128
128
|
end
|
129
129
|
disks do
|
data/lib/rudy.rb
CHANGED
data/lib/rudy/cli/candy.rb
CHANGED
data/lib/rudy/cli/machines.rb
CHANGED
data/lib/rudy/cli/routines.rb
CHANGED
@@ -12,7 +12,7 @@ module Rudy; module CLI;
|
|
12
12
|
machines = @rr.execute || []
|
13
13
|
puts $/, "The following machines are now available:" unless machines.empty?
|
14
14
|
machines.each do |machine|
|
15
|
-
puts machine.
|
15
|
+
puts @@global.verbose > 2 ? machine.inspect : machine.dump(@@global.format)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -25,7 +25,7 @@ module Rudy; module CLI;
|
|
25
25
|
machines = @rr.execute
|
26
26
|
puts $/, "The following machines have been restarted:"
|
27
27
|
machines.each do |machine|
|
28
|
-
puts machine.
|
28
|
+
puts @@global.verbose > 2 ? machine.inspect : machine.dump(@@global.format)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -53,7 +53,7 @@ module Rudy; module CLI;
|
|
53
53
|
unless machines.empty?
|
54
54
|
puts $/, "The following machines were processed:"
|
55
55
|
machines.each do |machine|
|
56
|
-
puts @@global.verbose >
|
56
|
+
puts @@global.verbose > 2 ? machine.inspect : machine.dump(@@global.format)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
data/lib/rudy/config/objects.rb
CHANGED
@@ -20,6 +20,9 @@ class Rudy::Config
|
|
20
20
|
# important that new keywords do not conflict with existing
|
21
21
|
# Rudy keywords. Strange things may happen!
|
22
22
|
class Commands < Caesars
|
23
|
+
class AlreadyDefined < Rudy::Config::Error
|
24
|
+
def message; "The command '#{@obj}' has already been defined for this project"; end
|
25
|
+
end
|
23
26
|
class PathNotString < Rudy::Config::Error
|
24
27
|
def message; super << " (path must be a String)"; end
|
25
28
|
end
|
@@ -30,7 +33,11 @@ class Rudy::Config
|
|
30
33
|
def message; "Arguments for #{cmd} must be: Symbols, Strings only"; end
|
31
34
|
end
|
32
35
|
|
33
|
-
@@processed = false
|
36
|
+
@@processed = false
|
37
|
+
|
38
|
+
## Not used currently. May be revived.
|
39
|
+
##@@allowed = [] ## Commands which have been processed
|
40
|
+
|
34
41
|
forced_array :allow
|
35
42
|
forced_array :deny
|
36
43
|
chill :allow
|
@@ -53,6 +60,7 @@ class Rudy::Config
|
|
53
60
|
def postprocess
|
54
61
|
return false if @@processed
|
55
62
|
@@processed = true # Make sure this runs only once
|
63
|
+
|
56
64
|
# Parses:
|
57
65
|
# commands do
|
58
66
|
# allow :kill
|
@@ -65,6 +73,10 @@ class Rudy::Config
|
|
65
73
|
self.allow.each do |cmd|
|
66
74
|
cmd, *args = *cmd
|
67
75
|
|
76
|
+
## Currently disabled
|
77
|
+
##raise AlreadyDefined.new(:commands, cmd) if @@allowed.member?(cmd)
|
78
|
+
##@@allowed << cmd
|
79
|
+
|
68
80
|
# We can allow existing commands to be overridden but we
|
69
81
|
# print a message to STDERR so the user knows what's up.
|
70
82
|
STDERR.puts "Redefining #{cmd}" if Rye::Cmd.can?(cmd)
|
data/lib/rudy/huxtable.rb
CHANGED
@@ -40,7 +40,7 @@ module Rudy
|
|
40
40
|
#def logger; @@logger; end
|
41
41
|
|
42
42
|
def self.update_config(path=nil)
|
43
|
-
@@config.verbose = (@@global.verbose >
|
43
|
+
@@config.verbose = (@@global.verbose > 1)
|
44
44
|
# nil and bad paths sent to look_and_load are ignored
|
45
45
|
@@config.look_and_load(path || @@global.config)
|
46
46
|
@@global.apply_config(@@config)
|
@@ -332,7 +332,7 @@ module Rudy
|
|
332
332
|
raise NoMachinesConfig if !@@config.machines
|
333
333
|
raise NoGlobal unless @@global
|
334
334
|
top_level = @@config.machines.find(parameter)
|
335
|
-
mc = fetch_machine_config
|
335
|
+
mc = fetch_machine_config || {}
|
336
336
|
mc[parameter] || top_level || nil
|
337
337
|
end
|
338
338
|
|
data/lib/rudy/routines.rb
CHANGED
@@ -140,7 +140,7 @@ module Rudy
|
|
140
140
|
if !skip_check && has_remote_task?(routine)
|
141
141
|
enjoy_every_sandwich {
|
142
142
|
msg = preliminary_separator("Waiting for SSH daemon...")
|
143
|
-
ret = Rudy::Utils.waiter(2,
|
143
|
+
ret = Rudy::Utils.waiter(2, 30, STDOUT, msg, 0) {
|
144
144
|
Rudy::Utils.service_available?(machine.dns_public, 22)
|
145
145
|
}
|
146
146
|
is_available = ret
|
@@ -149,7 +149,7 @@ module Rudy
|
|
149
149
|
|
150
150
|
if is_available
|
151
151
|
# TODO: trap rbox errors. We could get an authentication error.
|
152
|
-
opts = { :keys => root_keypairpath, :user => remote_user, :info => @@global.verbose >
|
152
|
+
opts = { :keys => root_keypairpath, :user => remote_user, :info => @@global.verbose > 3 }
|
153
153
|
begin
|
154
154
|
rbox = Rye::Box.new(machine.dns_public, opts)
|
155
155
|
Rudy::Utils.waiter(2, 10, STDOUT, nil, 0) { rbox.connect }
|
@@ -337,7 +337,7 @@ module Rudy
|
|
337
337
|
rescue => ex
|
338
338
|
STDERR.puts " Error: #{ex.message}".color(:red)
|
339
339
|
STDERR.puts ex.backtrace if Rudy.debug?
|
340
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
340
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
341
341
|
if choice.match(/\AS/i)
|
342
342
|
return
|
343
343
|
elsif choice.match(/\AR/i)
|
data/lib/rudy/routines/helper.rb
CHANGED
@@ -13,7 +13,7 @@ module Rudy
|
|
13
13
|
print_response(ret)
|
14
14
|
rescue IOError => ex
|
15
15
|
STDERR.puts " Connection Error (#{ex.message})".color(:red)
|
16
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
16
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
17
17
|
if choice.match(/\AS/i)
|
18
18
|
return
|
19
19
|
elsif choice.match(/\AR/i)
|
@@ -23,7 +23,7 @@ module Rudy
|
|
23
23
|
end
|
24
24
|
rescue Rye::CommandError => ex
|
25
25
|
print_response(ex)
|
26
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
26
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
27
27
|
if choice.match(/\AS/i)
|
28
28
|
return
|
29
29
|
elsif choice.match(/\AR/i)
|
@@ -34,7 +34,7 @@ module Rudy
|
|
34
34
|
rescue Rye::CommandNotFound => ex
|
35
35
|
STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
|
36
36
|
STDERR.puts ex.backtrace if Rudy.debug?
|
37
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
37
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
38
38
|
if choice.match(/\AS/i)
|
39
39
|
return
|
40
40
|
elsif choice.match(/\AR/i)
|
@@ -9,7 +9,7 @@ module Rudy; module Routines;
|
|
9
9
|
extend self
|
10
10
|
|
11
11
|
@@script_types = [:after, :before, :after_local, :before_local, :script, :script_local]
|
12
|
-
|
12
|
+
|
13
13
|
|
14
14
|
# TODO: refactor using this_method
|
15
15
|
|
@@ -76,7 +76,7 @@ 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
|
-
choice = Annoy.get_user_input('(S)kip (A)bort: ')
|
79
|
+
choice = Annoy.get_user_input('(S)kip (A)bort: ') || ''
|
80
80
|
if choice.match(/\AS/i)
|
81
81
|
return
|
82
82
|
else
|
@@ -104,15 +104,6 @@ module Rudy; module Routines;
|
|
104
104
|
raise "ScriptHelper: Not a Rye::Box" unless rbox.is_a?(Rye::Box)
|
105
105
|
raise "ScriptHelper: #{timing}?" unless @@script_types.member?(timing)
|
106
106
|
|
107
|
-
# The config file that gets created on each remote machine
|
108
|
-
# will be created in the user's home directory.
|
109
|
-
script_config_remote_path = File.join(rbox.getenv['HOME'] || '', @@script_config_file_name)
|
110
|
-
|
111
|
-
if sconf && !sconf.empty?
|
112
|
-
tf = Tempfile.new(@@script_config_file_name)
|
113
|
-
Rudy::Utils.write_to_file(tf.path, sconf.to_hash.to_yaml, 'w')
|
114
|
-
end
|
115
|
-
|
116
107
|
# Do we need to run this again? It's called in generic_routine_runner
|
117
108
|
##if execute_command?(timing, routine) # i.e. before_local?
|
118
109
|
|
@@ -140,18 +131,6 @@ module Rudy; module Routines;
|
|
140
131
|
next
|
141
132
|
end
|
142
133
|
|
143
|
-
trap_rbox_errors {
|
144
|
-
# We need to create the config file for every script,
|
145
|
-
# b/c the user may change and it would not be accessible.
|
146
|
-
# We turn off safe mode so we can write the config file via SSH.
|
147
|
-
# This will need to use SCP eventually; it is unsafe and error prone.
|
148
|
-
# TODO: Replace with rbox.upload. Make it safe again!
|
149
|
-
conf_str = StringIO.new
|
150
|
-
conf_str.puts sconf.to_hash.to_yaml
|
151
|
-
rbox.upload(conf_str, script_config_remote_path)
|
152
|
-
rbox.chmod(600, script_config_remote_path)
|
153
|
-
}
|
154
|
-
|
155
134
|
begin
|
156
135
|
# We define hooks so we can still print each command and its output
|
157
136
|
# when running the command blocks. NOTE: We only print this in
|
@@ -176,7 +155,7 @@ module Rudy; module Routines;
|
|
176
155
|
|
177
156
|
rescue Rye::CommandError => ex
|
178
157
|
print_response(ex)
|
179
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
158
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
180
159
|
if choice.match(/\AS/i)
|
181
160
|
return
|
182
161
|
elsif choice.match(/\AR/i)
|
@@ -187,7 +166,7 @@ module Rudy; module Routines;
|
|
187
166
|
rescue Rye::CommandNotFound => ex
|
188
167
|
STDERR.puts " CommandNotFound: #{ex.message}".color(:red)
|
189
168
|
STDERR.puts ex.backtrace if Rudy.debug?
|
190
|
-
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ')
|
169
|
+
choice = Annoy.get_user_input('(S)kip (R)etry (A)bort: ') || ''
|
191
170
|
if choice.match(/\AS/i)
|
192
171
|
return
|
193
172
|
elsif choice.match(/\AR/i)
|
@@ -202,7 +181,6 @@ module Rudy; module Routines;
|
|
202
181
|
end
|
203
182
|
|
204
183
|
rbox.cd # reset to home dir
|
205
|
-
rbox.rudy_tmp_rm(:f, script_config_remote_path) # -f to ignore errors
|
206
184
|
end
|
207
185
|
|
208
186
|
# Return the borrowed rbox instance to the user it was provided with
|
@@ -212,7 +190,6 @@ module Rudy; module Routines;
|
|
212
190
|
## puts "Nothing to do"
|
213
191
|
##end
|
214
192
|
|
215
|
-
tf.delete # delete local copy of script config
|
216
193
|
|
217
194
|
end
|
218
195
|
end
|
@@ -8,7 +8,7 @@ module Rudy; module Routines;
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def execute
|
11
|
-
routine_separator(:
|
11
|
+
routine_separator(:list)
|
12
12
|
unless @routine
|
13
13
|
STDERR.puts "[this is a generic shutdown routine]"
|
14
14
|
@routine = {}
|
@@ -24,9 +24,11 @@ module Rudy; module Routines;
|
|
24
24
|
def raise_early_exceptions
|
25
25
|
rmach = Rudy::Machines.new
|
26
26
|
raise MachineGroupNotRunning, current_machine_group unless rmach.running?
|
27
|
+
## NOTE: This check is disabled for now. If the private key doesn't exist
|
28
|
+
## it prevents shutting down.
|
27
29
|
# Check private key after machine group, otherwise we could get an error
|
28
30
|
# about there being no key which doesn't make sense if the group isn't running.
|
29
|
-
raise Rudy::PrivateKeyNotFound, root_keypairpath unless has_keypair?(:root)
|
31
|
+
##raise Rudy::PrivateKeyNotFound, root_keypairpath unless has_keypair?(:root)
|
30
32
|
end
|
31
33
|
|
32
34
|
end
|
data/rudy.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "rudy"
|
3
3
|
s.rubyforge_project = 'rudy'
|
4
|
-
s.version = "0.8.
|
4
|
+
s.version = "0.8.4"
|
5
5
|
s.summary = "Rudy: Not your grandparents' EC2 deployment tool."
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
@@ -15,17 +15,26 @@
|
|
15
15
|
s.rubygems_version = '1.1.1'
|
16
16
|
|
17
17
|
s.add_dependency 'drydock', '>= 0.6.3'
|
18
|
-
s.add_dependency 'caesars', '>= 0.
|
19
|
-
s.add_dependency 'rye', '>= 0.7.
|
18
|
+
s.add_dependency 'caesars', '>= 0.7.0'
|
19
|
+
s.add_dependency 'rye', '>= 0.7.4'
|
20
20
|
s.add_dependency 'sysinfo', '>= 0.5.1'
|
21
21
|
s.add_dependency 'storable', '>= 0.5.2'
|
22
|
-
s.add_dependency 'annoy', '>= 0.5.
|
22
|
+
s.add_dependency 'annoy', '>= 0.5.2'
|
23
23
|
|
24
24
|
s.add_dependency 'echoe'
|
25
25
|
s.add_dependency 'amazon-ec2', '>= 0.3.8' # Region fix
|
26
26
|
s.add_dependency 'aws-s3', '>= 0.6.1' # Ruby 1.9.1 compatability
|
27
27
|
s.add_dependency 'highline', '>= 1.5.1'
|
28
28
|
|
29
|
+
# One of the other dependencies needs these gems but doesn't seem
|
30
|
+
# to specify them. Why I outta!
|
31
|
+
s.add_dependency 'archive-tar-minitar'
|
32
|
+
s.add_dependency 'nokogiri'
|
33
|
+
s.add_dependency 'racc'
|
34
|
+
s.add_dependency 'tenderlove-frex'
|
35
|
+
s.add_dependency 'hoe'
|
36
|
+
|
37
|
+
# libxml2 libxml2-dev libxslt-dev
|
29
38
|
|
30
39
|
# http://bit.ly/2WaAgV
|
31
40
|
#s.add_runtime_dependency('xml-simple', '>= 1.0.11')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rudy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-04 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.7.0
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rye
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.7.
|
43
|
+
version: 0.7.4
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: sysinfo
|
@@ -70,7 +70,7 @@ dependencies:
|
|
70
70
|
requirements:
|
71
71
|
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: 0.5.
|
73
|
+
version: 0.5.2
|
74
74
|
version:
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: echoe
|
@@ -112,6 +112,56 @@ dependencies:
|
|
112
112
|
- !ruby/object:Gem::Version
|
113
113
|
version: 1.5.1
|
114
114
|
version:
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: archive-tar-minitar
|
117
|
+
type: :runtime
|
118
|
+
version_requirement:
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: "0"
|
124
|
+
version:
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: nokogiri
|
127
|
+
type: :runtime
|
128
|
+
version_requirement:
|
129
|
+
version_requirements: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: "0"
|
134
|
+
version:
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: racc
|
137
|
+
type: :runtime
|
138
|
+
version_requirement:
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: "0"
|
144
|
+
version:
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: tenderlove-frex
|
147
|
+
type: :runtime
|
148
|
+
version_requirement:
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: "0"
|
154
|
+
version:
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: hoe
|
157
|
+
type: :runtime
|
158
|
+
version_requirement:
|
159
|
+
version_requirements: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: "0"
|
164
|
+
version:
|
115
165
|
description: "Rudy: Not your grandparents' EC2 deployment tool."
|
116
166
|
email: delano@solutious.com
|
117
167
|
executables:
|