furikake 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,54 @@
1
+ module Furikake
2
+ module Resources
3
+ module Kinesis
4
+ def report
5
+ resources = get_resources
6
+ headers = ['Stream Name', 'Stream ARN', 'Stream Status', 'Shards']
7
+ if resources.empty?
8
+ info = 'N/A'
9
+ else
10
+ info = MarkdownTables.make_table(headers, resources, is_rows: true, align: 'l')
11
+ end
12
+ documents = <<"EOS"
13
+ ### Kinesis
14
+
15
+ #{info}
16
+ EOS
17
+
18
+ documents
19
+ end
20
+
21
+ def get_resources
22
+ kinesis = Aws::Kinesis::Client.new
23
+
24
+ all_streams = []
25
+ loop do
26
+ res = kinesis.list_streams
27
+ all_streams.push(*res.stream_names)
28
+ break unless res.has_more_streams
29
+ end
30
+
31
+ kinesis_infos = []
32
+ all_streams.each do |stream|
33
+ keys = [:stream_name, :stream_arn, :stream_status]
34
+ res = kinesis.describe_stream({
35
+ stream_name: stream
36
+ })
37
+ resouces = []
38
+ res.stream_description.to_h.each do |k, v|
39
+ if keys.include?(k)
40
+ resouces << v
41
+ end
42
+ if k == :shards
43
+ resouces << v.size
44
+ end
45
+ end
46
+ kinesis_infos << resouces
47
+ end
48
+ kinesis_infos
49
+ end
50
+
51
+ module_function :report, :get_resources
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,49 @@
1
+ module Furikake
2
+ module Resources
3
+ module Lambda
4
+ def report
5
+ resources = get_resources
6
+ headers = ['Function Name', 'Function ARN', 'Runtime', 'Timeout', 'Memory Size']
7
+ if resources.empty?
8
+ info = 'N/A'
9
+ else
10
+ info = MarkdownTables.make_table(headers, resources, is_rows: true, align: 'l')
11
+ end
12
+ documents = <<"EOS"
13
+ ### Lambda Functions
14
+
15
+ #{info}
16
+ EOS
17
+
18
+ documents
19
+ end
20
+
21
+ def get_resources
22
+ lmb = Aws::Lambda::Client.new
23
+
24
+ req = {}
25
+ functions = []
26
+ loop do
27
+ res = lmb.list_functions(req)
28
+ functions.push(*res.functions)
29
+ break if res.next_marker.nil?
30
+ req[:marker] = res.next_marker
31
+ end
32
+
33
+ function_infos = []
34
+ functions.map(&:to_h).each do |f|
35
+ function = []
36
+ function << f[:function_name]
37
+ function << f[:function_arn]
38
+ function << f[:runtime]
39
+ function << f[:timeout]
40
+ function << f[:memory_size]
41
+ function_infos << function
42
+ end
43
+ function_infos
44
+ end
45
+
46
+ module_function :report, :get_resources
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,56 @@
1
+ module Furikake
2
+ module Resources
3
+ module Rds
4
+ def report(format = nil)
5
+ instance, cluster = get_resources
6
+ contents = {
7
+ title: 'RDS',
8
+ resources: [
9
+ {
10
+ subtitle: 'DB Instances',
11
+ header: ['DB Cluster Name', 'DB Instance Name',
12
+ 'DB Instance Class', 'DB Engine', 'DB Endpoint'],
13
+ resource: instance
14
+ },
15
+ {
16
+ subtitle: 'DB Clusters',
17
+ header: ['DB Cluster Name', 'Cluster Endpoint',
18
+ 'Cluster Reader Endpoint', 'Cluster Members'],
19
+ resource: cluster
20
+ }
21
+ ]
22
+ }
23
+ Furikake::Formatter.shaping(format, contents).chomp
24
+ end
25
+
26
+ def get_resources
27
+ rds = Aws::RDS::Client.new
28
+
29
+ rds_infos = []
30
+ rds.describe_db_instances.db_instances.map(&:to_h).each do |i|
31
+ instance = []
32
+ instance << i[:db_cluster_identifier]
33
+ instance << i[:db_instance_identifier]
34
+ instance << i[:db_instance_class]
35
+ instance << i[:engine]
36
+ instance << i[:endpoint][:address]
37
+ rds_infos << instance
38
+ end
39
+
40
+ cluster_infos = []
41
+ rds.describe_db_clusters.db_clusters.map(&:to_h).each do |c|
42
+ cluster = []
43
+ cluster << c[:db_cluster_identifier]
44
+ cluster << c[:endpoint]
45
+ cluster << c[:reader_endpoint]
46
+ cluster << (c[:db_cluster_members].map {|m| m[:is_cluster_writer] ? m[:db_instance_identifier] + '(W)' : m[:db_instance_identifier] + '(R)'}).join(', ')
47
+ cluster_infos << cluster
48
+ end
49
+
50
+ return rds_infos, cluster_infos
51
+ end
52
+
53
+ module_function :report, :get_resources
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,118 @@
1
+ module Furikake
2
+ module Resources
3
+ module SecurityGroup
4
+ def report
5
+ ingresses, egresses = get_resources
6
+ headers = ['ID', 'Group Name', 'Description',
7
+ 'Port', 'Protocol', 'Source' ]
8
+ ingress_info = MarkdownTables.make_table(headers, ingresses, is_rows: true, align: 'l')
9
+
10
+ headers = ['ID', 'Group Name', 'Description',
11
+ 'Port', 'Protocol', 'Destination' ]
12
+ egress_info = MarkdownTables.make_table(headers, egresses, is_rows: true, align: 'l')
13
+
14
+ documents = <<"EOS"
15
+ ### Security Group
16
+
17
+ #### Ingress
18
+
19
+ #{ingress_info}
20
+
21
+ #### Egress
22
+
23
+ #{egress_info}
24
+ EOS
25
+
26
+ documents
27
+ end
28
+
29
+ def get_resources
30
+ ec2 = Aws::EC2::Client.new
31
+ params = {}
32
+ ingresses = []
33
+ egresses = []
34
+ loop do
35
+ res = ec2.describe_security_groups(params)
36
+ res.security_groups.each do |sg|
37
+ sg.ip_permissions.each do |permission|
38
+ ingress = []
39
+ ingress << sg.group_id
40
+ ingress << encode_value(sg.group_name)
41
+ ingress << encode_value(sg.description || 'N/A')
42
+ ingress << (permission.from_port || 'N/A')
43
+ ingress << (permission.ip_protocol == '-1' ? 'ALL' : permission.ip_protocol)
44
+
45
+ ip_ranges = list_ip_ranges(permission.ip_ranges)
46
+ list_ids = list_ids(permission.prefix_list_ids)
47
+ group_pairs = list_group_pairs(permission.user_id_group_pairs)
48
+
49
+ source = []
50
+ source << ip_ranges unless ip_ranges.empty?
51
+ source << list_ids unless list_ids.empty?
52
+ source << group_pairs unless group_pairs.empty?
53
+ ingress << source.join(', ')
54
+ ingresses << ingress
55
+ end
56
+
57
+ sg.ip_permissions_egress.each do |permission|
58
+ egress = []
59
+ egress << sg.group_id
60
+ egress << encode_value(sg.group_name)
61
+ egress << encode_value(sg.description || 'N/A')
62
+ egress << (permission.from_port || 'N/A')
63
+ egress << (permission.ip_protocol == '-1' ? 'ALL' : permission.ip_protocol)
64
+
65
+ ip_ranges = list_ip_ranges(permission.ip_ranges)
66
+ list_ids = list_ids(permission.prefix_list_ids)
67
+ group_pairs = list_group_pairs(permission.user_id_group_pairs)
68
+
69
+ dest = []
70
+ dest << ip_ranges unless ip_ranges.empty?
71
+ dest << list_ids unless list_ids.empty?
72
+ dest << group_pairs unless group_pairs.empty?
73
+ egress << dest.join(', ')
74
+ egresses << egress
75
+ end
76
+ end
77
+ break if res.next_token.nil?
78
+ params[:next_token] = res.next_token
79
+ end
80
+
81
+ return ingresses, egresses
82
+ end
83
+
84
+ def list_ip_ranges(ip_ranges)
85
+ result = []
86
+ ip_ranges.each do |ip|
87
+ result << (ip.cidr_ip || 'N/A') + ' (' + (ip.description || 'N/A') + ')'
88
+ end
89
+ result
90
+ end
91
+
92
+ def list_ids(prefix_list_ids)
93
+ result = []
94
+ prefix_list_ids.each do |id|
95
+ result << (id.prefix_list_id || 'N/A') + ' (' + (id.description|| 'N/A') + ')'
96
+ end
97
+ result
98
+ end
99
+
100
+ def list_group_pairs(user_id_group_pairs)
101
+ result = []
102
+ user_id_group_pairs.each do |id|
103
+ result << (id.group_id || 'N/A') + ' (' + (id.description|| 'N/A') + ')'
104
+ end
105
+ result
106
+ end
107
+
108
+ def encode_value(value)
109
+ return value unless value.index('_') == 0
110
+ '\\' + value
111
+ end
112
+
113
+ module_function :report, :get_resources,
114
+ :list_ip_ranges, :list_ids, :list_group_pairs,
115
+ :encode_value
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,33 @@
1
+ Aws.config[:ec2] = {
2
+ stub_responses: {
3
+ describe_instances: {
4
+ reservations: [
5
+ {
6
+ instances: [
7
+ {
8
+ instance_id: 'i-ec12345a',
9
+ image_id: 'ami-abc12def',
10
+ vpc_id: 'vpc-ab123cde',
11
+ subnet_id: 'subnet-1234a567',
12
+ public_ip_address: '123.0.456.789',
13
+ private_ip_address: '10.0.1.1',
14
+ instance_type: 't2.small',
15
+ state: {
16
+ name: 'running'
17
+ },
18
+ tags: [
19
+ {
20
+ key: 'Name',
21
+ value: 'my-ec2'
22
+ }
23
+ ],
24
+ placement: {
25
+ availability_zone: 'ap-northeast-1a'
26
+ }
27
+ }
28
+ ]
29
+ }
30
+ ]
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,9 @@
1
+ module Furikake
2
+ module Resources
3
+ class Stub
4
+ def self.load(type)
5
+ require File.dirname(__FILE__) + '/stub/' + type
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ module Furikake
2
+ module Resources
3
+ module Vpc
4
+ def report
5
+ resources = get_resources
6
+ headers = ['Name', 'ID', 'CIDR', 'State']
7
+ if resources.empty?
8
+ info = 'N/A'
9
+ else
10
+ info = MarkdownTables.make_table(headers, resources, is_rows: true, align: 'l')
11
+ end
12
+ documents = <<"EOS"
13
+ ### VPC
14
+
15
+ #{info}
16
+ EOS
17
+
18
+ documents
19
+ end
20
+
21
+ def get_resources
22
+ ec2 = Aws::EC2::Client.new
23
+ vpcs = []
24
+ ec2.describe_vpcs.vpcs.each do |v|
25
+ vpc = []
26
+ vpc << 'N/A' if v.tags.map(&:to_h).all? { |h| h[:key] != 'Name' }
27
+ v.tags.each do |tag|
28
+ vpc << tag.value if tag.key == 'Name'
29
+ end
30
+ vpc << v.vpc_id
31
+ vpc << v.cidr_block
32
+ vpc << v.state
33
+ vpcs << vpc
34
+ end
35
+ vpcs
36
+ end
37
+ module_function :report, :get_resources
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,45 @@
1
+ module Furikake
2
+ module Resources
3
+ module VpcEndpoint
4
+ def report
5
+ resources = get_resources
6
+ headers = ['ID', 'Type', 'VPC ID', 'State']
7
+ if resources.empty?
8
+ info = 'N/A'
9
+ else
10
+ info = MarkdownTables.make_table(headers, resources, is_rows: true, align: 'l')
11
+ end
12
+ documents = <<"EOS"
13
+ ### VPC Endpoint
14
+
15
+ #{info}
16
+ EOS
17
+
18
+ documents
19
+ end
20
+
21
+ def get_resources
22
+ ec2 = Aws::EC2::Client.new
23
+ params = {}
24
+ endpoints = []
25
+ loop do
26
+ res = ec2.describe_vpc_endpoints(params)
27
+ res.vpc_endpoints.each do |e|
28
+ endpoint = []
29
+ endpoint << e.vpc_endpoint_id
30
+ endpoint << e.vpc_endpoint_type
31
+ endpoint << e.vpc_id
32
+ endpoint << e.state
33
+ endpoints << endpoint
34
+ end
35
+ break if res.next_token.nil?
36
+ params[:next_token] = res.next_token
37
+ end
38
+
39
+ endpoints
40
+ end
41
+
42
+ module_function :report, :get_resources
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module Furikake
2
+ VERSION = "0.0.1"
3
+ end
data/lib/furikake.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'thor'
2
+ require 'aws-sdk'
3
+ require 'furikake/cli'
4
+ require 'furikake/config'
5
+ require 'furikake/formatter'
6
+ require 'furikake/resource'
7
+ require 'furikake/report'
8
+ require 'furikake/version'
9
+
10
+ module Furikake
11
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: furikake
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - inokappa
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-11-18 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: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
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
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: markdown-tables
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: backlog_kit
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
+ description: It is a command line tool to register your resources in Wiki page (Markdown
112
+ format).
113
+ email:
114
+ - inokara@gmail.com
115
+ executables:
116
+ - furikake
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".furikake.sample.yml"
121
+ - ".gitignore"
122
+ - ".rspec"
123
+ - ".travis.yml"
124
+ - Gemfile
125
+ - Gemfile.lock
126
+ - LICENSE.txt
127
+ - README.md
128
+ - Rakefile
129
+ - bin/console
130
+ - bin/setup
131
+ - docs/images/furikake.png
132
+ - exe/furikake
133
+ - furikake.gemspec
134
+ - lib/furikake.rb
135
+ - lib/furikake/cli.rb
136
+ - lib/furikake/config.rb
137
+ - lib/furikake/formatter.rb
138
+ - lib/furikake/formatters/csv.rb
139
+ - lib/furikake/formatters/markdown.rb
140
+ - lib/furikake/report.rb
141
+ - lib/furikake/reporters/backlog.rb
142
+ - lib/furikake/resource.rb
143
+ - lib/furikake/resources/alb.rb
144
+ - lib/furikake/resources/clb.rb
145
+ - lib/furikake/resources/directory_service.rb
146
+ - lib/furikake/resources/ec2.rb
147
+ - lib/furikake/resources/elasticsearch_service.rb
148
+ - lib/furikake/resources/kinesis.rb
149
+ - lib/furikake/resources/lambda.rb
150
+ - lib/furikake/resources/rds.rb
151
+ - lib/furikake/resources/security_group.rb
152
+ - lib/furikake/resources/stub.rb
153
+ - lib/furikake/resources/stub/ec2.rb
154
+ - lib/furikake/resources/vpc.rb
155
+ - lib/furikake/resources/vpc_endpoint.rb
156
+ - lib/furikake/version.rb
157
+ homepage: https://github.com/inokappa/furikake
158
+ licenses:
159
+ - MIT
160
+ metadata: {}
161
+ post_install_message:
162
+ rdoc_options: []
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 2.7.6
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: It is a command line tool to register your resources in Wiki page (Markdown
181
+ format).
182
+ test_files: []