github-pages-health-check 1.9.0 → 1.10.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 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