whois 0.8.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. data/CHANGELOG.rdoc +61 -0
  2. data/Manifest +87 -4
  3. data/README.rdoc +13 -9
  4. data/Rakefile +4 -1
  5. data/bin/ruby-whois +35 -21
  6. data/lib/whois.rb +6 -0
  7. data/lib/whois/answer.rb +30 -14
  8. data/lib/whois/answer/parser.rb +48 -11
  9. data/lib/whois/answer/parser/ast.rb +72 -0
  10. data/lib/whois/answer/parser/base.rb +14 -9
  11. data/lib/whois/answer/parser/blank.rb +1 -1
  12. data/lib/whois/answer/parser/scanners/verisign.rb +117 -0
  13. data/lib/whois/answer/parser/whois.aero.rb +74 -0
  14. data/lib/whois/answer/parser/whois.afilias-grs.info.rb +72 -0
  15. data/lib/whois/answer/parser/whois.afilias.info.rb +72 -0
  16. data/lib/whois/answer/parser/whois.crsnic.net.rb +5 -115
  17. data/lib/whois/answer/parser/whois.denic.de.rb +28 -25
  18. data/lib/whois/answer/parser/whois.domainregistry.ie.rb +74 -0
  19. data/lib/whois/answer/parser/whois.educause.edu.rb +76 -0
  20. data/lib/whois/answer/parser/whois.eu.org.rb +73 -0
  21. data/lib/whois/answer/parser/whois.iana.org.rb +75 -0
  22. data/lib/whois/answer/parser/whois.nic.asia.rb +74 -0
  23. data/lib/whois/answer/parser/whois.nic.fr.rb +77 -0
  24. data/lib/whois/answer/parser/whois.nic.gov.rb +71 -0
  25. data/lib/whois/answer/parser/whois.nic.hu.rb +332 -0
  26. data/lib/whois/answer/parser/whois.nic.it.rb +5 -23
  27. data/lib/whois/answer/parser/whois.nic.name.rb +73 -0
  28. data/lib/whois/answer/parser/whois.nic.tv.rb +99 -0
  29. data/lib/whois/answer/parser/whois.publicinterestregistry.net.rb +6 -24
  30. data/lib/whois/answer/parser/whois.za.net.rb +75 -0
  31. data/lib/whois/answer/parser/whois.za.org.rb +75 -0
  32. data/lib/whois/client.rb +4 -3
  33. data/lib/whois/definitions/tld.notes.txt +1 -0
  34. data/lib/whois/definitions/tlds.rb +11 -49
  35. data/lib/whois/version.rb +5 -6
  36. data/lib/whois/whois.rb +0 -6
  37. data/test/answer/parser/base_test.rb +21 -0
  38. data/test/answer/parser/blank_test.rb +1 -1
  39. data/test/answer/parser/whois.aero_test.rb +51 -0
  40. data/test/answer/parser/whois.afilias-grs.info_test.rb +51 -0
  41. data/test/answer/parser/whois.afilias.info_test.rb +51 -0
  42. data/test/answer/parser/{whois_crsnic_net_test.rb → whois.crsnic.net_test.rb} +15 -68
  43. data/test/answer/parser/{whois_denic_de_test.rb → whois.denic.de_test.rb} +9 -34
  44. data/test/answer/parser/whois.domainregistry.ie_test.rb +51 -0
  45. data/test/answer/parser/whois.educause.edu_test.rb +51 -0
  46. data/test/answer/parser/whois.eu.org_test.rb +51 -0
  47. data/test/answer/parser/whois.iana.org_test.rb +51 -0
  48. data/test/answer/parser/whois.nic.asia_test.rb +51 -0
  49. data/test/answer/parser/whois.nic.fr_test.rb +51 -0
  50. data/test/answer/parser/whois.nic.gov_test.rb +51 -0
  51. data/test/answer/parser/whois.nic.hu_test.rb +226 -0
  52. data/test/answer/parser/{whois_nic_it_test.rb → whois.nic.it_test.rb} +3 -25
  53. data/test/answer/parser/whois.nic.name_test.rb +51 -0
  54. data/test/answer/parser/whois.nic.tv_test.rb +122 -0
  55. data/test/answer/parser/{whois_publicinterestregistry_net_test.rb → whois.publicinterestregistry.net_test.rb} +4 -26
  56. data/test/answer/parser/whois.za.net_test.rb +51 -0
  57. data/test/answer/parser/whois.za.org_test.rb +51 -0
  58. data/test/answer/parser_test.rb +44 -3
  59. data/test/answer_test.rb +27 -13
  60. data/test/client_test.rb +18 -11
  61. data/test/list_tld +319 -0
  62. data/test/test_helper.rb +24 -0
  63. data/test/testcases/responses/whois.aero/available.txt +1 -0
  64. data/test/testcases/responses/whois.aero/registered.txt +102 -0
  65. data/test/testcases/responses/whois.afilias-grs.info/available.txt +1 -0
  66. data/test/testcases/responses/whois.afilias-grs.info/bz/available.txt +1 -0
  67. data/test/testcases/responses/whois.afilias-grs.info/bz/registered.txt +122 -0
  68. data/test/testcases/responses/whois.afilias-grs.info/gi/available.txt +1 -0
  69. data/test/testcases/responses/whois.afilias-grs.info/gi/registered.txt +98 -0
  70. data/test/testcases/responses/whois.afilias-grs.info/hn/available.txt +1 -0
  71. data/test/testcases/responses/whois.afilias-grs.info/hn/registered.txt +85 -0
  72. data/test/testcases/responses/whois.afilias-grs.info/lc/available.txt +1 -0
  73. data/test/testcases/responses/whois.afilias-grs.info/lc/registered.txt +83 -0
  74. data/test/testcases/responses/whois.afilias-grs.info/mn/available.txt +1 -0
  75. data/test/testcases/responses/whois.afilias-grs.info/mn/registered.txt +100 -0
  76. data/test/testcases/responses/whois.afilias-grs.info/registered.txt +122 -0
  77. data/test/testcases/responses/whois.afilias-grs.info/sc/available.txt +1 -0
  78. data/test/testcases/responses/whois.afilias-grs.info/sc/registered.txt +85 -0
  79. data/test/testcases/responses/whois.afilias-grs.info/vc/available.txt +1 -0
  80. data/test/testcases/responses/whois.afilias-grs.info/vc/registered.txt +100 -0
  81. data/test/testcases/responses/whois.afilias.info/available.txt +1 -0
  82. data/test/testcases/responses/whois.afilias.info/registered.txt +104 -0
  83. data/test/testcases/responses/whois.crsnic.net/MULTIPLE.txt +3 -0
  84. data/test/testcases/responses/whois.domainregistry.ie/available.txt +7 -0
  85. data/test/testcases/responses/whois.domainregistry.ie/registered.txt +26 -0
  86. data/test/testcases/responses/whois.educause.edu/available.txt +28 -0
  87. data/test/testcases/responses/whois.educause.edu/registered.txt +66 -0
  88. data/test/testcases/responses/whois.eu.org/available.txt +1 -0
  89. data/test/testcases/responses/whois.eu.org/registered.txt +19 -0
  90. data/test/testcases/responses/whois.iana.org/MULTIPLE.txt +3 -0
  91. data/test/testcases/responses/whois.iana.org/available.txt +7 -0
  92. data/test/testcases/responses/whois.iana.org/registered.txt +89 -0
  93. data/test/testcases/responses/whois.nic.asia/available.txt +1 -0
  94. data/test/testcases/responses/whois.nic.asia/registered.txt +159 -0
  95. data/test/testcases/responses/whois.nic.fr/MULTIPLE.txt +4 -0
  96. data/test/testcases/responses/whois.nic.fr/available.txt +19 -0
  97. data/test/testcases/responses/whois.nic.fr/registered.txt +98 -0
  98. data/test/testcases/responses/whois.nic.gov/available.txt +1 -0
  99. data/test/testcases/responses/whois.nic.gov/registered.txt +5 -0
  100. data/test/testcases/responses/whois.nic.hu/available.txt +12 -0
  101. data/test/testcases/responses/whois.nic.hu/in_progress.txt +13 -0
  102. data/test/testcases/responses/whois.nic.hu/registered.txt +65 -0
  103. data/test/testcases/responses/whois.nic.name/available.txt +29 -0
  104. data/test/testcases/responses/whois.nic.name/registered.txt +36 -0
  105. data/test/testcases/responses/whois.nic.name/reserved.txt +30 -0
  106. data/test/testcases/responses/whois.nic.tv/available.txt +44 -0
  107. data/test/testcases/responses/whois.nic.tv/registered.txt +54 -0
  108. data/test/testcases/responses/whois.za.net/available.txt +9 -0
  109. data/test/testcases/responses/whois.za.net/registered.txt +42 -0
  110. data/test/testcases/responses/whois.za.org/available.txt +9 -0
  111. data/test/testcases/responses/whois.za.org/registered.txt +44 -0
  112. data/whois.gemspec +9 -6
  113. metadata +138 -15
