roadworker 0.3.9 → 0.3.10
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 +13 -5
- data/bin/roadwork +15 -14
- data/lib/roadworker/dsl-tester.rb +57 -17
- data/lib/roadworker/version.rb +1 -1
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YjIzOTY2MjJjYmYzODVjMDE0NzFkZTIyMzhiNjRlNzJlZjYwMjljNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NWNiMzA2Nzk5YmE4NTllY2ZlMDFiMWNjZTYxYjYxYmM4MGEzNTRkMQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MmU4Y2U0MTYyYThhYzcwZDBiODFlMmYzZWFkOTY0YWExMTVlM2ViNWVlYjUy
|
10
|
+
OGMzYzc2YzNlN2E1NjJjNGIwM2FmM2UxOTBlYTI4YjA4OTNiY2RlZThjOTZi
|
11
|
+
ZmYwNDUyMjVhMDQyNDhhNGU0MDVhYmRjMTU4NmI0Yzk4MjQ5OGI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZGYxMzFkZGY5M2M0YjM5YWYyZWJlODc1YmU0MzNmODE3ZWRjOWQyODhkZDEw
|
14
|
+
ZGZiMmIyNTFmOWFhNjJhMzgxMjZiNWRhMDMzNmYyNmY4MWNmMzM3MDcyNmZj
|
15
|
+
MjE2ZDUyMTVhNTM0NTA3YzUzMjA2NzM5MzM3NjNmOTE5OTdhZjA=
|
data/bin/roadwork
CHANGED
@@ -30,20 +30,21 @@ ARGV.options do |opt|
|
|
30
30
|
access_key = nil
|
31
31
|
secret_key = nil
|
32
32
|
|
33
|
-
opt.on('-k', '--access-key ACCESS_KEY')
|
34
|
-
opt.on('-s', '--secret-key SECRET_KEY')
|
35
|
-
opt.on('-a', '--apply')
|
36
|
-
opt.on('-f', '--file FILE')
|
37
|
-
opt.on('', '--dry-run')
|
38
|
-
opt.on('' , '--force')
|
39
|
-
opt.on('', '--no-health-check-gc')
|
40
|
-
opt.on('-e', '--export')
|
41
|
-
opt.on('-o', '--output FILE')
|
42
|
-
opt.on('', '--split')
|
43
|
-
opt.on('', '--with-soa-ns')
|
44
|
-
opt.on('-t', '--test')
|
45
|
-
opt.on('' , '--
|
46
|
-
opt.on('' , '--
|
33
|
+
opt.on('-k', '--access-key ACCESS_KEY') {|v| access_key = v }
|
34
|
+
opt.on('-s', '--secret-key SECRET_KEY') {|v| secret_key = v }
|
35
|
+
opt.on('-a', '--apply') { mode = :apply }
|
36
|
+
opt.on('-f', '--file FILE') {|v| file = v }
|
37
|
+
opt.on('', '--dry-run') { options[:dry_run] = true }
|
38
|
+
opt.on('' , '--force') { options[:force] = true }
|
39
|
+
opt.on('', '--no-health-check-gc') { options[:no_health_check_gc] = true }
|
40
|
+
opt.on('-e', '--export') { mode = :export }
|
41
|
+
opt.on('-o', '--output FILE') {|v| output_file = v }
|
42
|
+
opt.on('', '--split') { split = true }
|
43
|
+
opt.on('', '--with-soa-ns') { options[:with_soa_ns] = true }
|
44
|
+
opt.on('-t', '--test') { mode = :test }
|
45
|
+
opt.on('' , '--nameservers SERVERS', Array) {|v| options[:nameservers] = v }
|
46
|
+
opt.on('' , '--no-color') { options[:color] = false }
|
47
|
+
opt.on('' , '--debug') { options[:debug] = true }
|
47
48
|
opt.parse!
|
48
49
|
|
49
50
|
if access_key and secret_key
|
@@ -31,6 +31,8 @@ module Roadworker
|
|
31
31
|
|
32
32
|
DEFAULT_NAMESERVERS = ['8.8.8.8', '8.8.4.4']
|
33
33
|
ASTERISK_PREFIX = 'asterisk-of-wildcard'
|
34
|
+
RETRY = 3
|
35
|
+
RETRY_WAIT = 1
|
34
36
|
|
35
37
|
class << self
|
36
38
|
def test(dsl, options)
|
@@ -49,6 +51,16 @@ module Roadworker
|
|
49
51
|
failures = 0
|
50
52
|
error_messages = []
|
51
53
|
warning_messages = []
|
54
|
+
a_records = {}
|
55
|
+
|
56
|
+
records.each do |key, rrs|
|
57
|
+
name, type = key
|
58
|
+
next unless type == "A"
|
59
|
+
|
60
|
+
a_records[name] = rrs.map do |record|
|
61
|
+
[(record.resource_records || []).map {|i| i[:value].strip }.sort, record.ttl]
|
62
|
+
end
|
63
|
+
end
|
52
64
|
|
53
65
|
validate_record = lambda do |key, rrs, asterisk_answers|
|
54
66
|
errors = []
|
@@ -59,7 +71,7 @@ module Roadworker
|
|
59
71
|
|
60
72
|
log(:debug, 'Check DNS', :white, "#{name} #{type}")
|
61
73
|
|
62
|
-
response = query(name, type,
|
74
|
+
response = query(name, type, error_messages)
|
63
75
|
|
64
76
|
unless response
|
65
77
|
failures += 1
|
@@ -87,7 +99,7 @@ module Roadworker
|
|
87
99
|
actual_message = actual_value.zip(actual_ttls).map {|v, t| "#{v}(#{t})" }.join(',')
|
88
100
|
logmsg_expected = "expected=#{expected_message}"
|
89
101
|
logmsg_actual = "actual=#{actual_message}"
|
90
|
-
log(:debug, " #{logmsg_expected}\n #{logmsg_actual}", :white
|
102
|
+
log(:debug, " #{logmsg_expected}\n #{logmsg_actual}", :white)
|
91
103
|
|
92
104
|
is_same = false
|
93
105
|
|
@@ -96,8 +108,14 @@ module Roadworker
|
|
96
108
|
case record.dns_name.sub(/\.\Z/, '')
|
97
109
|
when /\.elb\.amazonaws\.com/i
|
98
110
|
is_same = response.answer.all? {|a|
|
99
|
-
query(a.value, 'PTR',
|
100
|
-
|
111
|
+
response_query_ptr = query(a.value, 'PTR', error_messages)
|
112
|
+
|
113
|
+
if response_query_ptr
|
114
|
+
response_query_ptr.answer.all? do |ptr|
|
115
|
+
ptr.value =~ /\.compute\.amazonaws\.com\.\Z/
|
116
|
+
end
|
117
|
+
else
|
118
|
+
false
|
101
119
|
end
|
102
120
|
}
|
103
121
|
when /\As3-website-(?:[^.]+)\.amazonaws\.com\Z/
|
@@ -110,7 +128,7 @@ module Roadworker
|
|
110
128
|
log(:debug, 'Retry Check', :white, "#{name} #{type}")
|
111
129
|
end
|
112
130
|
|
113
|
-
dns_name_a = query(record.dns_name, 'A',
|
131
|
+
dns_name_a = query(record.dns_name, 'A', error_messages)
|
114
132
|
s3_website_endpoint_ips = dns_name_a.answer.map {|i| i.value }
|
115
133
|
|
116
134
|
!s3_website_endpoint_ips.empty? && s3_website_endpoint_ips.any? {|ip|
|
@@ -119,13 +137,24 @@ module Roadworker
|
|
119
137
|
end
|
120
138
|
when /\.cloudfront\.net\Z/
|
121
139
|
is_same = response.answer.all? {|a|
|
122
|
-
query(a.value, 'PTR',
|
123
|
-
|
140
|
+
response_query_ptr = query(a.value, 'PTR', error_messages)
|
141
|
+
|
142
|
+
if response_query_ptr
|
143
|
+
response_query_ptr.answer.all? do |ptr|
|
144
|
+
ptr.value =~ /\.cloudfront\.net\.\Z/
|
145
|
+
end
|
124
146
|
end
|
125
147
|
}
|
126
148
|
else
|
127
|
-
|
128
|
-
|
149
|
+
if (alias_target_a_record = a_records[record.dns_name])
|
150
|
+
expected_message = alias_target_a_record.map {|values, ttl| values.map {|i| "#{i}(#{ttl})" }.join(',') }.uniq.join (' or ')
|
151
|
+
logmsg_expected = "expected=#{expected_message}"
|
152
|
+
expected_ttl = alias_target_a_record.map {|values, ttl| ttl }.max
|
153
|
+
is_same = alias_target_a_record.any? {|values, ttl| values == actual_value }
|
154
|
+
else
|
155
|
+
warning_messages << "#{name} #{type}: Cannot check `#{record.dns_name}`"
|
156
|
+
is_same = true
|
157
|
+
end
|
129
158
|
end
|
130
159
|
else
|
131
160
|
is_same = (expected_value == actual_value)
|
@@ -195,7 +224,7 @@ module Roadworker
|
|
195
224
|
puts unless @options.debug
|
196
225
|
|
197
226
|
error_messages.each do |msg|
|
198
|
-
log(:
|
227
|
+
log(:error, msg, :intense_red)
|
199
228
|
end
|
200
229
|
|
201
230
|
warning_messages.each do |msg|
|
@@ -209,12 +238,16 @@ module Roadworker
|
|
209
238
|
|
210
239
|
def create_resolver
|
211
240
|
log_file = @options.debug ? Net::DNS::Resolver::Defaults[:log_file] : '/dev/null'
|
241
|
+
resolver_opts = {:log_file => log_file}
|
212
242
|
|
213
243
|
if File.exist?(Net::DNS::Resolver::Defaults[:config_file])
|
214
|
-
|
244
|
+
resolver_opts[:nameservers] = @options.nameservers if @options.nameservers
|
245
|
+
Net::DNS::Resolver.new(resolver_opts)
|
215
246
|
else
|
216
247
|
Tempfile.open(File.basename(__FILE__)) do |f|
|
217
|
-
|
248
|
+
resolver_opts.updated(:config_file => f.path, :nameservers => DEFAULT_NAMESERVERS)
|
249
|
+
resolver_opts[:nameservers] = @options.nameservers if @options.nameservers
|
250
|
+
Net::DNS::Resolver.new(resolver_opts)
|
218
251
|
end
|
219
252
|
end
|
220
253
|
end
|
@@ -238,14 +271,21 @@ module Roadworker
|
|
238
271
|
name.gsub('*', "#{ASTERISK_PREFIX}-#{rand_str}")
|
239
272
|
end
|
240
273
|
|
241
|
-
def query(name, type,
|
274
|
+
def query(name, type, error_messages = nil)
|
242
275
|
ctype = Net::DNS.const_get(type)
|
243
276
|
response = nil
|
244
277
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
278
|
+
RETRY.times do |i|
|
279
|
+
begin
|
280
|
+
response = @resolver.query(name, ctype)
|
281
|
+
break
|
282
|
+
rescue => e
|
283
|
+
if (i + 1) < RETRY
|
284
|
+
sleep RETRY_WAIT
|
285
|
+
else
|
286
|
+
error_messages << "#{name} #{type}: #{e.message}" if error_messages
|
287
|
+
end
|
288
|
+
end
|
249
289
|
end
|
250
290
|
|
251
291
|
return response
|
data/lib/roadworker/version.rb
CHANGED
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roadworker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- winebarrel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - '>='
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.14.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - '>='
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.14.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: term-ansicolor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - '>='
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.2.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - '>='
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.2.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -56,14 +56,14 @@ dependencies:
|
|
56
56
|
name: uuid
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - '>='
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 2.3.7
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - '>='
|
66
|
+
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.3.7
|
69
69
|
- !ruby/object:Gem::Dependency
|
@@ -84,14 +84,14 @@ dependencies:
|
|
84
84
|
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - '>='
|
87
|
+
- - ! '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - '>='
|
94
|
+
- - ! '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
@@ -142,17 +142,17 @@ require_paths:
|
|
142
142
|
- lib
|
143
143
|
required_ruby_version: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
|
-
- - '>='
|
145
|
+
- - ! '>='
|
146
146
|
- !ruby/object:Gem::Version
|
147
147
|
version: '0'
|
148
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- - '>='
|
150
|
+
- - ! '>='
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
requirements: []
|
154
154
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.1.
|
155
|
+
rubygems_version: 2.1.5
|
156
156
|
signing_key:
|
157
157
|
specification_version: 4
|
158
158
|
summary: Roadworker is a tool to manage Route53.
|