certman 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: abd249cac5771cfd40429d8123247925a65c3b55
4
+ data.tar.gz: a06cea74aff79c77bc6800660f038f89f0412aa8
5
+ SHA512:
6
+ metadata.gz: 88589e4fb6d9b5eb7e065dc3ddc351c7b2831ea2d5b6cda1e541192e470e50a9ddcd66be775959e2ec202ac034f5be7db437627223fb8fb9dd84a7d3de9707b8
7
+ data.tar.gz: e10726b02ce3acd0287f8800a8176c6f2f1816d23de210ca8152d3915a0b341173d3f2ea5ddd3f301933e50512563b218e0ccf77e9dcc1e895d715c2e6908e6c
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,29 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.2
3
+
4
+ Metrics/AbcSize:
5
+ Max: 160
6
+
7
+ Metrics/ClassLength:
8
+ Max: 310
9
+
10
+ Metrics/CyclomaticComplexity:
11
+ Max: 10
12
+
13
+ Metrics/MethodLength:
14
+ Max: 240
15
+
16
+ Metrics/PerceivedComplexity:
17
+ Max: 10
18
+
19
+ Metrics/BlockLength:
20
+ Max: 30
21
+
22
+ Metrics/LineLength:
23
+ Max: 120
24
+
25
+ Style/Documentation:
26
+ Enabled: false
27
+
28
+ Style/MutableConstant:
29
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ - 2.3.3
6
+ - 2.2.6
7
+ before_install:
8
+ - gem install bundler -v 1.12.5
9
+ script:
10
+ - bundle exec rake
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in certman.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 k1LoW
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/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # Certman
2
+
3
+ CLI tool for AWS Certificate Manager.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'certman'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```sh
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+
21
+ ```sh
22
+ $ gem install certman
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ### Request ACM Certificate with only AWS managed services
28
+
29
+ ```sh
30
+ $ certman request blog.example.com
31
+ NOTICE! Certman support *us-east-1* only, now. OK? Yes
32
+ NOTICE! When requesting, Certman replace Active Receipt Rule Set. OK? Yes
33
+ [✔] [ACM] Check Certificate (successfull)
34
+ [✔] [Route53] Check Hosted Zone (successfull)
35
+ [✔] [Route53] Check TXT Record (successfull)
36
+ [✔] [Route53] Check MX Record (successfull)
37
+ [✔] [S3] Create Bucket for SES inbound (successfull)
38
+ [✔] [SES] Create Domain Identity (successfull)
39
+ [✔] [Route53] Add TXT Record Set to verify Domain Identity (successfull)
40
+ [✔] [SES] Check Domain Identity Status *verified* (successfull)
41
+ [✔] [Route53] Add MX Record Set (successfull)
42
+ [✔] [SES] Create Receipt Rule (successfull)
43
+ [✔] [ACM] Request Certificate (successfull)
44
+ [✔] [S3] Check approval mail (will take about 30 min) (successfull)
45
+ [✔] [SES] Remove Receipt rule (successfull)
46
+ [✔] [Route53] Remove Record Set (successfull)
47
+ [✔] [SES] Remove Verified Domain Identiry (successfull)
48
+ [✔] [S3] Delete Bucket (successfull)
49
+ Done.
50
+
51
+ certificate_arn: arn:aws:acm:us-east-1:0123456789:certificate/123abcd4-5e67-8f90-123a-4567bc89d01
52
+
53
+ ```
54
+
55
+ ### Delete Certificate
56
+
57
+ ```sh
58
+ $ certman delete blog.example.com
59
+ [✔] [ACM] Delete Certificate (successfull)
60
+ Done.
61
+
62
+ ```
63
+
64
+ ## License
65
+
66
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
67
+
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'octorelease'
4
+ require 'rubocop/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new
7
+
8
+ task default: [:spec, :rubocop]
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'certman'
5
+
6
+ require 'pry'
7
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/certman.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'certman/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'certman'
8
+ spec.version = Certman::VERSION
9
+ spec.authors = ['k1LoW']
10
+ spec.email = ['k1lowxb@gmail.com']
11
+
12
+ spec.summary = 'CLI tool for AWS Certificate Manager.'
13
+ spec.description = 'CLI tool for AWS Certificate Manager.'
14
+ spec.homepage = 'https://github.com/k1LoW/certman'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.required_ruby_version = '>= 2.2'
23
+ spec.add_runtime_dependency 'aws-sdk', '< 2.9'
24
+ spec.add_runtime_dependency 'awsecrets', '~> 1.8'
25
+ spec.add_runtime_dependency 'thor'
26
+ spec.add_runtime_dependency 'public_suffix'
27
+ spec.add_runtime_dependency 'oga'
28
+ spec.add_runtime_dependency 'tty-prompt'
29
+ spec.add_runtime_dependency 'tty-spinner'
30
+ spec.add_runtime_dependency 'pastel'
31
+ spec.add_development_dependency 'bundler', '~> 1.12'
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.0'
34
+ spec.add_development_dependency 'rubocop', '~> 0.47.0'
35
+ spec.add_development_dependency 'octorelease'
36
+ spec.add_development_dependency 'pry'
37
+ end
data/exe/certman ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'certman'
4
+
5
+ Awsecrets.load
6
+ Aws.config[:region] = 'us-east-1'
7
+
8
+ Certman::CLI.start
@@ -0,0 +1,23 @@
1
+ module Certman
2
+ class CLI < Thor
3
+ desc 'request [DOMAIN]', 'Request ACM Certificate with only AWS managed services'
4
+ def request(domain)
5
+ pastel = Pastel.new
6
+ prompt = TTY::Prompt.new
7
+ return unless prompt.yes?(pastel.red('NOTICE! Certman support *us-east-1* only, now. OK?'))
8
+ return unless prompt.yes?(pastel.red('NOTICE! When requesting, Certman replace Active Receipt Rule Set. OK?'))
9
+ cert_arn = Certman::Client.new(domain).request_certificate
10
+ puts 'Done.'
11
+ puts ''
12
+ puts "certificate_arn: #{pastel.cyan(cert_arn)}"
13
+ puts ''
14
+ end
15
+
16
+ desc 'delete [DOMAIN]', 'Delete ACM Certificate'
17
+ def delete(domain)
18
+ Certman::Client.new(domain).delete_certificate
19
+ puts 'Done.'
20
+ puts ''
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,354 @@
1
+ module Certman
2
+ class Client
3
+ attr_reader :domain
4
+
5
+ def initialize(domain)
6
+ @domain = domain
7
+ end
8
+
9
+ def request_certificate
10
+ check_resource
11
+
12
+ # Get Account ID
13
+ account_id = sts.get_caller_identity.account
14
+
15
+ # Create S3 for SES inbound
16
+ s = spinner('[S3] Create Bucket for SES inbound')
17
+ bucket_policy = <<-"EOF"
18
+ {
19
+ "Version": "2008-10-17",
20
+ "Statement": [
21
+ {
22
+ "Sid": "GiveSESPermissionToWriteEmail",
23
+ "Effect": "Allow",
24
+ "Principal": {
25
+ "Service": [
26
+ "ses.amazonaws.com"
27
+ ]
28
+ },
29
+ "Action": [
30
+ "s3:PutObject"
31
+ ],
32
+ "Resource": "arn:aws:s3:::#{bucket_name}/*",
33
+ "Condition": {
34
+ "StringEquals": {
35
+ "aws:Referer": "#{account_id}"
36
+ }
37
+ }
38
+ }
39
+ ]
40
+ }
41
+ EOF
42
+ s3.create_bucket(
43
+ acl: 'private',
44
+ bucket: bucket_name
45
+ )
46
+ s3.put_bucket_policy(
47
+ bucket: bucket_name,
48
+ policy: bucket_policy,
49
+ use_accelerate_endpoint: false
50
+ )
51
+ s.success
52
+
53
+ # Create Domain Identity
54
+ s = spinner('[SES] Create Domain Identity')
55
+ res = ses.verify_domain_identity(domain: domain)
56
+ token = res.verification_token
57
+ s.success
58
+
59
+ # Add TXT Record Set with Route53
60
+ s = spinner('[Route53] Add TXT Record Set to verify Domain Identity')
61
+ root_domain = PublicSuffix.domain(domain)
62
+ hosted_zone = route53.list_hosted_zones.hosted_zones.find do |zone|
63
+ PublicSuffix.domain(zone.name) == root_domain
64
+ end
65
+ route53.change_resource_record_sets(
66
+ change_batch: {
67
+ changes: [
68
+ {
69
+ action: 'CREATE',
70
+ resource_record_set: {
71
+ name: "_amazonses.#{domain}",
72
+ resource_records: [
73
+ {
74
+ value: '"' + token + '"'
75
+ }
76
+ ],
77
+ ttl: 60,
78
+ type: 'TXT'
79
+ }
80
+ }
81
+ ],
82
+ comment: 'Generate by certman'
83
+ },
84
+ hosted_zone_id: hosted_zone.id
85
+ )
86
+ s.success
87
+
88
+ # Checking verify
89
+ s = spinner('[SES] Check Domain Identity Status *verified*')
90
+ is_break = false
91
+ 100.times do
92
+ res = ses.get_identity_verification_attributes(
93
+ identities: [
94
+ domain
95
+ ]
96
+ )
97
+ if res.verification_attributes[domain].verification_status == 'Success'
98
+ is_break = true
99
+ s.success
100
+ break
101
+ end
102
+ sleep 5
103
+ end
104
+ s.error unless is_break
105
+
106
+ # Add MX Record Set
107
+ s = spinner('[Route53] Add MX Record Set')
108
+ route53.change_resource_record_sets(
109
+ change_batch: {
110
+ changes: [
111
+ {
112
+ action: 'CREATE',
113
+ resource_record_set: {
114
+ name: domain,
115
+ resource_records: [
116
+ {
117
+ value: '10 inbound-smtp.us-east-1.amazonaws.com'
118
+ }
119
+ ],
120
+ ttl: 60,
121
+ type: 'MX'
122
+ }
123
+ }
124
+ ],
125
+ comment: 'Generate by certman'
126
+ },
127
+ hosted_zone_id: hosted_zone.id
128
+ )
129
+ s.success
130
+
131
+ # Create Receipt rule
132
+ s = spinner('[SES] Create Receipt Rule')
133
+ rule_name = "S3RuleGeneratedByCertman_#{domain}"
134
+ rule_set_name = "RuleSetGeneratedByCertman_#{domain}"
135
+ ses.create_receipt_rule_set(rule_set_name: rule_set_name)
136
+ ses.create_receipt_rule(
137
+ rule: {
138
+ recipients: ["admin@#{domain}"],
139
+ actions: [
140
+ {
141
+ s3_action: {
142
+ bucket_name: bucket_name
143
+ }
144
+ }
145
+ ],
146
+ enabled: true,
147
+ name: rule_name,
148
+ scan_enabled: true,
149
+ tls_policy: 'Optional'
150
+ },
151
+ rule_set_name: rule_set_name
152
+ )
153
+ current_rule_set_name = nil
154
+ res = ses.describe_active_receipt_rule_set
155
+ current_rule_set_name = res.metadata.name if res.metadata
156
+ ses.set_active_receipt_rule_set(rule_set_name: rule_set_name)
157
+ s.success
158
+
159
+ # Request Certificate
160
+ s = spinner('[ACM] Request Certificate')
161
+ res = acm.request_certificate(
162
+ domain_name: domain,
163
+ subject_alternative_names: [domain],
164
+ domain_validation_options: [
165
+ {
166
+ domain_name: domain,
167
+ validation_domain: domain
168
+ }
169
+ ]
170
+ )
171
+ cert_arn = res.certificate_arn
172
+ s.success
173
+
174
+ # Check Mail and Approve
175
+ s = spinner('[S3] Check approval mail (will take about 30 min)')
176
+ is_break = false
177
+ 60.times do
178
+ s3.list_objects(bucket: bucket_name).contents.map do |object|
179
+ res = s3.get_object(bucket: bucket_name, key: object.key)
180
+ res.body.read.match(%r{https://certificates\.amazon\.com/approvals[^\s]+}) do |md|
181
+ cert_uri = md[0]
182
+ handle = open(cert_uri)
183
+ document = Oga.parse_html(handle)
184
+ data = {}
185
+ document.css('form input').each do |input|
186
+ data[input.get('name')] = input.get('value')
187
+ end
188
+ res = Net::HTTP.post_form(URI.parse('https://certificates.amazon.com/approvals'), data)
189
+ if res.body =~ /Success/
190
+ s.success
191
+ else
192
+ s.error
193
+ end
194
+ is_break = true
195
+ break
196
+ end
197
+ end
198
+ break if is_break
199
+ sleep 30
200
+ end
201
+ s.error unless is_break
202
+
203
+ # Remove Receipt Rule
204
+ s = spinner('[SES] Remove Receipt Rule')
205
+ ses.set_active_receipt_rule_set(rule_set_name: current_rule_set_name)
206
+ ses.delete_receipt_rule(
207
+ rule_name: rule_name,
208
+ rule_set_name: rule_set_name
209
+ )
210
+ ses.delete_receipt_rule_set(rule_set_name: rule_set_name)
211
+ s.success
212
+
213
+ # Remove Record Set
214
+ s = spinner('[Route53] Remove Record Set')
215
+ route53.change_resource_record_sets(
216
+ change_batch: {
217
+ changes: [
218
+ {
219
+ action: 'DELETE',
220
+ resource_record_set: {
221
+ name: "_amazonses.#{domain}",
222
+ resource_records: [
223
+ {
224
+ value: '"' + token + '"'
225
+ }
226
+ ],
227
+ ttl: 60,
228
+ type: 'TXT'
229
+ }
230
+ },
231
+ {
232
+ action: 'DELETE',
233
+ resource_record_set: {
234
+ name: domain,
235
+ resource_records: [
236
+ {
237
+ value: '10 inbound-smtp.us-east-1.amazonaws.com'
238
+ }
239
+ ],
240
+ ttl: 60,
241
+ type: 'MX'
242
+ }
243
+ }
244
+ ],
245
+ comment: 'Generate by certman'
246
+ },
247
+ hosted_zone_id: hosted_zone.id
248
+ )
249
+ s.success
250
+
251
+ # Remove Verified Domain Identiry
252
+ s = spinner('[SES] Remove Verified Domain Identiry')
253
+ ses.delete_identity(identity: domain)
254
+ s.success
255
+
256
+ # Delete S3 for SES inbound
257
+ s = spinner('[S3] Delete Bucket')
258
+ objects = s3.list_objects(bucket: bucket_name).contents.map do |object|
259
+ { key: object.key }
260
+ end
261
+ s3.delete_objects(
262
+ bucket: bucket_name,
263
+ delete: {
264
+ objects: objects
265
+ }
266
+ )
267
+ s3.delete_bucket(bucket: bucket_name)
268
+ s.success
269
+
270
+ cert_arn
271
+ end
272
+
273
+ def delete_certificate
274
+ s = spinner('[ACM] Delete Certificate')
275
+ current_cert = acm.list_certificates.certificate_summary_list.find do |cert|
276
+ cert.domain_name == domain
277
+ end
278
+ raise 'Certificate does not exist' unless current_cert
279
+ acm.delete_certificate(certificate_arn: current_cert.certificate_arn)
280
+ s.success
281
+ end
282
+
283
+ def check_resource
284
+ s = spinner('[ACM] Check Certificate')
285
+ current_cert = acm.list_certificates.certificate_summary_list.find do |cert|
286
+ cert.domain_name == domain
287
+ end
288
+ raise 'Certificate already exist' if current_cert
289
+ s.success
290
+
291
+ s = spinner('[Route53] Check Hosted Zone')
292
+ root_domain = PublicSuffix.domain(domain)
293
+ hosted_zone_id = nil
294
+ hosted_zone = route53.list_hosted_zones.hosted_zones.find do |zone|
295
+ if PublicSuffix.domain(zone.name) == root_domain
296
+ hosted_zone_id = zone.id
297
+ next true
298
+ end
299
+ end
300
+ raise "Hosted Zone #{root_domain} does not exist" unless hosted_zone
301
+ s.success
302
+
303
+ s = spinner('[Route53] Check TXT Record')
304
+ res = route53.list_resource_record_sets(
305
+ hosted_zone_id: hosted_zone_id,
306
+ start_record_name: "_amazonses.#{domain}.",
307
+ start_record_type: 'TXT'
308
+ )
309
+ raise "_amazonses.#{domain} TXT already exist" unless res.resource_record_sets.empty?
310
+ s.success
311
+
312
+ s = spinner('[Route53] Check MX Record')
313
+ res = route53.list_resource_record_sets(
314
+ hosted_zone_id: hosted_zone_id,
315
+ start_record_name: "#{domain}.",
316
+ start_record_type: 'MX'
317
+ )
318
+ raise "#{domain} MX already exist" unless res.resource_record_sets.empty?
319
+ s.success
320
+
321
+ true
322
+ end
323
+
324
+ private
325
+
326
+ def sts
327
+ @sts ||= Aws::STS::Client.new
328
+ end
329
+
330
+ def s3
331
+ @s3 ||= Aws::S3::Client.new
332
+ end
333
+
334
+ def ses
335
+ @ses ||= Aws::SES::Client.new
336
+ end
337
+
338
+ def route53
339
+ @route53 ||= Aws::Route53::Client.new
340
+ end
341
+
342
+ def acm
343
+ @acm ||= Aws::ACM::Client.new
344
+ end
345
+
346
+ def bucket_name
347
+ @bucket_name ||= "#{domain}-generated-by-certman-for-ses-inbound-"
348
+ end
349
+
350
+ def spinner(message)
351
+ Certman::Log.new(message)
352
+ end
353
+ end
354
+ end
@@ -0,0 +1,17 @@
1
+ module Certman
2
+ class Log
3
+ def initialize(message)
4
+ @pastel = Pastel.new
5
+ @s = TTY::Spinner.new("[:spinner] #{message}", output: $stdout)
6
+ @s.auto_spin
7
+ end
8
+
9
+ def success
10
+ @s.success(@pastel.green('(successfull)'))
11
+ end
12
+
13
+ def error
14
+ @s.error(@pastel.red('(error)'))
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module Certman
2
+ VERSION = '0.1.0'
3
+ end
data/lib/certman.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'awsecrets'
2
+ require 'thor'
3
+ require 'public_suffix'
4
+ require 'oga'
5
+ require 'net/http'
6
+ require 'uri'
7
+ require 'open-uri'
8
+ require 'tty-prompt'
9
+ require 'tty-spinner'
10
+ require 'pastel'
11
+ require 'certman/client'
12
+ require 'certman/cli'
13
+ require 'certman/log'
14
+ require 'certman/version'
15
+
16
+ module Certman
17
+ end
metadata ADDED
@@ -0,0 +1,258 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: certman
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - k1LoW
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-03-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "<"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "<"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: awsecrets
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
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: public_suffix
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: oga
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: tty-prompt
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: tty-spinner
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: pastel
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: bundler
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.12'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.12'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '10.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '10.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 0.47.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 0.47.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: octorelease
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
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: pry
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ description: CLI tool for AWS Certificate Manager.
210
+ email:
211
+ - k1lowxb@gmail.com
212
+ executables:
213
+ - certman
214
+ extensions: []
215
+ extra_rdoc_files: []
216
+ files:
217
+ - ".gitignore"
218
+ - ".rspec"
219
+ - ".rubocop.yml"
220
+ - ".travis.yml"
221
+ - Gemfile
222
+ - LICENSE.txt
223
+ - README.md
224
+ - Rakefile
225
+ - bin/console
226
+ - bin/setup
227
+ - certman.gemspec
228
+ - exe/certman
229
+ - lib/certman.rb
230
+ - lib/certman/cli.rb
231
+ - lib/certman/client.rb
232
+ - lib/certman/log.rb
233
+ - lib/certman/version.rb
234
+ homepage: https://github.com/k1LoW/certman
235
+ licenses:
236
+ - MIT
237
+ metadata: {}
238
+ post_install_message:
239
+ rdoc_options: []
240
+ require_paths:
241
+ - lib
242
+ required_ruby_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: '2.2'
247
+ required_rubygems_version: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ requirements: []
253
+ rubyforge_project:
254
+ rubygems_version: 2.5.1
255
+ signing_key:
256
+ specification_version: 4
257
+ summary: CLI tool for AWS Certificate Manager.
258
+ test_files: []