whois 1.0.12 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/CHANGELOG.rdoc +16 -1
  2. data/Manifest +24 -4
  3. data/lib/whois.rb +5 -5
  4. data/lib/whois/answer.rb +6 -2
  5. data/lib/whois/answer/contact.rb +18 -17
  6. data/lib/whois/answer/parser.rb +16 -1
  7. data/lib/whois/answer/parser/base.rb +40 -4
  8. data/lib/whois/answer/parser/whois.ausregistry.net.au.rb +71 -0
  9. data/lib/whois/answer/parser/whois.denic.de.rb +6 -6
  10. data/lib/whois/answer/parser/whois.nic.ac.rb +3 -3
  11. data/lib/whois/answer/parser/whois.nic.am.rb +83 -0
  12. data/lib/whois/answer/parser/whois.nic.as.rb +73 -0
  13. data/lib/whois/answer/parser/whois.nic.hu.rb +7 -7
  14. data/lib/whois/answer/parser/whois.nic.it.rb +6 -6
  15. data/lib/whois/answer/parser/whois.nic.st.rb +81 -0
  16. data/lib/whois/answer/parser/whois.publicinterestregistry.net.rb +3 -3
  17. data/lib/whois/version.rb +2 -2
  18. data/test/answer/contact_test.rb +14 -0
  19. data/test/answer/parser/base_test.rb +18 -0
  20. data/test/answer/parser/whois.ausregistry.net.au_test.rb +70 -0
  21. data/test/answer/parser/whois.denic.de_test.rb +65 -44
  22. data/test/answer/parser/whois.eu_test.rb +1 -1
  23. data/test/answer/parser/whois.nic-se.se_test.rb +1 -1
  24. data/test/answer/parser/whois.nic.ac_test.rb +13 -13
  25. data/test/answer/parser/whois.nic.am_test.rb +84 -0
  26. data/test/answer/parser/whois.nic.as_test.rb +63 -0
  27. data/test/answer/parser/whois.nic.hu_test.rb +45 -35
  28. data/test/answer/parser/whois.nic.it_test.rb +92 -65
  29. data/test/answer/parser/whois.nic.st_test.rb +77 -0
  30. data/test/answer/parser/whois.publicinterestregistry.net_test.rb +26 -20
  31. data/test/answer/parser_test.rb +45 -0
  32. data/test/answer_test.rb +7 -0
  33. data/test/list_tld +4 -4
  34. data/test/testcases/responses/whois.ausregistry.net.au/available.txt +1 -0
  35. data/test/testcases/responses/whois.ausregistry.net.au/registered.txt +23 -0
  36. data/test/testcases/responses/whois.denic.de/{nameservers_with_ip.txt → property_nameservers_with_ip.txt} +0 -0
  37. data/test/testcases/responses/whois.denic.de/property_technical_contact.txt +70 -0
  38. data/test/testcases/responses/whois.eu/{nameservers_with_ip.txt → property_nameservers_with_ip.txt} +0 -0
  39. data/test/testcases/responses/whois.nic-se.se/{nameservers_with_ip.txt → property_nameservers_with_ip.txt} +0 -0
  40. data/test/testcases/responses/whois.nic.am/available.txt +3 -0
  41. data/test/testcases/responses/whois.nic.am/registered.txt +42 -0
  42. data/test/testcases/responses/whois.nic.as/available.txt +12 -0
  43. data/test/testcases/responses/whois.nic.as/registered.txt +18 -0
  44. data/test/testcases/responses/whois.nic.it/property_admin_contact.txt +53 -0
  45. data/test/testcases/responses/whois.nic.it/{contact.txt → property_registrant_contact.txt} +0 -0
  46. data/test/testcases/responses/whois.nic.it/property_technical_contact.txt +53 -0
  47. data/test/testcases/responses/whois.nic.st/available.txt +1 -0
  48. data/test/testcases/responses/whois.nic.st/registered.txt +47 -0
  49. data/whois.gemspec +5 -5
  50. metadata +36 -7
data/CHANGELOG.rdoc CHANGED
@@ -1,7 +1,22 @@
1
1
  = Changelog
2
2
 
3
3
 
