solutious-rudy 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/CHANGES.txt +8 -9
  2. data/README.rdoc +48 -7
  3. data/Rakefile +102 -7
  4. data/Rudyfile +28 -0
  5. data/bin/ird +162 -0
  6. data/bin/rudy +287 -93
  7. data/lib/annoy.rb +227 -0
  8. data/lib/aws_sdb/service.rb +1 -1
  9. data/lib/console.rb +20 -4
  10. data/lib/escape.rb +305 -0
  11. data/lib/rudy.rb +265 -125
  12. data/lib/rudy/aws.rb +61 -26
  13. data/lib/rudy/aws/ec2.rb +20 -296
  14. data/lib/rudy/aws/ec2/address.rb +121 -0
  15. data/lib/rudy/aws/ec2/group.rb +241 -0
  16. data/lib/rudy/aws/ec2/image.rb +46 -0
  17. data/lib/rudy/aws/ec2/instance.rb +407 -0
  18. data/lib/rudy/aws/ec2/keypair.rb +92 -0
  19. data/lib/rudy/aws/ec2/snapshot.rb +87 -0
  20. data/lib/rudy/aws/ec2/volume.rb +234 -0
  21. data/lib/rudy/aws/simpledb.rb +33 -15
  22. data/lib/rudy/cli.rb +142 -0
  23. data/lib/rudy/cli/addresses.rb +85 -0
  24. data/lib/rudy/cli/backups.rb +175 -0
  25. data/lib/rudy/{command → cli}/config.rb +18 -13
  26. data/lib/rudy/cli/deploy.rb +12 -0
  27. data/lib/rudy/cli/disks.rb +125 -0
  28. data/lib/rudy/cli/domains.rb +17 -0
  29. data/lib/rudy/cli/groups.rb +77 -0
  30. data/lib/rudy/{command → cli}/images.rb +18 -6
  31. data/lib/rudy/cli/instances.rb +142 -0
  32. data/lib/rudy/cli/keypairs.rb +47 -0
  33. data/lib/rudy/cli/manager.rb +51 -0
  34. data/lib/rudy/{command → cli}/release.rb +10 -10
  35. data/lib/rudy/cli/routines.rb +80 -0
  36. data/lib/rudy/cli/volumes.rb +121 -0
  37. data/lib/rudy/command/addresses.rb +62 -39
  38. data/lib/rudy/command/backups.rb +60 -170
  39. data/lib/rudy/command/disks-old.rb +322 -0
  40. data/lib/rudy/command/disks.rb +5 -209
  41. data/lib/rudy/command/domains.rb +34 -0
  42. data/lib/rudy/command/groups.rb +105 -48
  43. data/lib/rudy/command/instances.rb +263 -70
  44. data/lib/rudy/command/keypairs.rb +149 -0
  45. data/lib/rudy/command/manager.rb +65 -0
  46. data/lib/rudy/command/volumes.rb +110 -49
  47. data/lib/rudy/config.rb +90 -70
  48. data/lib/rudy/config/objects.rb +67 -0
  49. data/lib/rudy/huxtable.rb +253 -0
  50. data/lib/rudy/metadata/backup.rb +23 -48
  51. data/lib/rudy/metadata/disk.rb +79 -68
  52. data/lib/rudy/metadata/machine.rb +34 -0
  53. data/lib/rudy/routines.rb +54 -0
  54. data/lib/rudy/routines/disk_handler.rb +190 -0
  55. data/lib/rudy/routines/release.rb +15 -0
  56. data/lib/rudy/routines/script_runner.rb +65 -0
  57. data/lib/rudy/routines/shutdown.rb +42 -0
  58. data/lib/rudy/routines/startup.rb +48 -0
  59. data/lib/rudy/utils.rb +57 -2
  60. data/lib/storable.rb +11 -5
  61. data/lib/sysinfo.rb +274 -0
  62. data/rudy.gemspec +84 -20
  63. data/support/randomize-root-password +45 -0
  64. data/support/rudy-ec2-startup +5 -5
  65. data/support/update-ec2-ami-tools +20 -0
  66. data/test/05_config/00_setup_test.rb +24 -0
  67. data/test/05_config/30_machines_test.rb +69 -0
  68. data/test/20_sdb/00_setup_test.rb +31 -0
  69. data/test/20_sdb/10_domains_test.rb +113 -0
  70. data/test/25_ec2/00_setup_test.rb +34 -0
  71. data/test/25_ec2/10_keypairs_test.rb +33 -0
  72. data/test/25_ec2/20_groups_test.rb +139 -0
  73. data/test/25_ec2/30_addresses_test.rb +35 -0
  74. data/test/25_ec2/40_volumes_test.rb +46 -0
  75. data/test/25_ec2/50_snapshots_test.rb +69 -0
  76. data/test/26_ec2_instances/00_setup_test.rb +33 -0
  77. data/test/26_ec2_instances/10_instances_test.rb +81 -0
  78. data/test/26_ec2_instances/50_images_test.rb +13 -0
  79. data/test/30_sdb_metadata/00_setup_test.rb +28 -0
  80. data/test/30_sdb_metadata/10_disks_test.rb +99 -0
  81. data/test/30_sdb_metadata/20_backups_test.rb +102 -0
  82. data/test/50_commands/00_setup_test.rb +11 -0
  83. data/test/50_commands/10_keypairs_test.rb +79 -0
  84. data/test/50_commands/20_groups_test.rb +77 -0
  85. data/test/50_commands/40_volumes_test.rb +55 -0
  86. data/test/50_commands/50_instances_test.rb +110 -0
  87. data/test/coverage.txt +51 -0
  88. data/test/helper.rb +35 -0
  89. data/tryouts/disks.rb +55 -0
  90. data/tryouts/nested_methods.rb +36 -0
  91. data/tryouts/session_tryout.rb +48 -0
  92. metadata +94 -25
  93. data/bin/rudy-ec2 +0 -108
  94. data/lib/rudy/command/base.rb +0 -839
  95. data/lib/rudy/command/deploy.rb +0 -12
  96. data/lib/rudy/command/environment.rb +0 -74
  97. data/lib/rudy/command/machines.rb +0 -170
  98. data/lib/rudy/command/metadata.rb +0 -41
  99. data/lib/rudy/metadata.rb +0 -26
