solutious-rudy 0.7.2 → 0.7.3

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/Rudyfile CHANGED
@@ -123,7 +123,7 @@ routines do
123
123
 
124
124
  shutdown do # $ rudy shutdown
125
125
  before :root do # Run remote SSH commands before shutdown
126
- mysqld_initd
126
+ #mysqld_initd
127
127
  end
128
128
 
129
129
  disks do
@@ -23,6 +23,8 @@ require 'drydock'
23
23
  module RudyCLI_EC2
24
24
  extend Drydock
25
25
 
26
+ debug :off
27
+ default :instances
26
28
 
27
29
  # ----------------------------------- AMAZON EC2 COMMANDS --------
28
30
  # ------------------------------------------------------------------
@@ -47,6 +49,8 @@ module RudyCLI_EC2
47
49
 
48
50
  about "Amazon EC2 instance console output"
49
51
  usage "rudy-ec2 console [-g group] [instance ID]"
52
+ usage "rudy-ec2 [-k path/2/privatekey] console [instance ID]"
53
+ usage "NOTE: Private key is required only for Windows instances"
50
54
  option :g, :group, String, "A security group name"
51
55
  argv :awsid
52
56
  command :consoles => Rudy::CLI::AWS::EC2::Instances
@@ -54,8 +58,8 @@ module RudyCLI_EC2
54
58
  command_alias :consoles, :c
55
59
 
56
60
  about "Copy files to or from machines."
57
- usage "rudy-ec2 copy [-p] [-r] [-u user] [-k path/2/privatekey] source target"
58
- usage "rudy-ec2 upload -k path/2/privatekey -u username local-source target"
61
+ usage "rudy-ec2 copy [-p] [-r] source target"
62
+ usage "rudy-ec2 [-u user] [-k path/2/privatekey] upload local-source target"
59
63
  usage "rudy-ec2 download remote-source target"
60
64
  usage "NOTE: Use quotes when using a tilda or asterisk in remote paths ('~/')."
61
65
  usage "rudy-ec2 download '~/*' /tmp/"
@@ -207,12 +211,7 @@ module RudyCLI_EC2
207
211
  command_alias :zones, :zone
208
212
  command_alias :zones, :z
209
213
 
210
-
211
- # -------------------------------- RUDY-EC2 MISCELLANEOUS --------
212
- # ------------------------------------------------------------------
213
-
214
- default :instances
215
- debug :off
214
+
216
215
 
217
216
  end
218
217
 
@@ -186,9 +186,12 @@ class Annoy
186
186
  begin
187
187
  success = Timeout::timeout(period || @@period) do
188
188
  regexp &&= Regexp.new regexp
189
- writer.print msg
190
- writer.flush if writer.respond_to?(:flush)
191
- response = Annoy.get_response
189
+ highline = HighLine.new
190
+ response = highline.ask(msg) { |q|
191
+ q.echo = '*' # Don't display response
192
+ q.overwrite = true # Erase the question afterwards
193
+ q.whitespace = :strip # Remove whitespace from the response
194
+ }
192
195
  regexp.match(response)
193
196
  end
194
197
  rescue Timeout::Error => ex
@@ -197,6 +200,27 @@ class Annoy
197
200
  end
198
201
  end
199
202
 
203
+
204
+ def Annoy.timed_display(msg, writer, period=nil)
205
+ return true unless STDIN.tty? # Only ask a question if there's a human
206
+ if Annoy.skip?
207
+ #writer.puts msg
208
+ return true
209
+ end
210
+ begin
211
+ period ||= @@period
212
+ success = Timeout::timeout(period) do
213
+ writer.puts "Message will display for #{period} seconds"
214
+ writer.print msg
215
+ writer.flush if writer.respond_to?(:flush)
216
+ sleep period+1
217
+ end
218
+ rescue Timeout::Error => ex
219
+ writer.print "\r" << ' '*msg.size
220
+ end
221
+
222
+ true
223
+ end
200
224
 
201
225
  private
202
226
  def Annoy.get_response(writer=STDOUT)
@@ -45,7 +45,7 @@ module Rudy
45
45
  unless defined?(MAJOR)
46
46
  MAJOR = 0.freeze
47
47
  MINOR = 7.freeze
48
- TINY = 2.freeze
48
+ TINY = 3.freeze
49
49
  end
50
50
  def self.to_s; [MAJOR, MINOR, TINY].join('.'); end
51
51
  def self.to_f; self.to_s.to_f; end
@@ -30,7 +30,14 @@ module Rudy::AWS
30
30
 
31
31
  def to_s(with_title=false)
32
32
  lines = []
33
- lines << "%s (%s)" % [liner_note, @groups.join(', ')]
33
+ if @groups
34
+ gpstr = [@groups].flatten.compact.join(', ')
35
+ gpstr &&= "(#{gpstr})"
36
+ else
37
+ gpstr = ''
38
+ end
39
+
40
+ lines << "%s %s" % [liner_note, gpstr]
34
41
  #if self.running?
