solutious-rudy 0.9.3 → 0.9.4
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/CHANGES.txt +8 -1
- data/bin/rudy +4 -0
- data/bin/rudy-ec2 +1 -0
- data/lib/rudy.rb +1 -1
- data/lib/rudy/aws/ec2.rb +4 -5
- data/lib/rudy/aws/ec2/group.rb +0 -2
- data/lib/rudy/aws/sdb.rb +3 -3
- data/lib/rudy/cli/aws/ec2/addresses.rb +5 -5
- data/lib/rudy/cli/aws/ec2/candy.rb +16 -16
- data/lib/rudy/cli/aws/ec2/groups.rb +6 -6
- data/lib/rudy/cli/aws/ec2/images.rb +3 -3
- data/lib/rudy/cli/aws/ec2/info.rb +18 -18
- data/lib/rudy/cli/aws/ec2/instances.rb +15 -15
- data/lib/rudy/cli/aws/ec2/keypairs.rb +6 -6
- data/lib/rudy/cli/aws/ec2/snapshots.rb +1 -1
- data/lib/rudy/cli/aws/ec2/volumes.rb +10 -10
- data/lib/rudy/cli/backups.rb +5 -5
- data/lib/rudy/cli/base.rb +9 -9
- data/lib/rudy/cli/candy.rb +1 -1
- data/lib/rudy/cli/config.rb +6 -6
- data/lib/rudy/cli/disks.rb +5 -5
- data/lib/rudy/cli/images.rb +12 -12
- data/lib/rudy/cli/info.rb +9 -9
- data/lib/rudy/cli/keypairs.rb +5 -5
- data/lib/rudy/cli/machines.rb +26 -26
- data/lib/rudy/cli/metadata.rb +2 -2
- data/lib/rudy/cli/networks.rb +17 -8
- data/lib/rudy/cli/routines.rb +10 -10
- data/lib/rudy/config.rb +2 -2
- data/lib/rudy/config/objects.rb +1 -1
- data/lib/rudy/huxtable.rb +11 -5
- data/lib/rudy/machines.rb +4 -1
- data/lib/rudy/metadata/machine.rb +18 -9
- data/lib/rudy/routines.rb +4 -4
- data/lib/rudy/routines/handlers/base.rb +6 -6
- data/lib/rudy/routines/handlers/disks.rb +9 -9
- data/lib/rudy/routines/handlers/group.rb +1 -1
- data/lib/rudy/routines/handlers/rye.rb +7 -5
- data/lib/rudy/routines/handlers/script.rb +2 -2
- data/lib/rudy/routines/passthrough.rb +11 -4
- data/lib/rudy/routines/reboot.rb +16 -5
- data/lib/rudy/routines/shutdown.rb +14 -5
- data/lib/rudy/routines/startup.rb +5 -6
- data/lib/rudy/utils.rb +2 -2
- data/rudy.gemspec +1 -1
- metadata +2 -3
data/lib/rudy/cli/metadata.rb
CHANGED
@@ -23,7 +23,7 @@ module Rudy
|
|
23
23
|
end
|
24
24
|
|
25
25
|
objlist.each_pair do |k,o|
|
26
|
-
|
26
|
+
li "#{k}: " << o.inspect
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -38,7 +38,7 @@ module Rudy
|
|
38
38
|
unless @@global.quiet
|
39
39
|
msg = "NOTE: This will delete only the metadata and "
|
40
40
|
msg << "not the EC2 object (volume, instance, etc...)"
|
41
|
-
|
41
|
+
li msg
|
42
42
|
end
|
43
43
|
|
44
44
|
execute_check(:medium)
|
data/lib/rudy/cli/networks.rb
CHANGED
@@ -7,10 +7,19 @@ module Rudy
|
|
7
7
|
def networks
|
8
8
|
name = current_group_name
|
9
9
|
Rudy::AWS::EC2::Groups.list(name).each do |group|
|
10
|
-
|
10
|
+
li @@global.verbose > 0 ? group.inspect : group.dump(@@global.format)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def create_networks
|
15
|
+
Rudy::Routines::Handlers::Group.create rescue nil
|
16
|
+
networks
|
17
|
+
end
|
18
|
+
|
19
|
+
def destroy_networks
|
20
|
+
Rudy::Routines::Handlers::Group.destroy rescue nil
|
21
|
+
end
|
22
|
+
|
14
23
|
def update_networks
|
15
24
|
Rudy::Routines::Handlers::Group.authorize rescue nil
|
16
25
|
networks
|
@@ -20,11 +29,11 @@ module Rudy
|
|
20
29
|
ea = Rudy::Utils::external_ip_address || ''
|
21
30
|
ia = Rudy::Utils::internal_ip_address || ''
|
22
31
|
if @global.quiet
|
23
|
-
|
24
|
-
|
32
|
+
li ia unless @option.external && !@option.internal
|
33
|
+
li ea unless @option.internal && !@option.external
|
25
34
|
else
|
26
|
-
|
27
|
-
|
35
|
+
li "%10s: %s" % ['Internal', ia] unless @option.external && !@option.internal
|
36
|
+
li "%10s: %s" % ['External', ea] unless @option.internal && !@option.external
|
28
37
|
end
|
29
38
|
@global.quiet = true # don't print elapsed time
|
30
39
|
end
|
@@ -60,12 +69,12 @@ module Rudy
|
|
60
69
|
opts = check_options
|
61
70
|
if (@option.group || @option.owner)
|
62
71
|
g = [opts[:owner], opts[:group]].join(':')
|
63
|
-
|
72
|
+
li "#{action.to_s.capitalize} access to #{group.bright} from #{g.bright}"
|
64
73
|
else
|
65
74
|
print "#{action.to_s.capitalize} access to #{group.bright}"
|
66
|
-
|
75
|
+
li " from #{opts[:addresses].join(', ').bright}"
|
67
76
|
print "on #{opts[:protocols].join(', ').bright} "
|
68
|
-
|
77
|
+
li "ports: #{opts[:ports].map { |p| "#{p.join(' to ').bright}" }.join(', ')}"
|
69
78
|
end
|
70
79
|
execute_check(:medium)
|
71
80
|
execute_action {
|
data/lib/rudy/cli/routines.rb
CHANGED
@@ -24,7 +24,7 @@ module Rudy; module CLI;
|
|
24
24
|
|
25
25
|
outform = @@global.format == :json ? :to_json : :to_yaml
|
26
26
|
|
27
|
-
|
27
|
+
li routine.to_hash.send(outform)
|
28
28
|
end
|
29
29
|
|
30
30
|
def startup_valid?
|
@@ -34,7 +34,7 @@ module Rudy; module CLI;
|
|
34
34
|
end
|
35
35
|
def startup
|
36
36
|
machines = @rr.execute || []
|
37
|
-
|
37
|
+
li $/, "The following machines are now available:" unless machines.empty?
|
38
38
|
print_stobjects machines, :noverbose
|
39
39
|
end
|
40
40
|
|
@@ -45,7 +45,7 @@ module Rudy; module CLI;
|
|
45
45
|
end
|
46
46
|
def reboot
|
47
47
|
machines = @rr.execute
|
48
|
-
|
48
|
+
li $/, "The following machines have been restarted:"
|
49
49
|
print_stobjects machines, :noverbose
|
50
50
|
end
|
51
51
|
|
@@ -71,8 +71,8 @@ module Rudy; module CLI;
|
|
71
71
|
|
72
72
|
machines = @rr.execute
|
73
73
|
|
74
|
-
if
|
75
|
-
|
74
|
+
if !@@global.quiet && !machines.empty?
|
75
|
+
li $/, "The following machines were processed:"
|
76
76
|
print_stobjects machines, :noverbose
|
77
77
|
end
|
78
78
|
|
@@ -86,11 +86,11 @@ module Rudy; module CLI;
|
|
86
86
|
def shutdown
|
87
87
|
routine = fetch_routine_config(:shutdown) rescue {}
|
88
88
|
|
89
|
-
|
89
|
+
li "All machines in #{current_machine_group} will be shutdown".bright
|
90
90
|
if routine && routine.disks
|
91
91
|
if routine.disks.destroy
|
92
|
-
|
93
|
-
|
92
|
+
li "The following filesystems will be destroyed:".bright
|
93
|
+
li routine.disks.destroy.keys.join($/).bright
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -98,9 +98,9 @@ module Rudy; module CLI;
|
|
98
98
|
|
99
99
|
machines = @rr.execute
|
100
100
|
|
101
|
-
|
101
|
+
li $/, "The following instances have been destroyed:"
|
102
102
|
machines.each do |machine|
|
103
|
-
|
103
|
+
li '%s %s ' % [machine.name.bright, machine.instid]
|
104
104
|
end
|
105
105
|
|
106
106
|
end
|
data/lib/rudy/config.rb
CHANGED
@@ -106,12 +106,12 @@ module Rudy
|
|
106
106
|
def self.init_config_dir
|
107
107
|
|
108
108
|
unless File.exists?(Rudy::CONFIG_DIR)
|
109
|
-
|
109
|
+
li "Creating #{Rudy::CONFIG_DIR}"
|
110
110
|
Dir.mkdir(Rudy::CONFIG_DIR, 0700)
|
111
111
|
end
|
112
112
|
|
113
113
|
unless File.exists?(Rudy::CONFIG_FILE)
|
114
|
-
|
114
|
+
li "Creating #{Rudy::CONFIG_FILE}"
|
115
115
|
rudy_config = Rudy::Utils.without_indent %Q`
|
116
116
|
accounts { # Account Access Indentifiers
|
117
117
|
aws { # amazon web services
|
data/lib/rudy/config/objects.rb
CHANGED
@@ -112,7 +112,7 @@ class Rudy::Config
|
|
112
112
|
# We can allow existing commands to be overridden but we
|
113
113
|
# print a message to STDERR so the user knows what's up.
|
114
114
|
if Rye::Cmd.can?(cmd)
|
115
|
-
|
115
|
+
Rudy::Huxtable.le "Redefining #{cmd}" if Rudy::Huxtable.global.verbose > 2
|
116
116
|
end
|
117
117
|
|
118
118
|
if args.last.is_a?(Proc)
|
data/lib/rudy/huxtable.rb
CHANGED
@@ -38,7 +38,10 @@ module Rudy
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def self.update_global(ghash); @@global.update(ghash); end
|
41
|
-
def self.update_logger(logger)
|
41
|
+
def self.update_logger(logger)
|
42
|
+
return if logger.nil?
|
43
|
+
@@logger = logger
|
44
|
+
end
|
42
45
|
|
43
46
|
def self.reset_config; @@config = Rudy::Config.new; end
|
44
47
|
def self.reset_global; @@global = Rudy::Global.new; end
|
@@ -59,14 +62,17 @@ module Rudy
|
|
59
62
|
|
60
63
|
# Puts +msg+ to +@@logger+
|
61
64
|
def self.li(*msg); msg.each { |m| @@logger.puts m } if !@@global.quiet; end
|
62
|
-
# Puts +msg+ to +@@logger+ if +Rudy.debug?+ returns true
|
63
|
-
def self.ld(*msg); msg.each { |m| @@logger.puts "D: #{m}" } if Rudy.debug?; end
|
64
65
|
# Puts +msg+ to +@@logger+ with "ERROR: " prepended
|
65
|
-
def self.le(*msg);
|
66
|
+
def self.le(*msg); @@logger.puts " " << msg.join("#{$/} "); end
|
67
|
+
# Puts +msg+ to +@@logger+ if +Rudy.debug?+ returns true
|
68
|
+
def self.ld(*msg)
|
69
|
+
return unless Rudy.debug?
|
70
|
+
@@logger.puts "D: " << msg.join("#{$/}D: ")
|
71
|
+
end
|
66
72
|
|
67
73
|
def li(*msg); Rudy::Huxtable.li *msg; end
|
68
|
-
def ld(*msg); Rudy::Huxtable.ld *msg; end
|
69
74
|
def le(*msg); Rudy::Huxtable.le *msg; end
|
75
|
+
def ld(*msg); Rudy::Huxtable.ld *msg; end
|
70
76
|
|
71
77
|
def config_dirname
|
72
78
|
raise "No config paths defined" unless @@config.is_a?(Rudy::Config) && @@config.paths.is_a?(Array)
|
data/lib/rudy/machines.rb
CHANGED
@@ -44,13 +44,16 @@ module Rudy
|
|
44
44
|
group = Array.new(size) do |i|
|
45
45
|
m = Rudy::Machine.new(i + 1)
|
46
46
|
m.create
|
47
|
+
li "Created: #{m.to_s}"
|
47
48
|
m
|
48
49
|
end
|
49
50
|
else
|
50
51
|
m = Rudy::Machine.new(Rudy::Huxtable.global.position)
|
51
52
|
m.create
|
52
|
-
|
53
|
+
li "Created: #{m.to_s}"
|
54
|
+
group = [m]
|
53
55
|
end
|
56
|
+
group
|
54
57
|
end
|
55
58
|
|
56
59
|
def restart
|
@@ -126,6 +126,16 @@ module Rudy
|
|
126
126
|
k.decrypt encrtypted_text
|
127
127
|
end
|
128
128
|
|
129
|
+
def create_mock
|
130
|
+
refresh!
|
131
|
+
@dns_public = @dns_private = nil
|
132
|
+
inst = Rudy::AWS::EC2::Instances.list(:running).first
|
133
|
+
@instid = inst.awsid
|
134
|
+
self.save :replace
|
135
|
+
sleep 1
|
136
|
+
self
|
137
|
+
end
|
138
|
+
|
129
139
|
def create
|
130
140
|
raise "#{name} is already running" if instance_running?
|
131
141
|
|
@@ -140,11 +150,7 @@ module Rudy
|
|
140
150
|
:machine_data => self.generate_machine_data.to_yaml
|
141
151
|
}
|
142
152
|
|
143
|
-
|
144
|
-
|
145
|
-
#@dns_public = @dns_private = nil
|
146
|
-
#inst = Rudy::AWS::EC2::Instances.list(:running).first
|
147
|
-
#@instid = inst.awsid
|
153
|
+
ld "OPTS: #{opts.inspect}"
|
148
154
|
|
149
155
|
Rudy::AWS::EC2::Instances.create(opts) do |inst|
|
150
156
|
@instid = inst.awsid
|
@@ -157,19 +163,22 @@ module Rudy
|
|
157
163
|
if @address
|
158
164
|
# Make sure the address is associated to the current account
|
159
165
|
if Rudy::AWS::EC2::Addresses.exists?(@address)
|
160
|
-
|
166
|
+
li "Associating #{@address} to #{@instid}"
|
161
167
|
Rudy::AWS::EC2::Addresses.associate(@address, @instid)
|
162
168
|
else
|
163
|
-
|
169
|
+
le "Unknown address: #{@address}"
|
164
170
|
end
|
165
171
|
end
|
166
172
|
rescue => ex
|
167
|
-
|
168
|
-
|
173
|
+
le "Error: #{ex.message}"
|
174
|
+
le ex.backtrace if Rudy.debug?
|
169
175
|
end
|
170
176
|
end
|
171
177
|
|
172
178
|
self.save
|
179
|
+
|
180
|
+
sleep 1 # Eventual consistency in SimpleDB
|
181
|
+
|
173
182
|
self
|
174
183
|
end
|
175
184
|
|
data/lib/rudy/routines.rb
CHANGED
@@ -87,7 +87,7 @@ module Rudy
|
|
87
87
|
def self.runner(routine, rset, lbox, argv=nil)
|
88
88
|
routine.each_pair do |name,definition|
|
89
89
|
handler = Rudy::Routines.get_handler name
|
90
|
-
Rudy::Huxtable.
|
90
|
+
Rudy::Huxtable.li " #{name}:".bright
|
91
91
|
self.rescue {
|
92
92
|
handler.execute(name, definition, rset, lbox, argv)
|
93
93
|
}
|
@@ -99,8 +99,8 @@ module Rudy
|
|
99
99
|
begin
|
100
100
|
ret = bloc_party.call
|
101
101
|
rescue NameError, ArgumentError, RuntimeError, Errno::ECONNREFUSED => ex
|
102
|
-
|
103
|
-
|
102
|
+
Rudy::Huxtable.le "#{ex.class}: #{ex.message}".color(:red)
|
103
|
+
Rudy::Huxtable.le ex.backtrace if Rudy.debug?
|
104
104
|
unless Rudy::Huxtable.global.parallel
|
105
105
|
choice = Annoy.get_user_input('(S)kip (A)bort: ', nil, 3600) || ''
|
106
106
|
if choice.match(/\AS/i)
|
@@ -110,7 +110,7 @@ module Rudy
|
|
110
110
|
end
|
111
111
|
end
|
112
112
|
rescue Interrupt
|
113
|
-
|
113
|
+
li "Aborting..."
|
114
114
|
exit 12
|
115
115
|
end
|
116
116
|
ret
|
@@ -8,10 +8,10 @@ module Rudy; module Routines; module Handlers;
|
|
8
8
|
begin
|
9
9
|
ret = command.call if command
|
10
10
|
return unless ret.is_a?(Rye::Rap)
|
11
|
-
|
11
|
+
li ' ' << ret.stdout.join("#{$/} ") if !ret.stdout.empty?
|
12
12
|
print_response(ret)
|
13
13
|
rescue IOError => ex
|
14
|
-
|
14
|
+
le " Connection Error (#{ex.message})".color(:red)
|
15
15
|
choice = Annoy.get_user_input('(S)kip (R)etry (F)orce (A)bort: ', nil, 3600) || ''
|
16
16
|
if choice.match(/\AS/i)
|
17
17
|
return
|
@@ -38,11 +38,11 @@ module Rudy; module Routines; module Handlers;
|
|
38
38
|
colour = rap.exit_code != 0 ? :red : :normal
|
39
39
|
[:stderr].each do |sumpin|
|
40
40
|
next if rap.send(sumpin).empty?
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
le
|
42
|
+
le((" #{sumpin.to_s.upcase} " << '-'*38).color(colour).bright)
|
43
|
+
le " " << rap.send(sumpin).join("#{$/} ").color(colour)
|
44
44
|
end
|
45
|
-
|
45
|
+
le " Exit code: #{rap.exit_code}".color(colour) if rap.exit_code != 0
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
@@ -82,7 +82,7 @@ module Rudy::Routines::Handlers;
|
|
82
82
|
|
83
83
|
def create(rbox, disk, index)
|
84
84
|
if disk.exists?
|
85
|
-
|
85
|
+
li "Disk found: #{disk.name}"
|
86
86
|
disk.refresh!
|
87
87
|
end
|
88
88
|
|
@@ -179,7 +179,7 @@ module Rudy::Routines::Handlers;
|
|
179
179
|
raise Rudy::Disks::AlreadyMounted, disk.name if disk.mounted?
|
180
180
|
end
|
181
181
|
|
182
|
-
|
182
|
+
li "Mounting at #{disk.path}... "
|
183
183
|
|
184
184
|
|
185
185
|
rbox.mkdir(:p, disk.path)
|
@@ -201,7 +201,7 @@ module Rudy::Routines::Handlers;
|
|
201
201
|
raise Rudy::Disks::NotMounted, disk.name if !disk.mounted?
|
202
202
|
end
|
203
203
|
|
204
|
-
|
204
|
+
li "Unmounting #{disk.path}... "
|
205
205
|
|
206
206
|
unless rbox.nil? || rbox.stash.windows?
|
207
207
|
rbox.umount(disk.path)
|
@@ -232,11 +232,11 @@ module Rudy::Routines::Handlers;
|
|
232
232
|
|
233
233
|
print "Creating #{disk.fstype} filesystem for #{disk.path}... "
|
234
234
|
if rbox.stash.windows?
|
235
|
-
|
235
|
+
li "(index: #{index})"
|
236
236
|
windows_diskpart_partition rbox, disk, index
|
237
237
|
disk.mounted = true
|
238
238
|
else
|
239
|
-
|
239
|
+
li $/
|
240
240
|
rbox.rudy_mkfs(:t, disk.fstype, :F, disk.device)
|
241
241
|
end
|
242
242
|
|
@@ -257,7 +257,7 @@ module Rudy::Routines::Handlers;
|
|
257
257
|
raise Rudy::Disks::InUse, disk.name if disk.volume_attached?
|
258
258
|
end
|
259
259
|
|
260
|
-
|
260
|
+
li "Destroying #{disk.name}"
|
261
261
|
disk.destroy
|
262
262
|
end
|
263
263
|
|
@@ -268,13 +268,13 @@ module Rudy::Routines::Handlers;
|
|
268
268
|
raise Rudy::Disks::NotAttached, disk.name if !disk.volume_attached?
|
269
269
|
|
270
270
|
back = disk.archive
|
271
|
-
|
271
|
+
li "Created backup: #{back.name}"
|
272
272
|
end
|
273
273
|
|
274
274
|
def restore(rbox, disk, index)
|
275
275
|
|
276
276
|
if disk.exists?
|
277
|
-
|
277
|
+
li "Disk found: #{disk.name}"
|
278
278
|
disk.refresh!
|
279
279
|
end
|
280
280
|
|
@@ -290,7 +290,7 @@ module Rudy::Routines::Handlers;
|
|
290
290
|
|
291
291
|
disk.size, disk.fstype = latest_backup.size, latest_backup.fstype
|
292
292
|
|
293
|
-
|
293
|
+
li "Backup found: #{latest_backup.name}"
|
294
294
|
|
295
295
|
unless disk.volume_exists?
|
296
296
|
msg = "Creating volume... "
|
@@ -70,7 +70,7 @@ module Rudy; module Routines; module Handlers;
|
|
70
70
|
end
|
71
71
|
|
72
72
|
ports.each do |port|
|
73
|
-
|
73
|
+
li "#{action} port #{port} access for: #{addresses.join(', ')}"
|
74
74
|
Rudy::AWS::EC2::Groups.send(action, name, addresses, [[port, port]]) rescue nil
|
75
75
|
end
|
76
76
|
end
|
@@ -13,7 +13,7 @@ module Rudy::Routines::Handlers;
|
|
13
13
|
def create_box(hostname, opts={})
|
14
14
|
ld [:hostname, hostname, opts, caller[0]]
|
15
15
|
opts = {
|
16
|
-
:info => (@@global.verbose >=
|
16
|
+
:info => (@@global.verbose >= 2), # rudy -vv
|
17
17
|
:debug => false,
|
18
18
|
:user => current_machine_user,
|
19
19
|
:ostype => current_machine_os || :unix,
|
@@ -35,14 +35,14 @@ module Rudy::Routines::Handlers;
|
|
35
35
|
# We define hooks so we can still print each command and its output
|
36
36
|
# when running the command blocks. NOTE: We only print this in
|
37
37
|
# verbosity mode.
|
38
|
-
if
|
38
|
+
if !@@global.parallel && !@@global.quiet
|
39
39
|
# This block gets called for every command method call.
|
40
40
|
box.pre_command_hook do |cmd, user, host, nickname|
|
41
41
|
print_command user, nickname, cmd
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
if @@global.verbose >
|
45
|
+
if @@global.verbose > 0 && !@@global.quiet
|
46
46
|
# And this one gets called after each command method call.
|
47
47
|
box.post_command_hook do |ret|
|
48
48
|
print_response ret
|
@@ -68,7 +68,9 @@ module Rudy::Routines::Handlers;
|
|
68
68
|
# NOTE: Windows machines are skipped and not added to the set.
|
69
69
|
def create_set(hostnames, opts={})
|
70
70
|
hostnames ||= []
|
71
|
-
|
71
|
+
|
72
|
+
ld "Creating set from:", hostnames.inspect
|
73
|
+
|
72
74
|
opts = {
|
73
75
|
:user => (current_machine_user).to_s,
|
74
76
|
:parallel => @@global.parallel
|
@@ -164,7 +166,7 @@ module Rudy::Routines::Handlers;
|
|
164
166
|
else
|
165
167
|
le prefix << "#{ex.class}: #{ex.message}".color(:red)
|
166
168
|
end
|
167
|
-
le
|
169
|
+
le ex.backtrace if @@global.verbose > 1
|
168
170
|
end
|
169
171
|
|
170
172
|
|