awful 0.0.183 → 0.1.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/awful/s3.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'aws-sdk-s3'
2
+
1
3
  module Awful
2
4
  module Short
3
5
  def s3(*args)
@@ -17,6 +19,18 @@ module Awful
17
19
  rescue Aws::S3::Errors::NoSuchTagSet # sdk throws this if no tags
18
20
  nil
19
21
  end
22
+
23
+ def get_stack_tag(name)
24
+ (get_tags(name) || []).find do |tag|
25
+ tag.key == 'aws:cloudformation:stack-name'
26
+ end&.value
27
+ end
28
+
29
+ def stack_exists?(name)
30
+ cf.describe_stacks(stack_name: name) && true
31
+ rescue ::Aws::CloudFormation::Errors::ValidationError
32
+ false
33
+ end
20
34
  end
21
35
 
22
36
  desc 'ls PATTERN', 'list buckets or objects'
@@ -197,5 +211,18 @@ module Awful
197
211
  }
198
212
  )
199
213
  end
214
+
215
+ desc 'orphans', 'find empty buckets from a deleted CFN stack'
216
+ method_option :delete, type: :boolean, default: false, desc: 'delete orphaned buckets'
217
+ def orphans
218
+ s3.list_buckets.buckets.each do |bucket|
219
+ if (stack = get_stack_tag(bucket.name))
220
+ next if stack_exists?(stack)
221
+ puts bucket.name
222
+ s3.delete_bucket(bucket: bucket.name) if options[:delete]
223
+ end
224
+ end
225
+ end
226
+
200
227
  end
201
- end
228
+ end
@@ -0,0 +1,56 @@
1
+ require 'aws-sdk-secretsmanager'
2
+
3
+ module Awful
4
+ class Secret < Cli
5
+ COLORS = {
6
+ AWSCURRENT: :green
7
+ }
8
+
9
+ no_commands do
10
+ def client
11
+ @_client ||= Aws::SecretsManager::Client.new
12
+ end
13
+ end
14
+
15
+ desc 'ls', 'list secrets'
16
+ def ls(prefix = nil)
17
+ client.list_secrets.map(&:secret_list).flatten.tap do |secrets|
18
+ secrets.select! { |s| s.name.start_with?(prefix) } if prefix
19
+ end.map do |s|
20
+ [ s.name, s.created_date, s.primary_region ]
21
+ end.tap do |list|
22
+ print_table list.sort
23
+ end
24
+ end
25
+
26
+ desc 'get SECRET', 'get secret value'
27
+ method_option :show, aliases: '-s', type: :boolean, default: false, desc: 'show secret values'
28
+ method_option :previous, aliases: '-p', type: :boolean, default: false, desc: 'show previous value'
29
+ def get(id)
30
+ string = client.get_secret_value(secret_id: id).secret_string
31
+ begin
32
+ hash = JSON.parse(string)
33
+ hash.each { |k,v| hash[k] = "#{v.bytesize} bytes" } unless options[:show]
34
+ print_table hash.sort
35
+ rescue JSON::ParserError
36
+ puts string
37
+ end
38
+ end
39
+
40
+ desc 'history SECRET', 'get secret versions'
41
+ def history(id)
42
+ print_table client.list_secret_version_ids(secret_id: id).versions.map { |v|
43
+ [ v.version_id, color(v.version_stages.join(',')), v.created_date ]
44
+ }
45
+ end
46
+
47
+ desc 'delete SECRET', 'delete secret'
48
+ method_option :window, aliases: '-w', type: :numeric, default: 7, desc: 'recovery window in days'
49
+ def delete(id)
50
+ if yes?("Really delete secret #{id}?", :yellow)
51
+ puts client.delete_secret(secret_id: id, recovery_window_in_days: options[:window]).deletion_date
52
+ end
53
+ end
54
+
55
+ end
56
+ end
data/lib/awful/ssm.rb CHANGED
@@ -1,10 +1,6 @@
1
- module Awful
2
- module Short
3
- def ssm(*args)
4
- Awful::Ssm.new.invoke(*args)
5
- end
6
- end
1
+ require 'aws-sdk-ssm'
7
2
 
3
+ module Awful
8
4
  class Ssm < Cli
