github-pages-health-check 1.17.1 → 1.17.8

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: e269d0849d9754d658dde60478ee1bb1a87913fd6e10cc79cc6cab834b899946
4
- data.tar.gz: 83a05c02f53f262c02bcd7d1bf00801b7860fa878c32251fc24006f5dcf454ad
3
+ metadata.gz: b93b42aca0a60b8bd7d5df583585ec14e09c171077bf389e0d53699e935a344c
4
+ data.tar.gz: 9616ee04e0a5c2e80e2a1f32b66e401a39f98f31ba30317ffcb8e98c810994ca
5
5
  SHA512:
6
- metadata.gz: 765bb285569e16d11123448b7a2bfcc31c6317293dab5b5a64c6f8af2c9925f5e000b9885273fb1b8c1b42b6db94340dde7292f7227c46b528e56ae0631916ab
7
- data.tar.gz: ff8e0af41eb9e43bbe126a969a66fc6ebe704ed196f6a8d2230572ddb52ccfd089af823ddaf016600d117d343ce589f4e492c2b5148926d1c1eae83444900163
6
+ metadata.gz: 911c9d7e94f6a943a6789bc701b7bdf3ff1aa74b4ed0083d18304b40e903b0056175ea5c8990b1ef091156543cf651efcb3a38d80b7bb6721725b1b40c87ade1
7
+ data.tar.gz: 5dbcdd645e5f05c758126c1ce6dda0338a41ae6404f152ef18de7e2b6b37308446dd5b06cbf4f154d57a0c5eca87a1623debe3760aada69639b9d85193de6298
@@ -10,6 +10,7 @@ jobs:
10
10
  - 2.5
11
11
  - 2.6
12
12
  - 2.7
13
+ - 3.0
13
14
  steps:
14
15
  - uses: actions/checkout@master
15
16
  - name: script/cibuild-docker
data/Gemfile CHANGED
@@ -6,6 +6,7 @@ group :development do
6
6
  gem "dotenv", "~> 2.7"
7
7
  gem "gem-release", "~> 2.1"
8
8
  gem "pry", "~> 0.10"
9
+ gem "pry-byebug"
9
10
  gem "rspec", "~> 3.0"
10
11
  gem "rubocop", "~> 0.52"
11
12
  gem "webmock", "~> 3.8"
