jm81-ruby-whois 0.5.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.
- data/LICENSE +1020 -0
- data/README +4 -0
- data/Rakefile +43 -0
- data/VERSION +1 -0
- data/lib/whois.rb +9 -0
- data/lib/whois/domain.rb +18 -0
- data/lib/whois/domain/aero.rb +27 -0
- data/lib/whois/domain/afilias.rb +26 -0
- data/lib/whois/domain/base.rb +114 -0
- data/lib/whois/domain/cat.rb +30 -0
- data/lib/whois/domain/coop.rb +31 -0
- data/lib/whois/domain/educause.rb +51 -0
- data/lib/whois/domain/gov.rb +35 -0
- data/lib/whois/domain/int.rb +41 -0
- data/lib/whois/domain/mobi.rb +26 -0
- data/lib/whois/domain/museum.rb +28 -0
- data/lib/whois/domain/name.rb +36 -0
- data/lib/whois/domain/neustar.rb +42 -0
- data/lib/whois/domain/pro.rb +32 -0
- data/lib/whois/domain/public_interest.rb +25 -0
- data/lib/whois/domain/verisign_grs.rb +36 -0
- data/lib/whois/domain/ws.rb +58 -0
- data/ruby-whois.gemspec +95 -0
- data/test/test_helper.rb +59 -0
- data/test/whois/domain/aero_test.rb +24 -0
- data/test/whois/domain/afilias_test.rb +24 -0
- data/test/whois/domain/cat_test.rb +28 -0
- data/test/whois/domain/coop_test.rb +28 -0
- data/test/whois/domain/educause_test.rb +24 -0
- data/test/whois/domain/gov_test.rb +28 -0
- data/test/whois/domain/int_test.rb +24 -0
- data/test/whois/domain/mobi_test.rb +24 -0
- data/test/whois/domain/museum_test.rb +28 -0
- data/test/whois/domain/name_test.rb +24 -0
- data/test/whois/domain/neustar_test.rb +134 -0
- data/test/whois/domain/pro_test.rb +27 -0
- data/test/whois/domain/public_interest_test.rb +75 -0
- data/test/whois/domain/verisign_grs_test.rb +90 -0
- data/test/whois/domain/ws_test.rb +24 -0
- data/test/whois/domain_test.rb +15 -0
- metadata +110 -0
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'rubygems'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'jeweler'
|
8
|
+
Jeweler::Tasks.new do |gem|
|
9
|
+
gem.name = "ruby-whois"
|
10
|
+
gem.summary = %Q{Ruby library for accessing Whois information}
|
11
|
+
gem.email = "jmorgan@morgancreative.net"
|
12
|
+
gem.homepage = "http://github.com/jm81/ruby-whois"
|
13
|
+
gem.authors = ["Jared Morgan"]
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Default: run unit tests.'
|
22
|
+
task :default => :test
|
23
|
+
|
24
|
+
desc 'Test the whois gem.'
|
25
|
+
Rake::TestTask.new(:test) do |t|
|
26
|
+
t.libs << 'lib' << 'test'
|
27
|
+
t.pattern = 'test/**/*_test.rb'
|
28
|
+
t.verbose = true
|
29
|
+
end
|
30
|
+
|
31
|
+
Rake::RDocTask.new do |rdoc|
|
32
|
+
if File.exist?('VERSION')
|
33
|
+
version = File.read('VERSION')
|
34
|
+
else
|
35
|
+
version = ""
|
36
|
+
end
|
37
|
+
|
38
|
+
rdoc.rdoc_dir = 'rdoc'
|
39
|
+
rdoc.title = 'Whois #{version}'
|
40
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
41
|
+
rdoc.rdoc_files.include('README*')
|
42
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
43
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.5.0
|
data/lib/whois.rb
ADDED
data/lib/whois/domain.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Whois::Domain
|
2
|
+
@@tlds = {}
|
3
|
+
|
4
|
+
def self.tlds
|
5
|
+
@@tlds
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.new(domain_name)
|
9
|
+
tld = domain_name.match(/.*\.([^\.]+)$/)[1].to_sym
|
10
|
+
class_name = @@tlds.find{|c, tlds_ary| tlds_ary.include?(tld)}[0]
|
11
|
+
const_get(class_name).new(domain_name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'whois/domain/base.rb'
|
16
|
+
Dir.new(File.dirname(__FILE__) + '/domain').each do |file|
|
17
|
+
require('whois/domain/' + File.basename(file)) if File.extname(file) == ".rb"
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Whois::Domain::Aero < Whois::Domain::Base
|
2
|
+
HOST = "whois.aero"
|
3
|
+
ATTR_MATCH = /^([^:]+):(\S.*)\r$/
|
4
|
+
responds_to :aero
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Sponsoring Registrar",
|
8
|
+
:created_on => "Created On",
|
9
|
+
:updated_on => "Updated On",
|
10
|
+
:expires_on => "Expires On",
|
11
|
+
:status => "Domain Status"
|
12
|
+
}
|
13
|
+
|
14
|
+
# I couldn't find any database updated information for .org
|
15
|
+
def database_updated_at
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
# No whois server listed for .org domains, so always return the whois server used here.
|
20
|
+
def whois_server
|
21
|
+
HOST
|
22
|
+
end
|
23
|
+
|
24
|
+
def available?
|
25
|
+
@raw =~ /NOT FOUND/
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Whois::Domain::Afilias < Whois::Domain::Base
|
2
|
+
HOST = "whois.afilias.net"
|
3
|
+
ATTR_MATCH = /^([^:]+):(\S.*)\r$/
|
4
|
+
responds_to :info
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Sponsoring Registrar",
|
8
|
+
:created_on => "Created On",
|
9
|
+
:updated_on => "Last Updated On",
|
10
|
+
:expires_on => "Expiration Date"
|
11
|
+
}
|
12
|
+
|
13
|
+
# I couldn't find any database updated information for .org
|
14
|
+
def database_updated_at
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# No whois server listed for .org domains, so always return the whois server used here.
|
19
|
+
def whois_server
|
20
|
+
HOST
|
21
|
+
end
|
22
|
+
|
23
|
+
def available?
|
24
|
+
@raw =~ /NOT FOUND/
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
class Whois::Domain::Base
|
2
|
+
attr_reader :name, :raw
|
3
|
+
|
4
|
+
ATTR_NAMES = {
|
5
|
+
:registrar_name => "Registrar",
|
6
|
+
:created_on => "Creation Date",
|
7
|
+
:updated_on => "Updated Date",
|
8
|
+
:expires_on => "Expiration Date",
|
9
|
+
:status => "Status",
|
10
|
+
:name_servers => "Name Server",
|
11
|
+
:whois_server => "Whois Server"
|
12
|
+
}
|
13
|
+
|
14
|
+
def self.responds_to(*ary)
|
15
|
+
Whois::Domain::tlds[self.name.split(":").last] = ary
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(name)
|
19
|
+
@name = name
|
20
|
+
query
|
21
|
+
end
|
22
|
+
|
23
|
+
def host
|
24
|
+
self.class::HOST
|
25
|
+
end
|
26
|
+
|
27
|
+
def attr_names
|
28
|
+
@attr_names ||= ATTR_NAMES.merge(self.class::ATTR_NAMES)
|
29
|
+
end
|
30
|
+
|
31
|
+
# based on Michael Neumann's library
|
32
|
+
def query
|
33
|
+
s = TCPsocket.open(host, 43)
|
34
|
+
s.write("#{@name}\n")
|
35
|
+
ret = ""
|
36
|
+
while s.gets do ret += $_ end
|
37
|
+
s.close
|
38
|
+
@raw = ret
|
39
|
+
end
|
40
|
+
|
41
|
+
# based on Michael Neumann's library
|
42
|
+
def attrs
|
43
|
+
return @attrs if @attrs
|
44
|
+
|
45
|
+
actual_object = {}
|
46
|
+
raw.each do |i|
|
47
|
+
if i =~ self.class::ATTR_MATCH
|
48
|
+
if actual_object.has_key? $1 then
|
49
|
+
actual_object[$1] << $2
|
50
|
+
else
|
51
|
+
actual_object[$1] = [$2]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
@attrs = actual_object
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
s = ""
|
60
|
+
raw.each do |i|
|
61
|
+
if i =~ self.class::ATTR_MATCH
|
62
|
+
s << "#{$1}: #{$2}\n"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
s
|
66
|
+
end
|
67
|
+
|
68
|
+
def attr_single(attr_name)
|
69
|
+
attrs[attr_names[attr_name]] ? attrs[attr_names[attr_name]][0] : nil
|
70
|
+
end
|
71
|
+
|
72
|
+
%w{registrar_name whois_server}.each do |method_name|
|
73
|
+
define_method method_name do
|
74
|
+
attr_single(method_name.to_sym)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def attr_date(attr_name)
|
79
|
+
attrs[attr_names[attr_name]] ? Date.parse(attrs[attr_names[attr_name]][0]) : nil
|
80
|
+
end
|
81
|
+
|
82
|
+
%w{created_on updated_on expires_on}.each do |method_name|
|
83
|
+
define_method method_name do
|
84
|
+
attr_date(method_name.to_sym)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def attr_array(attr_name)
|
89
|
+
attrs[attr_names[attr_name]] || []
|
90
|
+
end
|
91
|
+
|
92
|
+
%w{status name_servers}.each do |method_name|
|
93
|
+
define_method method_name do
|
94
|
+
attr_array(method_name.to_sym)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def ns
|
99
|
+
name_servers
|
100
|
+
end
|
101
|
+
|
102
|
+
def expired?
|
103
|
+
expires_on && (expires_on < Date.today)
|
104
|
+
end
|
105
|
+
|
106
|
+
def registered?
|
107
|
+
!available?
|
108
|
+
end
|
109
|
+
|
110
|
+
# A url for registering this domain.
|
111
|
+
def register_url
|
112
|
+
"https://www.securepaynet.net/gdshop/registrar/search.asp?prog_id=morgancr&domainToCheck=#{name}&checkAvail=1"
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Whois::Domain::Cat < Whois::Domain::Base
|
2
|
+
HOST = "whois.cat"
|
3
|
+
ATTR_MATCH = /^([^:]+):\s(.*)\r$/
|
4
|
+
responds_to :cat
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Registrar ID",
|
8
|
+
:created_on => "Created On",
|
9
|
+
:updated_on => "Last Updated On",
|
10
|
+
:expires_on => "Expiration Date"
|
11
|
+
}
|
12
|
+
|
13
|
+
# I couldn't find any database updated information for .org
|
14
|
+
def database_updated_at
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# No whois server listed for .org domains, so always return the whois server used here.
|
19
|
+
def whois_server
|
20
|
+
HOST
|
21
|
+
end
|
22
|
+
|
23
|
+
def available?
|
24
|
+
@raw =~ /NOT FOUND/
|
25
|
+
end
|
26
|
+
|
27
|
+
def register_url
|
28
|
+
"http://domini.cat/en_registrar.html"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Whois::Domain::Coop < Whois::Domain::Base
|
2
|
+
ATTR_MATCH = /^([^:]+):\s{2,}(.*)\r$/
|
3
|
+
HOST = "whois.nic.coop"
|
4
|
+
responds_to :coop
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Sponsoring registrar",
|
8
|
+
:created_on => "Created",
|
9
|
+
:updated_on => "Last updated",
|
10
|
+
:expires_on => "Expiry Date",
|
11
|
+
:status => "Domain Status",
|
12
|
+
:name_servers => "Host Name"
|
13
|
+
}
|
14
|
+
|
15
|
+
def database_updated_at
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
# No whois server listed for .biz domains, so always return the whois server used here.
|
20
|
+
def whois_server
|
21
|
+
HOST
|
22
|
+
end
|
23
|
+
|
24
|
+
def available?
|
25
|
+
@raw =~ /may be available for purchase/
|
26
|
+
end
|
27
|
+
|
28
|
+
def register_url
|
29
|
+
"http://domains.coop/"
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Whois::Domain::Educause < Whois::Domain::Base
|
2
|
+
HOST = "whois.educause.edu"
|
3
|
+
ATTR_MATCH = /^([^:]+):\s+(.*)$/
|
4
|
+
responds_to :edu
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:created_on => "Domain record activated",
|
8
|
+
:updated_on => "Domain record last updated",
|
9
|
+
:expires_on => "Domain expires"
|
10
|
+
}
|
11
|
+
|
12
|
+
def database_updated_at
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def whois_server
|
17
|
+
HOST
|
18
|
+
end
|
19
|
+
|
20
|
+
# Educause is the only registrar for .edu
|
21
|
+
def registrar_name
|
22
|
+
"Educause"
|
23
|
+
end
|
24
|
+
|
25
|
+
def available?
|
26
|
+
@raw =~ /^No Match/
|
27
|
+
end
|
28
|
+
|
29
|
+
def name_servers
|
30
|
+
found = false
|
31
|
+
ns_ary = []
|
32
|
+
@raw.each_line do |l|
|
33
|
+
if l =~ /^Name Servers:/
|
34
|
+
found = true
|
35
|
+
elsif found && l =~ /^\s+(\S+)/
|
36
|
+
ns_ary << $1
|
37
|
+
elsif found && l.strip.empty?
|
38
|
+
return ns_ary
|
39
|
+
end
|
40
|
+
end
|
41
|
+
ns_ary
|
42
|
+
end
|
43
|
+
|
44
|
+
def ns
|
45
|
+
name_servers
|
46
|
+
end
|
47
|
+
|
48
|
+
def register_url
|
49
|
+
"http://www.educause.edu/edudomain"
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# All I know how to get so far is domain name and status.
|
2
|
+
# There is a web interface at http://www.dotgov.gov/whois.aspx
|
3
|
+
# with more detail.
|
4
|
+
class Whois::Domain::Gov < Whois::Domain::Base
|
5
|
+
HOST = "whois.nic.gov"
|
6
|
+
ATTR_MATCH = /^([^:]+):\s(.*)\r$/
|
7
|
+
responds_to :gov
|
8
|
+
|
9
|
+
ATTR_NAMES = {
|
10
|
+
}
|
11
|
+
|
12
|
+
def database_updated_at
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def whois_server
|
17
|
+
HOST
|
18
|
+
end
|
19
|
+
|
20
|
+
def available?
|
21
|
+
@raw !~ /Domain Name:/
|
22
|
+
end
|
23
|
+
|
24
|
+
def register_url
|
25
|
+
"http://www.dotgov.gov/help_how.aspx"
|
26
|
+
end
|
27
|
+
|
28
|
+
def name_servers
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
|
32
|
+
def ns
|
33
|
+
[]
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Whois::Domain::Int < Whois::Domain::Base
|
2
|
+
HOST = "whois.iana.org"
|
3
|
+
ATTR_MATCH = /^\s{0,4}([^:]+):\s+(\S.*)\r$/
|
4
|
+
responds_to :int
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Sponsoring Registrar",
|
8
|
+
:created_on => "Registration Date",
|
9
|
+
:updated_on => "Last Updated Date",
|
10
|
+
:name_servers => "Nameserver"
|
11
|
+
}
|
12
|
+
|
13
|
+
def database_updated_at
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def whois_server
|
18
|
+
HOST
|
19
|
+
end
|
20
|
+
|
21
|
+
def registrar_name
|
22
|
+
".int Domain Registry (IANA)"
|
23
|
+
end
|
24
|
+
|
25
|
+
def available?
|
26
|
+
@raw =~ /not found/
|
27
|
+
end
|
28
|
+
|
29
|
+
def created_on
|
30
|
+
Date.parse(attrs["Registration Date"][-1])
|
31
|
+
end
|
32
|
+
|
33
|
+
def updated_on
|
34
|
+
Date.parse(attrs["Last Updated Date"][-1])
|
35
|
+
end
|
36
|
+
|
37
|
+
def name_servers
|
38
|
+
# Remove trailing dot.
|
39
|
+
super.collect{ |ns| ns[0..-2] }
|
40
|
+
end
|
41
|
+
end
|