jm81-ruby-whois 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,26 @@
|
|
1
|
+
class Whois::Domain::Mobi < Whois::Domain::Base
|
2
|
+
HOST = "whois.dotmobiregistry.net"
|
3
|
+
ATTR_MATCH = /^([^:]+):(\S.*)\r$/
|
4
|
+
responds_to :mobi
|
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,28 @@
|
|
1
|
+
class Whois::Domain::Museum < Whois::Domain::Base
|
2
|
+
HOST = "whois.museum"
|
3
|
+
ATTR_MATCH = /^([^:]+):\s(.*)\r$/
|
4
|
+
responds_to :museum
|
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
|
+
def database_updated_at
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def whois_server
|
18
|
+
HOST
|
19
|
+
end
|
20
|
+
|
21
|
+
def available?
|
22
|
+
@raw =~ /NOT FOUND/
|
23
|
+
end
|
24
|
+
|
25
|
+
def register_url
|
26
|
+
"http://about.museum/register/"
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Whois::Domain::Name < Whois::Domain::Base
|
2
|
+
HOST = "whois.nic.name"
|
3
|
+
ATTR_MATCH = /^([^:]+):\s(.*)\r$/
|
4
|
+
responds_to :name
|
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
|
+
def database_updated_at
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def whois_server
|
19
|
+
HOST
|
20
|
+
end
|
21
|
+
|
22
|
+
def available?
|
23
|
+
@raw =~ /No match/
|
24
|
+
end
|
25
|
+
|
26
|
+
# whois.nic.name uses a query in the format
|
27
|
+
# object = name. e.g. domain = john.smith.name
|
28
|
+
def query
|
29
|
+
s = TCPsocket.open(host, 43)
|
30
|
+
s.write("domain = #{@name}\n")
|
31
|
+
ret = ""
|
32
|
+
while s.gets do ret += $_ end
|
33
|
+
s.close
|
34
|
+
@raw = ret
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Whois::Domain::Neustar < Whois::Domain::Base
|
2
|
+
ATTR_MATCH = /^([^:]+):\s{2,}(.*)$/
|
3
|
+
responds_to :biz, :us, :travel
|
4
|
+
|
5
|
+
ATTR_NAMES = {
|
6
|
+
:registrar_name => "Sponsoring Registrar",
|
7
|
+
:created_on => "Domain Registration Date",
|
8
|
+
:updated_on => "Domain Last Updated Date",
|
9
|
+
:expires_on => "Domain Expiration Date",
|
10
|
+
:status => "Domain Status"
|
11
|
+
}
|
12
|
+
|
13
|
+
def host
|
14
|
+
case @name.match(/.*\.([^\.]+)$/)[1]
|
15
|
+
when 'biz' then 'whois.biz'
|
16
|
+
when 'us' then 'whois.nic.us'
|
17
|
+
when 'travel' then 'whois.nic.travel'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def database_updated_at
|
22
|
+
if(@raw =~ /Whois database was last updated on: ([^<]*)/)
|
23
|
+
Time.parse($1)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def whois_server
|
28
|
+
host
|
29
|
+
end
|
30
|
+
|
31
|
+
def available?
|
32
|
+
@raw =~ /Not found:/
|
33
|
+
end
|
34
|
+
|
35
|
+
def register_url
|
36
|
+
if @name.match(/.*\.([^\.]+)$/)[1] == "travel"
|
37
|
+
"http://www.travel.travel/authenticationframe.htm"
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Whois::Domain::Pro < Whois::Domain::Base
|
2
|
+
HOST = "whois.registrypro.pro"
|
3
|
+
ATTR_MATCH = /^([^:]+):\W*(.*)\r$/
|
4
|
+
responds_to :pro
|
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
|
+
def database_updated_at
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def status
|
18
|
+
attrs["Status"] ? attrs["Status"][0].split(",").collect{|d| d.strip} : nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def whois_server
|
22
|
+
HOST
|
23
|
+
end
|
24
|
+
|
25
|
+
def register_url
|
26
|
+
"http://www.registrypro.pro/partners_findaregistrar.htm"
|
27
|
+
end
|
28
|
+
|
29
|
+
def available?
|
30
|
+
@raw =~ /^No match/
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Whois::Domain::PublicInterest < Whois::Domain::Base
|
2
|
+
HOST = "whois.pir.org"
|
3
|
+
ATTR_MATCH = /^([^:]+):(\S.*)\r$/
|
4
|
+
responds_to :org
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Sponsoring Registrar",
|
8
|
+
:created_on => "Created On",
|
9
|
+
:updated_on => "Last Updated On"
|
10
|
+
}
|
11
|
+
|
12
|
+
# I couldn't find any database updated information for .org
|
13
|
+
def database_updated_at
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# No whois server listed for .org domains, so always return the whois server used here.
|
18
|
+
def whois_server
|
19
|
+
HOST
|
20
|
+
end
|
21
|
+
|
22
|
+
def available?
|
23
|
+
@raw =~ /NOT FOUND/
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Whois::Domain::VerisignGrs < Whois::Domain::Base
|
2
|
+
HOST = "whois.verisign-grs.com"
|
3
|
+
ATTR_MATCH = /^ ([^:]+):\W*(.*)$/
|
4
|
+
responds_to :com, :net, :jobs, :tv
|
5
|
+
|
6
|
+
def host
|
7
|
+
case @name.match(/.*\.([^\.]+)$/)[1]
|
8
|
+
when 'jobs' then "jobswhois.verisign-grs.com"
|
9
|
+
when 'tv' then "tvwhois.verisign-grs.com"
|
10
|
+
else "whois.verisign-grs.com"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# For best results, this use object = name format.
|
15
|
+
# e.g. domain = john.smith.name
|
16
|
+
def query
|
17
|
+
s = TCPsocket.open(host, 43)
|
18
|
+
s.write("domain = #{@name}\n")
|
19
|
+
ret = ""
|
20
|
+
while s.gets do
|
21
|
+
ret += $_
|
22
|
+
end
|
23
|
+
s.close
|
24
|
+
@raw = ret
|
25
|
+
end
|
26
|
+
|
27
|
+
def database_updated_at
|
28
|
+
if(@raw =~ /Last update of whois database: ([^<]*)/)
|
29
|
+
Time.parse($1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def available?
|
34
|
+
@raw =~ /^No match for/
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class Whois::Domain::Ws < Whois::Domain::Base
|
2
|
+
HOST = "whois.website.ws"
|
3
|
+
ATTR_MATCH = /\s*([^:]+):\s+(.*)$/
|
4
|
+
responds_to :ws
|
5
|
+
|
6
|
+
ATTR_NAMES = {
|
7
|
+
:registrar_name => "Registrar Name",
|
8
|
+
:whois_server => "Registrar Whois",
|
9
|
+
:created_on => "Domain created on",
|
10
|
+
:updated_on => "Domain last updated on"
|
11
|
+
}
|
12
|
+
|
13
|
+
def database_updated_at
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def available?
|
18
|
+
@raw =~ /^No match/
|
19
|
+
end
|
20
|
+
|
21
|
+
def name_servers
|
22
|
+
found = false
|
23
|
+
ns_ary = []
|
24
|
+
@raw.each_line do |l|
|
25
|
+
if l =~ /Current Nameservers:/
|
26
|
+
found = true
|
27
|
+
elsif found && l =~ /^\s*(\S+)/
|
28
|
+
ns_ary << $1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
ns_ary
|
32
|
+
end
|
33
|
+
|
34
|
+
def created_on
|
35
|
+
if @raw =~ /Domain Created: (.*)$/
|
36
|
+
Date.parse($1)
|
37
|
+
else
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def updated_on
|
43
|
+
if @raw =~ /Domain Last Updated: (.*)$/
|
44
|
+
Date.parse($1)
|
45
|
+
else
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def expires_on
|
51
|
+
if @raw =~ /Domain Currently Expires: (.*)$/
|
52
|
+
Date.parse($1)
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/ruby-whois.gemspec
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ruby-whois}
|
8
|
+
s.version = "0.5.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jared Morgan"]
|
12
|
+
s.date = %q{2009-09-22}
|
13
|
+
s.email = %q{jmorgan@morgancreative.net}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"LICENSE",
|
16
|
+
"README"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"LICENSE",
|
20
|
+
"README",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"lib/whois.rb",
|
24
|
+
"lib/whois/domain.rb",
|
25
|
+
"lib/whois/domain/aero.rb",
|
26
|
+
"lib/whois/domain/afilias.rb",
|
27
|
+
"lib/whois/domain/base.rb",
|
28
|
+
"lib/whois/domain/cat.rb",
|
29
|
+
"lib/whois/domain/coop.rb",
|
30
|
+
"lib/whois/domain/educause.rb",
|
31
|
+
"lib/whois/domain/gov.rb",
|
32
|
+
"lib/whois/domain/int.rb",
|
33
|
+
"lib/whois/domain/mobi.rb",
|
34
|
+
"lib/whois/domain/museum.rb",
|
35
|
+
"lib/whois/domain/name.rb",
|
36
|
+
"lib/whois/domain/neustar.rb",
|
37
|
+
"lib/whois/domain/pro.rb",
|
38
|
+
"lib/whois/domain/public_interest.rb",
|
39
|
+
"lib/whois/domain/verisign_grs.rb",
|
40
|
+
"lib/whois/domain/ws.rb",
|
41
|
+
"ruby-whois.gemspec",
|
42
|
+
"test/test_helper.rb",
|
43
|
+
"test/whois/domain/aero_test.rb",
|
44
|
+
"test/whois/domain/afilias_test.rb",
|
45
|
+
"test/whois/domain/cat_test.rb",
|
46
|
+
"test/whois/domain/coop_test.rb",
|
47
|
+
"test/whois/domain/educause_test.rb",
|
48
|
+
"test/whois/domain/gov_test.rb",
|
49
|
+
"test/whois/domain/int_test.rb",
|
50
|
+
"test/whois/domain/mobi_test.rb",
|
51
|
+
"test/whois/domain/museum_test.rb",
|
52
|
+
"test/whois/domain/name_test.rb",
|
53
|
+
"test/whois/domain/neustar_test.rb",
|
54
|
+
"test/whois/domain/pro_test.rb",
|
55
|
+
"test/whois/domain/public_interest_test.rb",
|
56
|
+
"test/whois/domain/verisign_grs_test.rb",
|
57
|
+
"test/whois/domain/ws_test.rb",
|
58
|
+
"test/whois/domain_test.rb"
|
59
|
+
]
|
60
|
+
s.has_rdoc = true
|
61
|
+
s.homepage = %q{http://github.com/jm81/ruby-whois}
|
62
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
63
|
+
s.require_paths = ["lib"]
|
64
|
+
s.rubygems_version = %q{1.3.1}
|
65
|
+
s.summary = %q{Ruby library for accessing Whois information}
|
66
|
+
s.test_files = [
|
67
|
+
"test/test_helper.rb",
|
68
|
+
"test/whois/domain/aero_test.rb",
|
69
|
+
"test/whois/domain/afilias_test.rb",
|
70
|
+
"test/whois/domain/cat_test.rb",
|
71
|
+
"test/whois/domain/coop_test.rb",
|
72
|
+
"test/whois/domain/educause_test.rb",
|
73
|
+
"test/whois/domain/gov_test.rb",
|
74
|
+
"test/whois/domain/int_test.rb",
|
75
|
+
"test/whois/domain/mobi_test.rb",
|
76
|
+
"test/whois/domain/museum_test.rb",
|
77
|
+
"test/whois/domain/name_test.rb",
|
78
|
+
"test/whois/domain/neustar_test.rb",
|
79
|
+
"test/whois/domain/pro_test.rb",
|
80
|
+
"test/whois/domain/public_interest_test.rb",
|
81
|
+
"test/whois/domain/verisign_grs_test.rb",
|
82
|
+
"test/whois/domain/ws_test.rb",
|
83
|
+
"test/whois/domain_test.rb"
|
84
|
+
]
|
85
|
+
|
86
|
+
if s.respond_to? :specification_version then
|
87
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
88
|
+
s.specification_version = 2
|
89
|
+
|
90
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
91
|
+
else
|
92
|
+
end
|
93
|
+
else
|
94
|
+
end
|
95
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'whois'
|
3
|
+
|
4
|
+
class Test::Unit::TestCase
|
5
|
+
|
6
|
+
# +exp+ expects a hash representing expected results (although +name+ also indicates
|
7
|
+
# the domain to be queried if +d+ is not passed.) with the following keys:
|
8
|
+
# - name: domain name to be queried
|
9
|
+
# - kind: string identifying the name of the expected class
|
10
|
+
# (only the class name, namespace is assumed to be Whois::Domain)
|
11
|
+
# - created_on: Date created as string (YYYY-MM-DD)
|
12
|
+
# - updated_on: Date updated as string (YYYY-MM-DD)
|
13
|
+
# - expires_on: Expiration date as string (YYYY-MM-DD)
|
14
|
+
# - database_updated_at: false iff this server does not have such a value.
|
15
|
+
# - status: Array of statuses.
|
16
|
+
# - registrar_name: Name of Registrar
|
17
|
+
# - name_servers: Array of name servers
|
18
|
+
# - whois_server: Whois server domain
|
19
|
+
# - raw_match: A string to match against the raw data.
|
20
|
+
# - to_s: Expected to_s
|
21
|
+
def assert_whois_data(exp, d = nil)
|
22
|
+
d ||= Whois::Domain.new(exp[:name])
|
23
|
+
|
24
|
+
assert_kind_of Whois::Domain.const_get(exp[:kind]), d, "#{exp[:name]} should be an instance of Whois::Domain::#{exp[:kind]}"
|
25
|
+
assert_equal exp[:name], d.name, "Verify that name returns same as name given"
|
26
|
+
|
27
|
+
assert_equal(Date.parse(exp[:expires_on]).to_s, d.expires_on.to_s, "expiration date") unless exp[:expires_on].nil?
|
28
|
+
assert_equal(Date.parse(exp[:created_on]).to_s, d.created_on.to_s, "creation date") unless exp[:created_on].nil?
|
29
|
+
assert_equal(Date.parse(exp[:updated_on]).to_s, d.updated_on.to_s, "updated date") unless exp[:updated_on].nil?
|
30
|
+
|
31
|
+
if exp[:database_updated_at] == false
|
32
|
+
assert_nil d.database_updated_at, "no database_updated_at expected on this server"
|
33
|
+
else
|
34
|
+
assert_kind_of Time, d.database_updated_at, "database_updated_at should return a time object"
|
35
|
+
end
|
36
|
+
|
37
|
+
assert_kind_of Array, d.status, "status should return an Array"
|
38
|
+
assert_equal exp[:status], d.status
|
39
|
+
|
40
|
+
assert_kind_of Array, d.name_servers, "name_server should return an Array"
|
41
|
+
unless exp[:name_servers].nil? # see CatTest
|
42
|
+
assert_equal exp[:name_servers], d.name_servers
|
43
|
+
assert_equal d.name_servers, d.ns, "ns is an alias for name_servers"
|
44
|
+
end
|
45
|
+
|
46
|
+
assert_equal exp[:registrar_name], d.registrar_name
|
47
|
+
assert_equal exp[:whois_server], d.whois_server
|
48
|
+
|
49
|
+
assert_kind_of String, d.raw
|
50
|
+
assert_match exp[:raw_match], d.raw
|
51
|
+
|
52
|
+
if exp[:to_s]
|
53
|
+
assert_equal exp[:to_s], d.to_s
|
54
|
+
end
|
55
|
+
|
56
|
+
assert !d.available?
|
57
|
+
assert d.registered?
|
58
|
+
end
|
59
|
+
end
|