@@ -0,0 +1,72 @@
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.afilias-grs.info parser
26
+ #
27
+ # Parser for the whois.afilias-grs.info 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 WhoisAfiliasGrsInfo < Base
36
+
37
+ register_method :status do
38
+ @status ||= content.to_s.scan(/Status:(.*?)[\r\n]+/).flatten
39
+ end
40
+
41
+ register_method :available? do
42
+ @available ||= (content.to_s.strip == "NOT FOUND")
43
+ end
44
+
45
+ register_method :registered? do
46
+ !available?
47
+ end
48
+
49
+
50
+ register_method :created_on do
51
+ @created_on ||= if content.to_s =~ /Created On:(.*?)[\r\n]+/
52
+ Time.parse($1)
53
+ end
54
+ end
55
+
56
+ register_method :updated_on do
57
+ @updated_on ||= if content.to_s =~ /Last Updated On:(.*?)[\r\n]+/
58
+ Time.parse($1)
59
+ end
60
+ end
61
+
62
+ register_method :expires_on do
63
+ @expires_on ||= if content.to_s =~ /Expiration Date:(.*?)[\r\n]+/
64
+ Time.parse($1)
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,72 @@
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.afilias.info parser
26
+ #
27
+ # Parser for the whois.afilias.info 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 WhoisAfiliasInfo < Base
36
+
37
+ register_method :status do
38
+ @status ||= content.to_s.scan(/Status:(.*?)[\r\n]+/).flatten
39
+ end
40
+
41
+ register_method :available? do
42
+ @available ||= (content.to_s.strip == "NOT FOUND")
43
+ end
44
+
45
+ register_method :registered? do
46
+ !available?
47
+ end
48
+
49
+
50
+ register_method :created_on do
51
+ @created_on ||= if content.to_s =~ /Created On:(.*?)[\r\n]+/
52
+ Time.parse($1)
53
+ end
54
+ end
55
+
56
+ register_method :updated_on do
57
+ @updated_on ||= if content.to_s =~ /Last Updated On:(.*?)[\r\n]+/
58
+ Time.parse($1)
59
+ end
60
+ end
61
+
62
+ register_method :expires_on do
63
+ @expires_on ||= if content.to_s =~ /Expiration Date:(.*?)[\r\n]+/
64
+ Time.parse($1)
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -15,6 +15,7 @@
15
15
 
