github-pages-health-check 1.1.2 → 1.2.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
  SHA1:
3
- metadata.gz: ac5d338582ae0432d783ad6e2ce77e87d1954c16
4
- data.tar.gz: c91280a688eab7f1bfc1f916546edfb43171a436
3
+ metadata.gz: 55c8b9311f05c9c89c57e74f4e47700964f97b16
4
+ data.tar.gz: 7bf75965fb566b0bd9c6a5945cb073bea18a6fdc
5
5
  SHA512:
6
- metadata.gz: 8bf0a5e6b95798219f6d89553e6fd2ff01219242fe8a89f12476fa234289737f664fd1d0b599f099c071aa6c692d186db7884d7bd12acc5dd52925151c8e4ba4
7
- data.tar.gz: 4af63470b8f55dcaf48126cdac6543cd9f1a88d2c38c9f8c571116184fbf508d5ed4ce29877a6b39d608b05a9f8bd0c33c4ebea7556057a73d702d897c23931e
6
+ metadata.gz: 611f792db12ab0f8ea674a4368c2300126340a0da1a2d4d6c0e8974ac07b498a0d488d01b1ecd193c314b473357836b25743daa6f538ffd71be3462aca7b2806
7
+ data.tar.gz: af8a4e34b798af708a3df0cbe8dafaa5d49e7b987ba9e1ac846d1f215ce278f5f37d2f34c0e71dacfa22e5d8cf0366b8b3bd6675a87a9271c31d0a7a1c16fcb4
@@ -0,0 +1,14 @@
1
+ 23.235.32.0/20
2
+ 43.249.72.0/22
3
+ 103.244.50.0/24
4
+ 103.245.222.0/23
5
+ 103.245.224.0/24
6
+ 104.156.80.0/20
7
+ 151.101.0.0/16
8
+ 157.52.64.0/18
9
+ 172.111.64.0/18
10
+ 185.31.16.0/22
11
+ 199.27.72.0/21
12
+ 199.232.0.0/16
13
+ 202.21.128.0/24
14
+ 203.57.145.0/24
@@ -19,7 +19,9 @@ end
19
19
  module GitHubPages
20
20
  module HealthCheck
21
21
 
22
- autoload :CloudFlare, "github-pages-health-check/cloudflare"
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"
23
25
  autoload :Error, "github-pages-health-check/error"
24
26
  autoload :Errors, "github-pages-health-check/errors"
25
27
  autoload :Checkable, "github-pages-health-check/checkable"
@@ -1,22 +1,23 @@
1
1
  module GitHubPages
2
2
  module HealthCheck
3
- class CloudFlare
3
+ class CDN
4
4
  include Singleton
5
5
 
6
6
  # Internal: The path of the config file.
7
- attr_reader :path
7
+ attr_reader :name, :path
8
8
 
9
9
  # Public: Does cloudflare control this address?
10
10
  def self.controls_ip?(address)
11
11
  instance.controls_ip?(address)
12
12
  end
13
13
 
14
- # Internal: Create a new cloudflare info instance.
14
+ # Internal: Create a new CDN info instance.
15
15
  def initialize(options = {})
16
+ @name = options.fetch(:name) { self.class.name.split("::").last.downcase }
16
17
  @path = options.fetch(:path) { default_config_path }
17
18
  end
18
19
 
19
- # Internal: Does cloudflare control this address?
20
+ # Internal: Does this CDN control this address?
20
21
  def controls_ip?(address)
21
22
  ranges.any? { |range| range.include?(address) }
22
23
  end
@@ -34,7 +35,7 @@ module GitHubPages
34
35
  end
35
36
 
36
37
  def default_config_path
37
- File.expand_path("../../config/cloudflare-ips.txt", File.dirname(__FILE__))
38
+ File.expand_path("../../config/#{name}-ips.txt", File.dirname(__FILE__))
38
39
  end
39
40
  end
40
41
  end
@@ -0,0 +1,8 @@
1
+ module GitHubPages
2
+ module HealthCheck
3
+ # Instance of the CloudFlare CDN for checking IP ownership
4
+ # Specifically not namespaced to avoid a breaking change
5
+ class CloudFlare < CDN
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module GitHubPages
2
+ module HealthCheck
3
+ # Instance of the Fastly CDN for checking IP ownership
4
+ # Specifically not namespaced to avoid a breaking change
5
+ class Fastly < CDN
6
+ end
7
+ end
8
+ end
@@ -4,10 +4,14 @@ module GitHubPages
4
4
 
5
5
  attr_reader :host
6
6
 