4
- == master
4
+ == Release 1.1.0
5
+
6
+ * NEW: Added simple .am TLD parser (whois.nic.am).
7
+
8
+ * NEW: Added simple .as TLD parser (whois.nic.as).
9
+
10
+ * NEW: Added simple .au TLD parser (whois.ausregistry.net.au).
11
+
12
+ * NEW: Added simple .st TLD parser (whois.nic.st).
13
+
14
+ * NEW: New methods Whois::Answer#contacts, Whois::Answer::Parser#contacts, and Whois::Answer::Parser::Base#contacts returns all supported contacts.
15
+
16
+ * CHANGED: Renamed Whois::Answer::Parser::Base#(admin|technical|registrant) to Whois::Answer::Parser::Base#(admin|technical|registrant)_contact.
17
+
18
+
19
+ == Release 1.0.12
5
20
 
6
21
  * NEW: Added simple .in TLD parser (whois.registry.in).
7
22
 
data/Manifest CHANGED
@@ -30,6 +30,7 @@ lib/whois/answer/parser/whois.afilias-grs.info.rb
30
30
  lib/whois/answer/parser/whois.afilias.info.rb
31
31
  lib/whois/answer/parser/whois.ai.rb
32
32
  lib/whois/answer/parser/whois.arnes.si.rb
33
+ lib/whois/answer/parser/whois.ausregistry.net.au.rb
33
34
  lib/whois/answer/parser/whois.biz.rb
34
35
  lib/whois/answer/parser/whois.cat.rb
35
36
  lib/whois/answer/parser/whois.cira.ca.rb
@@ -57,6 +58,8 @@ lib/whois/answer/parser/whois.nic-se.se.rb
57
58
  lib/whois/answer/parser/whois.nic.ac.rb
58
59
  lib/whois/answer/parser/whois.nic.af.rb
59
60
  lib/whois/answer/parser/whois.nic.ag.rb
61
+ lib/whois/answer/parser/whois.nic.am.rb
62
+ lib/whois/answer/parser/whois.nic.as.rb
60
63
  lib/whois/answer/parser/whois.nic.asia.rb
61
64
  lib/whois/answer/parser/whois.nic.at.rb
62
65
  lib/whois/answer/parser/whois.nic.cc.rb
@@ -77,6 +80,7 @@ lib/whois/answer/parser/whois.nic.mx.rb
77
80
  lib/whois/answer/parser/whois.nic.name.rb
78
81
  lib/whois/answer/parser/whois.nic.nu.rb
79
82
  lib/whois/answer/parser/whois.nic.or.kr.rb
83
+ lib/whois/answer/parser/whois.nic.st.rb
80
84
  lib/whois/answer/parser/whois.nic.tel.rb
81
85
  lib/whois/answer/parser/whois.nic.tl.rb
82
86
  lib/whois/answer/parser/whois.nic.travel.rb
@@ -120,6 +124,7 @@ lib/whois/server/adapters/verisign.rb
120
124
  lib/whois/server/adapters/web.rb
121
125
  lib/whois/version.rb
122
126
  tasks/server.rake
127
+ test/answer/contact_test.rb
123
128
  test/answer/parser/base_test.rb
124
129
  test/answer/parser/blank_test.rb
125
130
  test/answer/parser/jobswhois.verisign-grs.com_test.rb
@@ -130,6 +135,7 @@ test/answer/parser/whois.afilias-grs.info_test.rb
130
135
  test/answer/parser/whois.afilias.info_test.rb
131
136
  test/answer/parser/whois.ai_test.rb
132
137
  test/answer/parser/whois.arnes.si_test.rb
138
+ test/answer/parser/whois.ausregistry.net.au_test.rb
133
139
  test/answer/parser/whois.biz_test.rb
134
140
  test/answer/parser/whois.cat_test.rb
135
141
  test/answer/parser/whois.cira.ca_test.rb
@@ -157,6 +163,8 @@ test/answer/parser/whois.nic-se.se_test.rb
157
163
  test/answer/parser/whois.nic.ac_test.rb
158
164
  test/answer/parser/whois.nic.af_test.rb
159
165
  test/answer/parser/whois.nic.ag_test.rb