16
16
 
17
17
  require 'whois/answer/parser/base'
18
+ require 'whois/answer/parser/scanners/verisign'
18
19
 
19
20
 
20
21
  module Whois
@@ -22,11 +23,12 @@ module Whois
22
23
  class Parser
23
24
 
24
25
  #
25
- # = whois.crsnic.net.rb parser
26
+ # = whois.crsnic.net parser
26
27
  #
27
- # Parser for the whois.crsnic.net.rb server.
28
+ # Parser for the whois.crsnic.net server.
28
29
  #
29
30
  class WhoisCrsnicNet < Base
31
+ include Ast
30
32
 
31
33
  register_method :disclaimer do
32
34
  node("Disclaimer")
@@ -86,122 +88,10 @@ module Whois
86
88
 
87
89
  protected
88
90
 
89
- def ast
90
- @ast ||= parse
91
- end
92
-
93
- def node(key, &block)
94
- if block_given?
95
- value = ast[key]
96
- value = yield(value) unless value.nil?
97
- value
98
- else
99
- ast[key]
100
- end
101
- end
102
-
103
- def node?(key)
104
- !ast[key].nil?
105
- end
106
-
107
91
  def parse
108
- Scanner.new(content.to_s).parse
92
+ Scanners::VerisignScanner.new(content.to_s).parse
109
93
  end
