wmap 2.4.4

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.
Files changed (141) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +141 -0
  3. data/LICENSE.txt +15 -0
  4. data/README.rdoc +98 -0
  5. data/TODO +13 -0
  6. data/bin/deprime +21 -0
  7. data/bin/distrust +38 -0
  8. data/bin/googleBot +23 -0
  9. data/bin/prime +21 -0
  10. data/bin/refresh +26 -0
  11. data/bin/run_tests +16 -0
  12. data/bin/spiderBot +26 -0
  13. data/bin/trust +38 -0
  14. data/bin/updateAll +57 -0
  15. data/bin/wadd +25 -0
  16. data/bin/wadds +26 -0
  17. data/bin/wcheck +28 -0
  18. data/bin/wdel +25 -0
  19. data/bin/wdump +21 -0
  20. data/bin/wmap +151 -0
  21. data/bin/wscan +32 -0
  22. data/data/cidrs +2 -0
  23. data/data/deactivated_sites +1 -0
  24. data/data/domains +2 -0
  25. data/data/hosts +1 -0
  26. data/data/prime_hosts +1 -0
  27. data/data/sites +2 -0
  28. data/data/sub_domains +2 -0
  29. data/demos/bruter.rb +27 -0
  30. data/demos/dns_brutes.rb +28 -0
  31. data/demos/filter_cidr.rb +18 -0
  32. data/demos/filter_crawls.rb +5 -0
  33. data/demos/filter_domain.rb +25 -0
  34. data/demos/filter_geoip.rb +26 -0
  35. data/demos/filter_known_services.rb +59 -0
  36. data/demos/filter_netinfo.rb +23 -0
  37. data/demos/filter_prime.rb +25 -0
  38. data/demos/filter_profiler.rb +3 -0
  39. data/demos/filter_redirection.rb +19 -0
  40. data/demos/filter_site.rb +40 -0
  41. data/demos/filter_siteip.rb +31 -0
  42. data/demos/filter_status.rb +17 -0
  43. data/demos/filter_timestamp.rb +23 -0
  44. data/demos/filter_url.rb +19 -0
  45. data/demos/new_fnd.rb +66 -0
  46. data/demos/nmap_parser.pl +138 -0
  47. data/demos/site_format.rb +18 -0
  48. data/demos/whois_domain.rb +78 -0
  49. data/dicts/GeoIP.dat +0 -0
  50. data/dicts/GeoIPASNum.dat +0 -0
  51. data/dicts/GeoLiteCity.dat +0 -0
  52. data/dicts/ccsld.txt +2646 -0
  53. data/dicts/cctld.txt +243 -0
  54. data/dicts/gtld.txt +25 -0
  55. data/dicts/hostnames-dict.big +1402 -0
  56. data/dicts/hostnames-dict.txt +101 -0
  57. data/lib/wmap/cidr_tracker.rb +327 -0
  58. data/lib/wmap/dns_bruter.rb +308 -0
  59. data/lib/wmap/domain_tracker/sub_domain.rb +142 -0
  60. data/lib/wmap/domain_tracker.rb +342 -0
  61. data/lib/wmap/geoip_tracker.rb +72 -0
  62. data/lib/wmap/google_search_scraper.rb +177 -0
  63. data/lib/wmap/host_tracker/primary_host.rb +130 -0
  64. data/lib/wmap/host_tracker.rb +550 -0
  65. data/lib/wmap/network_profiler.rb +144 -0
  66. data/lib/wmap/port_scanner.rb +208 -0
  67. data/lib/wmap/site_tracker/deactivated_site.rb +85 -0
  68. data/lib/wmap/site_tracker.rb +937 -0
  69. data/lib/wmap/url_checker.rb +314 -0
  70. data/lib/wmap/url_crawler.rb +381 -0
  71. data/lib/wmap/utils/domain_root.rb +184 -0
  72. data/lib/wmap/utils/logger.rb +53 -0
  73. data/lib/wmap/utils/url_magic.rb +343 -0
  74. data/lib/wmap/utils/utils.rb +333 -0
  75. data/lib/wmap/whois.rb +76 -0
  76. data/lib/wmap.rb +227 -0
  77. data/logs/wmap.log +17 -0
  78. data/ruby_whois_patches/base_cocca2.rb +149 -0
  79. data/ruby_whois_patches/kero.yachay.pe.rb +120 -0
  80. data/ruby_whois_patches/whois.PublicDomainRegistry.com.rb +124 -0
  81. data/ruby_whois_patches/whois.above.com.rb +61 -0
  82. data/ruby_whois_patches/whois.adamsnames.tc.rb +107 -0
  83. data/ruby_whois_patches/whois.aeda.net.ae.rb +105 -0
  84. data/ruby_whois_patches/whois.ai.rb +112 -0
  85. data/ruby_whois_patches/whois.arnes.si.rb +121 -0
  86. data/ruby_whois_patches/whois.ascio.com.rb +91 -0
  87. data/ruby_whois_patches/whois.cnnic.cn.rb +123 -0
  88. data/ruby_whois_patches/whois.corporatedomains.com.rb +67 -0
  89. data/ruby_whois_patches/whois.crsnic.net.rb +108 -0
  90. data/ruby_whois_patches/whois.denic.de.rb +174 -0
  91. data/ruby_whois_patches/whois.dk-hostmaster.dk.rb +120 -0
  92. data/ruby_whois_patches/whois.dns.be.rb +134 -0
  93. data/ruby_whois_patches/whois.dns.lu.rb +129 -0
  94. data/ruby_whois_patches/whois.dns.pl.rb +150 -0
  95. data/ruby_whois_patches/whois.dns.pt.rb +119 -0
  96. data/ruby_whois_patches/whois.domain.kg.rb +126 -0
  97. data/ruby_whois_patches/whois.domainregistry.my.rb +123 -0
  98. data/ruby_whois_patches/whois.domreg.lt.rb +110 -0
  99. data/ruby_whois_patches/whois.dot.tk.rb +140 -0
  100. data/ruby_whois_patches/whois.hkirc.hk.rb +121 -0
  101. data/ruby_whois_patches/whois.isnic.is.rb +130 -0
  102. data/ruby_whois_patches/whois.je.rb +119 -0
  103. data/ruby_whois_patches/whois.jprs.jp.rb +137 -0
  104. data/ruby_whois_patches/whois.kenic.or.ke.rb +140 -0
  105. data/ruby_whois_patches/whois.markmonitor.com.rb +118 -0
  106. data/ruby_whois_patches/whois.melbourneit.com.rb +58 -0
  107. data/ruby_whois_patches/whois.nic.as.rb +96 -0
  108. data/ruby_whois_patches/whois.nic.at.rb +109 -0
  109. data/ruby_whois_patches/whois.nic.ch.rb +141 -0
  110. data/ruby_whois_patches/whois.nic.cl.rb +117 -0
  111. data/ruby_whois_patches/whois.nic.ec.rb +157 -0
  112. data/ruby_whois_patches/whois.nic.im.rb +120 -0
  113. data/ruby_whois_patches/whois.nic.it.rb +170 -0
  114. data/ruby_whois_patches/whois.nic.lv.rb +116 -0
  115. data/ruby_whois_patches/whois.nic.ly.rb +127 -0
  116. data/ruby_whois_patches/whois.nic.mu.rb +27 -0
  117. data/ruby_whois_patches/whois.nic.mx.rb +123 -0
  118. data/ruby_whois_patches/whois.nic.net.sa.rb +111 -0
  119. data/ruby_whois_patches/whois.nic.or.kr.rb +101 -0
  120. data/ruby_whois_patches/whois.nic.tel.rb +129 -0
  121. data/ruby_whois_patches/whois.nic.tr.rb +133 -0
  122. data/ruby_whois_patches/whois.nic.us.rb +129 -0
  123. data/ruby_whois_patches/whois.nic.ve.rb +135 -0
  124. data/ruby_whois_patches/whois.norid.no.rb +127 -0
  125. data/ruby_whois_patches/whois.pandi.or.id.rb +118 -0
  126. data/ruby_whois_patches/whois.psi-usa.info.rb +63 -0
  127. data/ruby_whois_patches/whois.registro.br.rb +109 -0
  128. data/ruby_whois_patches/whois.registrygate.com.rb +55 -0
  129. data/ruby_whois_patches/whois.rrpproxy.net.rb +61 -0
  130. data/ruby_whois_patches/whois.sgnic.sg.rb +130 -0
  131. data/ruby_whois_patches/whois.srs.net.nz.rb +166 -0
  132. data/ruby_whois_patches/whois.tucows.com.rb +70 -0
  133. data/ruby_whois_patches/whois.twnic.net.tw.rb +133 -0
  134. data/settings/discovery_ports +24 -0
  135. data/settings/google_keywords.txt +9 -0
  136. data/settings/google_locator.txt +23 -0
  137. data/test/domain_tracker_test.rb +31 -0
  138. data/test/utils_test.rb +168 -0
  139. data/version.txt +13 -0
  140. data/wmap.gemspec +49 -0
  141. metadata +202 -0