166
+ test/answer/parser/whois.nic.am_test.rb
167
+ test/answer/parser/whois.nic.as_test.rb
160
168
  test/answer/parser/whois.nic.asia_test.rb
161
169
  test/answer/parser/whois.nic.at_test.rb
162
170
  test/answer/parser/whois.nic.cc_test.rb
@@ -177,6 +185,7 @@ test/answer/parser/whois.nic.mx_test.rb
177
185
  test/answer/parser/whois.nic.name_test.rb
178
186
  test/answer/parser/whois.nic.nu_test.rb
179
187
  test/answer/parser/whois.nic.or.kr_test.rb
188
+ test/answer/parser/whois.nic.st_test.rb
180
189
  test/answer/parser/whois.nic.tel_test.rb
181
190
  test/answer/parser/whois.nic.tl_test.rb
182
191
  test/answer/parser/whois.nic.travel_test.rb
@@ -256,6 +265,8 @@ test/testcases/responses/whois.ai/available.txt
256
265
  test/testcases/responses/whois.ai/registered.txt
257
266
  test/testcases/responses/whois.arnes.si/available.txt
258
267
  test/testcases/responses/whois.arnes.si/registered.txt
268
+ test/testcases/responses/whois.ausregistry.net.au/available.txt
269
+ test/testcases/responses/whois.ausregistry.net.au/registered.txt
259
270
  test/testcases/responses/whois.biz/available.txt
260
271
  test/testcases/responses/whois.biz/registered.txt
261
272
  test/testcases/responses/whois.cat/available.txt
@@ -272,7 +283,8 @@ test/testcases/responses/whois.denic.de/1-10-0_available.txt
272
283
  test/testcases/responses/whois.denic.de/1-10-0_registered.txt
273
284
  test/testcases/responses/whois.denic.de/available.txt
274
285
  test/testcases/responses/whois.denic.de/error_invalid_domain_name.txt
275
- test/testcases/responses/whois.denic.de/nameservers_with_ip.txt
286
+ test/testcases/responses/whois.denic.de/property_nameservers_with_ip.txt
287
+ test/testcases/responses/whois.denic.de/property_technical_contact.txt
276
288
  test/testcases/responses/whois.denic.de/registered.txt
277
289
  test/testcases/responses/whois.dk-hostmaster.dk/available.txt
278
290
  test/testcases/responses/whois.dk-hostmaster.dk/registered.txt
@@ -295,7 +307,7 @@ test/testcases/responses/whois.educause.edu/registered.txt
295
307
  test/testcases/responses/whois.eu.org/available.txt
296
308
  test/testcases/responses/whois.eu.org/registered.txt
297
309
  test/testcases/responses/whois.eu/available.txt
298
- test/testcases/responses/whois.eu/nameservers_with_ip.txt
310
+ test/testcases/responses/whois.eu/property_nameservers_with_ip.txt
299
311
  test/testcases/responses/whois.eu/registered.txt
300
312
  test/testcases/responses/whois.hkdnr.net.hk/available.txt
301
313
  test/testcases/responses/whois.hkdnr.net.hk/registered.txt
@@ -311,7 +323,7 @@ test/testcases/responses/whois.meregistry.net/registered.txt
311
323
  test/testcases/responses/whois.museum/available.txt
312
324
  test/testcases/responses/whois.museum/registered.txt
313
325
  test/testcases/responses/whois.nic-se.se/available.txt
314
- test/testcases/responses/whois.nic-se.se/nameservers_with_ip.txt
326
+ test/testcases/responses/whois.nic-se.se/property_nameservers_with_ip.txt
315
327
  test/testcases/responses/whois.nic-se.se/registered.txt
316
328
  test/testcases/responses/whois.nic.ac/available.txt
317
329
  test/testcases/responses/whois.nic.ac/registered.txt
@@ -319,6 +331,10 @@ test/testcases/responses/whois.nic.af/available.txt
319
331
  test/testcases/responses/whois.nic.af/registered.txt
320
332
  test/testcases/responses/whois.nic.ag/available.txt
321
333
  test/testcases/responses/whois.nic.ag/registered.txt
