whois 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +23 -0
- data/Manifest +27 -4
- data/README.rdoc +5 -8
- data/Rakefile +14 -0
- data/data/ip_del_list +11 -3
- data/data/servers_charset_list +2 -1
- data/data/tld_serv_list +15 -7
- data/lib/whois/answer/contact.rb +15 -15
- data/lib/whois/answer/parser/NOTES.txt +10 -13
- data/lib/whois/answer/parser/saudinic.net.sa.rb +36 -0
- data/lib/whois/answer/parser/whois.audns.net.au.rb +71 -0
- data/lib/whois/answer/parser/whois.ausregistry.net.au.rb +3 -39
- data/lib/whois/answer/parser/whois.cnnic.net.cn.rb +0 -1
- data/lib/whois/answer/parser/whois.jprs.jp.rb +3 -3
- data/lib/whois/answer/parser/whois.nic.co.rb +77 -0
- data/lib/whois/answer/parser/whois.nic.net.sa.rb +73 -0
- data/lib/whois/answer/parser/whois.tonic.to.rb +108 -0
- data/lib/whois/answer/parser.rb +5 -5
- data/lib/whois/answer/part.rb +1 -1
- data/lib/whois/answer/registrar.rb +4 -4
- data/lib/whois/client.rb +22 -10
- data/lib/whois/definitions/ipv4.rb +11 -3
- data/lib/whois/definitions/ipv4.txt +226 -0
- data/lib/whois/definitions/ipv6.txt +32 -0
- data/lib/whois/definitions/tlds.rb +12 -6
- data/lib/whois/definitions/tlds.txt +360 -0
- data/lib/whois/version.rb +2 -2
- data/lib/whois.rb +36 -17
- data/test/list_tld +21 -15
- data/test/testcases/responses/{whois.ausregistry.net.au → whois.audns.net.au}/available.txt +0 -0
- data/test/testcases/responses/{whois.ausregistry.net.au → whois.audns.net.au}/registered.txt +0 -0
- data/test/testcases/responses/whois.jprs.jp/jp/available.txt +17 -0
- data/test/testcases/responses/whois.jprs.jp/{registered.txt → jp/registered.txt} +0 -0
- data/test/testcases/responses/whois.jprs.jp/ne.jp/available.txt +17 -0
- data/test/testcases/responses/whois.jprs.jp/ne.jp/registered.txt +19 -0
- data/test/testcases/responses/whois.nic.co/available.txt +28 -0
- data/test/testcases/responses/whois.nic.co/registered.txt +82 -0
- data/test/testcases/responses/whois.nic.net.sa/available.txt +5 -0
- data/test/testcases/responses/whois.nic.net.sa/registered.txt +17 -0
- data/test/testcases/responses/whois.tonic.to/1.txt +1 -0
- data/test/testcases/responses/whois.tonic.to/available.txt +2 -0
- data/test/testcases/responses/whois.tonic.to/incomplete.txt +1 -0
- data/test/testcases/responses/whois.tonic.to/registered.txt +3 -0
- data/test/whois/answer/parser/saudinic.net.sa_test.rb +12 -0
- data/test/whois/answer/parser/whois.audns.net.au_test.rb +70 -0
- data/test/whois/answer/parser/whois.ausregistry.net.au_test.rb +3 -61
- data/test/whois/answer/parser/whois.jprs.jp_test.rb +93 -14
- data/test/whois/answer/parser/whois.nic.co_test.rb +64 -0
- data/test/whois/answer/parser/whois.nic.net.sa_test.rb +84 -0
- data/test/whois/answer/parser/whois.tonic.to_test.rb +125 -0
- data/whois.gemspec +5 -5
- metadata +44 -8
- data/test/testcases/responses/whois.jprs.jp/available.txt +0 -8
@@ -0,0 +1,77 @@
|
|
1
|
+
#
|
2
|
+
# = Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: Net
|
8
|
+
# Package:: Whois
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# License:: MIT License
|
11
|
+
#
|
12
|
+
#--
|
13
|
+
#
|
14
|
+
#++
|
15
|
+
|
16
|
+
|
17
|
+
require 'whois/answer/parser/base'
|
18
|
+
|
19
|
+
|
20
|
+
module Whois
|
21
|
+
class Answer
|
22
|
+
class Parser
|
23
|
+
|
24
|
+
#
|
25
|
+
# = whois.nic.co parser
|
26
|
+
#
|
27
|
+
# Parser for the whois.nic.co server.
|
28
|
+
#
|
29
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
30
|
+
# to check for domain availability and get domain status.
|
31
|
+
# Please consider to contribute implementing missing methods.
|
32
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
33
|
+
# and examples.
|
34
|
+
#
|
35
|
+
class WhoisNicCo < Base
|
36
|
+
|
37
|
+
property_supported :status do
|
38
|
+
@status ||= content_for_scanner.scan(/Domain Status:\s+(.*?)\n/).flatten
|
39
|
+
end
|
40
|
+
|
41
|
+
property_supported :available? do
|
42
|
+
@available ||= !!(content_for_scanner =~ /Not found:/)
|
43
|
+
end
|
44
|
+
|
45
|
+
property_supported :registered? do
|
46
|
+
!available?
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
property_supported :created_on do
|
51
|
+
@created_on ||= if content_for_scanner =~ /Domain Registration Date:\s+(.*)\n/
|
52
|
+
Time.parse($1)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
property_supported :updated_on do
|
57
|
+
@updated_on ||= if content_for_scanner =~ /Domain Last Updated Date:\s+(.*)\n/
|
58
|
+
Time.parse($1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
property_supported :expires_on do
|
63
|
+
@expires_on ||= if content_for_scanner =~ /Domain Expiration Date:\s+(.*)\n/
|
64
|
+
Time.parse($1)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
property_supported :nameservers do
|
70
|
+
@nameservers ||= content_for_scanner.scan(/Name Server:\s+(.*)\n/).flatten.map(&:downcase)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#
|
2
|
+
# = Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: Net
|
8
|
+
# Package:: Whois
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# License:: MIT License
|
11
|
+
#
|
12
|
+
#--
|
13
|
+
#
|
14
|
+
#++
|
15
|
+
|
16
|
+
|
17
|
+
require 'whois/answer/parser/base'
|
18
|
+
|
19
|
+
|
20
|
+
module Whois
|
21
|
+
class Answer
|
22
|
+
class Parser
|
23
|
+
|
24
|
+
#
|
25
|
+
# = whois.nic.net.sa parser
|
26
|
+
#
|
27
|
+
# Parser for the whois.nic.net.sa server.
|
28
|
+
#
|
29
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
30
|
+
# to check for domain availability and get domain status.
|
31
|
+
# Please consider to contribute implementing missing methods.
|
32
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
33
|
+
# and examples.
|
34
|
+
#
|
35
|
+
class WhoisNicNetSa < Base
|
36
|
+
|
37
|
+
property_supported :status do
|
38
|
+
@status ||= if available?
|
39
|
+
:available
|
40
|
+
else
|
41
|
+
:registered
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
property_supported :available? do
|
46
|
+
@available ||= !!(content_for_scanner =~ /^No match\.$/)
|
47
|
+
end
|
48
|
+
|
49
|
+
property_supported :registered? do
|
50
|
+
@registered ||= !available?
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
property_supported :created_on do
|
55
|
+
@created_on ||= if content_for_scanner =~ /reg-date:\s+(.*)\n/
|
56
|
+
Time.parse($1)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
property_not_supported :updated_on
|
61
|
+
|
62
|
+
property_not_supported :expires_on
|
63
|
+
|
64
|
+
|
65
|
+
property_supported :nameservers do
|
66
|
+
@nameservers ||= content_for_scanner.scan(/nserver:\s+(.+)\n/).flatten
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#
|
2
|
+
# = Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: Net
|
8
|
+
# Package:: Whois
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# License:: MIT License
|
11
|
+
#
|
12
|
+
#--
|
13
|
+
#
|
14
|
+
#++
|
15
|
+
|
16
|
+
|
17
|
+
require 'whois/answer/parser/base'
|
18
|
+
|
19
|
+
|
20
|
+
module Whois
|
21
|
+
class Answer
|
22
|
+
class Parser
|
23
|
+
|
24
|
+
#
|
25
|
+
# = whois.tonic.to parser
|
26
|
+
#
|
27
|
+
# Parser for the whois.tonic.to server.
|
28
|
+
#
|
29
|
+
class WhoisTonicTo < Base
|
30
|
+
|
31
|
+
property_not_supported :disclaimer
|
32
|
+
|
33
|
+
|
34
|
+
property_not_supported :domain
|
35
|
+
|
36
|
+
property_not_supported :domain_id
|
37
|
+
|
38
|
+
|
39
|
+
property_not_supported :referral_whois
|
40
|
+
|
41
|
+
property_not_supported :referral_url
|
42
|
+
|
43
|
+
|
44
|
+
property_supported :status do
|
45
|
+
@status ||= if incomplete_response?
|
46
|
+
:unknown
|
47
|
+
else
|
48
|
+
if available?
|
49
|
+
:available
|
50
|
+
else
|
51
|
+
:registered
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
property_supported :available? do
|
57
|
+
@available ||= (!incomplete_response? && !!(content_for_scanner =~ /No match for/))
|
58
|
+
end
|
59
|
+
|
60
|
+
property_supported :registered? do
|
61
|
+
@registered ||= (!incomplete_response? && !available?)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
property_not_supported :created_on
|
66
|
+
|
67
|
+
property_not_supported :updated_on
|
68
|
+
|
69
|
+
property_not_supported :expires_on
|
70
|
+
|
71
|
+
|
72
|
+
property_not_supported :registrar
|
73
|
+
|
74
|
+
|
75
|
+
property_not_supported :registrant_contact
|
76
|
+
|
77
|
+
property_not_supported :admin_contact
|
78
|
+
|
79
|
+
property_not_supported :technical_contact
|
80
|
+
|
81
|
+
|
82
|
+
property_not_supported :nameservers
|
83
|
+
|
84
|
+
|
85
|
+
property_supported :changed? do |other|
|
86
|
+
!unchanged?(other)
|
87
|
+
end
|
88
|
+
|
89
|
+
property_supported :unchanged? do |other|
|
90
|
+
(self === other) ||
|
91
|
+
(self.content == other.content)
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
# Very often the .to server returns a partial response, which is a response
|
98
|
+
# containing an emtpy line.
|
99
|
+
# It seems to be a very poorly-designed throttle mecanism.
|
100
|
+
def incomplete_response?
|
101
|
+
content_for_scanner.strip == ""
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/whois/answer/parser.rb
CHANGED
@@ -148,7 +148,7 @@ module Whois
|
|
148
148
|
end
|
149
149
|
|
150
150
|
|
151
|
-
#
|
151
|
+
# Returns the proper parser instance for given <tt>part</tt>.
|
152
152
|
# The parser class is selected according to the
|
153
153
|
# value of the <tt>#host</tt> attribute for given <tt>part</tt>.
|
154
154
|
#
|
@@ -170,7 +170,7 @@ module Whois
|
|
170
170
|
parser_klass(part.host).new(part)
|
171
171
|
end
|
172
172
|
|
173
|
-
#
|
173
|
+
# Detects the proper parser class according to given <tt>host</tt>
|
174
174
|
# and returns the class constant.
|
175
175
|
#
|
176
176
|
# This method autoloads missing parser classes. If you want to define
|
@@ -206,7 +206,7 @@ module Whois
|
|
206
206
|
Parser::Blank
|
207
207
|
end
|
208
208
|
|
209
|
-
#
|
209
|
+
# Converts <tt>host</tt> to the corresponding parser class name.
|
210
210
|
#
|
211
211
|
# host - A String with the host
|
212
212
|
#
|
@@ -224,7 +224,7 @@ module Whois
|
|
224
224
|
gsub(/(?:^|_)(.)/) { $1.upcase }
|
225
225
|
end
|
226
226
|
|
227
|
-
#
|
227
|
+
# Requires the file at <tt>whois/answer/parser/#{name}</tt>.
|
228
228
|
#
|
229
229
|
# name - A string with the file name
|
230
230
|
#
|
@@ -235,7 +235,7 @@ module Whois
|
|
235
235
|
end
|
236
236
|
|
237
237
|
|
238
|
-
def self.properties # :nodoc
|
238
|
+
def self.properties # :nodoc:
|
239
239
|
Whois.deprecate("Whois::Answer::Parser.properties is deprecated. Use the Whois::Answer::Parser::PROPERTIES constant.")
|
240
240
|
PROPERTIES
|
241
241
|
end
|
data/lib/whois/answer/part.rb
CHANGED
@@ -24,7 +24,7 @@ module Whois
|
|
24
24
|
# = Part
|
25
25
|
#
|
26
26
|
# A single <tt>Whois::Answer</tt> fragment. For instance,
|
27
|
-
# in case of thin server,
|
27
|
+
# in case of thin server, a <tt>Whois::Answer</tt> may be composed by
|
28
28
|
# one or more parts corresponding to all responses
|
29
29
|
# returned by the WHOIS servers.
|
30
30
|
#
|
@@ -27,10 +27,10 @@ module Whois
|
|
27
27
|
#
|
28
28
|
# A Registrar is composed by the following attributes:
|
29
29
|
#
|
30
|
-
# <tt>:id</tt>::
|
31
|
-
# <tt>:name</tt>::
|
32
|
-
# <tt>:organization</tt>::
|
33
|
-
# <tt>:url</tt>::
|
30
|
+
# * <tt>:id</tt>::
|
31
|
+
# * <tt>:name</tt>::
|
32
|
+
# * <tt>:organization</tt>::
|
33
|
+
# * <tt>:url</tt>::
|
34
34
|
#
|
35
35
|
# Be aware that every WHOIS server can return a different number of details
|
36
36
|
# or no details at all.
|
data/lib/whois/client.rb
CHANGED
@@ -21,7 +21,7 @@ module Whois
|
|
21
21
|
|
22
22
|
class Client
|
23
23
|
|
24
|
-
# The maximum time to run a whois query expressed in seconds
|
24
|
+
# The Integer maximum time to run a whois query, expressed in seconds.
|
25
25
|
DEFAULT_TIMEOUT = 10
|
26
26
|
|
27
27
|
attr_accessor :timeout
|
@@ -31,23 +31,30 @@ module Whois
|
|
31
31
|
# :call-seq:
|
32
32
|
# new { |client| ... } => client
|
33
33
|
# new(options = {}) { |client| ... } => client
|
34
|
-
#
|
35
|
-
# Initializes a new Whois::Client with <tt>options</tt>.
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
34
|
+
#
|
35
|
+
# Initializes a new <tt>Whois::Client</tt> with <tt>options</tt>.
|
36
|
+
#
|
37
|
+
# options - The Hash options used to refine the selection (default: {}):
|
38
|
+
# :timeout - The Integer script timeout, expressed in seconds (default: DEFAULT_TIMEOUT).
|
39
|
+
#
|
40
|
+
# If <tt>block</tt> is given, yields <tt>self</tt>.
|
41
|
+
#
|
42
|
+
# Examples
|
43
|
+
#
|
39
44
|
# client = Whois::Client.new do |c|
|
40
45
|
# c.timeout = nil
|
41
46
|
# end
|
42
47
|
# client.query("google.com")
|
43
48
|
#
|
49
|
+
#
|
50
|
+
# Returns a <tt>Whois::Client</tt>.
|
44
51
|
def initialize(options = {}, &block)
|
45
52
|
self.timeout = options[:timeout] || DEFAULT_TIMEOUT
|
46
53
|
yield(self) if block_given?
|
47
54
|
end
|
48
55
|
|
49
56
|
|
50
|
-
class Query # :nodoc
|
57
|
+
class Query # :nodoc:
|
51
58
|
# IPv6?
|
52
59
|
# RPSL?
|
53
60
|
# email?
|
@@ -59,12 +66,17 @@ module Whois
|
|
59
66
|
end
|
60
67
|
|
61
68
|
|
62
|
-
# Queries the right
|
63
|
-
#
|
69
|
+
# Queries the right WHOIS server for <tt>qstring</tt> and returns
|
70
|
+
# the response from the server.
|
71
|
+
#
|
72
|
+
# qstring - The String to be sent as query parameter.
|
73
|
+
#
|
74
|
+
# Examples
|
64
75
|
#
|
65
76
|
# client.query("google.com")
|
66
77
|
# # => #<Whois::Answer>
|
67
78
|
#
|
79
|
+
# Returns a <tt>Whois::Answer</tt> instance.
|
68
80
|
def query(qstring)
|
69
81
|
string = qstring.to_s
|
70
82
|
Timeout::timeout(timeout) do
|
@@ -75,4 +87,4 @@ module Whois
|
|
75
87
|
|
76
88
|
end
|
77
89
|
|
78
|
-
end
|
90
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
Whois::Server.define :ipv4, "1.0.0.0/8", "whois.apnic.net"
|
2
2
|
Whois::Server.define :ipv4, "2.0.0.0/8", "whois.ripe.net"
|
3
|
+
Whois::Server.define :ipv4, "14.0.0.0/8", "whois.apnic.net"
|
3
4
|
Whois::Server.define :ipv4, "24.132.0.0/14", "whois.ripe.net"
|
4
5
|
Whois::Server.define :ipv4, "27.0.0.0/8", "whois.apnic.net"
|
6
|
+
Whois::Server.define :ipv4, "31.0.0.0/8", "whois.ripe.net"
|
5
7
|
Whois::Server.define :ipv4, "41.0.0.0/8", "whois.afrinic.net"
|
6
8
|
Whois::Server.define :ipv4, "43.0.0.0/8", "whois.v6nic.net"
|
7
9
|
Whois::Server.define :ipv4, "46.0.0.0/8", "whois.ripe.net"
|
@@ -20,14 +22,16 @@ Whois::Server.define :ipv4, "77.0.0.0/8", "whois.ripe.net"
|
|
20
22
|
Whois::Server.define :ipv4, "78.0.0.0/7", "whois.ripe.net"
|
21
23
|
Whois::Server.define :ipv4, "80.0.0.0/4", "whois.ripe.net"
|
22
24
|
Whois::Server.define :ipv4, "96.0.0.0/6", "whois.arin.net"
|
25
|
+
Whois::Server.define :ipv4, "107.0.0.0/8", "whois.arin.net"
|
23
26
|
Whois::Server.define :ipv4, "108.0.0.0/8", "whois.arin.net"
|
24
27
|
Whois::Server.define :ipv4, "109.0.0.0/8", "whois.ripe.net"
|
25
28
|
Whois::Server.define :ipv4, "110.0.0.0/7", "whois.apnic.net"
|
26
29
|
Whois::Server.define :ipv4, "96.0.0.0/4", nil, {:adapter=>Whois::Server::Adapters::None}
|
27
|
-
Whois::Server.define :ipv4, "
|
28
|
-
Whois::Server.define :ipv4, "119.192.0.0/11", "whois.nic.or.kr"
|
30
|
+
Whois::Server.define :ipv4, "112.160.0.0/11", "whois.nic.or.kr"
|
29
31
|
Whois::Server.define :ipv4, "115.0.0.0/12", "whois.nic.or.kr"
|
30
32
|
Whois::Server.define :ipv4, "115.16.0.0/13", "whois.nic.or.kr"
|
33
|
+
Whois::Server.define :ipv4, "118.32.0.0/11", "whois.nic.or.kr"
|
34
|
+
Whois::Server.define :ipv4, "119.192.0.0/11", "whois.nic.or.kr"
|
31
35
|
Whois::Server.define :ipv4, "112.0.0.0/5", "whois.apnic.net"
|
32
36
|
Whois::Server.define :ipv4, "121.128.0.0/10", "whois.nic.or.kr"
|
33
37
|
Whois::Server.define :ipv4, "125.128.0.0/11", "whois.nic.or.kr"
|
@@ -88,9 +92,14 @@ Whois::Server.define :ipv4, "165.148.0.0/15", "whois.afrinic.net"
|
|
88
92
|
Whois::Server.define :ipv4, "169.208.0.0/12", "whois.apnic.net"
|
89
93
|
Whois::Server.define :ipv4, "171.16.0.0/12", "whois.ripe.net"
|
90
94
|
Whois::Server.define :ipv4, "171.32.0.0/15", "whois.ripe.net"
|
95
|
+
Whois::Server.define :ipv4, "175.192.0.0/10", "whois.nic.or.kr"
|
91
96
|
Whois::Server.define :ipv4, "175.0.0.0/8", "whois.apnic.net"
|
97
|
+
Whois::Server.define :ipv4, "176.0.0.0/8", "whois.ripe.net"
|
98
|
+
Whois::Server.define :ipv4, "177.0.0.0/8", "whois.lacnic.net"
|
92
99
|
Whois::Server.define :ipv4, "178.0.0.0/8", "whois.ripe.net"
|
93
100
|
Whois::Server.define :ipv4, "180.0.0.0/8", "whois.apnic.net"
|
101
|
+
Whois::Server.define :ipv4, "181.0.0.0/8", "whois.lacnic.net"
|
102
|
+
Whois::Server.define :ipv4, "183.96.0.0/11", "whois.nic.or.kr"
|
94
103
|
Whois::Server.define :ipv4, "182.0.0.0/7", "whois.apnic.net"
|
95
104
|
Whois::Server.define :ipv4, "186.0.0.0/7", "whois.lacnic.net"
|
96
105
|
Whois::Server.define :ipv4, "188.0.0.0/8", "whois.ripe.net"
|
@@ -214,5 +223,4 @@ Whois::Server.define :ipv4, "222.112.0.0/13", "whois.nic.or.kr"
|
|
214
223
|
Whois::Server.define :ipv4, "222.120.0.0/15", "whois.nic.or.kr"
|
215
224
|
Whois::Server.define :ipv4, "222.122.0.0/16", "whois.nic.or.kr"
|
216
225
|
Whois::Server.define :ipv4, "222.232.0.0/13", "whois.nic.or.kr"
|
217
|
-
Whois::Server.define :ipv4, "223.0.0.0/8", nil, {:adapter=>Whois::Server::Adapters::None}
|
218
226
|
Whois::Server.define :ipv4, "220.0.0.0/6", "whois.apnic.net"
|