github-pages-health-check 1.14.0 → 1.17.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +1 -0
- data/.github/dependabot.yml +15 -0
- data/.github/workflows/push-cibuild.yml +18 -0
- data/.rubocop.yml +13 -16
- data/.ruby-version +1 -0
- data/.travis.yml +3 -4
- data/Dockerfile +18 -0
- data/Gemfile +9 -0
- data/config/cloudflare-ips.txt +8 -7
- data/config/fastly-ips.txt +6 -5
- data/github-pages-health-check.gemspec +1 -8
- data/lib/github-pages-health-check.rb +3 -3
- data/lib/github-pages-health-check/caa.rb +14 -4
- data/lib/github-pages-health-check/domain.rb +53 -17
- data/lib/github-pages-health-check/error.rb +2 -2
- data/lib/github-pages-health-check/errors.rb +1 -1
- data/lib/github-pages-health-check/errors/build_error.rb +1 -1
- data/lib/github-pages-health-check/errors/deprecated_ip_error.rb +1 -1
- data/lib/github-pages-health-check/errors/invalid_a_record_error.rb +1 -1
- data/lib/github-pages-health-check/errors/invalid_aaaa_record_error.rb +1 -1
- data/lib/github-pages-health-check/errors/invalid_cname_error.rb +1 -1
- data/lib/github-pages-health-check/errors/invalid_dns_error.rb +1 -1
- data/lib/github-pages-health-check/errors/invalid_domain_error.rb +1 -1
- data/lib/github-pages-health-check/errors/not_served_by_pages_error.rb +1 -1
- data/lib/github-pages-health-check/printer.rb +1 -1
- data/lib/github-pages-health-check/repository.rb +7 -3
- data/lib/github-pages-health-check/resolver.rb +9 -9
- data/lib/github-pages-health-check/version.rb +1 -1
- data/script/cibuild +1 -1
- data/script/cibuild-docker +11 -0
- data/script/test +1 -1
- metadata +19 -92
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e269d0849d9754d658dde60478ee1bb1a87913fd6e10cc79cc6cab834b899946
|
4
|
+
data.tar.gz: 83a05c02f53f262c02bcd7d1bf00801b7860fa878c32251fc24006f5dcf454ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 765bb285569e16d11123448b7a2bfcc31c6317293dab5b5a64c6f8af2c9925f5e000b9885273fb1b8c1b42b6db94340dde7292f7227c46b528e56ae0631916ab
|
7
|
+
data.tar.gz: ff8e0af41eb9e43bbe126a969a66fc6ebe704ed196f6a8d2230572ddb52ccfd089af823ddaf016600d117d343ce589f4e492c2b5148926d1c1eae83444900163
|
data/.dockerignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
@@ -0,0 +1,15 @@
|
|
1
|
+
version: 2
|
2
|
+
updates:
|
3
|
+
- package-ecosystem: bundler
|
4
|
+
directory: "/"
|
5
|
+
schedule:
|
6
|
+
interval: daily
|
7
|
+
time: "10:00"
|
8
|
+
timezone: Europe/Vienna
|
9
|
+
pull-request-branch-name:
|
10
|
+
separator: "-"
|
11
|
+
open-pull-requests-limit: 99
|
12
|
+
allow:
|
13
|
+
- dependency-type: direct
|
14
|
+
- dependency-type: indirect
|
15
|
+
rebase-strategy: disabled
|
@@ -0,0 +1,18 @@
|
|
1
|
+
on: push
|
2
|
+
name: cibuild on push
|
3
|
+
jobs:
|
4
|
+
build:
|
5
|
+
name: "GitHub Pages Health Check Tests"
|
6
|
+
runs-on: ubuntu-latest
|
7
|
+
strategy:
|
8
|
+
matrix:
|
9
|
+
ruby:
|
10
|
+
- 2.5
|
11
|
+
- 2.6
|
12
|
+
- 2.7
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@master
|
15
|
+
- name: script/cibuild-docker
|
16
|
+
run: script/cibuild-docker
|
17
|
+
env:
|
18
|
+
RUBY_VERSION: ${{ matrix.ruby }}
|
data/.rubocop.yml
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
AllCops:
|
20
|
-
TargetRubyVersion: 2.
|
20
|
+
TargetRubyVersion: 2.6
|
21
21
|
Exclude:
|
22
22
|
- 'bin/**/*'
|
23
23
|
- 'script/**/*'
|
@@ -30,10 +30,6 @@ Layout/EndAlignment:
|
|
30
30
|
Lint/UnreachableCode:
|
31
31
|
Severity: error
|
32
32
|
|
33
|
-
Style/StringLiterals:
|
34
|
-
EnforcedStyle: double_quotes
|
35
|
-
Severity: error
|
36
|
-
|
37
33
|
Style/StringLiteralsInInterpolation:
|
38
34
|
EnforcedStyle: double_quotes
|
39
35
|
|
@@ -41,10 +37,10 @@ Style/HashSyntax:
|
|
41
37
|
EnforcedStyle: hash_rockets
|
42
38
|
Severity: error
|
43
39
|
|
44
|
-
Layout/
|
40
|
+
Layout/HashAlignment:
|
45
41
|
SupportedLastArgumentHashStyles: always_ignore
|
46
42
|
|
47
|
-
Layout/
|
43
|
+
Layout/ParameterAlignment:
|
48
44
|
Enabled: false # This is usually true, but we often want to roll back to
|
49
45
|
# the start of a line.
|
50
46
|
|
@@ -55,12 +51,7 @@ Style/Attr:
|
|
55
51
|
Style/ClassAndModuleChildren:
|
56
52
|
Enabled: false # module X<\n>module Y is just as good as module X::Y.
|
57
53
|
|
58
|
-
|
59
|
-
PreferredDelimiters:
|
60
|
-
'%w': '{}'
|
61
|
-
'%r': '{}'
|
62
|
-
|
63
|
-
Metrics/LineLength:
|
54
|
+
Layout/LineLength:
|
64
55
|
Max: 90
|
65
56
|
Severity: warning
|
66
57
|
Exclude:
|
@@ -99,13 +90,12 @@ Naming/FileName: #Rubocop doesn't like the Git*H*ub namespace
|
|
99
90
|
Enabled: false
|
100
91
|
|
101
92
|
Metrics/ParameterLists: { Max: 4 }
|
102
|
-
Metrics/AbcSize: { Max: 20 }
|
103
93
|
|
104
|
-
Layout/
|
94
|
+
Layout/FirstHashElementIndentation: { EnforcedStyle: consistent }
|
105
95
|
Layout/MultilineMethodCallIndentation: { EnforcedStyle: indented }
|
106
96
|
Layout/MultilineOperationIndentation: { EnforcedStyle: indented }
|
107
97
|
Layout/FirstParameterIndentation: { EnforcedStyle: consistent }
|
108
|
-
Layout/
|
98
|
+
Layout/FirstArrayElementIndentation: { EnforcedStyle: consistent }
|
109
99
|
Layout/ExtraSpacing: { AllowForAlignment: true }
|
110
100
|
Style/SignalException: { EnforcedStyle: only_raise }
|
111
101
|
Style/StringLiterals: { EnforcedStyle: double_quotes }
|
@@ -155,3 +145,10 @@ Style/FrozenStringLiteralComment:
|
|
155
145
|
|
156
146
|
Gemspec/RequiredRubyVersion:
|
157
147
|
Enabled: false
|
148
|
+
|
149
|
+
Style/HashEachMethods:
|
150
|
+
Enabled: false
|
151
|
+
Style/HashTransformKeys:
|
152
|
+
Enabled: false
|
153
|
+
Style/HashTransformValues:
|
154
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.1
|
data/.travis.yml
CHANGED
data/Dockerfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
ARG RUBY_VERSION
|
2
|
+
FROM ruby:$RUBY_VERSION-slim
|
3
|
+
RUN set -ex \
|
4
|
+
&& gem update --system --silent --quiet \
|
5
|
+
&& apt-get update -y \
|
6
|
+
&& apt-get upgrade -y \
|
7
|
+
&& apt-get install -y \
|
8
|
+
build-essential \
|
9
|
+
git \
|
10
|
+
libcurl4-openssl-dev \
|
11
|
+
&& apt-get clean
|
12
|
+
WORKDIR /app/github-pages-health-check
|
13
|
+
COPY Gemfile .
|
14
|
+
COPY github-pages-health-check.gemspec .
|
15
|
+
COPY lib/github-pages-health-check/version.rb lib/github-pages-health-check/version.rb
|
16
|
+
RUN bundle install
|
17
|
+
COPY . .
|
18
|
+
ENTRYPOINT [ "/bin/bash" ]
|
data/Gemfile
CHANGED
data/config/cloudflare-ips.txt
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
+
173.245.48.0/20
|
1
2
|
103.21.244.0/22
|
2
3
|
103.22.200.0/22
|
3
4
|
103.31.4.0/22
|
4
|
-
104.16.0.0/12
|
5
|
-
108.162.192.0/18
|
6
|
-
131.0.72.0/22
|
7
5
|
141.101.64.0/18
|
8
|
-
162.
|
9
|
-
172.64.0.0/13
|
10
|
-
173.245.48.0/20
|
11
|
-
188.114.96.0/20
|
6
|
+
108.162.192.0/18
|
12
7
|
190.93.240.0/20
|
8
|
+
188.114.96.0/20
|
13
9
|
197.234.240.0/22
|
14
10
|
198.41.128.0/17
|
11
|
+
162.158.0.0/15
|
12
|
+
172.64.0.0/13
|
13
|
+
131.0.72.0/22
|
14
|
+
104.16.0.0/13
|
15
|
+
104.24.0.0/14
|
data/config/fastly-ips.txt
CHANGED
@@ -4,13 +4,14 @@
|
|
4
4
|
103.245.222.0/23
|
5
5
|
103.245.224.0/24
|
6
6
|
104.156.80.0/20
|
7
|
+
146.75.0.0/16
|
7
8
|
151.101.0.0/16
|
8
9
|
157.52.64.0/18
|
10
|
+
167.82.0.0/17
|
11
|
+
167.82.128.0/20
|
12
|
+
167.82.160.0/20
|
13
|
+
167.82.224.0/20
|
9
14
|
172.111.64.0/18
|
10
15
|
185.31.16.0/22
|
11
16
|
199.27.72.0/21
|
12
|
-
199.232.0.0/16
|
13
|
-
202.21.128.11/32
|
14
|
-
202.21.128.12/32
|
15
|
-
203.57.145.11/32
|
16
|
-
203.57.145.12/32
|
17
|
+
199.232.0.0/16
|
@@ -19,13 +19,6 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_dependency("addressable", "~> 2.3")
|
20
20
|
s.add_dependency("dnsruby", "~> 1.60")
|
21
21
|
s.add_dependency("octokit", "~> 4.0")
|
22
|
-
s.add_dependency("public_suffix", "
|
22
|
+
s.add_dependency("public_suffix", ">= 2.0.2", "< 5.0")
|
23
23
|
s.add_dependency("typhoeus", "~> 1.3")
|
24
|
-
|
25
|
-
s.add_development_dependency("dotenv", "~> 1.0")
|
26
|
-
s.add_development_dependency("gem-release", "~> 0.7")
|
27
|
-
s.add_development_dependency("pry", "~> 0.10")
|
28
|
-
s.add_development_dependency("rspec", "~> 3.0")
|
29
|
-
s.add_development_dependency("rubocop", "~> 0.52")
|
30
|
-
s.add_development_dependency("webmock", "~> 1.21")
|
31
24
|
end
|
@@ -37,9 +37,9 @@ module GitHubPages
|
|
37
37
|
# DNS and HTTP timeout, in seconds
|
38
38
|
TIMEOUT = 7
|
39
39
|
|
40
|
-
HUMAN_NAME = "GitHub Pages Health Check"
|
41
|
-
URL = "https://github.com/github/pages-health-check"
|
42
|
-
USER_AGENT = "Mozilla/5.0 (compatible; #{HUMAN_NAME}/#{VERSION}; +#{URL})"
|
40
|
+
HUMAN_NAME = "GitHub Pages Health Check"
|
41
|
+
URL = "https://github.com/github/pages-health-check"
|
42
|
+
USER_AGENT = "Mozilla/5.0 (compatible; #{HUMAN_NAME}/#{VERSION}; +#{URL})"
|
43
43
|
|
44
44
|
TYPHOEUS_OPTIONS = {
|
45
45
|
:followlocation => true,
|
@@ -9,7 +9,7 @@ module GitHubPages
|
|
9
9
|
class CAA
|
10
10
|
attr_reader :host, :error, :nameservers
|
11
11
|
|
12
|
-
def initialize(host
|
12
|
+
def initialize(host:, nameservers: :default)
|
13
13
|
raise ArgumentError, "host cannot be nil" if host.nil?
|
14
14
|
|
15
15
|
@host = host
|
@@ -24,24 +24,30 @@ module GitHubPages
|
|
24
24
|
def lets_encrypt_allowed?
|
25
25
|
return false if errored?
|
26
26
|
return true unless records_present?
|
27
|
+
|
27
28
|
records.any? { |r| r.property_value == "letsencrypt.org" }
|
28
29
|
end
|
29
30
|
|
30
31
|
def records_present?
|
31
32
|
return false if errored?
|
33
|
+
|
32
34
|
records && !records.empty?
|
33
35
|
end
|
34
36
|
|
35
37
|
def records
|
36
|
-
@records
|
37
|
-
|
38
|
-
|
38
|
+
return @records if defined?(@records)
|
39
|
+
|
40
|
+
@records = get_caa_records(host)
|
41
|
+
@records = get_caa_records(parent_host) if @records.nil? || @records.empty?
|
42
|
+
|
43
|
+
@records
|
39
44
|
end
|
40
45
|
|
41
46
|
private
|
42
47
|
|
43
48
|
def get_caa_records(domain)
|
44
49
|
return [] if domain.nil?
|
50
|
+
|
45
51
|
query(domain).select { |r| issue_caa_record?(r) }
|
46
52
|
end
|
47
53
|
|
@@ -59,6 +65,10 @@ module GitHubPages
|
|
59
65
|
def resolver(domain)
|
60
66
|
GitHubPages::HealthCheck::Resolver.new(domain, :nameservers => nameservers)
|
61
67
|
end
|
68
|
+
|
69
|
+
def parent_host
|
70
|
+
host.split(".").drop(1).join(".")
|
71
|
+
end
|
62
72
|
end
|
63
73
|
end
|
64
74
|
end
|
@@ -100,44 +100,52 @@ module GitHubPages
|
|
100
100
|
@host = normalize_host(host)
|
101
101
|
@nameservers = nameservers
|
102
102
|
@resolver = GitHubPages::HealthCheck::Resolver.new(self.host,
|
103
|
-
|
103
|
+
:nameservers => nameservers)
|
104
104
|
end
|
105
105
|
|
106
106
|
# Runs all checks, raises an error if invalid
|
107
|
+
# rubocop:disable Metrics/AbcSize
|
107
108
|
def check!
|
108
|
-
raise Errors::InvalidDomainError
|
109
|
-
raise Errors::InvalidDNSError
|
110
|
-
raise Errors::DeprecatedIPError
|
109
|
+
raise Errors::InvalidDomainError.new :domain => self unless valid_domain?
|
110
|
+
raise Errors::InvalidDNSError.new :domain => self unless dns_resolves?
|
111
|
+
raise Errors::DeprecatedIPError.new :domain => self if deprecated_ip?
|
111
112
|
return true if proxied?
|
112
|
-
raise Errors::InvalidARecordError
|
113
|
-
raise Errors::InvalidCNAMEError
|
114
|
-
raise Errors::InvalidAAAARecordError
|
115
|
-
raise Errors::NotServedByPagesError
|
113
|
+
raise Errors::InvalidARecordError.new :domain => self if invalid_a_record?
|
114
|
+
raise Errors::InvalidCNAMEError.new :domain => self if invalid_cname?
|
115
|
+
raise Errors::InvalidAAAARecordError.new :domain => self if invalid_aaaa_record?
|
116
|
+
raise Errors::NotServedByPagesError.new :domain => self unless served_by_pages?
|
117
|
+
|
116
118
|
true
|
117
119
|
end
|
120
|
+
# rubocop:enable Metrics/AbcSize
|
118
121
|
|
119
122
|
def deprecated_ip?
|
120
123
|
return @deprecated_ip if defined? @deprecated_ip
|
124
|
+
|
121
125
|
@deprecated_ip = (valid_domain? && a_record? && old_ip_address?)
|
122
126
|
end
|
123
127
|
|
124
128
|
def invalid_aaaa_record?
|
125
129
|
return @invalid_aaaa_record if defined? @invalid_aaaa_record
|
130
|
+
|
126
131
|
@invalid_aaaa_record = (valid_domain? && should_be_a_record? &&
|
127
132
|
aaaa_record_present?)
|
128
133
|
end
|
129
134
|
|
130
135
|
def invalid_a_record?
|
131
136
|
return @invalid_a_record if defined? @invalid_a_record
|
137
|
+
|
132
138
|
@invalid_a_record = (valid_domain? && a_record? && !should_be_a_record?)
|
133
139
|
end
|
134
140
|
|
135
141
|
def invalid_cname?
|
136
142
|
return @invalid_cname if defined? @invalid_cname
|
143
|
+
|
137
144
|
@invalid_cname = begin
|
138
145
|
return false unless valid_domain?
|
139
146
|
return false if github_domain? || apex_domain?
|
140
147
|
return true if cname_to_pages_dot_github_dot_com? || cname_to_fastly?
|
148
|
+
|
141
149
|
!cname_to_github_user_domain? && should_be_cname_record?
|
142
150
|
end
|
143
151
|
end
|
@@ -146,8 +154,11 @@ module GitHubPages
|
|
146
154
|
# Used as an escape hatch to prevent false positives on DNS checkes
|
147
155
|
def valid_domain?
|
148
156
|
return @valid if defined? @valid
|
157
|
+
|
149
158
|
unicode_host = Addressable::IDNA.to_unicode(host)
|
150
|
-
@valid = PublicSuffix.valid?(unicode_host,
|
159
|
+
@valid = PublicSuffix.valid?(unicode_host,
|
160
|
+
:default_rule => nil,
|
161
|
+
:ignore_private => true)
|
151
162
|
end
|
152
163
|
|
153
164
|
# Is this domain an apex domain, meaning a CNAME would be innapropriate
|
@@ -161,7 +172,9 @@ module GitHubPages
|
|
161
172
|
# E.g. PublicSuffix.domain("blog.digital.gov.uk") # => "digital.gov.uk"
|
162
173
|
# For apex-level domain names, DNS providers do not support CNAME records.
|
163
174
|
unicode_host = Addressable::IDNA.to_unicode(host)
|
164
|
-
PublicSuffix.domain(unicode_host
|
175
|
+
PublicSuffix.domain(unicode_host,
|
176
|
+
:default_rule => nil,
|
177
|
+
:ignore_private => true) == unicode_host
|
165
178
|
end
|
166
179
|
|
167
180
|
# Should the domain use an A record?
|
@@ -181,6 +194,7 @@ module GitHubPages
|
|
181
194
|
# Are any of the domain's A records pointing elsewhere?
|
182
195
|
def non_github_pages_ip_present?
|
183
196
|
return unless dns?
|
197
|
+
|
184
198
|
a_records = dns.select { |answer| answer.type == Dnsruby::Types::A }
|
185
199
|
|
186
200
|
a_records.any? { |answer| !github_pages_ip?(answer.address.to_s) }
|
@@ -256,6 +270,7 @@ module GitHubPages
|
|
256
270
|
return false if cname_to_github_user_domain?
|
257
271
|
return false if cname_to_pages_dot_github_dot_com?
|
258
272
|
return false if cname_to_fastly? || fastly_ip?
|
273
|
+
|
259
274
|
served_by_pages?
|
260
275
|
end
|
261
276
|
|
@@ -270,9 +285,11 @@ module GitHubPages
|
|
270
285
|
def dns
|
271
286
|
return @dns if defined? @dns
|
272
287
|
return unless valid_domain?
|
288
|
+
|
273
289
|
@dns = Timeout.timeout(TIMEOUT) do
|
274
290
|
GitHubPages::HealthCheck.without_warnings do
|
275
291
|
next if host.nil?
|
292
|
+
|
276
293
|
REQUESTED_RECORD_TYPES
|
277
294
|
.map { |type| resolver.query(type) }
|
278
295
|
.flatten.uniq
|
@@ -300,11 +317,13 @@ module GitHubPages
|
|
300
317
|
# Is this domain's first response an A record?
|
301
318
|
def a_record?
|
302
319
|
return unless dns?
|
320
|
+
|
303
321
|
dns.first.type == Dnsruby::Types::A
|
304
322
|
end
|
305
323
|
|
306
324
|
def aaaa_record_present?
|
307
325
|
return unless dns?
|
326
|
+
|
308
327
|
dns.any? { |answer| answer.type == Dnsruby::Types::AAAA }
|
309
328
|
end
|
310
329
|
|
@@ -312,6 +331,7 @@ module GitHubPages
|
|
312
331
|
def cname_record?
|
313
332
|
return unless dns?
|
314
333
|
return false unless cname
|
334
|
+
|
315
335
|
cname.valid_domain?
|
316
336
|
end
|
317
337
|
alias cname? cname_record?
|
@@ -319,12 +339,15 @@ module GitHubPages
|
|
319
339
|
# The domain to which this domain's CNAME resolves
|
320
340
|
# Returns nil if the domain is not a CNAME
|
321
341
|
def cname
|
322
|
-
|
323
|
-
|
342
|
+
cnames = dns.take_while { |answer| answer.type == Dnsruby::Types::CNAME }
|
343
|
+
return if cnames.empty?
|
344
|
+
|
345
|
+
@cname ||= Domain.new(cnames.last.cname.to_s)
|
324
346
|
end
|
325
347
|
|
326
348
|
def mx_records_present?
|
327
349
|
return unless dns?
|
350
|
+
|
328
351
|
dns.any? { |answer| answer.type == Dnsruby::Types::MX }
|
329
352
|
end
|
330
353
|
|
@@ -337,7 +360,7 @@ module GitHubPages
|
|
337
360
|
return true if response.headers["Server"] == "GitHub.com"
|
338
361
|
|
339
362
|
# Typhoeus mangles the case of the header, compare insensitively
|
340
|
-
response.headers.any? { |k, _v| k
|
363
|
+
response.headers.any? { |k, _v| k.downcase == "x-github-request-id" }
|
341
364
|
end
|
342
365
|
end
|
343
366
|
|
@@ -361,27 +384,40 @@ module GitHubPages
|
|
361
384
|
# Does this domain redirect HTTP requests to HTTPS?
|
362
385
|
def enforces_https?
|
363
386
|
return false unless https? && http_response.headers["Location"]
|
387
|
+
|
364
388
|
redirect = Addressable::URI.parse(http_response.headers["Location"])
|
365
389
|
redirect.scheme == "https" && redirect.host == host
|
366
390
|
end
|
367
391
|
|
368
392
|
# Can an HTTPS certificate be issued for this domain?
|
369
393
|
def https_eligible?
|
370
|
-
|
371
|
-
|
372
|
-
|
394
|
+
# Can't have any IP's which aren't GitHub's present.
|
395
|
+
return false if non_github_pages_ip_present?
|
396
|
+
# Can't have any AAAA records present
|
397
|
+
return false if aaaa_record_present?
|
398
|
+
# Must be a CNAME or point to our IPs.
|
399
|
+
|
400
|
+
# Only check the one domain if a CNAME. Don't check the parent domain.
|
401
|
+
return true if cname_to_github_user_domain?
|
402
|
+
|
403
|
+
# Check CAA records for the full domain and its parent domain.
|
404
|
+
pointed_to_github_pages_ip? && caa.lets_encrypt_allowed?
|
373
405
|
end
|
374
406
|
|
375
407
|
# Any errors querying CAA records
|
376
408
|
def caa_error
|
377
409
|
return nil unless caa.errored?
|
410
|
+
|
378
411
|
caa.error.class.name
|
379
412
|
end
|
380
413
|
|
381
414
|
private
|
382
415
|
|
383
416
|
def caa
|
384
|
-
@caa ||= GitHubPages::HealthCheck::CAA.new(
|
417
|
+
@caa ||= GitHubPages::HealthCheck::CAA.new(
|
418
|
+
:host => cname&.host || host,
|
419
|
+
:nameservers => nameservers
|
420
|
+
)
|
385
421
|
end
|
386
422
|
|
387
423
|
# The domain's response to HTTP(S) requests, following redirects
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module GitHubPages
|
4
4
|
module HealthCheck
|
5
5
|
class Error < StandardError
|
6
|
-
DOCUMENTATION_BASE = "https://help.github.com"
|
7
|
-
DOCUMENTATION_PATH = "/categories/github-pages-basics/"
|
6
|
+
DOCUMENTATION_BASE = "https://help.github.com"
|
7
|
+
DOCUMENTATION_PATH = "/categories/github-pages-basics/"
|
8
8
|
LOCAL_ONLY = false # Error is only used when running locally
|
9
9
|
|
10
10
|
attr_reader :repository, :domain
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class BuildError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/troubleshooting-jekyll-builds/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/troubleshooting-jekyll-builds/"
|
8
8
|
LOCAL_ONLY = true
|
9
9
|
end
|
10
10
|
end
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class DeprecatedIPError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
<<-MSG
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class InvalidARecordError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
<<-MSG
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class InvalidAAAARecordError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
<<-MSG
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class InvalidCNAMEError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
<<-MSG
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class InvalidDNSError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
"Domain's DNS record could not be retrieved"
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class InvalidDomainError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
"Domain is not a valid domain"
|
@@ -4,7 +4,7 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
module Errors
|
6
6
|
class NotServedByPagesError < GitHubPages::HealthCheck::Error
|
7
|
-
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
7
|
+
DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/"
|
8
8
|
|
9
9
|
def message
|
10
10
|
"Domain does not resolve to the GitHub Pages server"
|
@@ -5,7 +5,7 @@ module GitHubPages
|
|
5
5
|
class Repository < Checkable
|
6
6
|
attr_reader :name, :owner
|
7
7
|
|
8
|
-
REPO_REGEX = %r{\A[a-z0-9_\-]+/[a-z0-9_\-\.]+\z}i
|
8
|
+
REPO_REGEX = %r{\A[a-z0-9_\-]+/[a-z0-9_\-\.]+\z}i.freeze
|
9
9
|
|
10
10
|
HASH_METHODS = %i[
|
11
11
|
name_with_owner built? last_built build_duration build_error
|
@@ -15,6 +15,7 @@ module GitHubPages
|
|
15
15
|
unless name_with_owner.match(REPO_REGEX)
|
16
16
|
raise Errors::InvalidRepositoryError
|
17
17
|
end
|
18
|
+
|
18
19
|
parts = name_with_owner.split("/")
|
19
20
|
@owner = parts.first
|
20
21
|
@name = parts.last
|
@@ -28,6 +29,7 @@ module GitHubPages
|
|
28
29
|
|
29
30
|
def check!
|
30
31
|
raise Errors::BuildError.new(:repository => self), build_error unless built?
|
32
|
+
|
31
33
|
true
|
32
34
|
end
|
33
35
|
|
@@ -45,15 +47,16 @@ module GitHubPages
|
|
45
47
|
alias reason build_error
|
46
48
|
|
47
49
|
def build_duration
|
48
|
-
last_build
|
50
|
+
last_build&.duration
|
49
51
|
end
|
50
52
|
|
51
53
|
def last_built
|
52
|
-
last_build
|
54
|
+
last_build&.updated_at
|
53
55
|
end
|
54
56
|
|
55
57
|
def domain
|
56
58
|
return if cname.nil?
|
59
|
+
|
57
60
|
@domain ||= GitHubPages::HealthCheck::Domain.redundant(cname)
|
58
61
|
end
|
59
62
|
|
@@ -61,6 +64,7 @@ module GitHubPages
|
|
61
64
|
|
62
65
|
def client
|
63
66
|
raise Errors::MissingAccessTokenError if @access_token.nil?
|
67
|
+
|
64
68
|
@client ||= Octokit::Client.new(:access_token => @access_token)
|
65
69
|
end
|
66
70
|
|
@@ -4,10 +4,10 @@ module GitHubPages
|
|
4
4
|
module HealthCheck
|
5
5
|
class Resolver
|
6
6
|
DEFAULT_RESOLVER_OPTIONS = {
|
7
|
-
:retry_times
|
7
|
+
:retry_times => 2,
|
8
8
|
:query_timeout => 5,
|
9
|
-
:dnssec
|
10
|
-
:do_caching
|
9
|
+
:dnssec => false,
|
10
|
+
:do_caching => false
|
11
11
|
}.freeze
|
12
12
|
PUBLIC_NAMESERVERS = %w(
|
13
13
|
8.8.8.8
|
@@ -43,16 +43,16 @@ module GitHubPages
|
|
43
43
|
self.class.default_resolver
|
44
44
|
when :authoritative
|
45
45
|
Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(
|
46
|
-
|
47
|
-
|
46
|
+
:nameservers => authoritative_nameservers
|
47
|
+
))
|
48
48
|
when :public
|
49
49
|
Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(
|
50
|
-
|
51
|
-
|
50
|
+
:nameservers => PUBLIC_NAMESERVERS
|
51
|
+
))
|
52
52
|
when Array
|
53
53
|
Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge(
|
54
|
-
|
55
|
-
|
54
|
+
:nameservers => nameservers
|
55
|
+
))
|
56
56
|
else
|
57
57
|
raise "Invalid nameserver type: #{nameservers.inspect}"
|
58
58
|
end
|
data/script/cibuild
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
: ${RUBY_VERSION:="2.7"}
|
4
|
+
docker build -t github-pages-health-check --build-arg RUBY_VERSION=$RUBY_VERSION .
|
5
|
+
if [ -n "$DEBUG" ]; then
|
6
|
+
# Run a shell.
|
7
|
+
docker run -it --rm -v $(pwd):/app/github-pages-health-check github-pages-health-check
|
8
|
+
else
|
9
|
+
# Run CI
|
10
|
+
docker run --rm github-pages-health-check script/cibuild --profile --fail-fast
|
11
|
+
fi
|
data/script/test
CHANGED
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.
|
4
|
+
version: 1.17.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -56,16 +56,22 @@ dependencies:
|
|
56
56
|
name: public_suffix
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.0.2
|
62
|
+
- - "<"
|
60
63
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
64
|
+
version: '5.0'
|
62
65
|
type: :runtime
|
63
66
|
prerelease: false
|
64
67
|
version_requirements: !ruby/object:Gem::Requirement
|
65
68
|
requirements:
|
66
|
-
- - "
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 2.0.2
|
72
|
+
- - "<"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
74
|
+
version: '5.0'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: typhoeus
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,100 +86,21 @@ dependencies:
|
|
80
86
|
- - "~>"
|
81
87
|
- !ruby/object:Gem::Version
|
82
88
|
version: '1.3'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: dotenv
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1.0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1.0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: gem-release
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0.7'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0.7'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: pry
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0.10'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0.10'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rspec
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '3.0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '3.0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rubocop
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0.52'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0.52'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: webmock
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - "~>"
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '1.21'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - "~>"
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '1.21'
|
167
89
|
description: Checks your GitHub Pages site for commons DNS configuration issues.
|
168
90
|
email: support@github.com
|
169
91
|
executables: []
|
170
92
|
extensions: []
|
171
93
|
extra_rdoc_files: []
|
172
94
|
files:
|
95
|
+
- ".dockerignore"
|
96
|
+
- ".github/dependabot.yml"
|
97
|
+
- ".github/workflows/push-cibuild.yml"
|
173
98
|
- ".gitignore"
|
174
99
|
- ".rspec"
|
175
100
|
- ".rubocop.yml"
|
101
|
+
- ".ruby-version"
|
176
102
|
- ".travis.yml"
|
103
|
+
- Dockerfile
|
177
104
|
- Gemfile
|
178
105
|
- LICENSE.md
|
179
106
|
- README.md
|
@@ -209,6 +136,7 @@ files:
|
|
209
136
|
- script/check
|
210
137
|
- script/check-cdn-ips
|
211
138
|
- script/cibuild
|
139
|
+
- script/cibuild-docker
|
212
140
|
- script/console
|
213
141
|
- script/fmt
|
214
142
|
- script/release
|
@@ -233,8 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
161
|
- !ruby/object:Gem::Version
|
234
162
|
version: '0'
|
235
163
|
requirements: []
|
236
|
-
|
237
|
-
rubygems_version: 2.7.6
|
164
|
+
rubygems_version: 3.1.2
|
238
165
|
signing_key:
|
239
166
|
specification_version: 4
|
240
167
|
summary: Checks your GitHub Pages site for commons DNS configuration issues
|