334
+ test/testcases/responses/whois.nic.am/available.txt
335
+ test/testcases/responses/whois.nic.am/registered.txt
336
+ test/testcases/responses/whois.nic.as/available.txt
337
+ test/testcases/responses/whois.nic.as/registered.txt
322
338
  test/testcases/responses/whois.nic.asia/available.txt
323
339
  test/testcases/responses/whois.nic.asia/registered.txt
324
340
  test/testcases/responses/whois.nic.at/available.txt
@@ -357,7 +373,9 @@ test/testcases/responses/whois.nic.im/registered.txt
357
373
  test/testcases/responses/whois.nic.io/available.txt
358
374
  test/testcases/responses/whois.nic.io/registered.txt
359
375
  test/testcases/responses/whois.nic.it/available.txt
360
- test/testcases/responses/whois.nic.it/contact.txt
376
+ test/testcases/responses/whois.nic.it/property_admin_contact.txt
377
+ test/testcases/responses/whois.nic.it/property_registrant_contact.txt
378
+ test/testcases/responses/whois.nic.it/property_technical_contact.txt
361
379
  test/testcases/responses/whois.nic.it/registered.txt
362
380
  test/testcases/responses/whois.nic.it/status_active.txt
363
381
  test/testcases/responses/whois.nic.it/status_available.txt
@@ -378,6 +396,8 @@ test/testcases/responses/whois.nic.nu/available.txt
378
396
  test/testcases/responses/whois.nic.nu/registered.txt
379
397
  test/testcases/responses/whois.nic.or.kr/available.txt
380
398
  test/testcases/responses/whois.nic.or.kr/registered.txt
399
+ test/testcases/responses/whois.nic.st/available.txt
400
+ test/testcases/responses/whois.nic.st/registered.txt
381
401
  test/testcases/responses/whois.nic.tel/available.txt
382
402
  test/testcases/responses/whois.nic.tel/registered.txt
383
403
  test/testcases/responses/whois.nic.tl/available.txt
data/lib/whois.rb CHANGED
@@ -63,8 +63,8 @@ module Whois
63
63
  def self.available?(qstring)
64
64
  query(qstring).available?
65
65
  rescue ParserNotFound => e
66
- $stderr.puts "This method is not supported for this kind of object.\n" +
67
- "Use Whois.query('#{qstring}') instead."
66
+ warn "This method is not supported for this kind of object.\n" +
67
+ "Use Whois.query('#{qstring}') instead."
68
68
  nil
69
69
  end
70
70
 
@@ -87,8 +87,8 @@ module Whois
87
87
  def self.registered?(qstring)
88
88
  query(qstring).registered?
89
89
  rescue ParserNotFound => e
90
- $stderr.puts "This method is not supported for this kind of object.\n" +
91
- "Use Whois.query('#{qstring}') instead."
90
+ warn "This method is not supported for this kind of object.\n" +
91
+ "Use Whois.query('#{qstring}') instead."
92
92
  nil
93
93
  end
94
94
 
@@ -101,7 +101,7 @@ module Whois
101
101
 
102
102
  def self.deprecate(message = nil)
103
103
  message ||= "You are using deprecated behavior which will be removed from the next major or minor release."
104
- $stderr.puts("DEPRECATION WARNING: #{message}")
104
+ warn("DEPRECATION WARNING: #{message}")
105
105
  end
106
106
 
107
107
  end
data/lib/whois/answer.rb CHANGED
@@ -82,6 +82,7 @@ module Whois
82
82
  @content ||= parts.map(&:response).join("\n")
83
83
  end
84
84
 
85
+
85
86
  # Returns whether this answer changed compared to <tt>other</tt>.
86
87
  #
87
88
  # Comparing the Answer contents is not always as trivial as it seems.
@@ -102,6 +103,9 @@ module Whois
102
103
  parser.unchanged?(other.parser)
103
104
  end
104
105
 
106
+ def contacts
107
+ parser.contacts
108
+ end
105
109
 
106
110
 
107
111
  # Lazy-loads and returns a <tt>Whois::Answer::Parser</tt> proxy for current answer.
@@ -130,7 +134,7 @@ module Whois
130
134
 
131
135
  # Delegates all method calls to the internal parser.
132
136
  def method_missing(method, *args, &block)
