dns-check 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ .rbenv-gemsets
2
+ db/*
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,64 @@
1
+ #dns-check
2
+
3
+ CLI base DNS check propagation tool
4
+
5
+ ### Note
6
+
7
+ * While the tool works - it was hacked in an hour or so with the only purpose in mind to get some work done. That being said, there are still a couple of TODO/FIXME lurking in the code and likely a couple of refactoring needed... and of course, some test units. I am releasing it in the hope it is useful to someone else.
8
+
9
+ * The upstream json feed contains sometimes empty records for city and country - NN is used for specified "No Name"
10
+
11
+ ## Getting started
12
+
13
+ * gem install dns-check
14
+ * dns-check --update
15
+
16
+ ## Usage
17
+ Usage: dns-check [options] [domain]
18
+
19
+ Options:
20
+ -l, --location [name] Location can either be a country or city
21
+ -t, --timeout [sec] DNS Query timeout (Default: 5s)
22
+ --records [size] Number of nameservers to select (default: 10)
23
+ --show-ns Show nameservers
24
+ --update Perform indice update
25
+ --debug
26
+ -v, --version Show version
27
+ -h, -?, --help Show this message
28
+
29
+ ### Examples
30
+ <br>
31
+
32
+ $ dns-check google.com --records 5
33
+ Hong Kong/Central District|74.125.128.100
34
+ Taiwan/NN|74.125.31.138
35
+ Saudi Arabia/NN|173.194.35.96
36
+ Afghanistan/NN|173.194.72.139
37
+ Guatemala/El Salvador|74.125.137.139
38
+
39
+
40
+ $ dns-check google.com --location Berlin --show-ns<br>
41
+ Berlin|173.194.70.101|194.77.8.1
42
+ Berlin|173.194.70.138|alhazred.hsd.de
43
+ Berlin|173.194.70.113|192.166.192.2
44
+
45
+
46
+ $ dns-check google.com --records 5 --location US --show-ns
47
+ Longmont|74.125.225.195|209.97.224.3
48
+ Burlington|74.125.226.228|64.17.101.12
49
+ Romney|74.125.140.138|resolve01.rmny.wv.frontiernet.net
50
+ Deerfield Beach|74.125.229.238|216.242.0.15
51
+ North Attleboro|173.194.34.102|207.180.2.6
52
+
53
+
54
+ $ dns-check google.com --records 5 --location US
55
+ El Paso|173.194.46.5
56
+ Atlanta|74.125.228.34
57
+ Greenville|74.125.227.128
58
+ Newark|74.125.228.64
59
+ Baltimore|74.125.228.34
60
+
61
+
62
+ $ dns-check google.com --records 2 --location Atlanta --show-ns
63
+ Atlanta|173.194.37.67|ns.echina.com
64
+ Atlanta|74.125.137.100|64.94.1.1
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #-*- encoding: utf-8 -*-
3
+ #
4
+
5
+ STDOUT.sync = true
6
+
7
+ $PROG_PATH = File.expand_path(File.dirname(__FILE__) + '/..')
8
+ $LOAD_PATH.unshift($PROG_PATH + '/lib') if File.directory?($PROG_PATH + '/lib') && !$LOAD_PATH.include?($PROG_PATH + '/lib')
9
+
10
+ require 'dns-check'
11
+
12
+ begin
13
+ DNSCheck::CLI.instance.run
14
+ rescue => e
15
+ raise e if $DEBUG
16
+ STDERR.puts e.message
17
+ STDERR.puts e.backtrace.join("\n") if $DEBUG
18
+ end
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+
5
+ require 'dns-check/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "dns-check"
9
+ gem.version = DNSCheck::VERSION
10
+ gem.authors = "Ali Abbas"
11
+ gem.email = "ali@alouche.net"
12
+ gem.description = "CLI based DNS propagation check tool"
13
+ gem.summary = "Allows you to query a bunch of random nameservers, filter per countries, cities to check the propagation of your domain or simply make sure that your geo load balancing is working"
14
+ gem.homepage = "https://github.com/alouche/dns-check"
15
+ gem.add_dependency('ipaddress')
16
+ gem.add_dependency('public_suffix')
17
+ gem.add_dependency('eventmachine')
18
+ gem.add_dependency('em-resolv-replace')
19
+ gem.add_development_dependency('rspec')
20
+
21
+ gem.files = `git ls-files`.split($/)
22
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
23
+ gem.test_files = gem.files.grep(%r{^(test|spec)/})
24
+ gem.require_paths = ["lib"]
25
+ end
@@ -0,0 +1,27 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'uri'
4
+ require 'json'
5
+ require 'time'
6
+
7
+ require 'dns-check/ext'
8
+ require 'dns-check/version'
9
+ require 'dns-check/errors'
10
+ require 'dns-check/util'
11
+ require 'dns-check/cli'
12
+
13
+ module DNSCheck extend self
14
+ def config
15
+ @config ||={
16
+ :timeout => 1,
17
+ :indice_location => URI.parse('http://public-dns.tk/nameservers.json'),
18
+ :indice_store => "#{$PROG_PATH}/db/indice",
19
+ :show_ns => false,
20
+ :size => 10
21
+ }
22
+ end
23
+
24
+ def config=(opts)
25
+ @config = opts
26
+ end
27
+ end
@@ -0,0 +1,99 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'optparse'
4
+ require 'singleton'
5
+
6
+ require 'dns-check/db'
7
+ require 'dns-check/update'
8
+ require 'dns-check/node'
9
+
10
+ module DNSCheck
11
+ class CLI
12
+ include Singleton
13
+
14
+ attr_reader :args
15
+
16
+ def initialize
17
+ super
18
+ @args = ARGV
19
+ end
20
+
21
+ def run
22
+ config.merge!(parse_options)
23
+ DNSCheck::Node.start
24
+ end
25
+
26
+ private
27
+
28
+ def config
29
+ DNSCheck.config
30
+ end
31
+
32
+ def update!
33
+ DNSCheck.indice_location = config[:indice_location]
34
+ DNSCheck.indice_store = config[:indice_store]
35
+ DNSCheck.update!
36
+ exit 0
37
+ end
38
+
39
+ def parse_options
40
+ opts = {}
41
+
42
+ parser = OptionParser.new do |o|
43
+ o.separator ''
44
+ o.separator 'Options:'
45
+
46
+ o.on '-l', '--location [name]', String, 'Location can either be a country or city' do |loc|
47
+ opts[:location] = loc
48
+ end
49
+
50
+ o.on '-t', '--timeout [sec]', Integer, 'DNS Query timeout (Default: 5s)' do |sec|
51
+ opts[:timeout] = sec
52
+ end
53
+
54
+ o.on '--records [size]', Integer, 'Number of nameservers to select (default: 10)' do |size|
55
+ opts[:size] = size
56
+ end
57
+
58
+ o.on '--show-ns', 'Show nameservers' do
59
+ opts[:show_ns] = true
60
+ end
61
+
62
+ o.on '--update', 'Perform indice update' do
63
+ update!
64
+ end
65
+
66
+ o.on '--debug' do
67
+ $DEBUG = true
68
+ end
69
+
70
+ o.on_tail '-v', '--version', 'Show version' do
71
+ puts DNSCheck::VERSION
72
+ exit 0
73
+ end
74
+ end
75
+
76
+ parser.banner = 'Usage: dns-check [options] [domain]'
77
+ parser.on_tail '-h', '-?', '--help', 'Show this message' do
78
+ puts parser
79
+ exit 0
80
+ end
81
+
82
+ parser.parse!(@args)
83
+
84
+ if @args.empty?
85
+ puts parser
86
+ exit 0
87
+ end
88
+
89
+ opts[:hostname] = @args[0]
90
+ opts
91
+ end
92
+ end
93
+
94
+ trap("SIGINT") {
95
+ EM.stop if EM.reactor_running?
96
+
97
+ exit 0
98
+ }
99
+ end
@@ -0,0 +1,101 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'ipaddress'
4
+ require 'public_suffix'
5
+
6
+ module DNSCheck
7
+ module Core
8
+ def __init options, filter={}
9
+ is_hostname_sane? options[:hostname]
10
+ indice_file_exist? options[:indice_store]
11
+
12
+ indice_records = load_indice(options[:indice_store], options[:location])
13
+
14
+ select_random_records(options[:size], indice_records)
15
+ end
16
+
17
+ private
18
+
19
+ def is_hostname_sane? hostname
20
+ raise DNSCheck::DomainError, "Specify a correct domain name format!"\
21
+ if IPAddress.valid? hostname\
22
+ or (Float(hostname) != nil rescue false)\
23
+ or !PublicSuffix.valid? hostname
24
+ end
25
+
26
+ def indice_file_exist? indice_file
27
+ raise DNSCheck::IndiceMissing, "Download the indice by issuing dns-check --update"\
28
+ unless File.exist?(indice_file)
29
+ end
30
+
31
+ def is_location_city? location_filter
32
+ return location_filter.resolve_country_name if location_filter.size > 2
33
+
34
+ #FIXME String#capitalize_all needs to be fixed
35
+ #to not allow FR to become Fr
36
+ return location_filter.upcase
37
+ end
38
+
39
+ def load_indice indice_file, location_filter=nil
40
+ records = DNSCheck.load indice_file
41
+
42
+ unless location_filter.nil?
43
+ location_filter = location_filter.capitalize_all
44
+
45
+ location = is_location_city? location_filter
46
+
47
+ filtered_records = []
48
+
49
+ #FIXME clean up procedure (duplicate push call)
50
+ unless location.nil?
51
+ # This will also catch unexisting cities, return general error
52
+ raise DNSCheck::LocationError, "This location could not be found"\
53
+ unless records.has_key?(location)
54
+
55
+ records = records[location]
56
+ records.each do |record|
57
+ filtered_records.push([record])
58
+ end
59
+ else
60
+ records.values.each do |record|
61
+ record.each do |k|
62
+ if k.include?(location_filter)
63
+ filtered_records.push([k])
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ return DNSCheck::DB[filtered_records]
70
+ end
71
+
72
+ records
73
+ rescue => e
74
+ raise DNSCheck::IndiceLoading, e.message
75
+ end
76
+
77
+ #FIXME break method
78
+ def select_random_records(max_records, indice_records)
79
+ records = []
80
+
81
+ sliced_records = indice_records.rand_keys.slice(0..max_records-1)
82
+
83
+ sliced_records.each do |k|
84
+ if k.class == String
85
+ v = indice_records[k].sample.flatten
86
+ v.push(k)
87
+ else
88
+ v = k.flatten
89
+ end
90
+
91
+ v[1].delete_if {|x|
92
+ x == nil || x == ""
93
+ }
94
+
95
+ records.push(v)
96
+ end
97
+
98
+ records
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,66 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'forwardable'
4
+
5
+ module DNSCheck
6
+ class DB
7
+
8
+ extend Forwardable
9
+
10
+ include Enumerable
11
+
12
+ def_delegators :@Records
13
+
14
+ def initialize
15
+ super
16
+ @Records = Hash.new { |hash, key|
17
+ hash[key] = []
18
+ }
19
+ end
20
+
21
+ def self.[](*args)
22
+ db = new
23
+ db.instance_variable_set(:@Records, Hash[*args])
24
+ db
25
+ end
26
+
27
+ def [](key)
28
+ @Records[key]
29
+ end
30
+
31
+ def update k
32
+ @Records[k] = yield(@Records[k])
33
+ end
34
+
35
+ def add(k, v)
36
+ update(k) do |hash|
37
+ hash << v
38
+ end
39
+ end
40
+ alias_method :[]=, :add
41
+
42
+ # Can't marshal hash with default proc
43
+ def dump_all
44
+ return @Records unless @Records.default_proc
45
+ records = @Records.clone
46
+ records.default = nil
47
+ records
48
+ end
49
+
50
+ def keys
51
+ @Records.keys
52
+ end
53
+
54
+ def values
55
+ @Records.values
56
+ end
57
+
58
+ def has_key? k
59
+ @Records[k] ? true : false
60
+ end
61
+
62
+ def rand_keys
63
+ self.keys.sort_by{rand}
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,32 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'timeout'
4
+ require 'em-resolv-replace'
5
+
6
+ module DNSCheck
7
+ module DNS
8
+
9
+ def timeout= sec
10
+ @timeout = sec
11
+ end
12
+
13
+ def nameservers= ns
14
+ @query = Resolv::DNS.new(
15
+ :nameserver => ns,
16
+ :ndots => 1
17
+ )
18
+ end
19
+
20
+ def lookup hostname
21
+ Timeout::timeout(@timeout) do
22
+ @query.getaddress(hostname).to_s.colorize_to('green')
23
+ end
24
+ rescue Timeout::Error
25
+ "Nameserver Timeout".colorize_to('red')
26
+ rescue => e
27
+ e.message.colorize_to('red')
28
+ end
29
+ end
30
+
31
+ extend DNS
32
+ end
@@ -0,0 +1,17 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ module DNSCheck
4
+ class Error < StandardError; end
5
+
6
+ class NotFoundError < RuntimeError; end
7
+
8
+ class IndiceMissing < Error; end
9
+
10
+ class IndiceLoading < Error; end
11
+
12
+ class DomainError < Error; end
13
+
14
+ class LocationError < Error; end
15
+
16
+ class UpdateError < Error; end
17
+ end
@@ -0,0 +1,31 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ class String
4
+
5
+ def capitalize_all
6
+ self.split(' ').map do |word|
7
+ word.capitalize
8
+ end.join(' ')
9
+ end
10
+
11
+ def resolve_country_code
12
+ DNSCheck::COUNTRY_CODES[self] || self
13
+ end
14
+
15
+ def resolve_country_name
16
+ DNSCheck::COUNTRY_CODES.invert[self]
17
+ end
18
+
19
+ def colorize_to(color_name)
20
+ case color_name
21
+ when 'red'
22
+ color_code = 31
23
+ when 'green'
24
+ color_code = 32
25
+ else
26
+ color_code = 33
27
+ end
28
+
29
+ "\e[#{color_code}m#{self}\e[0m"
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'eventmachine'
4
+ require 'dns-check/output'
5
+ require 'dns-check/dns'
6
+ require 'dns-check/core'
7
+
8
+ module DNSCheck
9
+ module Node extend Core
10
+
11
+ def start
12
+ @records = __init(DNSCheck.config)
13
+ resolv_all
14
+ end
15
+
16
+ def resolv
17
+ DNSCheck
18
+ end
19
+
20
+ def hostname
21
+ DNSCheck.config[:hostname]
22
+ end
23
+
24
+ def timeout
25
+ DNSCheck.config[:timeout]
26
+ end
27
+
28
+ def output
29
+ output ||= Output.new
30
+ end
31
+
32
+ def resolv_all
33
+ resolv.timeout = timeout
34
+
35
+ EM.run do
36
+ Fiber.new do
37
+ @records.each do |e, ns, c|
38
+ resolv.nameservers = ns
39
+
40
+ resolved_ip = resolv.lookup(hostname)
41
+
42
+ output_msg = [e, resolved_ip, ns.sample, c]
43
+
44
+ output.insert do
45
+ output.print_msg output_msg
46
+ end
47
+ end
48
+ EM.stop
49
+ end.resume
50
+ end
51
+ end
52
+
53
+ extend self
54
+ end
55
+ end
@@ -0,0 +1,43 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'stringio'
4
+
5
+ module DNSCheck
6
+ class Output
7
+ def initialize; end
8
+
9
+ def print_msg msg
10
+ pretty_print msg
11
+ end
12
+
13
+ def insert(*msg)
14
+ $stdout = StringIO.new
15
+
16
+ yield
17
+
18
+ unless $stdout.string.empty?
19
+ STDOUT.print $stdout.string
20
+ STDOUT.flush
21
+ end
22
+ ensure
23
+ $stdout = STDOUT
24
+ end
25
+
26
+ def pretty_print msg
27
+ msg[0] = "NN" if msg[0].empty?
28
+
29
+ #FIXME redundant, catch nil instead of has_key
30
+ if msg[3] && COUNTRY_CODES.has_key?(msg[3])
31
+ #FIXME cheap workaround around frozen string
32
+ msg[0] = msg[0].dup
33
+ msg[0].prepend(COUNTRY_CODES[msg[3]] + '/')
34
+ end
35
+
36
+ print msg[0] + "|" + msg[1]
37
+
38
+ print "|" + msg[2] if DNSCheck.config[:show_ns]
39
+
40
+ print "\n"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,80 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'net/http'
4
+
5
+ module DNSCheck
6
+ module Update
7
+ attr_accessor :indice_location, :indice_store
8
+
9
+ def update!
10
+ print "-> downloading... (please wait)"
11
+
12
+ http do |conn|
13
+ request = Net::HTTP::Get.new(indice_location.request_uri, {})
14
+
15
+ buffer = ''
16
+
17
+ conn.request request do |res|
18
+ case res
19
+ when Net::HTTPNotModified
20
+ puts "No new content available"
21
+ when Net::HTTPRedirection
22
+ # Do not expect a redirect...
23
+ puts "Redirecting to #{res['Location']}... aborting! open a github issue"
24
+ when Net::HTTPOK
25
+ begin
26
+ res.read_body do |buf|
27
+ buffer << buf
28
+ end
29
+ save buffer
30
+ rescue Exception => e
31
+ raise e
32
+ ensure
33
+ #TODO clean exit?
34
+ end
35
+ when Net::HTTPNotFound
36
+ raise DNSCheck::NotFoundError, "http code 404 - open a github issue"
37
+ else
38
+ raise RuntimeError, "Update failed... #{res.message}"
39
+ end
40
+ end
41
+ end
42
+ rescue => e
43
+ raise DNSCheck::UpdateError, "the indice update failed... #{e.message}"
44
+ end
45
+
46
+ private
47
+
48
+ def save buffer
49
+ object = sanetize_indice buffer
50
+ DNSCheck.store object, indice_store
51
+ end
52
+
53
+ def http
54
+ yield Net::HTTP.new(indice_location.hostname, 80)
55
+ end
56
+
57
+ def sanetize_indice buffer
58
+ indice_records = JSON.parse(buffer)
59
+ # Create new array, faster than calling Array#delete on indice_records
60
+ new_indice_records = DNSCheck::DB.new
61
+
62
+ indice_records.each do |record|
63
+ if record['state'] == "valid" and !record['country_id'].nil?
64
+ new_indice_records[record['country_id']] = {
65
+ record['city'] => [
66
+ record['ip'],
67
+ record['name']
68
+ ]
69
+ }
70
+ end
71
+ end
72
+ print " - done\n";
73
+ return new_indice_records
74
+ rescue => e
75
+ #TODO raise exception, i.e: upstream key format changed!
76
+ end
77
+ end
78
+
79
+ extend Update
80
+ end
@@ -0,0 +1,266 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ require 'zlib'
4
+
5
+ module DNSCheck
6
+
7
+ COUNTRY_CODES = {
8
+ 'AF'=>'Afghanistan',
9
+ 'AL'=>'Albania',
10
+ 'DZ'=>'Algeria',
11
+ 'AS'=>'American Samoa',
12
+ 'AD'=>'Andorra',
13
+ 'AO'=>'Angola',
14
+ 'AI'=>'Anguilla',
15
+ 'AQ'=>'Antarctica',
16
+ 'AG'=>'Antigua And Barbuda',
17
+ 'AR'=>'Argentina',
18
+ 'AM'=>'Armenia',
19
+ 'AW'=>'Aruba',
20
+ 'AU'=>'Australia',
21
+ 'AT'=>'Austria',
22
+ 'AZ'=>'Azerbaijan',
23
+ 'BS'=>'Bahamas',
24
+ 'BH'=>'Bahrain',
25
+ 'BD'=>'Bangladesh',
26
+ 'BB'=>'Barbados',
27
+ 'BY'=>'Belarus',
28
+ 'BE'=>'Belgium',
29
+ 'BZ'=>'Belize',
30
+ 'BJ'=>'Benin',
31
+ 'BM'=>'Bermuda',
32
+ 'BT'=>'Bhutan',
33
+ 'BO'=>'Bolivia',
34
+ 'BA'=>'Bosnia And Herzegovina',
35
+ 'BW'=>'Botswana',
36
+ 'BV'=>'Bouvet Island',
37
+ 'BR'=>'Brazil',
38
+ 'IO'=>'British Indian Ocean Territory',
39
+ 'BN'=>'Brunei',
40
+ 'BG'=>'Bulgaria',
41
+ 'BF'=>'Burkina Faso',
42
+ 'BI'=>'Burundi',
43
+ 'KH'=>'Cambodia',
44
+ 'CM'=>'Cameroon',
45
+ 'CA'=>'Canada',
46
+ 'CV'=>'Cape Verde',
47
+ 'KY'=>'Cayman Islands',
48
+ 'CF'=>'Central African Republic',
49
+ 'TD'=>'Chad',
50
+ 'CL'=>'Chile',
51
+ 'CN'=>'China',
52
+ 'CX'=>'Christmas Island',
53
+ 'CC'=>'Cocos (Keeling) Islands',
54
+ 'CO'=>'Columbia',
55
+ 'KM'=>'Comoros',
56
+ 'CG'=>'Congo',
57
+ 'CK'=>'Cook Islands',
58
+ 'CR'=>'Costa Rica',
59
+ 'CI'=>'Cote D\'Ivorie (Ivory Coast)',
60
+ 'HR'=>'Croatia (Hrvatska)',
61
+ 'CU'=>'Cuba',
62
+ 'CY'=>'Cyprus',
63
+ 'CZ'=>'Czech Republic',
64
+ 'CD'=>'Democratic Republic Of Congo (Zaire)',
65
+ 'DK'=>'Denmark',
66
+ 'DJ'=>'Djibouti',
67
+ 'DM'=>'Dominica',
68
+ 'DO'=>'Dominican Republic',
69
+ 'TP'=>'East Timor',
70
+ 'EC'=>'Ecuador',
71
+ 'EG'=>'Egypt',
72
+ 'SV'=>'El Salvador',
73
+ 'GQ'=>'Equatorial Guinea',
74
+ 'ER'=>'Eritrea',
75
+ 'EE'=>'Estonia',
76
+ 'ET'=>'Ethiopia',
77
+ 'FK'=>'Falkland Islands (Malvinas)',
78
+ 'FO'=>'Faroe Islands',
79
+ 'FJ'=>'Fiji',
80
+ 'FI'=>'Finland',
81
+ 'FR'=>'France',
82
+ 'FX'=>'France, Metropolitan',
83
+ 'GF'=>'French Guinea',
84
+ 'PF'=>'French Polynesia',
85
+ 'TF'=>'French Southern Territories',
86
+ 'GA'=>'Gabon',
87
+ 'GM'=>'Gambia',
88
+ 'GE'=>'Georgia',
89
+ 'DE'=>'Germany',
90
+ 'GH'=>'Ghana',
91
+ 'GI'=>'Gibraltar',
92
+ 'GR'=>'Greece',
93
+ 'GL'=>'Greenland',
94
+ 'GD'=>'Grenada',
95
+ 'GP'=>'Guadeloupe',
96
+ 'GU'=>'Guam',
97
+ 'GT'=>'Guatemala',
98
+ 'GN'=>'Guinea',
99
+ 'GW'=>'Guinea-Bissau',
100
+ 'GY'=>'Guyana',
101
+ 'HT'=>'Haiti',
102
+ 'HM'=>'Heard And McDonald Islands',
103
+ 'HN'=>'Honduras',
104
+ 'HK'=>'Hong Kong',
105
+ 'HU'=>'Hungary',
106
+ 'IS'=>'Iceland',
107
+ 'IN'=>'India',
108
+ 'ID'=>'Indonesia',
109
+ 'IR'=>'Iran',
110
+ 'IQ'=>'Iraq',
111
+ 'IE'=>'Ireland',
112
+ 'IL'=>'Israel',
113
+ 'IT'=>'Italy',
114
+ 'JM'=>'Jamaica',
115
+ 'JP'=>'Japan',
116
+ 'JO'=>'Jordan',
117
+ 'KZ'=>'Kazakhstan',
118
+ 'KE'=>'Kenya',
119
+ 'KI'=>'Kiribati',
120
+ 'KW'=>'Kuwait',
121
+ 'KG'=>'Kyrgyzstan',
122
+ 'LA'=>'Laos',
123
+ 'LV'=>'Latvia',
124
+ 'LB'=>'Lebanon',
125
+ 'LS'=>'Lesotho',
126
+ 'LR'=>'Liberia',
127
+ 'LY'=>'Libya',
128
+ 'LI'=>'Liechtenstein',
129
+ 'LT'=>'Lithuania',
130
+ 'LU'=>'Luxembourg',
131
+ 'MO'=>'Macau',
132
+ 'MK'=>'Macedonia',
133
+ 'MG'=>'Madagascar',
134
+ 'MW'=>'Malawi',
135
+ 'MY'=>'Malaysia',
136
+ 'MV'=>'Maldives',
137
+ 'ML'=>'Mali',
138
+ 'MT'=>'Malta',
139
+ 'MH'=>'Marshall Islands',
140
+ 'MQ'=>'Martinique',
141
+ 'MR'=>'Mauritania',
142
+ 'MU'=>'Mauritius',
143
+ 'YT'=>'Mayotte',
144
+ 'MX'=>'Mexico',
145
+ 'FM'=>'Micronesia',
146
+ 'MD'=>'Moldova',
147
+ 'MC'=>'Monaco',
148
+ 'MN'=>'Mongolia',
149
+ 'MS'=>'Montserrat',
150
+ 'MA'=>'Morocco',
151
+ 'MZ'=>'Mozambique',
152
+ 'MM'=>'Myanmar (Burma)',
153
+ 'NA'=>'Namibia',
154
+ 'NR'=>'Nauru',
155
+ 'NP'=>'Nepal',
156
+ 'NL'=>'Netherlands',
157
+ 'AN'=>'Netherlands Antilles',
158
+ 'NC'=>'New Caledonia',
159
+ 'NZ'=>'New Zealand',
160
+ 'NI'=>'Nicaragua',
161
+ 'NE'=>'Niger',
162
+ 'NG'=>'Nigeria',
163
+ 'NU'=>'Niue',
164
+ 'NF'=>'Norfolk Island',
165
+ 'KP'=>'North Korea',
166
+ 'MP'=>'Northern Mariana Islands',
167
+ 'NO'=>'Norway',
168
+ 'OM'=>'Oman',
169
+ 'PK'=>'Pakistan',
170
+ 'PW'=>'Palau',
171
+ 'PA'=>'Panama',
172
+ 'PG'=>'Papua New Guinea',
173
+ 'PY'=>'Paraguay',
174
+ 'PE'=>'Peru',
175
+ 'PH'=>'Philippines',
176
+ 'PN'=>'Pitcairn',
177
+ 'PL'=>'Poland',
178
+ 'PT'=>'Portugal',
179
+ 'PR'=>'Puerto Rico',
180
+ 'QA'=>'Qatar',
181
+ 'RE'=>'Reunion',
182
+ 'RO'=>'Romania',
183
+ 'RU'=>'Russia',
184
+ 'RW'=>'Rwanda',
185
+ 'SH'=>'Saint Helena',
186
+ 'KN'=>'Saint Kitts And Nevis',
187
+ 'LC'=>'Saint Lucia',
188
+ 'PM'=>'Saint Pierre And Miquelon',
189
+ 'VC'=>'Saint Vincent And The Grenadines',
190
+ 'SM'=>'San Marino',
191
+ 'ST'=>'Sao Tome And Principe',
192
+ 'SA'=>'Saudi Arabia',
193
+ 'SN'=>'Senegal',
194
+ 'SC'=>'Seychelles',
195
+ 'SL'=>'Sierra Leone',
196
+ 'SG'=>'Singapore',
197
+ 'SK'=>'Slovak Republic',
198
+ 'SI'=>'Slovenia',
199
+ 'SB'=>'Solomon Islands',
200
+ 'SO'=>'Somalia',
201
+ 'ZA'=>'South Africa',
202
+ 'GS'=>'South Georgia And South Sandwich Islands',
203
+ 'KR'=>'South Korea',
204
+ 'ES'=>'Spain',
205
+ 'LK'=>'Sri Lanka',
206
+ 'SD'=>'Sudan',
207
+ 'SR'=>'Suriname',
208
+ 'SJ'=>'Svalbard And Jan Mayen',
209
+ 'SZ'=>'Swaziland',
210
+ 'SE'=>'Sweden',
211
+ 'CH'=>'Switzerland',
212
+ 'SY'=>'Syria',
213
+ 'TW'=>'Taiwan',
214
+ 'TJ'=>'Tajikistan',
215
+ 'TZ'=>'Tanzania',
216
+ 'TH'=>'Thailand',
217
+ 'TG'=>'Togo',
218
+ 'TK'=>'Tokelau',
219
+ 'TO'=>'Tonga',
220
+ 'TT'=>'Trinidad And Tobago',
221
+ 'TN'=>'Tunisia',
222
+ 'TR'=>'Turkey',
223
+ 'TM'=>'Turkmenistan',
224
+ 'TC'=>'Turks And Caicos Islands',
225
+ 'TV'=>'Tuvalu',
226
+ 'UG'=>'Uganda',
227
+ 'UA'=>'Ukraine',
228
+ 'AE'=>'United Arab Emirates',
229
+ 'UK'=>'United Kingdom',
230
+ 'US'=>'United States',
231
+ 'UM'=>'United States Minor Outlying Islands',
232
+ 'UY'=>'Uruguay',
233
+ 'UZ'=>'Uzbekistan',
234
+ 'VU'=>'Vanuatu',
235
+ 'VA'=>'Vatican City (Holy See)',
236
+ 'VE'=>'Venezuela',
237
+ 'VN'=>'Vietnam',
238
+ 'VG'=>'Virgin Islands (British)',
239
+ 'VI'=>'Virgin Islands (US)',
240
+ 'WF'=>'Wallis And Futuna Islands',
241
+ 'EH'=>'Western Sahara',
242
+ 'WS'=>'Western Samoa',
243
+ 'YE'=>'Yemen',
244
+ 'YU'=>'Yugoslavia',
245
+ 'ZM'=>'Zambia',
246
+ 'ZW'=>'Zimbabwe'
247
+ }
248
+
249
+ def self.store obj, file_name
250
+ marshal_dump = Marshal.dump(obj.dump_all)
251
+ file = File.new(file_name,'w')
252
+ file = Zlib::GzipWriter.new(file)
253
+ file.write marshal_dump
254
+ file.close
255
+ return true
256
+ rescue => e
257
+ raise DNSCheck::UpdateError, e.message
258
+ end
259
+
260
+ def self.load file_name
261
+ file = Zlib::GzipReader.open(file_name)
262
+ obj = Marshal.load file.read
263
+ file.close
264
+ DNSCheck::DB[obj]
265
+ end
266
+ end
@@ -0,0 +1,5 @@
1
+ #-*- encoding: utf-8 -*-
2
+
3
+ module DNSCheck
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dns-check
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ali Abbas
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ipaddress
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: public_suffix
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: eventmachine
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: em-resolv-replace
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: CLI based DNS propagation check tool
95
+ email: ali@alouche.net
96
+ executables:
97
+ - dns-check
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - Gemfile
103
+ - README.md
104
+ - Rakefile
105
+ - bin/dns-check
106
+ - db/.gitignore
107
+ - dns-check.gemspec
108
+ - lib/dns-check.rb
109
+ - lib/dns-check/cli.rb
110
+ - lib/dns-check/core.rb
111
+ - lib/dns-check/db.rb
112
+ - lib/dns-check/dns.rb
113
+ - lib/dns-check/errors.rb
114
+ - lib/dns-check/ext.rb
115
+ - lib/dns-check/node.rb
116
+ - lib/dns-check/output.rb
117
+ - lib/dns-check/update.rb
118
+ - lib/dns-check/util.rb
119
+ - lib/dns-check/version.rb
120
+ homepage: https://github.com/alouche/dns-check
121
+ licenses: []
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 1.8.23
141
+ signing_key:
142
+ specification_version: 3
143
+ summary: Allows you to query a bunch of random nameservers, filter per countries,
144
+ cities to check the propagation of your domain or simply make sure that your geo
145
+ load balancing is working
146
+ test_files: []