awful 0.0.183 → 0.1.0.alpha.2

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/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: []