/lib/whois/record/parser/base_whoisd.rb

http://github.com/weppos/whois · Ruby · 147 lines · 105 code · 32 blank · 10 comment · 7 complexity · d6561bf261904cdbb4ad837d06fcd057 MD5 · raw file

  1. #--
  2. # Ruby Whois
  3. #
  4. # An intelligent pure Ruby WHOIS client and parser.
  5. #
  6. # Copyright (c) 2009-2013 Simone Carletti <weppos@weppos.net>
  7. #++
  8. require 'whois/record/parser/base'
  9. require 'whois/record/scanners/base_whoisd'
  10. module Whois
  11. class Record
  12. class Parser
  13. # Base parser for Whoisd servers.
  14. #
  15. # @abstract
  16. class BaseWhoisd < Base
  17. include Scanners::Scannable
  18. class_attribute :status_mapping
  19. self.status_mapping = {
  20. "paid and in zone" => :registered,
  21. "expired" => :expired,
  22. }
  23. self.scanner = Scanners::BaseWhoisd
  24. property_supported :domain do
  25. node('domain')
  26. end
  27. property_not_supported :domain_id
  28. property_supported :status do
  29. node('status') do |value|
  30. values = Array.wrap(value)
  31. status = values.each do |s|
  32. v = self.class.status_mapping[s.downcase]
  33. break v if v
  34. end
  35. status || Whois.bug!(ParserError, "Unknown status `#{string}'.")
  36. end || :available
  37. end
  38. property_supported :available? do
  39. !!node('status:available')
  40. end
  41. property_supported :registered? do
  42. !available?
  43. end
  44. property_supported :created_on do
  45. node('registered') { |string| Time.parse(string) }
  46. end
  47. property_supported :updated_on do
  48. node('changed') { |string| Time.parse(string) }
  49. end
  50. property_supported :expires_on do
  51. node('expire') { |string| Time.parse(string) }
  52. end
  53. property_supported :registrar do
  54. node('registrar') do |string|
  55. Whois::Record::Registrar.new(
  56. :id => string,
  57. :name => string
  58. )
  59. end
  60. end
  61. property_supported :registrant_contacts do
  62. node('registrant') do |value|
  63. build_contact(value, Record::Contact::TYPE_REGISTRANT)
  64. end
  65. end
  66. property_supported :admin_contacts do
  67. node('admin-c') do |value|
  68. build_contact(value, Record::Contact::TYPE_ADMINISTRATIVE)
  69. end
  70. end
  71. property_supported :technical_contacts do
  72. id = node_nsset['tech-c'] rescue nil
  73. if id
  74. build_contact(id, Record::Contact::TYPE_TECHNICAL)
  75. end
  76. end
  77. property_supported :nameservers do
  78. lines = node_nsset['nserver'] rescue nil
  79. Array.wrap(lines).map do |line|
  80. if line =~ /(.+) \((.+)\)/
  81. name = $1
  82. ipv4, ipv6 = $2.split(', ')
  83. Record::Nameserver.new(:name => name, :ipv4 => ipv4, :ipv6 => ipv6)
  84. else
  85. Record::Nameserver.new(:name => line.strip)
  86. end
  87. end
  88. end
  89. private
  90. def node_nsset
  91. node("node:nsset/#{node("nsset")}")
  92. end
  93. def build_contact(element, type)
  94. node("node:contact/#{element}") do |hash|
  95. address = hash['street'] || hash['address']
  96. address = address.join("\n") if address.respond_to?(:join)
  97. Record::Contact.new(
  98. :type => type,
  99. :id => element,
  100. :name => hash['name'],
  101. :organization => hash['org'],
  102. :address => address,
  103. :city => hash['city'],
  104. :zip => hash['postal code'],
  105. :country_code => hash['country'],
  106. :phone => hash['phone'],
  107. :email => hash['e-mail'],
  108. :created_on => Time.parse(hash['created'])
  109. )
  110. end
  111. end
  112. end
  113. end
  114. end
  115. end