data/README.md CHANGED
@@ -81,3 +81,40 @@ check = GitHubPages::HealthCheck::Site.new "github/pages-health-check", access_t
81
81
  ```
82
82
 
83
83
  You can also set `OCTOKIT_ACCESS_TOKEN` as an environmental variable, or via a `.env` file in your working directory.
84
+
85
+ ### Command Line
86
+
87
+ ```
88
+ ./script/check pages.github.com
89
+
90
+ host: pages.github.com
91
+ uri: https://pages.github.com/
92
+ nameservers: :default
93
+ dns_resolves?: true
94
+ proxied?: false
95
+ cloudflare_ip?: false
96
+ fastly_ip?: false
97
+ old_ip_address?: false
98
+ a_record?: false
99
+ cname_record?: true
100
+ mx_records_present?: false
101
+ valid_domain?: true
102
+ apex_domain?: false
103
+ should_be_a_record?: false
104
+ cname_to_github_user_domain?: true
105
+ cname_to_pages_dot_github_dot_com?: false
106
+ cname_to_fastly?: false
107
+ pointed_to_github_pages_ip?: false
108
+ non_github_pages_ip_present?: false
109
+ pages_domain?: true
110
+ served_by_pages?: true
111
+ valid?: true
112
+ reason:
113
+ https?: true
114
+ enforces_https?: true
115
+ https_error:
116
+ https_eligible?: true
117
+ caa_error:
118
+ dns_zone_soa?: false
119
+ dns_zone_ns?: false
120
+ ```
@@ -9,7 +9,14 @@
9
9
  197.234.240.0/22
10
10
  198.41.128.0/17
11
11
  162.158.0.0/15
12
- 172.64.0.0/13
13
- 131.0.72.0/22
14
12
  104.16.0.0/13
15
13
  104.24.0.0/14
14
+ 172.64.0.0/13
15
+ 131.0.72.0/22
16
+ 2400:cb00::/32
17
+ 2606:4700::/32
18
+ 2803:f800::/32
19
+ 2405:b500::/32
20
+ 2405:8100::/32
21
+ 2a06:98c0::/29
22
+ 2c0f:f248::/32
@@ -4,7 +4,7 @@
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
+ 146.75.0.0/17
8
8
  151.101.0.0/16
9
9
  157.52.64.0/18
10
10
  167.82.0.0/17
@@ -14,4 +14,6 @@
14
14
  172.111.64.0/18
15
15
  185.31.16.0/22
16
16
  199.27.72.0/21
17
- 199.232.0.0/16
17
+ 199.232.0.0/16
18
+ 2a04:4e40::/32
19
+ 2a04:4e42::/32
@@ -19,6 +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", ">= 2.0.2", "< 5.0")
22
+ s.add_dependency("public_suffix", ">= 3.0", "< 5.0")
23
23
  s.add_dependency("typhoeus", "~> 1.3")
24
24
  end
@@ -77,15 +77,25 @@ module GitHubPages
77
77
  185.199.111.153
78
78
  ).freeze
79
79
 
80
+ CURRENT_IPV6_ADDRESSES = %w(
81
+ 2606:50c0:8000::153
82
+ 2606:50c0:8001::153
83
+ 2606:50c0:8002::153
84
+ 2606:50c0:8003::153
85
+ ).freeze
86
+
87
+ CURRENT_IP_ADDRESSES_ALL =
88
+ (CURRENT_IP_ADDRESSES + CURRENT_IPV6_ADDRESSES).freeze
89
+
80
90
  HASH_METHODS = %i[
81
91
  host uri nameservers dns_resolves? proxied? cloudflare_ip?
82
- fastly_ip? old_ip_address? a_record? cname_record?
83
- mx_records_present? valid_domain? apex_domain? should_be_a_record?
84
- cname_to_github_user_domain? cname_to_pages_dot_github_dot_com?
85
- cname_to_fastly? pointed_to_github_pages_ip?
86
- non_github_pages_ip_present? pages_domain?
92
+ fastly_ip? old_ip_address? a_record? aaaa_record? aaaa_record_present?
93
+ cname_record? mx_records_present? valid_domain? apex_domain?
94
+ should_be_a_record? cname_to_github_user_domain?
95
+ cname_to_pages_dot_github_dot_com? cname_to_fastly?
96
+ pointed_to_github_pages_ip? non_github_pages_ip_present? pages_domain?
87
97
  served_by_pages? valid? reason valid_domain? https?
88
- enforces_https? https_error https_eligible? caa_error
98
+ enforces_https? https_error https_eligible? caa_error dns_zone_soa? dns_zone_ns?
89
99
  ].freeze
90
100
 
91
101
  def self.redundant(host)
@@ -128,8 +138,8 @@ module GitHubPages
128
138
  def invalid_aaaa_record?
129
139
  return @invalid_aaaa_record if defined? @invalid_aaaa_record
130
140
 
131
- @invalid_aaaa_record = (valid_domain? && should_be_a_record? &&
132
- aaaa_record_present?)
141
+ @invalid_aaaa_record =
142
+ (valid_domain? && aaaa_record_present? && !should_be_a_record?)
133
143
  end
134
144
 
135
145
  def invalid_a_record?
@@ -164,7 +174,10 @@ module GitHubPages
164
174
  # Is this domain an apex domain, meaning a CNAME would be innapropriate
165
175
  def apex_domain?
166
176
  return @apex_domain if defined?(@apex_domain)
167
- return unless valid_domain?
177
+
178
+ return false unless valid_domain?
179
+
180
+ return true if dns_zone_soa? && dns_zone_ns?
168
181
 
169
182
  # PublicSuffix.domain pulls out the apex-level domain name.
170
183
  # E.g. PublicSuffix.domain("techblog.netflix.com") # => "netflix.com"
@@ -177,6 +190,30 @@ module GitHubPages
177
190
  :ignore_private => true) == unicode_host
178
191
  end
179
192
 
193
+ #
194
+ # Does the domain have an associated SOA record?
195
+ #
196
+ def dns_zone_soa?
197
+ return @soa_records if defined?(@soa_records)
198
+ return false unless dns?
199
+
200
+ @soa_records = dns.any? do |answer|
201
+ answer.type == Dnsruby::Types::SOA && answer.name.to_s == host
202
+ end
203
+ end
204
+
205
+ #
206
+ # Does the domain have assoicated NS records?
207
+ #
208
+ def dns_zone_ns?
209
+ return @ns_records if defined?(@ns_records)
210
+ return false unless dns?
211
+
212
+ @ns_records = dns.any? do |answer|
213
+ answer.type == Dnsruby::Types::NS && answer.name.to_s == host
214
+ end
215
+ end
216
+
180
217
  # Should the domain use an A record?
181
218
  def should_be_a_record?
182
219
  !pages_io_domain? && (apex_domain? || mx_records_present?)
@@ -186,20 +223,20 @@ module GitHubPages
186
223
  !should_be_a_record?
187
224
  end
188
225
 
189
- # Is the domain's first response an A record to a valid GitHub Pages IP?
226
+ # Is the domain's first response an A or AAAA record to a valid GitHub Pages IP?
190
227
  def pointed_to_github_pages_ip?
191
- a_record? && CURRENT_IP_ADDRESSES.include?(dns.first.address.to_s)
228
+ return false unless address_record?
229
+
230
+ CURRENT_IP_ADDRESSES_ALL.include?(dns.first.address.to_s.downcase)
192
231
  end
193
232
 
194
- # Are any of the domain's A records pointing elsewhere?
233
+ # Are any of the domain's A or AAAA records pointing elsewhere?
195
234
  def non_github_pages_ip_present?
196
235
  return unless dns?
197
236
 
198
- a_records = dns.select { |answer| answer.type == Dnsruby::Types::A }
199
-
200
- a_records.any? { |answer| !github_pages_ip?(answer.address.to_s) }
201
-
202
- false
237
+ dns
238
+ .select { |a| Dnsruby::Types::A == a.type || Dnsruby::Types::AAAA == a.type }
239
+ .any? { |a| !github_pages_ip?(a.address.to_s) }
203
240
  end
204
241
 
205
242
  # Is the domain's first response a CNAME to a pages domain?
@@ -278,7 +315,9 @@ module GitHubPages
278
315
  Dnsruby::Types::A,
279
316
  Dnsruby::Types::AAAA,
280
317
  Dnsruby::Types::CNAME,
281
- Dnsruby::Types::MX
318
+ Dnsruby::Types::MX,
319
+ Dnsruby::Types::NS,
320
+ Dnsruby::Types::SOA
282
321
  ].freeze
283
322
 
284
323
  # Returns an array of DNS answers
@@ -316,9 +355,18 @@ module GitHubPages
316
355
 
317
356
  # Is this domain's first response an A record?
318
357
  def a_record?
358
+ return @is_a_record if defined?(@is_a_record)
319
359
  return unless dns?
320
360
 
321
- dns.first.type == Dnsruby::Types::A
361
+ @is_a_record = Dnsruby::Types::A == dns.first.type
362
+ end
363
+
364
+ # Is this domain's first response an AAAA record?
365
+ def aaaa_record?
366
+ return @is_aaaa_record if defined?(@is_aaaa_record)
367
+ return unless dns?
368
+
369
+ @is_aaaa_record = Dnsruby::Types::AAAA == dns.first.type
322
370
  end
323
371
 
324
372
  def aaaa_record_present?
@@ -339,6 +387,8 @@ module GitHubPages
339
387
  # The domain to which this domain's CNAME resolves
340
388
  # Returns nil if the domain is not a CNAME
341
389
  def cname
390
+ return unless dns?
391
+
342
392
  cnames = dns.take_while { |answer| answer.type == Dnsruby::Types::CNAME }
343
393
  return if cnames.empty?
344
394
 
@@ -356,7 +406,6 @@ module GitHubPages
356
406
  return unless dns_resolves?
357
407
 
358
408
  @served_by_pages = begin
359
- return false unless response.mock? || response.return_code == :ok
360
409
  return true if response.headers["Server"] == "GitHub.com"
361
410
 
362
411
  # Typhoeus mangles the case of the header, compare insensitively
@@ -393,8 +442,6 @@ module GitHubPages
393
442
  def https_eligible?
394
443
  # Can't have any IP's which aren't GitHub's present.
395
444
  return false if non_github_pages_ip_present?
396
- # Can't have any AAAA records present
397
- return false if aaaa_record_present?
398
445
  # Must be a CNAME or point to our IPs.
399
446
 
400
447
  # Only check the one domain if a CNAME. Don't check the parent domain.
@@ -406,13 +453,17 @@ module GitHubPages
406
453
 
407
454
  # Any errors querying CAA records
408
455
  def caa_error
409
- return nil unless caa.errored?
456
+ return nil unless caa&.errored?
410
457
 
411
458
  caa.error.class.name
412
459
  end
413
460
 
414
461
  private
415
462
 
463
+ def address_record?
464
+ a_record? || aaaa_record?
465
+ end
466
+
416
467
  def caa
417
468
  @caa ||= GitHubPages::HealthCheck::CAA.new(
418
469
  :host => cname&.host || host,
@@ -487,10 +538,12 @@ module GitHubPages
487
538
  def cdn_ip?(cdn)
488
539
  return unless dns?
489
540
 
490
- a_records = dns.select { |answer| answer.type == Dnsruby::Types::A }
491
- return false if !a_records || a_records.empty?
541
+ address_records = dns.select do |answer|
542
+ Dnsruby::Types::A == answer.type || Dnsruby::Types::AAAA == answer.type
543
+ end
544
+ return false if !address_records || address_records.empty?
492
545
 
493
- a_records.all? do |answer|
546
+ address_records.all? do |answer|
494
547
  cdn.controls_ip?(answer.address)
495
548
  end
496
549
  end
@@ -500,7 +553,7 @@ module GitHubPages
500
553
  end
501
554
 
502
555
  def github_pages_ip?(ip_addr)
503
- CURRENT_IP_ADDRESSES.include?(ip_addr)
556
+ CURRENT_IP_ADDRESSES_ALL.include?(ip_addr&.to_s&.downcase)
504
557
  end
505
558
  end
506
559
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitHubPages
4
4
  module HealthCheck
5
- VERSION = "1.17.1"
5
+ VERSION = "1.17.8"
6
6
  end
7
7
  end
data/script/check CHANGED
@@ -3,6 +3,8 @@
3
3
  #
4
4
  # Usage: script/check [DOMAIN]
5
5
 
6
+ require "rubygems"
7
+ require "bundler/setup"
6
8
  require_relative "../lib/github-pages-health-check"
7
9
 
8
10
  if ARGV.count != 1
@@ -8,15 +8,43 @@ require "open-uri"
8
8
  require "json"
9
9
 
10
10
  SOURCES = {
11
- :cloudflare => "https://www.cloudflare.com/ips-v4",
12
- :fastly => "https://api.fastly.com/public-ip-list"
11
+ :cloudflare => ["https://www.cloudflare.com/ips-v4", "https://www.cloudflare.com/ips-v6"],
12
+ :fastly => ["https://api.fastly.com/public-ip-list"]
13
13
  }.freeze
14
14
 
15
- SOURCES.each do |source, url|
15
+ def parse_fastly(data)
16
+ json_data = JSON.parse(data)
17
+ (json_data["addresses"] + json_data["ipv6_addresses"]).join("\n")
18
+ end
19
+
20
+ def parse_cloudflare(data)
21
+ data
22
+ end
23
+
24
+ def fetch_ips_from_cdn(urls)
25
+ urls.map do |url|
26
+ puts "Fetching #{url}..."
27
+ URI.parse(url).open.read
28
+ end.join("\n")
29
+ end
30
+
31
+ def update_cdn_file(source, data)
16
32
  file = "config/#{source}-ips.txt"
17
- puts "Fetching #{url}..."
18
- data = open(url).read
19
- data = JSON.parse(data)["addresses"].join("\n") if source == :fastly
20
33
  File.write(file, data)
34
+ puts "Writing contents to #{file} and staging changes."
21
35
  `git add --verbose #{file}`
