github-pages-health-check 1.9.0 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 491f20abd7228f543a6f4682b74918a9f32265ca0f0f015d41ae40e5163462e6
4
- data.tar.gz: 1dcb08e4d692030537e2d1334c09edbcac2e4179fb7ad05fe23cb412c6401270
3
+ metadata.gz: ad338ea604a8549ea8d86009de6cdd7d8c578eb81d14d2f2ebf96b5fc7791cbe
4
+ data.tar.gz: 1241ab1285cf8d4e15cc9e56ee701b40241eede4740ce4090deb055c3b460ef0
5
5
  SHA512:
6
- metadata.gz: 18bb1e7f1c7ece16a011ddd55c4f4238ab600be77013705857306cbbfd6d74e120b72f62ea853647c1b7d0a8affcc0dda222c7a22008645f4f66abe755c64634
7
- data.tar.gz: b099817a6ebd5298f81a993f5c5c2b767bd291122f0262f81002bdb4a1fa315864f838698b9e192719f46fbbd4b7b0ceba59e92a3ad8fe10f94a3edf97aa5873
6
+ metadata.gz: aff974999ece850cf655e4cd1234806ddc8974c30e3b70eb1c3d8095d716c4be27ba23d343436bf28fd04f6ac3c9da0de676d079e25b0fc6d68b2e848b289c08
7
+ data.tar.gz: 44d14037c06a29e2be93da02040464894eedb72fa33b704a96dff152d31e438863e10fad54c69877182267e0f53949ee4d64e3e414a3748785c915e14f73cadf
@@ -19,18 +19,19 @@ end
19
19
 
20
20
  module GitHubPages
21
21
  module HealthCheck
22
- autoload :CDN, "github-pages-health-check/cdn"
23
- autoload :CloudFlare, "github-pages-health-check/cdns/cloudflare"
24
- autoload :Fastly, "github-pages-health-check/cdns/fastly"
25
- autoload :Error, "github-pages-health-check/error"
26
- autoload :Errors, "github-pages-health-check/errors"
27
- autoload :CAA, "github-pages-health-check/caa"
28
- autoload :Checkable, "github-pages-health-check/checkable"
29
- autoload :Domain, "github-pages-health-check/domain"
30
- autoload :Repository, "github-pages-health-check/repository"
31
- autoload :Resolver, "github-pages-health-check/resolver"
32
- autoload :Site, "github-pages-health-check/site"
33
- autoload :Printer, "github-pages-health-check/printer"
22
+ autoload :CDN, "github-pages-health-check/cdn"
23
+ autoload :CloudFlare, "github-pages-health-check/cdns/cloudflare"
24
+ autoload :Fastly, "github-pages-health-check/cdns/fastly"
25
+ autoload :Error, "github-pages-health-check/error"
26
+ autoload :Errors, "github-pages-health-check/errors"
27
+ autoload :CAA, "github-pages-health-check/caa"
28
+ autoload :Checkable, "github-pages-health-check/checkable"
29
+ autoload :Domain, "github-pages-health-check/domain"
30
+ autoload :RedundantCheck, "github-pages-health-check/redundant_check"
31
+ autoload :Repository, "github-pages-health-check/repository"
32
+ autoload :Resolver, "github-pages-health-check/resolver"
33
+ autoload :Site, "github-pages-health-check/site"
34
+ autoload :Printer, "github-pages-health-check/printer"
34
35
 
35
36
  # DNS and HTTP timeout, in seconds
36
37
  TIMEOUT = 7
@@ -2,17 +2,18 @@
2
2
 
3
3
  require "dnsruby"
4
4
  require "public_suffix"
5
+ require "github-pages-health-check/resolver"
5
6
 
6
7
  module GitHubPages
7
8
  module HealthCheck
8
9
  class CAA
9
- attr_reader :host
10
- attr_reader :error
10
+ attr_reader :host, :error, :nameservers
11
11
 
12
- def initialize(host)
12
+ def initialize(host, nameservers: nil)
13
13
  raise ArgumentError, "host cannot be nil" if host.nil?
14
14
 
15
15
  @host = host
16
+ @nameservers = nameservers
16
17
  end
17
18
 
18
19
  def errored?
@@ -47,11 +48,15 @@ module GitHubPages
47
48
  end
48
49
 
49
50
  def query(domain)