133
- if Parser.properties.include?(method)
137
+ if (Parser.properties + Parser::METHODS).include?(method)
134
138
  self.class.class_eval foo = %{
135
139
  def #{method}(*args, &block)
136
140
  if property_supported?(:#{method})
@@ -142,7 +146,7 @@ module Whois
142
146
  }, __FILE__, __LINE__
143
147
  send(method, *args, &block)
144
148
 
145
- elsif method.to_s =~ /([a-z_]+)\?/ and Parser.properties.include?($1.to_sym)
149
+ elsif method.to_s =~ /([a-z_]+)\?/ and (Parser.properties + Parser::METHODS).include?($1.to_sym)
146
150
  self.class.class_eval %{
147
151
  def #{$1}?
148
152
  !#{$1}.nil?
@@ -23,29 +23,30 @@ module Whois
23
23
  #
24
24
  # = Contacts
25
25
  #
26
- # Holds the details of a Contact extracted from the WHOIS answer.
26
+ # Holds the details of a <tt>Contact</tt> extracted from the WHOIS <tt>Answer</tt>.
27
27
  #
28
- # A Contact is composed by the following attributes:
28
+ # A <tt>Contact</tt> is composed by the following attributes:
29
29
  #
30
- # <tt>:id</tt>::
31
- # <tt>:name</tt>::
32
- # <tt>:organization</tt>::
33
- # <tt>:address</tt>::
34
- # <tt>:city</tt>::
35
- # <tt>:zip</tt>::
36
- # <tt>:state</tt>::
37
- # <tt>:country</tt>::
38
- # <tt>:country_code</tt>::
39
- # <tt>:phone</tt>::
40
- # <tt>:fax</tt>::
41
- # <tt>:email</tt>::
42
- # <tt>:created_on</tt>::
43
- # <tt>:updated_on</tt>::
30
+ # * <tt>:id</tt>:
31
+ # * <tt>:type</tt>: the contact type.
32
+ # * <tt>:name</tt>:
33
+ # * <tt>:organization</tt>:
34
+ # * <tt>:address</tt>:
35
+ # * <tt>:city</tt>:
36
+ # * <tt>:zip</tt>:
37
+ # * <tt>:state</tt>:
38
+ # * <tt>:country</tt>:
39
+ # * <tt>:country_code</tt>:
40
+ # * <tt>:phone</tt>:
41
+ # * <tt>:fax</tt>:
42
+ # * <tt>:email</tt>:
43
+ # * <tt>:created_on</tt>:
44
+ # * <tt>:updated_on</tt>:
44
45
  #
45
46
  # Be aware that every WHOIS server can return a different number of details
46
47
  # or no details at all.
47
48
  #
48
- class Contact < SuperStruct.new(:id, :name, :organization,
49
+ class Contact < SuperStruct.new(:id, :name, :organization, :type,
49
50
  :address, :city, :zip, :state, :country, :country_code,
50
51
  :phone, :fax, :email,
51
52
  :created_on, :updated_on)
@@ -22,13 +22,20 @@ module Whois
22
22
  #
23
23
  class Parser
24
24
 
25
+ METHODS = [
26
+ :contacts,
27
+ # deprecated methods
28
+ :registrant, :admin, :technical,
29
+ ]
30
+
25
31
  @@properties = [
26
32
  :disclaimer,
27
33
  :domain, :domain_id,
28
34
  :referral_whois, :referral_url,
29
35
  :status, :available?, :registered?,
30
36
  :created_on, :updated_on, :expires_on,
31
- :registrar, :registrant, :admin, :technical,
37
+ :registrar,
38
+ :registrant_contact, :admin_contact, :technical_contact,
32
39
  :nameservers,
33
40
  ]
34
41
 
@@ -61,11 +68,19 @@ module Whois
61
68
  end
62
69
 
63
70
 
71
+ # Collects and returns all the contacts from all parsers.
72
+ def contacts
73
+ parsers.inject([]) { |all, parser| all.concat(parser.contacts) }
74
+ end
75
+
76
+
64
77
  private
65
78
 
66
79
  def method_missing(method, *args, &block)
67
80
  if Parser.properties.include?(method)
68
81
  delegate_to_parsers(method, *args, &block)
82
+ elsif Parser::METHODS.include?(method)
83
+ delegate_to_parsers(method, *args, &block)
69
84
  else
70
85
  super
71
86
  end
@@ -188,10 +188,6 @@ module Whois
188
188
  @part = part
189
189
  end
190
190
 
191
- ::Whois::Answer::Parser.properties.each do |property|
192
- property_not_implemented(property)
193
- end
194
-
195
191
  def part
196
192
  @part
197
193
  end
@@ -219,6 +215,46 @@ module Whois
219
215
  end
220
216
 
221
217
 
218
+ ::Whois::Answer::Parser.properties.each do |property|
219
+ property_not_implemented(property)
220
+ end
221
+
222
+
223
+ # Returns an array of all supported contacts.
224
+ def contacts
225
+ contacts = []
226
+ contacts.concat([*registrant_contact]) if property_supported?(:registrant_contact)
227
+ contacts.concat([*admin_contact]) if property_supported?(:admin_contact)
228
+ contacts.concat([*technical_contact]) if property_supported?(:technical_contact)
229
+ contacts.compact
230
+ end
231
+
232
+
233
+ # @deprecated {#registrant} is deprecated
234
+ # and will be removed in a future version.
235
+ # Use {#registrant_contact}.
236
+ def registrant
237
+ Whois.deprecate "Whois::Answer::Parser::Base#registrant is deprecated and will be removed in a future version. Use Whois::Answer::Parser::Base#registrant_contact."
238
+ registrant_contact
239
+ end
240
+
241
+ # @deprecated {#admin} is deprecated
242
+ # and will be removed in a future version.
243
+ # Use {#admin_contact}.
244
+ def admin
245
+ Whois.deprecate "Whois::Answer::Parser::Base#admin is deprecated and will be removed in a future version. Use Whois::Answer::Parser::Base#admin_contact."
246
+ admin_contact
247
+ end
248
+
249
+ # @deprecated {#technical} is deprecated
250
+ # and will be removed in a future version.
251
+ # Use {#technical_contact}.
252
+ def technical
253
+ Whois.deprecate "Whois::Answer::Parser::Base#technical is deprecated and will be removed in a future version. Use Whois::Answer::Parser::Base#technical_contact."
254
+ technical_contact
255
+ end
256
+
257
+
222
258
  protected
223
259
 
224
260
  def content_for_scanner
@@ -0,0 +1,71 @@
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.ausregistry.net.au parser
26
+ #
27
+ # Parser for the whois.ausregistry.net.au 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 WhoisAusregistryNetAu < Base
36
+
37
+ property_supported :status do
38
+ @status ||= if content_for_scanner =~ /Status:\s+(.*)\n/
39
+ $1
40
+ end
41
+ end
42
+
43
+ property_supported :available? do
44
+ @available ||= (content_for_scanner.strip == "No Data Found")
45
+ end
46
+
47
+ property_supported :registered? do
48
+ !available?
49
+ end
50
+
51
+
52
+ property_not_supported :created_on
53
+
54
+ property_supported :updated_on do
55
+ @updated_on ||= if content_for_scanner =~ /Last Modified:\s+(.*)\n/
56
+ Time.parse($1)
57
+ end
58
+ end
59
+
60
+ property_not_supported :expires_on
61
+
62
+
63
+ property_supported :nameservers do
64
+ @nameservers ||= content_for_scanner.scan(/Name Server:\s+(.+)\n/).flatten
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -68,16 +68,16 @@ module Whois
68
68
  end
69
69
  end
70
70
 
71
- property_supported :registrant do
72
- node("Holder")
71
+ property_supported :registrant_contact do
72
+ @registrant_contact ||= node("Holder")
73
73
  end
74
74
 
75
- property_supported :admin do
76
- node("Admin-C")
75
+ property_supported :admin_contact do
76
+ @admin_contact ||= node("Admin-C")
77
77
  end
78
78
 
79
- property_supported :technical do
80
- node("Tech-C")
79
+ property_supported :technical_contact do
80
+ @technical_contact ||= node("Tech-C")
81
81
  end
82
82
 
83
83