110
94
 
111
-
112
- class Scanner
113
-
114
- def initialize(content)
115
- content = content.to_s.gsub("\r", "")
116
- @input = StringScanner.new(content.to_s)
117
- end
118
-
119
- def parse
120
- @ast = {}
121
- while !@input.eos?
122
- parse_content
123
- end
124
- @ast
125
- end
126
-
127
- private
128
-
129
- def parse_content
130
- trim_newline ||
131
- parse_not_found ||
132
- parse_disclaimer ||
133
- parse_notice ||
134
- parse_pair ||
135
- trim_last_update ||
136
- trim_fuffa ||
137
- error("Unexpected token")
138
- end
139
-
140
- def trim_newline
141
- @input.scan(/\n/)
142
- end
143
-
144
- def trim_last_update
145
- @input.scan(/>>>(.*?)<<<\n/)
146
- end
147
-
148
- def trim_fuffa
149
- @input.scan(/^\w(.*)\n/) ||
150
- (@input.scan(/^\w(.*)/) and @input.eos?)
151
- end
152
-
153
- def parse_not_found
154
- if @input.scan(/No match for "(.*?)"\.\n/)
155
- @ast["Domain Name"] = @input[1].strip
156
- end
157
- end
158
-
159
- # NOTE: parse_notice and parse_disclaimer are similar!
160
- def parse_notice
161
- if @input.match?(/NOTICE:/)
162
- lines = []
163
- while !@input.match?(/\n/) && @input.scan(/(.*)\n/)
164
- lines << @input[1].strip
165
- end
166
- @ast["Notice"] = lines.join(" ")
167
- else
168
- false
169
- end
170
- end
171
-
172
- def parse_disclaimer
173
- if @input.match?(/TERMS OF USE:/)
174
- lines = []
175
- while !@input.match?(/\n/) && @input.scan(/(.*)\n/)
176
- lines << @input[1].strip
177
- end
178
- @ast["Disclaimer"] = lines.join(" ")
179
- else
180
- false
181
- end
182
- end
183
-
184
- def parse_pair
185
- if @input.scan(/\s+(.*?):(.*?)\n/)
186
- key, value = @input[1].strip, @input[2].strip
187
- if @ast[key].nil?
188
- @ast[key] = value
189
- else
190
- @ast[key].is_a?(Array) || @ast[key] = [@ast[key]]
191
- @ast[key] << value
192
- end
193
- else
194
- false
195
- end
196
- end
197
-
198
- def error(message)
199
- raise "#{message}: #{@input.peek(@input.string.length)}"
200
- end
201
-
202
- end
203
-
204
-
205
95
  end
206
96
 
207
97
  end
@@ -21,76 +21,79 @@ module Whois
21
21
  class Answer