50
- GitHubPages::HealthCheck::Resolver.new(domain).query(Dnsruby::Types::CAA)
51
+ resolver(domain).query(Dnsruby::Types::CAA)
51
52
  rescue Dnsruby::ResolvError, Dnsruby::ResolvTimeout => e
52
53
  @error = e
53
54
  []
54
55
  end
56
+
57
+ def resolver(domain)
58
+ GitHubPages::HealthCheck::Resolver.new(domain, :nameservers => nameservers)
59
+ end
55
60
  end
56
61
  end
57
62
  end
@@ -3,7 +3,7 @@
3
3
  module GitHubPages
4
4
  module HealthCheck
5
5
  class Domain < Checkable
6
- attr_reader :host
6
+ attr_reader :host, :resolver, :nameservers
7
7
 
8
8
  LEGACY_IP_ADDRESSES = [
9
9
  # Legacy GitHub Datacenter
@@ -85,16 +85,23 @@ module GitHubPages
85
85
  valid_domain? apex_domain? should_be_a_record?
86
86
  cname_to_github_user_domain? cname_to_pages_dot_github_dot_com?
87
87
  cname_to_fastly? pointed_to_github_pages_ip? pages_domain?
88
- served_by_pages? valid_domain? https? enforces_https? https_error
89
- https_eligible? caa_error
88
+ served_by_pages? valid? reason valid_domain?
89
+ https? enforces_https? https_error https_eligible? caa_error
90
90
  ].freeze
91
91
 
92
- def initialize(host)
92
+ def self.redundant(host)
93
+ GitHubPages::HealthCheck::RedundantCheck.new(host).check
94
+ end
95
+
96
+ def initialize(host, nameservers: :default)
93
97
  unless host.is_a? String
94
98
  raise ArgumentError, "Expected string, got #{host.class}"
95
99
  end
96
100
 
97
101
  @host = normalize_host(host)
102
+ @nameservers = nameservers
103
+ @resolver = GitHubPages::HealthCheck::Resolver.new(host,
104
+ :nameservers => nameservers)
98
105
  end
99
106
 
100
107
  # Runs all checks, raises an error if invalid
@@ -269,10 +276,6 @@ module GitHubPages
269
276
  @dns = nil
270
277
  end
271
278
 
272
- def resolver
273
- @resolver ||= GitHubPages::HealthCheck::Resolver.new(absolute_domain)
274
- end
275
-
276
279
  # Are we even able to get the DNS record?
277
280
  def dns?
278
281
  !(dns.nil? || dns.empty?)
@@ -371,7 +374,7 @@ module GitHubPages
371
374
  private
372
375
 
373
376
  def caa
374
- @caa ||= GitHubPages::HealthCheck::CAA.new(host)
377
+ @caa ||= GitHubPages::HealthCheck::CAA.new(host, :nameservers => nameservers)
375
378
  end
376
379
 
377
380
  # The domain's response to HTTP(S) requests, following redirects
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitHubPages
4
+ module HealthCheck
5
+ class RedundantCheck
6
+ extend Forwardable
7
+
8
+ TIMEOUT = 5 # seconds
9
+
10
+ attr_reader :domain
11
+
12
+ def initialize(domain)
13
+ @domain = domain
14
+ end
15
+
16
+ def check
17
+ @check ||= (checks.find(&:valid?) || check_with_default_nameservers)
18
+ end
19
+
20
+ def_delegator :check, :reason, :reason
21
+ def_delegator :check, :valid?, :valid?
22
+
23
+ def https_eligible?
24
+ checks.any?(&:https_eligible?)
25
+ end
26
+
27
+ private
28
+
29
+ def checks
30
+ @checks ||= %i[default authoritative].map do |ns|
31
+ GitHubPages::HealthCheck::Domain.new(domain, :nameservers => ns)
32
+ end
33
+ end
34
+
35
+ def check_with_default_nameservers
36
+ @check_with_default_nameservers ||= checks.find { |c| c.nameservers == :default }
37
+ end
38
+ end
39
+ end
40
+ end
@@ -54,7 +54,7 @@ module GitHubPages
54
54
 
55
55
  def domain
56
56
  return if cname.nil?
57
- @domain ||= GitHubPages::HealthCheck::Domain.new(cname)
57
+ @domain ||= GitHubPages::HealthCheck::Domain.redundant(cname)
58
58
  end
59
59
 