data/lib/rudy/utils.rb CHANGED
@@ -16,8 +16,8 @@ module Rudy
16
16
  def external_ip_address
17
17
  ip = nil
18
18
  %w{solutious.com/ip myip.dk/ whatismyip.com }.each do |sponge| # w/ backup
19
- break unless ip.nil?
20
19
  ip = (open("http://#{sponge}") { |f| /([0-9]{1,3}\.){3}[0-9]{1,3}/.match(f.read) }).to_s rescue nil
20
+ break if !ip.nil?
21
21
  end
22
22
  ip += "/32" if ip
23
23
  ip
@@ -37,7 +37,7 @@ module Rudy
37
37
  end
38
38
 
39
39
  # Generates a canonical tag name in the form:
40
- # rudy-2009-12-31-r1
40
+ # rudy-2009-12-31-01
41
41
  # where r1 refers to the revision number that day
42
42
  def generate_tag(revision=1)
43
43
  n = DateTime.now
@@ -60,5 +60,60 @@ module Rudy
60
60
  false
61
61
  end
62
62
  end
63
+
64
+
65
+
66
+ # Capture STDOUT or STDERR to prevent it from being printed.
67
+ #
68
+ # capture(:stdout) do
69
+ # ...
70
+ # end
71
+ #
72
+ def capture(stream)
73
+ #raise "We can only capture STDOUT or STDERR" unless stream == :stdout || stream == :stderr
74
+ begin
75
+ stream = stream.to_s
76
+ eval "$#{stream} = StringIO.new"
77
+ yield
78
+ result = eval("$#{stream}").read
79
+ ensure
80
+ eval("$#{stream} = #{stream.upcase}")
81
+ end
82
+
83
+ result
84
+ end
85
+
86
+ # A basic file writer
87
+ def write_to_file(filename, content, mode, chmod=nil)
88
+ mode = (mode == :append) ? 'a' : 'w'
89
+ f = File.open(filename,mode)
90
+ f.puts content
91
+ f.close
92
+ return unless Rudy.sysinfo.os == :unix
93
+ raise "Provided chmod is not a Fixnum (#{chmod})" unless chmod.is_a?(Fixnum)
94
+ File.chmod(chmod, filename)
95
+ end
96
+
97
+ #
98
+ # Generates a string of random alphanumeric characters.
99
+ # * +len+ is the length, an Integer. Default: 8
100
+ # * +safe+ in safe-mode, ambiguous characters are removed (default: true):
101
+ # i l o 1 0
102
+ def strand( len=8, safe=true )
103
+ chars = ("a".."z").to_a + ("0".."9").to_a
104
+ chars.delete_if { |v| %w(i l o 1 0).member?(v) } if safe
105
+ str = ""
106
+ 1.upto(len) { |i| str << chars[rand(chars.size-1)] }
107
+ str
108
+ end
109
+
110
+ # Returns +str+ with the leading indentation removed.
111
+ # Stolen from http://github.com/mynyml/unindent/ because it was better.
112
+ def without_indent(str)
113
+ indent = str.split($/).each {|line| !line.strip.empty? }.map {|line| line.index(/[^\s]/) }.compact.min
114
+ str.gsub(/^[[:blank:]]{#{indent}}/, '')
115
+ end
116
+
117
+
63
118
  end
64
119
  end
data/lib/storable.rb CHANGED
@@ -13,9 +13,11 @@ require 'fileutils'
13
13
  # Storable.field method which tells Storable the order and
14
14
  # name.
15
15
  class Storable
16
- VERSION = 2
17
- NICE_TIME_FORMAT = "%Y-%m-%d@%H:%M:%S".freeze unless defined? NICE_TIME_FORMAT
18
- SUPPORTED_FORMATS = %w{tsv csv yaml json}.freeze unless defined? SUPPORTED_FORMATS
16
+ unless defined?(VERSION) # We can assume all are defined
17
+ VERSION = 2
18
+ NICE_TIME_FORMAT = "%Y-%m-%d@%H:%M:%S".freeze
19
+ SUPPORTED_FORMATS = %w{tsv csv yaml json}.freeze
20
+ end
19
21
 
20
22
  # This value will be used as a default unless provided on-the-fly.
21
23
  # See SUPPORTED_FORMATS for available values.
@@ -109,7 +111,7 @@ class Storable
109
111
  # Create a new instance of the object from a hash.
110
112
  def self.from_hash(from={})
111
113
  me = self.new
112
-
114
+
113
115
  return me if !from || from.empty?
114
116
 
115
117
  fnames = field_names
@@ -122,8 +124,10 @@ class Storable
122
124
  if field_types[index] == Array
123
125
  ((value ||= []) << stored_value).flatten
124
126
  elsif field_types[index] == Hash
127
+
125
128
  value = stored_value
126
129
  else
130
+
127
131
  # SimpleDB stores attribute shit as lists of values
128
132
  value = stored_value.first if stored_value.is_a?(Array) && stored_value.size == 1
129
133
 
@@ -137,8 +141,10 @@ class Storable
137
141
  value = value.to_f
138
142
  elsif field_types[index] == Integer
139
143
  value = value.to_i
144
+ elsif field_types[index].kind_of?(Storable) && stored_value.is_a?(Hash)
145
+ value = field_types[index].from_hash(stored_value)
140
146
  else
141
- value = value.first if value.is_a?(Array) && value.size == 1 # I
147
+ value = (stored_value.is_a?(Array) && stored_value.size == 1) ? stored_value.first : stored_value
142
148
  end
143
149
  end
144
150
 
data/lib/sysinfo.rb ADDED
@@ -0,0 +1,274 @@
1
+ require 'storable'
2
+ require 'socket'
3
+
4
+ # SystemInfo
5
+ #
6
+ # A container for the system platform information.
7
+ # Portions of this code is from Amazon's EC2 AMI tools, lib/platform.rb.
8
+ class SystemInfo < Storable
9
+ unless defined?(VERSION)
10
+ VERSION = 2.freeze
11
+ IMPLEMENTATIONS = [
12
+
13
+ # These are for JRuby, System.getproperty('os.name').
14
+ # For a list of all values, see: http://lopica.sourceforge.net/os.html
15
+ [/mac\s*os\s*x/i, :unix, :osx ],
16
+ [/sunos/i, :unix, :solaris ],
17
+ [/windows\s*ce/i, :win32, :windows ],
18
+ [/windows/i, :win32, :windows ],
19
+ [/osx/i, :unix, :osx ],
20
+
21
+ # TODO: implement other windows matches: # /djgpp|(cyg|ms|bcc)win|mingw/ (from mongrel)
22
+
23
+ # These are for RUBY_PLATFORM and JRuby
24
+ [/java/i, :java, :java ],
25
+ [/darwin/i, :unix, :osx ],
26
+ [/linux/i, :unix, :linux ],
27
+ [/freebsd/i, :unix, :freebsd ],
28
+ [/netbsd/i, :unix, :netbsd ],
29
+ [/solaris/i, :unix, :solaris ],
30
+ [/irix/i, :unix, :irix ],
31
+ [/cygwin/i, :unix, :cygwin ],
32
+ [/mswin/i, :win32, :windows ],
33
+ [/mingw/i, :win32, :mingw ],
34
+ [/bccwin/i, :win32, :bccwin ],
35
+ [/wince/i, :win32, :wince ],
36
+ [/vms/i, :vms, :vms ],
37
+ [/os2/i, :os2, :os2 ],
38
+ [nil, :unknown, :unknown ],
39
+ ].freeze
40
+
41
+ ARCHITECTURES = [
42
+ [/(i\d86)/i, :i386 ],
43
+ [/x86_64/i, :x86_64 ],
44
+ [/x86/i, :i386 ], # JRuby
45
+ [/ia64/i, :ia64 ],
46
+ [/alpha/i, :alpha ],
47
+ [/sparc/i, :sparc ],
48
+ [/mips/i, :mips ],
49
+ [/powerpc/i, :powerpc ],
50
+ [/universal/i,:universal ],
51
+ [nil, :unknown ],
52
+ ].freeze
53
+ end
54
+
55
+
56
+ field :os => String
57
+ field :implementation => String
58
+ field :architecture => String
59
+ field :hostname => String
60
+ field :ipaddress => String
61
+ field :uptime => Float
62
+
63
+
64
+ alias :impl :implementation
65
+ alias :arch :architecture
66
+
67
+
68
+ def initialize
69
+ @os, @implementation, @architecture = guess
70
+ @hostname, @ipaddress, @uptime = get_info
71
+ end
72
+
73
+ # guess
74
+ #
75
+ # This is called at require-time in stella.rb. It guesses
76
+ # the current operating system, implementation, architecture.
77
+ # Returns [os, impl, arch]
78
+ def guess
79
+ os = :unknown
80
+ impl = :unknown
81
+ arch = :unknown
82
+ IMPLEMENTATIONS.each do |r, o, i|
83
+ if r and RUBY_PLATFORM =~ r
84
+ os, impl = [o, i]
85
+ break
86
+ end
87
+ end
88
+ ARCHITECTURES.each do |r, a|
89
+ if r and RUBY_PLATFORM =~ r
90
+ arch = a
91
+ break
92
+ end
93
+ end
94
+
95
+ #
96
+ if os == :win32
97
+ #require 'Win32API'
98
+
99
+ # If we're running in java, we'll need to look elsewhere
100
+ # for the implementation and architecture.
101
+ # We'll replace IMPL and ARCH with what we find.
102
+ elsif os == :java
103
+ require 'java'
104
+ include_class java.lang.System
105
+
106
+ osname = System.getProperty("os.name")
107
+ IMPLEMENTATIONS.each do |r, o, i|
108
+ if r and osname =~ r
109
+ impl = i
110
+ break
111
+ end
112
+ end
113
+
114
+ osarch = System.getProperty("os.arch")
115
+ ARCHITECTURES.each do |r, a|
116
+ if r and osarch =~ r
117
+ arch = a
118
+ break
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ [os, impl, arch]
125
+ end
126
+
127
+ # get_info
128
+ #
129
+ # Returns [hostname, ipaddr, uptime] for the local machine
130
+ def get_info
131
+ hostname = :unknown
132
+ ipaddr = :unknown
133
+ uptime = :unknown
134
+
135
+ begin
136
+ hostname = local_hostname
137
+ ipaddr = local_ip_address
138
+ uptime = local_uptime
139
+ rescue => ex
140
+ # Be silent!
141
+ end
142
+
143
+ [hostname, ipaddr, uptime]
144
+ end
145
+
146
+ # local_hostname
147
+ #
148
+ # Return the hostname for the local machine
149
+ def local_hostname
150
+ Socket.gethostname
151
+ end
152
+
153
+ # local_uptime
154
+ #
155
+ # Returns the local uptime in hours. Use Win32API in Windows,
156
+ # 'sysctl -b kern.boottime' os osx, and 'who -b' on unix.
157
+ # Based on Ruby Quiz solutions by: Matthias Reitinger
158
+ # On Windows, see also: net statistics server
159
+ def local_uptime
160
+
161
+ # Each method must return uptime in seconds
162
+ methods = {
163
+
164
+ :win32_windows => lambda {
165
+ # Win32API is required in self.guess
166
+ getTickCount = Win32API.new("kernel32", "GetTickCount", nil, 'L')
167
+ ((getTickCount.call()).to_f / 1000).to_f
168
+ },
169
+
170
+ # Ya, this is kinda wack. Ruby -> Java -> Kernel32. See:
171
+ # http://www.oreillynet.com/ruby/blog/2008/01/jruby_meets_the_windows_api_1.html
172
+ # http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx
173
+ # Ruby 1.9.1: Win32API is now deprecated in favor of using the DL library.
174
+ :java_windows => lambda {
175
+ kernel32 = com.sun.jna.NativeLibrary.getInstance('kernel32')
176
+ buf = java.nio.ByteBuffer.allocate(256)
177
+ (kernel32.getFunction('GetTickCount').invokeInt([256, buf].to_java).to_f / 1000).to_f
178
+ },
179
+
180
+ :unix_osx => lambda {
181
+ # This is faster than who and could work on BSD also.
182
+ (Time.now.to_f - Time.at(`sysctl -b kern.boottime 2>/dev/null`.unpack('L').first).to_f).to_f
183
+ },
184
+ # This should work for most unix flavours.
185
+ :unix => lambda {
186
+ # who is sloooooow. Use File.read('/proc/uptime')
187
+ (Time.now.to_f - Time.parse(`who -b 2>/dev/null`).to_f)
188
+ }
189
+ }
190
+
191
+ hours = 0
192
+
193
+ begin
194
+ key = platform
195
+ method = (methods.has_key? key) ? methods[key] : methods[:unix]
196
+ hours = (method.call) / 3600 # seconds to hours
197
+ rescue => ex
198
+ end
199
+ hours
200
+ end
201
+
202
+
203
+ #
204
+ # Return the local IP address which receives external traffic
205
+ # from: http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/
206
+ # NOTE: This <em>does not</em> open a connection to the IP address.
207
+ def local_ip_address
208
+ # turn off reverse DNS resolution temporarily
209
+ orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true
210
+ UDPSocket.open {|s| s.connect('75.101.137.7', 1); s.addr.last } # Solutious IP
211
+ ensure
212
+ Socket.do_not_reverse_lookup = orig
213
+ end
214
+
215
+ #
216
+ # Returns the local IP address based on the hostname.
217
+ # According to coderrr (see comments on blog link above), this implementation
218
+ # doesn't guarantee that it will return the address for the interface external
219
+ # traffic goes through. It's also possible the hostname isn't resolvable to the
220
+ # local IP.
221
+ def local_ip_address_alt
222
+ ipaddr = :unknown
223
+ begin
224
+ saddr = Socket.getaddrinfo( Socket.gethostname, nil, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)
225
+ ipaddr = saddr.select{|type| type[0] == 'AF_INET' }[0][3]
226
+ rescue => ex
227
+ end
228
+ ipaddr
229
+ end
230
+
231
+ # returns a symbol in the form: os_implementation. This is used throughout Stella
232
+ # for platform specific support.
233
+ def platform
234
+ "#{@os}_#{@implementation}".to_sym
235
+ end
236
+
237
+ # Returns Ruby version as an array
238
+ def ruby
239
+ RUBY_VERSION.split('.').map { |v| v.to_i }
240
+ end
241
+
242
+ # Returns the environment PATH as an Array
243
+ def paths
244
+ if @os == :unix
245
+ (ENV['PATH'] || '').split(':')
246
+ elsif
247
+ (ENV['PATH'] || '').split(';') # Note tested!
248
+ else
249
+ raise "paths not implemented for: #{@os}"
250
+ end
251
+ end
252
+
253
+ def user
254
+ ENV['USER']
255
+ end
256
+
257
+ def home
258
+ if @os == :unix
259
+ File.expand_path(ENV['HOME'])
260
+ elsif @os == :win32
261
+ File.expand_path(ENV['USERPROFILE'])
262
+ else
263
+ raise "paths not implemented for: #{@os}"
264
+ end
265
+ end
266
+
267
+ # Print friendly system information.
268
+ def to_s
269
+ sprintf("Hostname: %s#{$/}IP Address: %s#{$/}System: %s#{$/}Uptime: %.2f (hours)#{$/}Ruby: #{ruby.join('.')}",
270
+ @hostname, @ipaddress, "#{@os}-#{@implementation}-#{@architecture}", @uptime)
271
+ end
272
+
273
+
274
+ end
data/rudy.gemspec CHANGED
@@ -1,7 +1,8 @@
1
1
  @spec = Gem::Specification.new do |s|
2
2
  s.name = "rudy"
3
- s.version = "0.4.0"
4
- s.summary = "Your friend in staging and deploying with EC2."
3
+ s.rubyforge_project = 'rudy'
4
+ s.version = "0.5.0"
5
+ s.summary = "Not your grandparent's deployment tool."
5
6
  s.description = s.summary
6
7
  s.author = "Delano Mandelbaum"
7
8
  s.email = "delano@solutious.com"
@@ -14,63 +15,126 @@
14
15
  LICENSE.txt
15
16
  README.rdoc
16
17
  Rakefile
18
+ Rudyfile
19
+ bin/ird
17
20
  bin/rudy
18
- bin/rudy-ec2
21
+ lib/annoy.rb
19
22
  lib/aws_sdb.rb
20
23
  lib/aws_sdb/error.rb
21
24
  lib/aws_sdb/service.rb
22
25
  lib/console.rb
26
+ lib/escape.rb
23
27
  lib/rudy.rb
24
28
  lib/rudy/aws.rb
25
29
  lib/rudy/aws/ec2.rb
30
+ lib/rudy/aws/ec2/address.rb
31
+ lib/rudy/aws/ec2/group.rb
32
+ lib/rudy/aws/ec2/image.rb
33
+ lib/rudy/aws/ec2/instance.rb
34
+ lib/rudy/aws/ec2/keypair.rb
35
+ lib/rudy/aws/ec2/snapshot.rb
36
+ lib/rudy/aws/ec2/volume.rb
26
37
  lib/rudy/aws/s3.rb
27
38
  lib/rudy/aws/simpledb.rb
39
+ lib/rudy/cli.rb
40
+ lib/rudy/cli/addresses.rb
41
+ lib/rudy/cli/backups.rb
42
+ lib/rudy/cli/config.rb
43
+ lib/rudy/cli/deploy.rb
44
+ lib/rudy/cli/disks.rb
45
+ lib/rudy/cli/domains.rb
46
+ lib/rudy/cli/groups.rb
47
+ lib/rudy/cli/images.rb
48
+ lib/rudy/cli/instances.rb
49
+ lib/rudy/cli/keypairs.rb
50
+ lib/rudy/cli/manager.rb
51
+ lib/rudy/cli/release.rb
52
+ lib/rudy/cli/routines.rb
53
+ lib/rudy/cli/volumes.rb
28
54
  lib/rudy/command/addresses.rb
29
55
  lib/rudy/command/backups.rb
30
- lib/rudy/command/base.rb
31
- lib/rudy/command/config.rb
32
- lib/rudy/command/deploy.rb
56
+ lib/rudy/command/disks-old.rb
33
57
  lib/rudy/command/disks.rb
34
- lib/rudy/command/environment.rb
58
+ lib/rudy/command/domains.rb
35
59
  lib/rudy/command/groups.rb
36
- lib/rudy/command/images.rb
37
60
  lib/rudy/command/instances.rb
38
- lib/rudy/command/machines.rb
39
- lib/rudy/command/metadata.rb
40
- lib/rudy/command/release.rb
61
+ lib/rudy/command/keypairs.rb
62
+ lib/rudy/command/manager.rb
41
63
  lib/rudy/command/volumes.rb
42
64
  lib/rudy/config.rb
43
- lib/rudy/metadata.rb
65
+ lib/rudy/config/objects.rb
66
+ lib/rudy/huxtable.rb
44
67
  lib/rudy/metadata/backup.rb
45
68
  lib/rudy/metadata/disk.rb
69
+ lib/rudy/metadata/machine.rb
70
+ lib/rudy/routines.rb
71
+ lib/rudy/routines/disk_handler.rb
72
+ lib/rudy/routines/release.rb
73
+ lib/rudy/routines/script_runner.rb
74
+ lib/rudy/routines/shutdown.rb
75
+ lib/rudy/routines/startup.rb
46
76
  lib/rudy/scm/svn.rb
47
77
  lib/rudy/utils.rb
48
78
  lib/storable.rb
79
+ lib/sysinfo.rb
49
80
  lib/tryouts.rb
50
81
  rudy.gemspec
51
82
  support/mailtest
83
+ support/randomize-root-password
52
84
  support/rudy-ec2-startup
85
+ support/update-ec2-ami-tools
86
+ test/05_config/00_setup_test.rb
87
+ test/05_config/30_machines_test.rb
88
+ test/20_sdb/00_setup_test.rb
89
+ test/20_sdb/10_domains_test.rb
90
+ test/25_ec2/00_setup_test.rb
91
+ test/25_ec2/10_keypairs_test.rb
92
+ test/25_ec2/20_groups_test.rb
93
+ test/25_ec2/30_addresses_test.rb
94
+ test/25_ec2/40_volumes_test.rb
95
+ test/25_ec2/50_snapshots_test.rb
96
+ test/26_ec2_instances/00_setup_test.rb
97
+ test/26_ec2_instances/10_instances_test.rb
98
+ test/26_ec2_instances/50_images_test.rb
99
+ test/30_sdb_metadata/00_setup_test.rb
100
+ test/30_sdb_metadata/10_disks_test.rb
101
+ test/30_sdb_metadata/20_backups_test.rb
102
+ test/50_commands/00_setup_test.rb
103
+ test/50_commands/10_keypairs_test.rb
104
+ test/50_commands/20_groups_test.rb
105
+ test/50_commands/40_volumes_test.rb
106
+ test/50_commands/50_instances_test.rb
107
+ test/coverage.txt
108
+ test/helper.rb
53
109
  tryouts/console_tryout.rb
110
+ tryouts/disks.rb
111
+ tryouts/nested_methods.rb
112
+ tryouts/session_tryout.rb
54
113
  )
55
- s.executables = %w[rudy rudy-ec2]
114
+ s.executables = %w[rudy ird]
56
115
 
57
- s.extra_rdoc_files = %w[README.rdoc LICENSE.txt]
116
+ s.extra_rdoc_files = %w[README.rdoc LICENSE.txt CHANGES.txt]
58
117
  s.has_rdoc = true
59
118
  s.rdoc_options = ["--line-numbers", "--title", "Rudy: #{s.summary}", "--main", "README.rdoc"]
60
119
  s.require_paths = %w[lib]
61
120
  s.rubygems_version = '1.1.1'
62
-
63
121
 
64
- s.add_dependency 'drydock'
65
- s.add_dependency 'caesars'
66
122
  s.add_dependency 'echoe'
67
- s.add_dependency 'right_aws'
123
+ s.add_dependency 'amazon-ec2'
124
+ s.add_dependency 'aws-sdb'
68
125
  s.add_dependency 'net-ssh'
69
126
  s.add_dependency 'net-scp'
70
127
  s.add_dependency 'net-ssh-gateway'
71
128
  s.add_dependency 'net-ssh-multi'
72
- s.add_dependency 'highline'
129
+ s.add_dependency 'drydock'
130
+ s.add_dependency 'caesars'
131
+ s.add_dependency 'rye'
132
+
133
+ # http://bit.ly/2WaAgV
134
+ #s.add_runtime_dependency('xml-simple', '>= 1.0.11')
135
+ #s.add_dependency('xml-simple', '>= 1.0.11')
136
+ #s.add_development_dependency('jgre-monkeyspecdoc', '>= 0.1.0')
137
+ #s.add_development_dependency('thoughtbot-shoulda', '>= 0.1.0')
73
138
 
74
139
 
75
- s.rubyforge_project = 'rudy'
76
140
  end