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
@@ -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
|