github-pages-health-check 1.1.2 → 1.2.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
  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