22
22
  class Parser
23
23
  class WhoisDenicDe < Base
24
+ include Ast
24
25
 
25
26
  register_method :disclaimer do
26
- ast['Disclaimer']
27
+ node("Disclaimer")
27
28
  end
28
29
 
30
+
29
31
  register_method :domain do
30
- ast['Domain']
32
+ node("Domain")
31
33
  end
32
34
 
33
35
  register_method :domain_id do
34
36
  nil
35
37
  end
36
38
 
39
+
37
40
  register_method :status do
38
- ast['Status']
41
+ node("Status")
39
42
  end
40
43
 
41
- register_method :registered? do
42
- !(ast['NotFound'] || ast['Invalid'])
44
+ register_method :available? do
45
+ node("NotFound") && !node("Invalid")
43
46
  end
44
47
 
45
- register_method :available? do
46
- ast['NotFound'] && !ast['Invalid']
48
+ register_method :registered? do
49
+ !(node("NotFound") || node("Invalid"))
47
50
  end
48
51
 
52
+
49
53
  register_method :created_on do
50
54
  nil
51
55
  end
52
56
 
57
+ register_method :updated_on do
58
+ node("Changed") { |raw| Time.parse(raw) }
59
+ end
60
+
53
61
  register_method :expires_on do
54
62
  nil
55
63
  end
56
64
 
57
- register_method :updated_on do
58
- ast['Changed'] ? Time.parse(ast['Changed']) : nil
59
- end
60
65
 
61
66
  register_method :registrar do
62
- return nil unless ast['Zone-C']
63
- Answer::Registrar.new(
64
- :id => nil,
65
- :name => ast['Zone-C'].name,
66
- :organization => ast['Zone-C'].organization,
67
- :url => nil
68
- )
67
+ node("Zone-C") do |raw|
68
+ Answer::Registrar.new(
69
+ :id => nil,
70
+ :name => raw.name,
71
+ :organization => raw.organization,
72
+ :url => nil
73
+ )
74
+ end
69
75
  end
70
76
 
71
77
  register_method :registrant do
72
- ast['Holder']
78
+ node("Holder")
73
79
  end
74
80
 
75
81
  register_method :admin do
76
- ast['Admin-C']
82
+ node("Admin-C")
77
83
  end
78
84
 
79
85
  register_method :technical do
80
- ast['Tech-C']
86
+ node("Tech-C")
81
87
  end
82
88
 
89
+
83
90
  register_method :nameservers do
84
- ast['Nserver']
91
+ node("Nserver")
85
92
  end
86
93
 
87
94
 
88
95
  protected
89
96
 
90
- def ast
91
- @ast ||= parse
92
- end
93
-
94
97
  def parse
95
98
  Scanner.new(content.to_s).parse
96
99
  end
@@ -0,0 +1,74 @@
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.domainregistry.ie parser
26
+ #
27
+ # Parser for the whois.domainregistry.ie 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 WhoisDomainregistryIe < Base
36
+
37
+ register_method :status do
38
+ @status ||= if content.to_s =~ /status:\s+(.*)\n/
39
+ $1.downcase.to_sym
40
+ else
41
+ :available
42
+ end
43
+ end
44
+
45
+ register_method :available? do
46
+ @available ||= !!(content.to_s =~ /Not Registered - The domain you have requested is not a registered .ie domain name/)
47
+ end
48
+
49
+ register_method :registered? do
50
+ !available?
51
+ end
52
+
53
+
54
+ # TODO: NotAvailable
55
+ register_method :created_on do
56
+ nil
57
+ end
58
+
59
+ # TODO: NotAvailable
60
+ register_method :updated_on do
61
+ nil
62
+ end
63
+
64
+ register_method :expires_on do
65
+ @expires_on ||= if content.to_s =~ /renewal:\s+(.*)\n/
66
+ Time.parse($1)
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+ end
74
+ end