awry 0.1.0
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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +21 -0
- data/Rakefile +8 -0
- data/awry.gemspec +42 -0
- data/bin/cfn +4 -0
- data/bin/ec2 +4 -0
- data/bin/rds +4 -0
- data/bin/s3 +4 -0
- data/bin/sm +4 -0
- data/bin/ssm +4 -0
- data/bin/vpc +4 -0
- data/lib/awry/cfn.rb +111 -0
- data/lib/awry/ec2.rb +25 -0
- data/lib/awry/rds.rb +40 -0
- data/lib/awry/s3.rb +87 -0
- data/lib/awry/sm.rb +32 -0
- data/lib/awry/ssm.rb +56 -0
- data/lib/awry/version.rb +5 -0
- data/lib/awry/vpc.rb +77 -0
- data/lib/awry.rb +26 -0
- metadata +200 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 4bba6e0b7a043af40434da72f2835859d8f6139c30727a175bcb9d57ab5cc84a
|
|
4
|
+
data.tar.gz: a76b3387e7fe4df69239a7a3129ddfbb0546d057c11fea463d52092a8ea93f45
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5a359702be49714fc9aecdd9450e1380c4f3243ceba182e7b0e08f2eed82339b597544ce6445fdc56e036c32e3b9ced8998fd9084723ced697c9625c7e24b143
|
|
7
|
+
data.tar.gz: 19cd60e5d9bd1f09279097ec7e874c4b62b742bc167663e8af330fa33a3fd16292b8ff7b53cdd13a38cac1e62b94619618dc5a168239456263d19a29ce75dc6b
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Richard Lister
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
data/awry.gemspec
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lib/awry/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'awry'
|
|
7
|
+
spec.version = Awry::VERSION
|
|
8
|
+
spec.authors = ['Richard Lister']
|
|
9
|
+
spec.email = ['rlister+gh@gmail.com']
|
|
10
|
+
|
|
11
|
+
spec.summary = 'gem'
|
|
12
|
+
spec.homepage = 'https://github.com/rlister/awry'
|
|
13
|
+
spec.license = 'MIT'
|
|
14
|
+
spec.required_ruby_version = '>= 2.4.0'
|
|
15
|
+
|
|
16
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
|
17
|
+
|
|
18
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
19
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
|
20
|
+
|
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
|
22
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
23
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
24
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
25
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
spec.bindir = 'bin'
|
|
29
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
30
|
+
spec.require_paths = ['lib']
|
|
31
|
+
|
|
32
|
+
spec.add_development_dependency 'bundler'
|
|
33
|
+
spec.add_development_dependency 'rake'
|
|
34
|
+
|
|
35
|
+
spec.add_dependency 'aws-sdk-cloudformation'
|
|
36
|
+
spec.add_dependency 'aws-sdk-ec2'
|
|
37
|
+
spec.add_dependency 'aws-sdk-rds'
|
|
38
|
+
spec.add_dependency 'aws-sdk-s3'
|
|
39
|
+
spec.add_dependency 'aws-sdk-secretsmanager'
|
|
40
|
+
spec.add_dependency 'aws-sdk-ssm'
|
|
41
|
+
spec.add_dependency('thor')
|
|
42
|
+
end
|
data/bin/cfn
ADDED
data/bin/ec2
ADDED
data/bin/rds
ADDED
data/bin/s3
ADDED
data/bin/sm
ADDED
data/bin/ssm
ADDED
data/bin/vpc
ADDED
data/lib/awry/cfn.rb
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'aws-sdk-cloudformation'
|
|
2
|
+
|
|
3
|
+
module Awry
|
|
4
|
+
class Cfn < Cli
|
|
5
|
+
COLORS = {
|
|
6
|
+
CREATE_COMPLETE: :green,
|
|
7
|
+
CREATE_FAILED: :red,
|
|
8
|
+
CREATE_IN_PROGRESS: :yellow,
|
|
9
|
+
DELETE_COMPLETE: :green,
|
|
10
|
+
DELETE_FAILED: :red,
|
|
11
|
+
DELETE_IN_PROGRESS: :yellow,
|
|
12
|
+
DELETE_SKIPPED: :yellow,
|
|
13
|
+
DELETED: :red,
|
|
14
|
+
ROLLBACK_COMPLETE: :red,
|
|
15
|
+
ROLLBACK_IN_PROGRESS: :red,
|
|
16
|
+
UPDATE_COMPLETE: :green,
|
|
17
|
+
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS: :yellow,
|
|
18
|
+
UPDATE_FAILED: :red,
|
|
19
|
+
UPDATE_IN_PROGRESS: :yellow,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
## stack statuses that are not DELETE_COMPLETE
|
|
23
|
+
STATUSES = %i[
|
|
24
|
+
CREATE_IN_PROGRESS CREATE_FAILED CREATE_COMPLETE
|
|
25
|
+
DELETE_IN_PROGRESS DELETE_FAILED
|
|
26
|
+
REVIEW_IN_PROGRESS
|
|
27
|
+
ROLLBACK_IN_PROGRESS ROLLBACK_FAILED ROLLBACK_COMPLETE
|
|
28
|
+
UPDATE_IN_PROGRESS UPDATE_COMPLETE_CLEANUP_IN_PROGRESS UPDATE_COMPLETE
|
|
29
|
+
UPDATE_ROLLBACK_IN_PROGRESS UPDATE_ROLLBACK_FAILED UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS UPDATE_ROLLBACK_COMPLETE
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
no_commands do
|
|
33
|
+
def client
|
|
34
|
+
@_client ||= Aws::CloudFormation::Client.new
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc 'ls [PREFIX]', 'list stacks'
|
|
39
|
+
def ls(prefix = nil)
|
|
40
|
+
client.list_stacks(stack_status_filter: STATUSES).map(&:stack_summaries).flatten.tap do |stacks|
|
|
41
|
+
stacks.select! { |s| s.stack_name.start_with?(prefix) } if prefix
|
|
42
|
+
end.map do |s|
|
|
43
|
+
[s.stack_name, s.creation_time, color(s.stack_status), s.template_description]
|
|
44
|
+
end.tap do |list|
|
|
45
|
+
print_table list.sort
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
desc 'parameters NAME', 'list stack parameters'
|
|
50
|
+
def parameters(name)
|
|
51
|
+
client.describe_stacks(stack_name: name).stacks.first.parameters.each_with_object({}) do |p, h|
|
|
52
|
+
h[p.parameter_key] = p.parameter_value
|
|
53
|
+
end.tap do |hash|
|
|
54
|
+
print_table hash.sort
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
desc 'outputs NAME', 'list stack outputs'
|
|
59
|
+
def outputs(name)
|
|
60
|
+
client.describe_stacks(stack_name: name).stacks.first.outputs.each_with_object({}) do |o, hash|
|
|
61
|
+
hash[o.output_key] = o.output_value
|
|
62
|
+
end.tap do |hash|
|
|
63
|
+
print_table hash.sort
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
desc 'resources NAME', 'list stack reasources'
|
|
68
|
+
method_option :match, aliases: '-m', type: :string, default: nil, desc: 'regex filter type of resource'
|
|
69
|
+
def resources(name)
|
|
70
|
+
client.list_stack_resources(stack_name: name).map(&:stack_resource_summaries).flatten.tap do |resources|
|
|
71
|
+
if options[:match]
|
|
72
|
+
regexp = Regexp.new(options[:match], Regexp::IGNORECASE)
|
|
73
|
+
resources.select! { |r| regexp.match(r.resource_type) }
|
|
74
|
+
end
|
|
75
|
+
end.map do |r|
|
|
76
|
+
[ r.logical_resource_id, r.resource_type, color(r.resource_status), r.physical_resource_id ]
|
|
77
|
+
end.tap do |list|
|
|
78
|
+
print_table list.sort
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
desc 'delete NAME', 'deletes stack'
|
|
83
|
+
def delete(name)
|
|
84
|
+
if yes?("Really delete stack #{name}?", :yellow)
|
|
85
|
+
client.delete_stack(stack_name: name)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
desc 'events NAME', 'show events for stack'
|
|
90
|
+
method_option :number, aliases: '-n', type: :numeric, default: nil, desc: 'return n most recent events'
|
|
91
|
+
def events(name)
|
|
92
|
+
events = client.describe_stack_events(stack_name: name).map(&:stack_events).flatten
|
|
93
|
+
events = events.first(options[:number]) if options[:number]
|
|
94
|
+
events.map do |e|
|
|
95
|
+
[ e.timestamp, color(e.resource_status), e.resource_type, e.logical_resource_id, e.resource_status_reason ]
|
|
96
|
+
end.tap do |list|
|
|
97
|
+
print_table list.reverse
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
desc 'limits', 'describe cloudformation account limits'
|
|
102
|
+
def limits
|
|
103
|
+
client.describe_account_limits.account_limits.map do |l|
|
|
104
|
+
[l.name, l.value]
|
|
105
|
+
end.tap do |list|
|
|
106
|
+
print_table list.sort
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
end
|
data/lib/awry/ec2.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'aws-sdk-ec2'
|
|
2
|
+
|
|
3
|
+
module Awry
|
|
4
|
+
class Ec2 < Cli
|
|
5
|
+
COLORS = {
|
|
6
|
+
running: :green,
|
|
7
|
+
terminated: :red,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
no_commands do
|
|
11
|
+
def client
|
|
12
|
+
@_client ||= Aws::EC2::Client.new
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
desc 'ls', 'list instances'
|
|
17
|
+
def ls
|
|
18
|
+
client.describe_instances.map(&:reservations).flatten.map(&:instances).flatten.map do |i|
|
|
19
|
+
[ tag_name(i), i.instance_id, color(i.state.name), i.instance_type, i.placement.availability_zone, i.private_ip_address, i.public_ip_address, i.launch_time ]
|
|
20
|
+
end.tap do |list|
|
|
21
|
+
print_table list.sort
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/awry/rds.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'aws-sdk-rds'
|
|
2
|
+
|
|
3
|
+
module Awry
|
|
4
|
+
class Rds < Cli
|
|
5
|
+
COLORS = {
|
|
6
|
+
available: :green,
|
|
7
|
+
'in-sync': :green,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
no_commands do
|
|
11
|
+
def client
|
|
12
|
+
@_client ||= Aws::RDS::Client.new
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
desc 'ls [PREFIX]', 'list clusters'
|
|
17
|
+
def ls(prefix = nil)
|
|
18
|
+
client.describe_db_clusters.map(&:db_clusters).flatten.map do |d|
|
|
19
|
+
cluster = [ d.db_cluster_identifier, d.engine, color(d.status)]
|
|
20
|
+
instances = d.db_cluster_members.map do |i|
|
|
21
|
+
role = i.is_cluster_writer ? 'writer' : 'reader'
|
|
22
|
+
[ '- ' + i.db_instance_identifier, role, color(i.db_cluster_parameter_group_status) ]
|
|
23
|
+
end
|
|
24
|
+
[ cluster ] + instances
|
|
25
|
+
end.flatten(1).tap do |list|
|
|
26
|
+
print_table list
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
desc 'endpoints [CLUSTER]', 'list endpoints'
|
|
31
|
+
def endpoints(cluster = nil)
|
|
32
|
+
client.describe_db_cluster_endpoints(db_cluster_identifier: cluster).map(&:db_cluster_endpoints).flatten.map do |e|
|
|
33
|
+
[ e.db_cluster_identifier, e.endpoint_type, color(e.status), e.endpoint ]
|
|
34
|
+
end.tap do |list|
|
|
35
|
+
print_table list
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/awry/s3.rb
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'aws-sdk-s3'
|
|
2
|
+
|
|
3
|
+
module Awry
|
|
4
|
+
class S3 < Cli
|
|
5
|
+
COLORS = {
|
|
6
|
+
active: :green,
|
|
7
|
+
available: :green,
|
|
8
|
+
deleted: :red,
|
|
9
|
+
expired: :red,
|
|
10
|
+
failed: :red,
|
|
11
|
+
rejected: :red,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
no_commands do
|
|
15
|
+
def client
|
|
16
|
+
@_client ||= Aws::S3::Client.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def wait_until_empty(bucket)
|
|
20
|
+
while true
|
|
21
|
+
break if client.list_objects_v2(bucket: bucket, max_keys: 1).key_count == 0
|
|
22
|
+
puts 'waiting for objects to delete'
|
|
23
|
+
sleep 3
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc 'ls [PREFIX]', 'list buckets'
|
|
29
|
+
def ls(prefix = nil)
|
|
30
|
+
if prefix&.include?('/')
|
|
31
|
+
p client
|
|
32
|
+
else
|
|
33
|
+
buckets(prefix)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
desc 'buckets [PREFIX]', 'list buckets'
|
|
38
|
+
def buckets(prefix = nil)
|
|
39
|
+
client.list_buckets.buckets.tap do |buckets|
|
|
40
|
+
buckets.select! { |b| b.name.start_with?(prefix) } if prefix
|
|
41
|
+
end.map do |b|
|
|
42
|
+
region = client.get_bucket_location(bucket: b.name).location_constraint
|
|
43
|
+
[ b.name, region, b.creation_date ]
|
|
44
|
+
end.tap do |list|
|
|
45
|
+
print_table list.sort
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
desc 'empty BUCKET', 'delete objects from bucket'
|
|
50
|
+
def empty(bucket)
|
|
51
|
+
if yes?("Really delete objects and versions from bucket #{bucket}?", :yellow)
|
|
52
|
+
Aws::S3::Resource.new.bucket(bucket).object_versions.batch_delete!
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
desc 'delete BUCKET', 'delete bucket'
|
|
57
|
+
method_option :empty, aliases: '-e', type: :boolean, default: false, desc: 'delete all objects'
|
|
58
|
+
def delete(bucket)
|
|
59
|
+
if options[:empty]
|
|
60
|
+
empty(bucket)
|
|
61
|
+
wait_until_empty(bucket)
|
|
62
|
+
end
|
|
63
|
+
if yes?("Really delete bucket #{bucket}?", :yellow)
|
|
64
|
+
client.delete_bucket(bucket: bucket)
|
|
65
|
+
end
|
|
66
|
+
rescue Aws::S3::Errors::BucketNotEmpty => e
|
|
67
|
+
error(e.message)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
desc 'policy BUCKET', 'get bucket policy'
|
|
71
|
+
def policy(bucket)
|
|
72
|
+
client.get_bucket_policy(bucket: bucket).policy.tap do |policy|
|
|
73
|
+
puts JSON.pretty_generate(JSON.parse(policy.gets))
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
desc 'acl BUCKET', 'get bucket acl'
|
|
78
|
+
def acl(bucket)
|
|
79
|
+
client.get_bucket_acl(bucket: bucket).grants.map do |g|
|
|
80
|
+
[ g.grantee.display_name, g.grantee.id, g.grantee.type, g.permission ]
|
|
81
|
+
end.tap do |list|
|
|
82
|
+
print_table list
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
end
|
data/lib/awry/sm.rb
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'aws-sdk-secretsmanager'
|
|
2
|
+
|
|
3
|
+
module Awry
|
|
4
|
+
class Sm < Cli
|
|
5
|
+
no_commands do
|
|
6
|
+
def client
|
|
7
|
+
@_client ||= Aws::SecretsManager::Client.new
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
desc 'ls', 'list secrets'
|
|
12
|
+
def ls(prefix = nil)
|
|
13
|
+
client.list_secrets.map(&:secret_list).flatten.tap do |secrets|
|
|
14
|
+
secrets.select! { |s| s.name.start_with?(prefix) } if prefix
|
|
15
|
+
end.map do |s|
|
|
16
|
+
[ s.name, s.description, s.created_date, s.primary_region ]
|
|
17
|
+
end.tap do |list|
|
|
18
|
+
print_table list.sort
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
desc 'value SECRET', 'get secret value'
|
|
23
|
+
method_option :show, aliases: '-s', type: :boolean, default: false, desc: 'show secret values'
|
|
24
|
+
def value(secret_id)
|
|
25
|
+
string = client.get_secret_value(secret_id: secret_id).secret_string
|
|
26
|
+
hash = JSON.parse(string)
|
|
27
|
+
hash.each { |k,v| hash[k] = "#{v.bytesize} bytes" } unless options[:show]
|
|
28
|
+
print_table hash.sort
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/awry/ssm.rb
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'aws-sdk-ssm'
|
|
2
|
+
|
|
3
|
+
module Awry
|
|
4
|
+
class Ssm < Cli
|
|
5
|
+
no_commands do
|
|
6
|
+
def client
|
|
7
|
+
@_client ||= Aws::SSM::Client.new
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
desc 'ls [PREFIX]', 'list parameters'
|
|
12
|
+
def ls(prefix = '/')
|
|
13
|
+
filters = [ { key: :Name, option: :BeginsWith, values: [ prefix.sub(/^(\w)/, '/\1') ] } ]
|
|
14
|
+
client.describe_parameters(parameter_filters: filters).each do |response|
|
|
15
|
+
response.parameters.each { |p| puts p.name }
|
|
16
|
+
sleep 0.1 # this api will throttle easily
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
desc 'get NAME', 'get parameter value'
|
|
21
|
+
method_option :decrypt, aliases: '-d', type: :boolean, default: false, desc: 'decrypt SecureString'
|
|
22
|
+
def get(name)
|
|
23
|
+
puts client.get_parameter(name: name, with_decryption: options[:decrypt]).parameter.value
|
|
24
|
+
rescue Aws::SSM::Errors::ParameterNotFound => e
|
|
25
|
+
error(e.message)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc 'put NAME VALUE', 'put parameter'
|
|
29
|
+
method_option :description, aliases: '-d', type: :string, default: nil, desc: 'description for params'
|
|
30
|
+
method_option :key_id, aliases: '-k', type: :string, default: nil, desc: 'KMS key for SecureString params'
|
|
31
|
+
method_option :overwrite, aliases: '-o', type: :boolean, default: false, desc: 'overwrite existing params'
|
|
32
|
+
method_option :type, aliases: '-t', type: :string, default: :String, desc: 'String, StringList, SecureString'
|
|
33
|
+
def put(name, value)
|
|
34
|
+
client.put_parameter(
|
|
35
|
+
name: name,
|
|
36
|
+
value: value,
|
|
37
|
+
description: options[:description],
|
|
38
|
+
type: options[:type],
|
|
39
|
+
key_id: options[:key_id],
|
|
40
|
+
overwrite: options[:overwrite],
|
|
41
|
+
)
|
|
42
|
+
rescue Aws::SSM::Errors::ParameterAlreadyExists => e
|
|
43
|
+
error(e.message)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
desc 'delete NAME', 'delete parameter'
|
|
47
|
+
def delete(name)
|
|
48
|
+
if yes?("Really delete parameter #{name}?", :yellow)
|
|
49
|
+
client.delete_parameter(name: name)
|
|
50
|
+
end
|
|
51
|
+
rescue Aws::SSM::Errors::ParameterNotFound => e
|
|
52
|
+
error(e.message)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
data/lib/awry/version.rb
ADDED
data/lib/awry/vpc.rb
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
require 'aws-sdk-ec2'
|
|
3
|
+
|
|
4
|
+
module Awry
|
|
5
|
+
class Vpc < Cli
|
|
6
|
+
COLORS = {
|
|
7
|
+
active: :green,
|
|
8
|
+
available: :green,
|
|
9
|
+
deleted: :red,
|
|
10
|
+
expired: :red,
|
|
11
|
+
failed: :red,
|
|
12
|
+
rejected: :red,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
no_commands do
|
|
16
|
+
def client
|
|
17
|
+
@_client ||= Aws::EC2::Client.new
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
desc 'ls [PREFIX]', 'list vpcs'
|
|
22
|
+
def ls(prefix = nil)
|
|
23
|
+
client.describe_vpcs.map(&:vpcs).flatten.map do |v|
|
|
24
|
+
[ tag_name(v, '-'), v.vpc_id, color(v.state), v.cidr_block ]
|
|
25
|
+
end.tap do |list|
|
|
26
|
+
list.select! { |l| l.first.start_with?(prefix) } if prefix
|
|
27
|
+
end.tap do |list|
|
|
28
|
+
print_table list.sort
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
desc 'subnets [PREFIX]', 'list subnets'
|
|
33
|
+
def subnets(prefix = nil)
|
|
34
|
+
client.describe_subnets.map(&:subnets).flatten.map do |s|
|
|
35
|
+
[ tag_name(s, '') , s.subnet_id, color(s.state), s.vpc_id, s.cidr_block, s.availability_zone, s.availability_zone_id ]
|
|
36
|
+
end.tap do |list|
|
|
37
|
+
list.select! { |l| l.first.start_with?(prefix) } if prefix
|
|
38
|
+
end.tap do |list|
|
|
39
|
+
print_table list.sort
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc 'peers', 'list vpc peers'
|
|
44
|
+
def peers
|
|
45
|
+
client.describe_vpc_peering_connections.map(&:vpc_peering_connections).flatten.map do |p|
|
|
46
|
+
[
|
|
47
|
+
tag_name(p, '-'), p.vpc_peering_connection_id, color(p.status.code),
|
|
48
|
+
p.requester_vpc_info.vpc_id, p.accepter_vpc_info.vpc_id,
|
|
49
|
+
p.requester_vpc_info.cidr_block, p.accepter_vpc_info.cidr_block,
|
|
50
|
+
]
|
|
51
|
+
end.tap do |list|
|
|
52
|
+
print_table list.sort
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
desc 'sg', 'list security groups'
|
|
57
|
+
def sg
|
|
58
|
+
client.describe_security_groups.map(&:security_groups).flatten.map do |s|
|
|
59
|
+
[ s.group_name, s.group_id, s.vpc_id, '→'+s.ip_permissions.count.to_s, s.ip_permissions_egress.count.to_s+'→' ]
|
|
60
|
+
end.tap do |list|
|
|
61
|
+
print_table list.sort
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
desc 'delete VPC', 'delete vpc'
|
|
66
|
+
def delete(vpc_id)
|
|
67
|
+
if yes?("Really delete vpc #{vpc_id}?", :yellow)
|
|
68
|
+
p client.delete_vpc(vpc_id: vpc_id)
|
|
69
|
+
end
|
|
70
|
+
rescue Aws::EC2::Errors::DependencyViolation => e
|
|
71
|
+
error(e.message)
|
|
72
|
+
rescue Aws::EC2::Errors::InvalidVpcIDNotFound => e
|
|
73
|
+
error(e.message)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
end
|
data/lib/awry.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'thor'
|
|
4
|
+
require_relative "awry/version"
|
|
5
|
+
|
|
6
|
+
## clean exit on ctrl-c for all methods
|
|
7
|
+
trap('SIGINT', 'EXIT')
|
|
8
|
+
|
|
9
|
+
module Awry
|
|
10
|
+
class Error < StandardError; end
|
|
11
|
+
|
|
12
|
+
class Cli < Thor
|
|
13
|
+
|
|
14
|
+
no_commands do
|
|
15
|
+
def color(string)
|
|
16
|
+
set_color(string, self.class::COLORS.fetch(string.to_sym, :yellow))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def tag_name(thing, default = nil)
|
|
20
|
+
tn = thing.tags.find { |tag| tag.key == 'Name' }
|
|
21
|
+
tn ? tn.value : default
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: awry
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Richard Lister
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2021-09-11 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: aws-sdk-cloudformation
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: aws-sdk-ec2
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: aws-sdk-rds
|
|
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-s3
|
|
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-secretsmanager
|
|
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-ssm
|
|
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: thor
|
|
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
|
+
description:
|
|
140
|
+
email:
|
|
141
|
+
- rlister+gh@gmail.com
|
|
142
|
+
executables:
|
|
143
|
+
- cfn
|
|
144
|
+
- ec2
|
|
145
|
+
- rds
|
|
146
|
+
- s3
|
|
147
|
+
- sm
|
|
148
|
+
- ssm
|
|
149
|
+
- vpc
|
|
150
|
+
extensions: []
|
|
151
|
+
extra_rdoc_files: []
|
|
152
|
+
files:
|
|
153
|
+
- ".rspec"
|
|
154
|
+
- Gemfile
|
|
155
|
+
- LICENSE.txt
|
|
156
|
+
- Rakefile
|
|
157
|
+
- awry.gemspec
|
|
158
|
+
- bin/cfn
|
|
159
|
+
- bin/ec2
|
|
160
|
+
- bin/rds
|
|
161
|
+
- bin/s3
|
|
162
|
+
- bin/sm
|
|
163
|
+
- bin/ssm
|
|
164
|
+
- bin/vpc
|
|
165
|
+
- lib/awry.rb
|
|
166
|
+
- lib/awry/cfn.rb
|
|
167
|
+
- lib/awry/ec2.rb
|
|
168
|
+
- lib/awry/rds.rb
|
|
169
|
+
- lib/awry/s3.rb
|
|
170
|
+
- lib/awry/sm.rb
|
|
171
|
+
- lib/awry/ssm.rb
|
|
172
|
+
- lib/awry/version.rb
|
|
173
|
+
- lib/awry/vpc.rb
|
|
174
|
+
homepage: https://github.com/rlister/awry
|
|
175
|
+
licenses:
|
|
176
|
+
- MIT
|
|
177
|
+
metadata:
|
|
178
|
+
allowed_push_host: https://rubygems.org
|
|
179
|
+
homepage_uri: https://github.com/rlister/awry
|
|
180
|
+
source_code_uri: https://github.com/rlister/awry
|
|
181
|
+
post_install_message:
|
|
182
|
+
rdoc_options: []
|
|
183
|
+
require_paths:
|
|
184
|
+
- lib
|
|
185
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
186
|
+
requirements:
|
|
187
|
+
- - ">="
|
|
188
|
+
- !ruby/object:Gem::Version
|
|
189
|
+
version: 2.4.0
|
|
190
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
|
+
requirements:
|
|
192
|
+
- - ">="
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: '0'
|
|
195
|
+
requirements: []
|
|
196
|
+
rubygems_version: 3.1.4
|
|
197
|
+
signing_key:
|
|
198
|
+
specification_version: 4
|
|
199
|
+
summary: gem
|
|
200
|
+
test_files: []
|