9
5
  COLORS = {
10
6
  Success: :green,
@@ -17,15 +13,76 @@ module Awful
17
13
  def ssm
18
14
  @ssm ||= Aws::SSM::Client.new
19
15
  end
16
+ end
17
+
18
+ desc 'ls [PREFIX]', 'list parameters'
19
+ def ls(prefix = '/')
20
+ filters = [ { key: :Name, option: :BeginsWith, values: [ prefix.sub(/^(\w)/, '/\1') ] } ]
21
+ ssm.describe_parameters(parameter_filters: filters).each do |response|
22
+ response.parameters.each { |p| puts p.name }
23
+ sleep 0.1 # this api will throttle easily
24
+ end
25
+ end
26
+
27
+ desc 'get NAME', 'get parameter value'
28
+ method_option :decrypt, aliases: '-d', type: :boolean, default: false, desc: 'decrypt SecureString'
29
+ def get(name)
30
+ puts ssm.get_parameter(name: name, with_decryption: options[:decrypt]).parameter.value
31
+ rescue Aws::SSM::Errors::ParameterNotFound => e
32
+ error(e.message)
33
+ end
20
34
 
21
- def color(string)
22
- set_color(string, COLORS.fetch(string.to_sym, :yellow))
35
+ desc 'path NAME', 'get parameters by path'
36
+ method_option :decrypt, aliases: '-d', type: :boolean, default: false, desc: 'decrypt SecureString'
37
+ method_option :recursive, aliases: '-r', type: :boolean, default: false, desc: 'recurse hierarchy'
38
+ method_option :show, aliases: '-s', type: :boolean, default: false, desc: 'show values'
39
+ def path(path)
40
+ cmd = options[:show] ? ->(p) { puts "#{p.name} #{p.value}" } : ->(p) { puts p.name }
41
+ ssm.get_parameters_by_path(path: path, with_decryption: options[:decrypt], recursive: options[:recursive]).each do |response|
42
+ response.parameters.each(&cmd.method(:call))
43
+ end
44
+ end
45
+
46
+ desc 'put NAME VALUE', 'put parameter'
47
+ method_option :description, aliases: '-d', type: :string, default: nil, desc: 'description for params'
48
+ method_option :key_id, aliases: '-k', type: :string, default: nil, desc: 'KMS key for SecureString params'
49
+ method_option :overwrite, aliases: '-o', type: :boolean, default: false, desc: 'overwrite existing params'
50
+ method_option :type, aliases: '-t', type: :string, default: :String, desc: 'String, StringList, SecureString'
51
+ def put(name, value)
52
+ ssm.put_parameter(
53
+ name: name,
54
+ value: value,
55
+ description: options[:description],
56
+ type: options[:type],
57
+ key_id: options[:key_id],
58
+ overwrite: options[:overwrite],
59
+ )
60
+ rescue Aws::SSM::Errors::ParameterAlreadyExists => e
61
+ error(e.message)
62
+ end
63
+
64
+ desc 'delete NAME', 'delete parameter'
65
+ def delete(name)
66
+ if yes?("Really delete parameter #{name}?", :yellow)
67
+ ssm.delete_parameter(name: name)
68
+ end
69
+ rescue Aws::SSM::Errors::ParameterNotFound => e
70
+ error(e.message)
71
+ end
72
+
73
+ desc 'history NAME', 'get parameter history'
74
+ method_option :decrypt, aliases: '-d', type: :boolean, default: false, desc: 'decrypt SecureString'
75
+ def history(name)
76
+ ssm.get_parameter_history(name: name, with_decryption: options[:decrypt]).each do |p|
77
+ print_table p.parameters.map { |h|
78
+ [ h.version, h.last_modified_date, h.value ]
79
+ }
23
80
  end
24
81
  end
25
82
 
26
- desc 'ls', 'list commands'
83
+ desc 'commands', 'list commands'
27
84
  method_option :long, aliases: '-l', type: :boolean, default: false, desc: 'Long listing'
28
- def ls
85
+ def commands
29
86
  ssm.list_commands.commands.output do |cmds|
30
87
  if options[:long]
31
88
  print_table cmds.map { |c|
@@ -91,4 +148,4 @@ module Awful
91
148
  end
92
149
  end
93
150
  end
94
- end
151
+ end
data/lib/awful/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Awful
2
- VERSION = '0.0.183'
3
- end
2
+ VERSION = '0.1.0.alpha.2'
3
+ end
data/lib/awful/vpc.rb CHANGED
@@ -1,17 +1,19 @@
1
1
  module Awful
2
- module Short
3
- def vpc(*args)
4
- Awful::Vpc.new.invoke(*args)
5
- end
6
- end
7
-
8
2
  class Vpc < Cli
3
+ COLORS = {
4
+ active: :green,
5
+ available: :green,
6
+ deleted: :red,
7
+ expired: :red,
8
+ failed: :red,
9
+ rejected: :red,
10
+ }
9
11
 
10
12
  desc 'ls [PATTERN]', 'list vpcs [with any tags matching PATTERN]'
11
13
  method_option :long, aliases: '-l', type: :boolean, default: false, desc: 'Long listing'
12
14
  def ls(name = /./)
13
15
  fields = options[:long] ?
14
- ->(v) { [tag_name(v), v.vpc_id, v.state, v.cidr_block] } :
16
+ ->(v) { [tag_name(v), v.vpc_id, color(v.state), v.cidr_block] } :
15
17
  ->(v) { [v.vpc_id] }
16
18
  ec2.describe_vpcs.map(&:vpcs).flatten.select do |vpc|
17
19
  vpc.tags.any? { |tag| tag.value.match(name) }
@@ -31,6 +33,29 @@ module Awful
31
33
  end
32
34
  end
33
35
 
34
- end
36
+ desc 'delete VPC', 'delete vpc'
37
+ def delete(vpc_id)
38
+ if yes?("Really delete vpc #{vpc_id}?", :yellow)
39
+ p ec2.delete_vpc(vpc_id: vpc_id)
40
+ end
41
+ rescue Aws::EC2::Errors::DependencyViolation => e
42
+ error(e.message)
43
+ rescue Aws::EC2::Errors::InvalidVpcIDNotFound => e
44
+ error(e.message)
45
+ end
35
46
 
47
+ desc 'peers', 'list vpc peers'
48
+ def peers
49
+ ec2.describe_vpc_peering_connections.map(&:vpc_peering_connections).flatten.map do |p|
50
+ [
51
+ tag_name(p, '-'), p.vpc_peering_connection_id, color(p.status.code),
52
+ p.requester_vpc_info.vpc_id, p.accepter_vpc_info.vpc_id,
53
+ p.requester_vpc_info.cidr_block, p.accepter_vpc_info.cidr_block,
54
+ ]
55
+ end.tap do |list|
56
+ print_table list.sort
57
+ end
58
+ end
59
+
60
+ end
36
61
  end
data/lib/awful/vpce.rb CHANGED
@@ -13,12 +13,6 @@ module Awful
13
13
  deleted: :green,
14
14
  }
15
15
 
16
- no_commands do
17
- def color(string)
18
- set_color(string, COLORS.fetch(string.to_sym, :yellow))
19
- end
20
- end
21
-
22
16
  desc 'ls [IDs]', 'list VPC endpoints'
23
17
  method_option :long, aliases: '-l', type: :boolean, default: false, desc: 'long listing'
24
18
  method_option :vpc, aliases: '-v', type: :array, default: [], desc: 'VPC IDs to filter'
@@ -54,4 +48,4 @@ module Awful
54
48
  end
55
49
 
56
50
  end
57
- end
51
+ end
data/lib/awful.rb CHANGED
@@ -1,7 +1,8 @@
1
+ require 'aws-sdk-s3'
2
+ require 'aws-sdk-ec2'
1
3
  require 'awful/version'
2
4
 
3
5
  require 'dotenv'
4
- require 'aws-sdk'
5
6
  require 'thor'
6
7
  require 'yaml'
7
8
  require 'erb'
@@ -33,6 +34,10 @@ module Awful
33
34
  options[:yes] ? say("#{statement} yes", color) : super(statement, color)
34
35
  end
35
36
 
37
+ def color(string)
38
+ set_color(string, self.class::COLORS.fetch(string.to_sym, :yellow))
39
+ end
40
+
36
41
  def ec2
37
42
  @ec2 ||= Aws::EC2::Client.new
38
43
  end
@@ -76,6 +81,10 @@ module Awful
76
81
  @s3 ||= Aws::S3::Client.new
77
82
  end
78
83
 
84
+ def cf
85
+ @cf ||= Aws::CloudFormation::Client.new
86
+ end
87
+
79
88
  def lambda
80
89
  @lambda ||= Aws::Lambda::Client.new
81
90
  end
@@ -84,6 +93,10 @@ module Awful
84
93
  @support ||= Aws::Support::Client.new
85
94
  end
86
95
 
96
+ def cf
97
+ @cf ||= Aws::CloudFormation::Client.new
98
+ end
99
+
87
100
  def symbolize_keys(thing)
88
101
  if thing.is_a?(Hash)
89
102
  Hash[ thing.map { |k,v| [ k.to_sym, symbolize_keys(v) ] } ]
@@ -184,5 +197,16 @@ module Awful
184
197
  things
185
198
  end
186
199
  end
200
+
201
+ desc 'version', 'print version'
202
+ def version
203
+ puts VERSION
204
+ exit
205
+ end
206
+
207
+ desc 'll', 'long list'
208
+ def ll(*args)
209
+ invoke :ls, args, options.merge(long: true)
210
+ end
187
211
  end
188
- end
212
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.183
4
+ version: 0.1.0.alpha.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ric Lister
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-21 00:00:00.000000000 Z
11
+ date: 2022-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -39,21 +39,21 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: aws-sdk
42
+ name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '2'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '2'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: thor
56
+ name: dotenv
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,133 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: dotenv
70
+ name: aws-sdk-autoscaling
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aws-sdk-cloudformation
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: aws-sdk-dynamodb
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: aws-sdk-ec2
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: aws-sdk-ecr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: aws-sdk-elasticloadbalancingv2
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: aws-sdk-rds
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: aws-sdk-s3
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: aws-sdk-secretsmanager
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: aws-sdk-ssm
71
197
  requirement: !ruby/object:Gem::Requirement
72
198
  requirements:
73
199
  - - ">="
@@ -105,16 +231,18 @@ executables:
105
231
  - elasticache
106
232
  - elb
107
233
  - emr
234
+ - firehose
108
235
  - iam
109
236
  - keypair
237
+ - kinesis
110
238
  - kms
111
239
  - lambda
112
240
  - lc
113
- - param
114
241
  - r53
115
242
  - rds
116
243
  - route
117
244
  - s3
245
+ - secret
118
246
  - sg
119
247
  - sqs
120
248
  - ssm
@@ -154,16 +282,18 @@ files:
154
282
  - bin/elasticache
155
283
  - bin/elb
156
284
  - bin/emr
285
+ - bin/firehose
157
286
  - bin/iam
158
287
  - bin/keypair
288
+ - bin/kinesis
159
289
  - bin/kms
160
290
  - bin/lambda
161
291
  - bin/lc
162
- - bin/param
163
292
  - bin/r53
164
293
  - bin/rds
165
294
  - bin/route
166
295
  - bin/s3
296
+ - bin/secret
167
297
  - bin/sg
168
298
  - bin/sqs
169
299
  - bin/ssm
@@ -201,17 +331,19 @@ files:
201
331
  - lib/awful/elasticache.rb
202
332
  - lib/awful/elb.rb
203
333
  - lib/awful/emr.rb
334
+ - lib/awful/firehose.rb
204
335
  - lib/awful/iam.rb
205
336
  - lib/awful/keypair.rb
337
+ - lib/awful/kinesis.rb
206
338
  - lib/awful/kms.rb
207
339
  - lib/awful/lambda.rb
208
340
  - lib/awful/lambda_events.rb
209
341
  - lib/awful/launch_config.rb
210
- - lib/awful/param.rb
211
342
  - lib/awful/rds.rb
212
343
  - lib/awful/route53.rb
213
344
  - lib/awful/route_table.rb
214
345
  - lib/awful/s3.rb
346
+ - lib/awful/secret.rb
215
347
  - lib/awful/security_group.rb
216
348
  - lib/awful/sqs.rb
217
349
  - lib/awful/ssm.rb
@@ -229,7 +361,7 @@ homepage: ''
229
361
  licenses:
230
362
  - MIT
231
363
  metadata: {}
232
- post_install_message:
364
+ post_install_message:
233
365
  rdoc_options: []
234
366
  require_paths:
235
367
  - lib
@@ -240,13 +372,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
240
372
  version: '0'
241
373
  required_rubygems_version: !ruby/object:Gem::Requirement
242
374
  requirements:
243
- - - ">="
375
+ - - ">"
244
376
  - !ruby/object:Gem::Version
245
- version: '0'
377
+ version: 1.3.1
246
378
  requirements: []
247
- rubyforge_project:
248
- rubygems_version: 2.6.13
249
- signing_key:
379
+ rubygems_version: 3.1.4
380
+ signing_key:
250
381
  specification_version: 4
251
382
  summary: Simple AWS command-line tool.
252
383
  test_files: []