solutious-rudy 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
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