35
42
  # k, g = @keyname || 'no-keypair', self.groups.join(', ')
36
43
  # lines << @@sformat % %w{zone size ami keyname groups} if with_title
@@ -14,12 +14,9 @@ module AWS; module EC2;
14
14
  end
15
15
  def create_groups
16
16
  opts = check_options
17
- puts "Creating #{@argv.name}"
18
-
19
17
  execute_action {
20
18
  @rgroups.create(@argv.name, @option.description, opts[:addresses], opts[:ports], opts[:protocols])
21
19
  }
22
-
23
20
  @rgroups.list(@argv.name) do |group|
24
21
  puts @@global.verbose > 0 ? group.inspect : group.dump(@@global.format)
25
22
  end
@@ -113,6 +113,10 @@ module AWS; module EC2;
113
113
 
114
114
  def consoles_valid?
115
115
  @rinst = Rudy::AWS::EC2::Instances.new(@@global.accesskey, @@global.secretkey, @@global.region)
116
+ if @@global.pkey
117
+ raise "Cannot find file #{@@global.pkey}" unless File.exists?(@@global.pkey)
118
+ raise "Insecure permissions for #{@@global.pkey}" unless (File.stat(@@global.pkey).mode & 600) == 0
119
+ end
116
120
  raise "No instances" unless @rinst.any?
117
121
  true
118
122
  end
@@ -123,11 +127,35 @@ module AWS; module EC2;
123
127
  opts[:id] &&= [opts[:id]].flatten
124
128
 
125
129
  lt = @rinst.list_group(opts[:group], :any, opts[:id]) do |inst|
126
- puts '-'*50
127
- puts "Console for: #{inst.liner_note}", $/
130
+ puts instance_separator(inst.dns_public || inst.state, inst.awsid)
128
131
  console = @rinst.console(inst.awsid)
129
132
  output = console ? Base64.decode64(console) : "Unavailable"
130
- puts output.noansi # Remove color and clear, etc...
133
+
134
+ # The linux console can include ANSI escape codes for color,
135
+ # clear screen etc... We strip them out to get rid of the
136
+ # clear specifically. Otherwise the display is messed!
137
+ output &&= output.noansi
138
+
139
+ puts output
140
+
141
+ if output.match(/<Password>(.+)<\/Password>/m) # /m, match multiple lines
142
+ puts
143
+ if @@global.pkey
144
+ encrtypted_text = ($1 || '').strip
145
+ k = Rye::Key.from_file(@@global.pkey)
146
+ pword = k.decrypt(encrtypted_text)
147
+ ret = Annoy.pose_question("Display password?\a ", /yes|y|ya|sure|you bet!/i, STDERR)
148
+ if ret
149
+ answer = "%s: %s" % ['password', pword]
150
+ Annoy.timed_display(answer, STDERR, 10)
151
+ end
152
+ puts
153
+ else
154
+ puts "Please supply a private key path to decode the administrator password"
155
+ puts "rudy-ec2 -k path/2/privatekey console [-g group] [instance ID]"
156
+ end
157
+ end
158
+
131
159
  end
132
160
 
133
161
  end
@@ -184,6 +212,9 @@ module AWS; module EC2;
184
212
  status
185
213
  end
186
214
 
215
+ def instance_separator(name, awsid)
216
+ ('%s %-63s awsid: %s ' % [$/, name, awsid]).att(:reverse)
217
+ end
187
218
 
188
219
  end
189
220
 
@@ -12,7 +12,7 @@ module AWS; module EC2;
12
12
  def create_keypairs
13
13
  rkey = Rudy::AWS::EC2::KeyPairs.new(@@global.accesskey, @@global.secretkey, @@global.region)
14
14
  kp = execute_action { rkey.create(@argv.name) }
15
- if %w[s string].member?(@@global.format)
15
+ if [:s, :string].member?(@@global.format)
16
16
  puts "Name: #{kp.name}"
17
17
  puts "Fingerprint: #{kp.fingerprint}", $/
18
18
  puts "Copy the following private key data into a file."
@@ -209,8 +209,6 @@ module Rudy
209
209
  end
210
210
 
211
211
  def machine_separator(name, awsid)
212
- dashes = 80 - name.size #
213
- dashes = 0 if dashes < 1
214
212
  ('%s %-63s awsid: %s ' % [$/, name, awsid]).att(:reverse)
215
213
  end
216
214
 
@@ -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.7.2"
4
+ s.version = "0.7.3"
5
5
  s.summary = "Rudy: Not your grandparents' EC2 deployment tool."
6
6
  s.description = s.summary
7
7
  s.author = "Delano Mandelbaum"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solutious-rudy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum