roadworker 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 392920823680868099f04b0e50244f453fe1375f
4
- data.tar.gz: 0e3b6d6c6caf791974c4587ce7047302c9f486d9
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjIzOTY2MjJjYmYzODVjMDE0NzFkZTIyMzhiNjRlNzJlZjYwMjljNA==
5
+ data.tar.gz: !binary |-
6
+ NWNiMzA2Nzk5YmE4NTllY2ZlMDFiMWNjZTYxYjYxYmM4MGEzNTRkMQ==
5
7
  SHA512:
6
- metadata.gz: 2e99dc04e6f92adaa562e4347025ec181c3c9ecde97fc4ede6e71bff7b83e251f663603d356ac4d23e40206dc056b7146e90be71f5db0559ab6bf48913862d13
7
- data.tar.gz: 82bce88e812bc4e6bffcd6acd2fff92efa84b3b34345ba8e7a63a01d1bcd328528244064d0e8a70a2f5dc4586e60aac53f37625d1091f675f91876d275aa5330
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') {|v| access_key = v }
34
- opt.on('-s', '--secret-key SECRET_KEY') {|v| secret_key = v }
35
- opt.on('-a', '--apply') {|v| mode = :apply }
36
- opt.on('-f', '--file FILE') {|v| file = v }
37
- opt.on('', '--dry-run') {|v| options[:dry_run] = true }
38
- opt.on('' , '--force') { options[:force] = true }
39
- opt.on('', '--no-health-check-gc') {|v| options[:no_health_check_gc] = true }
40
- opt.on('-e', '--export') {|v| mode = :export }
41
- opt.on('-o', '--output FILE') {|v| output_file = v }
42
- opt.on('', '--split') {|v| split = true }
43
- opt.on('', '--with-soa-ns') {|v| options[:with_soa_ns] = true }
44
- opt.on('-t', '--test') {|v| mode = :test }
45
- opt.on('' , '--no-color') { options[:color] = false }
46
- opt.on('' , '--debug') { options[:debug] = true }
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, warning_messages)
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, "#{name} #{type}")
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', warning_messages).answer.all? do |ptr|
100
- ptr.value =~ /\.compute\.amazonaws\.com\.\Z/
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', warning_messages)
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', warning_messages).answer.all? do |ptr|
123
- ptr.value =~ /\.cloudfront\.net\.\Z/
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
- warning_messages << "#{name} #{type}: Cannot check `#{record.dns_name}`"
128
- is_same = true
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(:warn, msg, :intense_red)
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
- Net::DNS::Resolver.new(:log_file => log_file)
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
- Net::DNS::Resolver.new(:config_file => f.path, :nameservers => DEFAULT_NAMESERVERS, :log_file => log_file)
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, warning_messages = nil)
274
+ def query(name, type, error_messages = nil)
242
275
  ctype = Net::DNS.const_get(type)
243
276
  response = nil
244
277
 
245
- begin
246
- response = @resolver.query(name, ctype)
247
- rescue => e
248
- warning_messages << "#{name} #{type}: #{e.message}" if warning_messages
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
@@ -1,5 +1,5 @@
1
1
  module Roadworker
2
- VERSION = "0.3.9"
2
+ VERSION = "0.3.10"
3
3
  end
4
4
 
5
5
  Version = Roadworker::VERSION
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.9
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-09 00:00:00.000000000 Z
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.8
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.