60
60
  private
@@ -4,50 +4,53 @@ module GitHubPages
4
4
  module HealthCheck
5
5
  class Resolver
6
6
  DEFAULT_RESOLVER_OPTIONS = {
7
- :retry_times => 2,
7
+ :retry_times => 2,
8
8
  :query_timeout => 5,
9
- :dnssec => false
9
+ :dnssec => false
10
10
  }.freeze
11
11
 
12
- PREFERS_AUTHORITATIVE_ANSWER = [
13
- Dnsruby::Types::A,
14
- Dnsruby::Types::CAA,
15
- Dnsruby::Types::MX
16
- ].freeze
17
-
18
12
  class << self
19
13
  def default_resolver
20
14
  @default_resolver ||= Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS)
21
15
  end
22
16
  end
23
17
 
24
- attr_reader :domain
18
+ attr_reader :domain, :nameservers
25
19
 
26
- def initialize(domain)
20
+ # Create a new resolver.
21
+ #
22
+ # domain - the domain we're getting answers for
23
+ # nameserver - (optional) a case
24
+ def initialize(domain, nameservers: :default)
27
25
  @domain = domain
26
+ @nameservers = nameservers
28
27
  end
29
28
 
30
29
  def query(type)
31
- if PREFERS_AUTHORITATIVE_ANSWER.include?(type)
32
- answer = authoritative_resolver.query(domain, type).answer
33
- return answer unless answer.empty?
34
- end
35
-
36
- self.class.default_resolver.query(domain, type).answer
37
- rescue Dnsruby::ResolvTimeout, Dnsruby::ResolvError
38
- self.class.default_resolver.query(domain, type).answer
30
+ resolver.query(domain, type).answer
39
31
  end
40
32
 
41
33
  private
42
34
 
43
- def authoritative_resolver
44
- return self.class.default_resolver if nameservers.nil? || nameservers.empty?
45
-
46
- Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(:nameservers => nameservers))
35
+ def resolver
36
+ @resolver ||= case nameservers
37
+ when :default
38
+ self.class.default_resolver
39
+ when :authoritative
40
+ Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(
41
+ :nameservers => authoritative_nameservers
42
+ ))
43
+ when Array
44
+ Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(
45
+ :nameservers => nameservers
46
+ ))
47
+ else
48
+ raise "Invalid nameserver type: #{nameservers.inspect}"
49
+ end
47
50
  end
48
51
 
49
- def nameservers
50
- @nameservers ||= begin
52
+ def authoritative_nameservers
53
+ @authoritative_nameservers ||= begin
51
54
  self.class.default_resolver.query(domain, Dnsruby::Types::NS).answer.map do |rr|
52
55
  next rr.nsdname.to_s if rr.type == Dnsruby::Types::NS
53
56
  end.compact
@@ -10,7 +10,7 @@ module GitHubPages
10
10
  @domain = @repository.domain
11
11
  rescue GitHubPages::HealthCheck::Errors::InvalidRepositoryError
12
12
  @repository = nil
13
- @domain = Domain.new(repository_or_domain)
13
+ @domain = Domain.redundant(repository_or_domain)
14
14
  end
15
15
 
16
16
  def check!
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitHubPages
4
4
  module HealthCheck
5
- VERSION = "1.9.0".freeze
5
+ VERSION = "1.10.0".freeze
6
6
  end
7
7
  end
data/script/cibuild CHANGED
@@ -6,4 +6,6 @@ script/bootstrap
6
6
 
7
7
  script/test
8
8
  script/check-cdn-ips
9
+ bundle exec script/check www.parkermoore.de | grep 'valid?: true'
10
+ bundle exec script/check ben.balter.com | grep 'valid?: true'
9
11
  bundle exec gem build github-pages-health-check.gemspec
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github-pages-health-check
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-08 00:00:00.000000000 Z
11
+ date: 2018-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -200,6 +200,7 @@ files:
200
200
  - lib/github-pages-health-check/errors/missing_access_token_error.rb
201
201
  - lib/github-pages-health-check/errors/not_served_by_pages_error.rb
202
202
  - lib/github-pages-health-check/printer.rb
203
+ - lib/github-pages-health-check/redundant_check.rb
203
204
  - lib/github-pages-health-check/repository.rb
204
205
  - lib/github-pages-health-check/resolver.rb
205
206
  - lib/github-pages-health-check/site.rb