22
36
  end
37
+
38
+ def parse_cdn_response(source, ips)
39
+ send("parse_#{source}", ips)
40
+ end
41
+
42
+ def update_cdn_ips(source, urls)
43
+ ips = fetch_ips_from_cdn(urls)
44
+ data = parse_cdn_response(source, ips)
45
+ update_cdn_file(source, data)
46
+ end
47
+
48
+ SOURCES.each do |source, urls|
49
+ update_cdn_ips(source, urls)
50
+ end
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.17.1
4
+ version: 1.17.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-12 00:00:00.000000000 Z
11
+ date: 2021-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 2.0.2
61
+ version: '3.0'
62
62
  - - "<"
63
63
  - !ruby/object:Gem::Version
64
64
  version: '5.0'
@@ -68,7 +68,7 @@ dependencies:
68
68
  requirements:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
- version: 2.0.2
71
+ version: '3.0'
72
72
  - - "<"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '5.0'
@@ -99,7 +99,6 @@ files:
99
99
  - ".rspec"
100
100
  - ".rubocop.yml"
101
101
  - ".ruby-version"
102
- - ".travis.yml"
103
102
  - Dockerfile
104
103
  - Gemfile
105
104
  - LICENSE.md
@@ -161,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
160
  - !ruby/object:Gem::Version
162
161
  version: '0'
163
162
  requirements: []
164
- rubygems_version: 3.1.2
163
+ rubygems_version: 3.2.9
165
164
  signing_key:
166
165
  specification_version: 4
167
166
  summary: Checks your GitHub Pages site for commons DNS configuration issues
data/.travis.yml DELETED
@@ -1,16 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.5
4
- - 2.6
5
- - 2.7
6
-
7
- before_install:
8
- - gem update --system
9
-
10
- script: "script/cibuild"
11
-
12
- notifications:
13
- email: false
14
-
15
- cache: bundler
16
- sudo: false