@@ -0,0 +1,174 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+ require 'whois/record/scanners/whois.denic.de.rb'
12
+
13
+
14
+ module Whois
15
+ class Record
16
+ class Parser
17
+
18
+ # Parser for the whois.denic.de server.
19
+ #
20
+ # @author Simone Carletti <weppos@weppos.net>
21
+ # @author Aaron Mueller <mail@aaron-mueller.de>
22
+ #
23
+ class WhoisDenicDe < Base
24
+ include Scanners::Nodable
25
+
26
+ property_supported :disclaimer do
27
+ node("Disclaimer")
28
+ end
29
+
30
+
31
+ property_supported :domain do
32
+ node("Domain")
33
+ end
34
+
35
+ property_not_supported :domain_id
36
+
37
+
38
+ property_supported :status do
39
+ if node("Status")
40
+ case node("Status")
41
+ when "connect" then :registered
42
+ when "free" then :available
43
+ when "invalid" then :invalid
44
+ # NEWSTATUS (inactive)
45
+ # The domain is registered, but there is not DNS entry for it.
46
+ when "failed" then :registered
47
+ else
48
+ Whois.bug!(ParserError, "Unknown status `#{node("Status")}'.")
49
+ end
50
+ else
51
+ if version < "2.0"
52
+ if invalid?
53
+ :invalid
54
+ else
55
+ :available
56
+ end
57
+ else
58
+ Whois.bug!(ParserError, "Unable to parse status.")
59
+ end
60
+ end
61
+ end
62
+
63
+ property_supported :available? do
64
+ !invalid? && (!!node("status:available") || node("Status") == "free")
65
+ end
66
+
67
+ property_supported :registered? do
68
+ !invalid? && !available?
69
+ end
70
+
71
+
72
+ property_not_supported :created_on
73
+
74
+ property_supported :updated_on do
75
+ node("Changed") { |raw| Time.parse(raw) }
76
+ end
77
+
78
+ property_not_supported :expires_on
79
+
80
+
81
+ property_supported :registrar do
82
+ node("Zone-C") do |raw|
83
+ Record::Registrar.new(
84
+ :id => nil,
85
+ :name => raw["name"],
86
+ :organization => raw["organization"],
87
+ :url => nil
88
+ )
89
+ end
90
+ end
91
+
92
+ property_supported :registrant_contacts do
93
+ build_contact("Holder", Whois::Record::Contact::TYPE_REGISTRANT)
94
+ end
95
+
96
+ property_supported :admin_contacts do
97
+ build_contact("Admin-C", Whois::Record::Contact::TYPE_ADMIN)
98
+ end
99
+
100
+ # FIXME: check against different schema
101
+
102
+ property_supported :technical_contacts do
103
+ build_contact("Tech-C", Whois::Record::Contact::TYPE_TECHNICAL)
104
+ end
105
+
106
+
107
+ # Nameservers are listed in the following formats:
108
+ #
109
+ # Nserver: ns1.prodns.de. 213.160.64.75
110
+ # Nserver: ns1.prodns.de.
111
+ #
112
+ property_supported :nameservers do
113
+ node("Nserver") do |values|
114
+ values.map do |line|
115
+ name, ipv4 = line.split(/\s+/)
116
+ Record::Nameserver.new(:name => name.chomp("."), :ipv4 => ipv4)
117
+ end
118
+ end
119
+ end
120
+
121
+
122
+ # Checks whether the response has been throttled.
123
+ #
124
+ # @return [Boolean]
125
+ #
126
+ # @example
127
+ # % Error: 55000000002 Connection refused; access control limit reached.
128
+ #
129
+ def response_throttled?
130
+ !!node("response:throttled")
131
+ end
132
+
133
+
134
+ # NEWPROPERTY
135
+ def version
136
+ cached_properties_fetch :version do
137
+ if content_for_scanner =~ /^% Version: (.+)$/
138
+ $1
139
+ end
140
+ end
141
+ end
142
+
143
+ # NEWPROPERTY
144
+ def invalid?
145
+ cached_properties_fetch :invalid? do
146
+ !!node("status:invalid") || node("Status") == "invalid"
147
+ end
148
+ end
149
+
150
+
151
+ # Initializes a new {Scanners::WhoisDenicDe} instance
152
+ # passing the {#content_for_scanner}
153
+ # and calls +parse+ on it.
154
+ #
155
+ # @return [Hash]
156
+ def parse
157
+ Scanners::WhoisDenicDe.new(content_for_scanner).parse
158
+ end
159
+
160
+
161
+ private
162
+
163
+ def build_contact(element, type)
164
+ node(element) do |raw|
165
+ Record::Contact.new(raw) do |c|
166
+ c.type = type
167
+ end
168
+ end
169
+ end
170
+
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,120 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+
12
+
13
+ module Whois
14
+ class Record
15
+ class Parser
16
+
17
+ # Parser for the whois.dk-hostmaster.dk server.
18
+ #
19
+ # @note This parser is just a stub and provides only a few basic methods
20
+ # to check for domain availability and get domain status.
21
+ # Please consider to contribute implementing missing methods.
22
+ #
23
+ # @see Whois::Record::Parser::Example
24
+ # The Example parser for the list of all available methods.
25
+ #
26
+ # @author Simone Carletti <weppos@weppos.net>
27
+ # @author Mikkel Kristensen <mikkel@tdx.dk>
28
+ #
29
+ class WhoisDkHostmasterDk < Base
30
+
31
+ property_supported :status do
32
+ if content_for_scanner =~ /Status:\s+(.+?)\n/
33
+ case $1.downcase
34
+ when "active"
35
+ :registered
36
+ when "deactivated"
37
+ :expired
38
+ else
39
+ Whois.bug!(ParserError, "Unknown status `#{$1}'.")
40
+ end
41
+ else
42
+ :available
43
+ end
44
+ end
45
+
46
+ property_supported :available? do
47
+ !!(content_for_scanner =~ /^No entries found for the selected source/)
48
+ end
49
+
50
+ property_supported :registered? do
51
+ !available?
52
+ end
53
+
54
+
55
+ property_supported :created_on do
56
+ if content_for_scanner =~ /Registered:\s+(.*)\n/
57
+ Time.parse($1)
58
+ end
59
+ end
60
+
61
+ property_not_supported :updated_on
62
+
63
+ property_supported :expires_on do
64
+ if content_for_scanner =~ /Expires:\s+(.*)\n/
65
+ Time.parse($1)
66
+ end
67
+ end
68
+
69
+ property_supported :nameservers do
70
+ content_for_scanner.scan(/Hostname:\s+(.+)\n/).flatten.map do |name|
71
+ Record::Nameserver.new(:name => name)
72
+ end
73
+ end
74
+
75
+ # The following methods are implemented by Yang Li on 01/29/2013
76
+ # ----------------------------------------------------------------------------
77
+ property_supported :domain do
78
+ return $1 if content_for_scanner =~ /Domain:\s+(.+)\n/i
79
+ end
80
+
81
+ property_not_supported :domain_id
82
+
83
+ property_not_supported :registrar
84
+
85
+ property_supported :admin_contacts do
86
+ build_contact("Administrator", Whois::Record::Contact::TYPE_ADMIN)
87
+ end
88
+
89
+ property_supported :registrant_contacts do
90
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
91
+ end
92
+
93
+ property_not_supported :technical_contacts
94
+
95
+ property_not_supported :billing_contacts
96
+
97
+ private
98
+
99
+ def build_contact(element, type)
100
+ reg=Record::Contact.new(:type => type)
101
+ if content_for_scanner =~ /^#{element}\n((.+\n)+)\n/i
102
+ $1.scan(/^(.+):\s+(.+)\n/).map do |entry|
103
+ reg["id"]=entry[1] if entry[0] =~ /Handle/i
104
+ reg["name"]=entry[1] if entry[0] =~ /Name/i
105
+ reg["organization"]=entry[1] if entry[0]=~ /Name/i
106
+ reg["address"]=entry[1] if entry[0]=~ /Address/i
107
+ reg["city"]= entry[1] if entry[0]=~ /City/i
108
+ reg["zip"]=entry[1] if entry[0]=~ /PostalCode/i
109
+ reg["country_code"]=entry[1] if entry[0]=~ /Country/i
110
+ reg["phone"]=entry[1] if entry[0]=~ /Phone/i
111
+ end
112
+ end
113
+ return reg
114
+ end
115
+ # ----------------------------------------------------------------------------
116
+
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,134 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+
12
+
13
+ module Whois
14
+ class Record
15
+ class Parser
16
+
17
+ # Parser for the whois.dns.be server.
18
+ #
19
+ # @note This parser is just a stub and provides only a few basic methods
20
+ # to check for domain availability and get domain status.
21
+ # Please consider to contribute implementing missing methods.
22
+ #
23
+ # @see Whois::Record::Parser::Example
24
+ # The Example parser for the list of all available methods.
25
+ #
26
+ class WhoisDnsBe < Base
27
+
28
+ property_supported :status do
29
+ if content_for_scanner =~ /Status:\s+(.+?)\n/
30
+ case $1.downcase
31
+ when "available" then :available
32
+ when "not available" then :registered
33
+ when "quarantine" then :redemption
34
+ when "out of service" then :redemption
35
+ # old response
36
+ when "registered" then :registered
37
+ when "free" then :available
38
+ else
39
+ Whois.bug!(ParserError, "Unknown status `#{$1}'.")
40
+ end
41
+ else
42
+ Whois.bug!(ParserError, "Unable to parse status.")
43
+ end
44
+ end
45
+
46
+ property_supported :available? do
47
+ (status == :available)
48
+ end
49
+
50
+ property_supported :registered? do
51
+ !available?
52
+ end
53
+
54
+ property_supported :created_on do
55
+ if content_for_scanner =~ /Registered:\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
+ property_supported :nameservers do
65
+ if content_for_scanner =~ /Nameservers:\s((.+\n)+)\n/
66
+ $1.split("\n").map do |line|
67
+ if line.strip =~ /(.+) \((.+)\)/
68
+ Record::Nameserver.new(:name => $1, :ipv4 => $2)
69
+ else
70
+ Record::Nameserver.new(:name => line.strip)
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ # Checks whether the response has been throttled.
77
+ #
78
+ # @return [Boolean]
79
+ def response_throttled?
80
+ !!(content_for_scanner =~ /^% (Excessive querying|Maximum queries per hour reached)/)
81
+ end
82
+
83
+ # The following methods are implemented by Yang Li on 01/24/2013
84
+ # ----------------------------------------------------------------------------
85
+ property_supported :domain do
86
+ return $1 if content_for_scanner =~ /Domain Name:\s+(.*)\n/i
87
+ end
88
+
89
+ property_supported :domain_id do
90
+ return $1 if content_for_scanner =~ /Domain ID:\s+(.*)\n/i
91
+ end
92
+
93
+ property_supported :registrar do
94
+ reg=Record::Registrar.new
95
+ if content_for_scanner =~ /Registrar Technical Contacts:\n((.+\n)+)\n/
96
+ $1.scan(/^(.+?):(.+?)\n/).map do |entry|
97
+ reg["name"] = entry[1].strip if entry[0] =~ /Name/i
98
+ reg["organization"] = entry[1] if entry[0] =~ /Organisation/i
99
+ reg["url"] = entry[1] if entry[0] =~ /Email/i
100
+ end
101
+ end
102
+ return reg
103
+ end
104
+
105
+ property_supported :registrant_contacts do
106
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
107
+ end
108
+
109
+ property_not_supported :admin_contacts
110
+
111
+ property_not_supported :technical_contacts
112
+
113
+ property_not_supported :billing_contacts
114
+
115
+ private
116
+
117
+ def build_contact(element, type)
118
+ reg=Record::Contact.new(:type => type)
119
+ if content_for_scanner =~ /^#{element}:\n((.+\n)+)\n/i
120
+ line_num=1
121
+ $1.split(%r{\n}).each do |entry|
122
+ reg["name"]=entry.strip if line_num==1
123
+ reg["organization"]=entry.strip if line_num==1
124
+ line_num=line_num+1
125
+ end
126
+ end
127
+ return reg
128
+ end
129
+ # ----------------------------------------------------------------------------
130
+
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,129 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+
12
+
13
+ module Whois
14
+ class Record
15
+ class Parser
16
+
17
+ #
18
+ # = whois.dns.lu parser
19
+ #
20
+ # Parser for the whois.dns.lu server.
21
+ #
22
+ # NOTE: This parser is just a stub and provides only a few basic methods
23
+ # to check for domain availability and get domain status.
24
+ # Please consider to contribute implementing missing methods.
25
+ # See WhoisNicIt parser for an explanation of all available methods
26
+ # and examples.
27
+ #
28
+ class WhoisDnsLu < Base
29
+
30
+ property_supported :status do
31
+ if content_for_scanner =~ /domaintype:\s+(.+)\n/
32
+ case $1.downcase
33
+ when "active" then :registered
34
+ else
35
+ Whois.bug!(ParserError, "Unknown status `#{$1}'.")
36
+ end
37
+ else
38
+ :available
39
+ end
40
+ end
41
+
42
+ property_supported :available? do
43
+ !!(content_for_scanner =~ /% No such domain/)
44
+ end
45
+
46
+ property_supported :registered? do
47
+ !available?
48
+ end
49
+
50
+
51
+ property_supported :created_on do
52
+ if content_for_scanner =~ /registered:\s+(.*)\n/
53
+ # Force the parser to use the dd/mm/yyyy format.
54
+ Time.utc(*$1.split("/").reverse)
55
+ end
56
+ end
57
+
58
+ property_not_supported :updated_on
59
+
60
+ property_not_supported :expires_on
61
+
62
+
63
+ property_supported :nameservers do
64
+ content_for_scanner.scan(/nserver:\s+(.+)\n/).flatten.map do |line|
65
+ if line =~ /(.+) \[(.+)\]/
66
+ Record::Nameserver.new(:name => $1, :ipv4 => $2)
67
+ else
68
+ Record::Nameserver.new(:name => line)
69
+ end
70
+ end
71
+ end
72
+
73
+ # The following methods are implemented by Yang Li on 01/29/2013
74
+ # ----------------------------------------------------------------------------
75
+ property_supported :domain do
76
+ return $1 if content_for_scanner =~ /domainname:\s+(.*)\n/i
77
+ end
78
+
79
+ property_supported :domain_id do
80
+ return $1 if content_for_scanner =~ /Domain ID:\s+(.*)\n/i
81
+ end
82
+
83
+ property_supported :registrar do
84
+ reg=Record::Registrar.new
85
+ content_for_scanner.scan(/^registrar-(.*):\s+(.+)\n/).map do |entry|
86
+ reg["name"] = entry[1] if entry[0] =~ /name/i
87
+ reg["url"] = entry[1] if entry[0] =~ /url/i
88
+ reg["email"] = entry[1] if entry[0] =~ /email/i
89
+ reg["country"] = entry[1] if entry[0] =~ /country/i
90
+ end
91
+ return reg
92
+ end
93
+
94
+ property_supported :registrant_contacts do
95
+ build_contact("org", Whois::Record::Contact::TYPE_REGISTRANT)
96
+ end
97
+
98
+ property_supported :admin_contacts do
99
+ build_contact("adm", Whois::Record::Contact::TYPE_ADMIN)
100
+ end
101
+
102
+ property_supported :technical_contacts do
103
+ build_contact("tec", Whois::Record::Contact::TYPE_TECHNICAL)
104
+ end
105
+
106
+ property_not_supported :billing_contacts
107
+
108
+ private
109
+
110
+ def build_contact(element, type)
111
+ reg=Record::Contact.new(:type => type)
112
+ content_for_scanner.scan(/^#{element}-(.*):\s+(.+)\n/).map do |entry|
113
+ reg["name"]=entry[1] if entry[0] =~ /name/i
114
+ reg["address"]=entry[1] if entry[0]=~ /address/i
115
+ reg["city"]= entry[1] if entry[0]=~ /city/i
116
+ reg["zip"]=entry[1] if entry[0]=~ /ZipCode/i
117
+ reg["country_code"]=entry[1] if entry[0]=~ /country/i
118
+ reg["phone"]=entry[1] if entry[0]=~ /#{element}\sPhone\sNumber/i
119
+ reg["fax"]=entry[1] if entry[0]=~ /#{element}\sFacsimile\sNumber/i
120
+ reg["email"]=entry[1] if entry[0]=~ /#{element}\sEmail/i
121
+ end
122
+ return reg
123
+ end
124
+ # ----------------------------------------------------------------------------
125
+
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,150 @@
1
+ #--
2
+ # Ruby Whois
3
+ #
4
+ # An intelligent pure Ruby WHOIS client and parser.
5
+ #
6
+ # Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
7
+ #++
8
+
9
+
10
+ require 'whois/record/parser/base'
11
+
12
+
13
+ module Whois
14
+ class Record
15
+ class Parser
16
+
17
+ # Parser for the whois.dns.pl server.
18
+ #
19
+ # @see Whois::Record::Parser::Example
20
+ # The Example parser for the list of all available methods.
21
+ #
22
+ class WhoisDnsPl < Base
23
+
24
+ property_supported :domain do
25
+ if content_for_scanner =~ /DOMAIN NAME:\s+(.+)\n/
26
+ $1
27
+ end
28
+ end
29
+
30
+ property_not_supported :domain_id
31
+
32
+
33
+ property_supported :status do
34
+ if available?
35
+ :available
36
+ else
37
+ :registered
38
+ end
39
+ end
40
+
41
+ property_supported :available? do
42
+ !!(content_for_scanner =~ /^No information available about domain name/)
43
+ end
44
+
45
+ property_supported :registered? do
46
+ !available?
47
+ end
48
+
49
+
50
+ property_supported :created_on do
51
+ if content_for_scanner =~ /created:\s+(.+?)\n/
52
+ Time.parse($1)
53
+ end
54
+ end
55
+
56
+ property_supported :updated_on do
57
+ if content_for_scanner =~ /last modified:\s+(.+?)\n/
58
+ Time.parse($1)
59
+ end
60
+ end
61
+
62
+ property_supported :expires_on do
63
+ if content_for_scanner =~ /renewal date:\s+(.+?)\n/
64
+ Time.parse($1)
65
+ end
66
+ end
67
+
68
+
69
+ property_supported :registrar do
70
+ match = content_for_scanner.slice(/REGISTRAR:\n((.+\n)+)\n/, 1)
71
+ return unless match
72
+
73
+ lines = match.split("\n")
74
+ Record::Registrar.new(
75
+ :name => lines[0]
76
+ )
77
+ end
78
+
79
+
80
+ property_supported :registrant_contacts do
81
+ reg=Record::Contact.new(:type => Whois::Record::Contact::TYPE_REGISTRANT)
82
+ if content_for_scanner =~ /^Registrant data (.+)/
83
+ reg['name']=$1
84
+ reg['organization']=$1
85
+ end
86
+ return reg
87
+ end
88
+
89
+ property_not_supported :admin_contacts
90
+
91
+ property_supported :technical_contacts do
92
+ build_contact("TECHNICAL CONTACT", Record::Contact::TYPE_TECHNICAL)
93
+ end
94
+
95
+
96
+ property_supported :nameservers do
97
+ content_for_scanner.scan(/nameservers:\s+(.+)\n(.+)\n/).flatten.map do |line|
98
+ line.strip!
99
+ if line =~ /(.+) \[(.+)\]/
100
+ Record::Nameserver.new(:name => $1.chomp("."), :ipv4 => $2)
101
+ else
102
+ Record::Nameserver.new(:name => line.chomp("."))
103
+ end
104
+ end
105
+ end
106
+
107
+
108
+ private
109
+
110
+ def build_contact(element, type)
111
+ match = content_for_scanner.slice(/#{element}:\n((.+\n)+)\n/, 1)
112
+ return unless match
113
+
114
+ values = parse_contact_block(match.split("\n"))
115
+ zip, city = values["city"].match(/(.+?) (.+)/)[1..2]
116
+
117
+ Record::Contact.new(
118
+ :type => type,
119
+ :id => values["handle"],
120
+ :name => nil,
121
+ :organization => values["company"],
122
+ :address => values["street"],
123
+ :city => city,
124
+ :zip => zip,
125
+ :state => nil,
126
+ :country_code => values["location"],
127
+ :phone => values["phone"],
128
+ :fax => values["fax"],
129
+ :email => nil
130
+ )
131
+ end
132
+
133
+ def parse_contact_block(lines)
134
+ key = nil
135
+ hash = {}
136
+ lines.each do |line|
137
+ if line =~ /(.+):(.+)/
138
+ hash[key = $1] = $2.strip
139
+ else
140
+ hash[key] += "\n#{line.strip}"
141
+ end
142
+ end
143
+ hash
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+ end
150
+ end