7
- LEGACY_IP_ADDRESSES = %w[
8
- 207.97.227.245
9
- 204.232.175.78
10
- 199.27.73.133
7
+ LEGACY_IP_ADDRESSES = [
8
+ # Legacy GitHub Datacenter
9
+ "207.97.227.245",
10
+ "204.232.175.78",
11
+
12
+ # Legacy Fastly Datacenter
13
+ "199.27.73.133",
14
+ "199.27.76.133"
11
15
  ].freeze
12
16
 
13
17
  CURRENT_IP_ADDRESSES = %w[
@@ -16,7 +20,7 @@ module GitHubPages
16
20
  ].freeze
17
21
 
18
22
  HASH_METHODS = [
19
- :host, :uri, :dns_resolves?, :proxied?, :cloudflare_ip?,
23
+ :host, :uri, :dns_resolves?, :proxied?, :cloudflare_ip?, :fastly_ip?,
20
24
  :old_ip_address?, :a_record?, :cname_record?, :valid_domain?,
21
25
  :apex_domain?, :should_be_a_record?, :cname_to_github_user_domain?,
22
26
  :cname_to_pages_dot_github_dot_com?, :cname_to_fastly?,
@@ -36,8 +40,8 @@ module GitHubPages
36
40
  def check!
37
41
  raise Errors::InvalidDomainError.new(domain: self) unless valid_domain?
38
42
  raise Errors::InvalidDNSError.new(domain: self) unless dns_resolves?
39
- return true if proxied?
40
43
  raise Errors::DeprecatedIPError.new(domain: self) if deprecated_ip?
44
+ return true if proxied?
41
45
  raise Errors::InvalidARecordError.new(domain: self) if invalid_a_record?
42
46
  raise Errors::InvalidCNAMEError.new(domain: self) if invalid_cname?
43
47
  raise Errors::NotServedByPagesError.new(domain: self) unless served_by_pages?
@@ -138,10 +142,12 @@ module GitHubPages
138
142
 
139
143
  # Does the domain resolve to a CloudFlare-owned IP
140
144
  def cloudflare_ip?
141
- return unless dns?
142
- dns.all? do |answer|
143
- answer.class == Net::DNS::RR::A && CloudFlare.controls_ip?(answer.address)
144
- end
145
+ cdn_ip?(CloudFlare)
146
+ end
147
+
148
+ # Does the domain resolve to a Fastly-owned IP
149
+ def fastly_ip?
150
+ cdn_ip?(Fastly)
145
151
  end
146
152
 
147
153
  # Does this non-GitHub-pages domain proxy a GitHub Pages site?
@@ -154,7 +160,7 @@ module GitHubPages
154
160
  return unless dns?
155
161
  return true if cloudflare_ip?
156
162
  return false if pointed_to_github_pages_ip? || cname_to_github_user_domain?
157
- return false if cname_to_pages_dot_github_dot_com? || cname_to_fastly?
163
+ return false if cname_to_pages_dot_github_dot_com? || cname_to_fastly? || fastly_ip?
158
164
  served_by_pages?
159
165
  end
160
166
 
@@ -268,6 +274,14 @@ module GitHubPages
268
274
  def scheme
269
275
  @scheme ||= github_domain? ? "https" : "http"
270
276
  end
277
+
278
+ # Does the domain resolve to a CDN-owned IP
279
+ def cdn_ip?(cdn)
280
+ return unless dns?
281
+ dns.all? do |answer|
282
+ answer.class == Net::DNS::RR::A && cdn.controls_ip?(answer.address)
283
+ end
284
+ end
271
285
  end
272
286
  end
273
287
  end
@@ -33,6 +33,10 @@ module GitHubPages
33
33
  end
34
34
  alias_method :message_formatted, :message_with_url
35
35
 
36
+ def to_s
37
+ "#{message_with_url} (#{self.class.name.split('::').last})".gsub("\n", " ").squeeze(" ").strip
38
+ end
39
+
36
40
  private
37
41
 
38
42
  def username
@@ -1,5 +1,5 @@
1
1
  module GitHubPages
2
2
  module HealthCheck
3
- VERSION = "1.1.2"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
@@ -0,0 +1,20 @@
1
+ #!/bin/bash -e
2
+
3
+ script/update-cdn-ips >/dev/null 2>&1
4
+ files=( cloudflare fastly)
5
+
6
+ # `git diff --quiet` suppresses output and sets a return code
7
+ # 0 - no changes
8
+ # 1 - changes
9
+ for file in "${files[@]}"
10
+ do
11
+ if git diff -w --quiet --cached "config/$file-ips.txt"
12
+ then
13
+ echo "$file IP list is up-to-date."
14
+ else
15
+ echo git reset "config/$file-ips.txt"
16
+ git reset --quiet "config/$file-ips.txt"
17
+ echo "*** $file IP list is out of date! Run script/update-cdn-ips!"
18
+ exit 1
19
+ fi
20
+ done
data/script/cibuild CHANGED
@@ -5,5 +5,5 @@ set -ex
5
5
  script/bootstrap
6
6
 
7
7
  script/test
8
- script/check-cloudflare-ips
8
+ script/check-cdn-ips
9
9
  bundle exec gem build github-pages-health-check.gemspec
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ #/ Usage script/update-ips
3
+ #/ updates config/cloudflare-ips.txt and config/fastly-ips.txt
4
+
5
+ require 'open-uri'
6
+ require 'json'
7
+
8
+ SOURCES = {
9
+ cloudflare: "https://www.cloudflare.com/ips-v4",
10
+ fastly: "https://api.fastly.com/public-ip-list"
11
+ }
12
+
13
+ SOURCES.each do |source, url|
14
+ file = "config/#{source}-ips.txt"
15
+ puts "Fetching #{url}..."
16
+ data = open(url).read
17
+ data = JSON.parse(data)["addresses"].join("\n") if source == :fastly
18
+ File.write(file, data)
19
+ `git add --verbose #{file}`
20
+ 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.1.2
4
+ version: 1.2.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: 2016-05-12 00:00:00.000000000 Z
11
+ date: 2016-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-dns
@@ -164,10 +164,13 @@ files:
164
164
  - LICENSE.md
165
165
  - README.md
166
166
  - config/cloudflare-ips.txt
167
+ - config/fastly-ips.txt
167
168
  - github-pages-health-check.gemspec
168
169
  - lib/github-pages-health-check.rb
170
+ - lib/github-pages-health-check/cdn.rb
171
+ - lib/github-pages-health-check/cdns/cloudflare.rb
172
+ - lib/github-pages-health-check/cdns/fastly.rb
169
173
  - lib/github-pages-health-check/checkable.rb
170
- - lib/github-pages-health-check/cloudflare.rb
171
174
  - lib/github-pages-health-check/domain.rb
172
175
  - lib/github-pages-health-check/error.rb
173
176
  - lib/github-pages-health-check/errors.rb
@@ -186,12 +189,12 @@ files:
186
189
  - lib/github-pages-health-check/version.rb
187
190
  - script/bootstrap
188
191
  - script/check
189
- - script/check-cloudflare-ips
192
+ - script/check-cdn-ips
190
193
  - script/cibuild
191
194
  - script/console
192
195
  - script/release
193
196
  - script/test
194
- - script/update-cloudflare-ips
197
+ - script/update-cdn-ips
195
198
  homepage: https://github.com/github/github-pages-health-check
196
199
  licenses:
197
200
  - MIT
@@ -212,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
215
  version: '0'
213
216
  requirements: []
214
217
  rubyforge_project:
215
- rubygems_version: 2.6.2
218
+ rubygems_version: 2.2.5
216
219
  signing_key:
217
220
  specification_version: 4
218
221
  summary: Checks your GitHub Pages site for commons DNS configuration issues
@@ -1,17 +0,0 @@
1
- #!/bin/bash -e
2
-
3
- script/update-cloudflare-ips >/dev/null 2>&1
4
-
5
- # `git diff --quiet` suppresses output and sets a return code
6
- # 0 - no changes
7
- # 1 - changes
8
- if git diff -w --quiet --cached config/cloudflare-ips.txt
9
- then
10
- echo CloudFlare IP list is up-to-date.
11
- exit 0
12
- else
13
- echo git reset config/cloudflare-ips.txt
14
- git reset --quiet config/cloudflare-ips.txt
15
- echo '*** CloudFlare IP list is out of date! Run script/update-cloudflare-ips!'
16
- exit 1
17
- fi
@@ -1,14 +0,0 @@
1
- #!/bin/bash -e
2
- #/ Usage script/update-cloudflare-ips
3
- #/ updates config/cloudflare-ips.txt
4
-
5
- source=https://www.cloudflare.com/ips-v4
6
- dest=config/cloudflare-ips.txt
7
-
8
- echo '====>' Downloading $source
9
- curl --silent --fail $source | tee $dest
10
- echo # cover for a missing newline
11
-
12
- echo '====>' git add $dest
13
- git diff -w $dest
14
- git add --verbose $dest