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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +141 -0
- data/LICENSE.txt +15 -0
- data/README.rdoc +98 -0
- data/TODO +13 -0
- data/bin/deprime +21 -0
- data/bin/distrust +38 -0
- data/bin/googleBot +23 -0
- data/bin/prime +21 -0
- data/bin/refresh +26 -0
- data/bin/run_tests +16 -0
- data/bin/spiderBot +26 -0
- data/bin/trust +38 -0
- data/bin/updateAll +57 -0
- data/bin/wadd +25 -0
- data/bin/wadds +26 -0
- data/bin/wcheck +28 -0
- data/bin/wdel +25 -0
- data/bin/wdump +21 -0
- data/bin/wmap +151 -0
- data/bin/wscan +32 -0
- data/data/cidrs +2 -0
- data/data/deactivated_sites +1 -0
- data/data/domains +2 -0
- data/data/hosts +1 -0
- data/data/prime_hosts +1 -0
- data/data/sites +2 -0
- data/data/sub_domains +2 -0
- data/demos/bruter.rb +27 -0
- data/demos/dns_brutes.rb +28 -0
- data/demos/filter_cidr.rb +18 -0
- data/demos/filter_crawls.rb +5 -0
- data/demos/filter_domain.rb +25 -0
- data/demos/filter_geoip.rb +26 -0
- data/demos/filter_known_services.rb +59 -0
- data/demos/filter_netinfo.rb +23 -0
- data/demos/filter_prime.rb +25 -0
- data/demos/filter_profiler.rb +3 -0
- data/demos/filter_redirection.rb +19 -0
- data/demos/filter_site.rb +40 -0
- data/demos/filter_siteip.rb +31 -0
- data/demos/filter_status.rb +17 -0
- data/demos/filter_timestamp.rb +23 -0
- data/demos/filter_url.rb +19 -0
- data/demos/new_fnd.rb +66 -0
- data/demos/nmap_parser.pl +138 -0
- data/demos/site_format.rb +18 -0
- data/demos/whois_domain.rb +78 -0
- data/dicts/GeoIP.dat +0 -0
- data/dicts/GeoIPASNum.dat +0 -0
- data/dicts/GeoLiteCity.dat +0 -0
- data/dicts/ccsld.txt +2646 -0
- data/dicts/cctld.txt +243 -0
- data/dicts/gtld.txt +25 -0
- data/dicts/hostnames-dict.big +1402 -0
- data/dicts/hostnames-dict.txt +101 -0
- data/lib/wmap/cidr_tracker.rb +327 -0
- data/lib/wmap/dns_bruter.rb +308 -0
- data/lib/wmap/domain_tracker/sub_domain.rb +142 -0
- data/lib/wmap/domain_tracker.rb +342 -0
- data/lib/wmap/geoip_tracker.rb +72 -0
- data/lib/wmap/google_search_scraper.rb +177 -0
- data/lib/wmap/host_tracker/primary_host.rb +130 -0
- data/lib/wmap/host_tracker.rb +550 -0
- data/lib/wmap/network_profiler.rb +144 -0
- data/lib/wmap/port_scanner.rb +208 -0
- data/lib/wmap/site_tracker/deactivated_site.rb +85 -0
- data/lib/wmap/site_tracker.rb +937 -0
- data/lib/wmap/url_checker.rb +314 -0
- data/lib/wmap/url_crawler.rb +381 -0
- data/lib/wmap/utils/domain_root.rb +184 -0
- data/lib/wmap/utils/logger.rb +53 -0
- data/lib/wmap/utils/url_magic.rb +343 -0
- data/lib/wmap/utils/utils.rb +333 -0
- data/lib/wmap/whois.rb +76 -0
- data/lib/wmap.rb +227 -0
- data/logs/wmap.log +17 -0
- data/ruby_whois_patches/base_cocca2.rb +149 -0
- data/ruby_whois_patches/kero.yachay.pe.rb +120 -0
- data/ruby_whois_patches/whois.PublicDomainRegistry.com.rb +124 -0
- data/ruby_whois_patches/whois.above.com.rb +61 -0
- data/ruby_whois_patches/whois.adamsnames.tc.rb +107 -0
- data/ruby_whois_patches/whois.aeda.net.ae.rb +105 -0
- data/ruby_whois_patches/whois.ai.rb +112 -0
- data/ruby_whois_patches/whois.arnes.si.rb +121 -0
- data/ruby_whois_patches/whois.ascio.com.rb +91 -0
- data/ruby_whois_patches/whois.cnnic.cn.rb +123 -0
- data/ruby_whois_patches/whois.corporatedomains.com.rb +67 -0
- data/ruby_whois_patches/whois.crsnic.net.rb +108 -0
- data/ruby_whois_patches/whois.denic.de.rb +174 -0
- data/ruby_whois_patches/whois.dk-hostmaster.dk.rb +120 -0
- data/ruby_whois_patches/whois.dns.be.rb +134 -0
- data/ruby_whois_patches/whois.dns.lu.rb +129 -0
- data/ruby_whois_patches/whois.dns.pl.rb +150 -0
- data/ruby_whois_patches/whois.dns.pt.rb +119 -0
- data/ruby_whois_patches/whois.domain.kg.rb +126 -0
- data/ruby_whois_patches/whois.domainregistry.my.rb +123 -0
- data/ruby_whois_patches/whois.domreg.lt.rb +110 -0
- data/ruby_whois_patches/whois.dot.tk.rb +140 -0
- data/ruby_whois_patches/whois.hkirc.hk.rb +121 -0
- data/ruby_whois_patches/whois.isnic.is.rb +130 -0
- data/ruby_whois_patches/whois.je.rb +119 -0
- data/ruby_whois_patches/whois.jprs.jp.rb +137 -0
- data/ruby_whois_patches/whois.kenic.or.ke.rb +140 -0
- data/ruby_whois_patches/whois.markmonitor.com.rb +118 -0
- data/ruby_whois_patches/whois.melbourneit.com.rb +58 -0
- data/ruby_whois_patches/whois.nic.as.rb +96 -0
- data/ruby_whois_patches/whois.nic.at.rb +109 -0
- data/ruby_whois_patches/whois.nic.ch.rb +141 -0
- data/ruby_whois_patches/whois.nic.cl.rb +117 -0
- data/ruby_whois_patches/whois.nic.ec.rb +157 -0
- data/ruby_whois_patches/whois.nic.im.rb +120 -0
- data/ruby_whois_patches/whois.nic.it.rb +170 -0
- data/ruby_whois_patches/whois.nic.lv.rb +116 -0
- data/ruby_whois_patches/whois.nic.ly.rb +127 -0
- data/ruby_whois_patches/whois.nic.mu.rb +27 -0
- data/ruby_whois_patches/whois.nic.mx.rb +123 -0
- data/ruby_whois_patches/whois.nic.net.sa.rb +111 -0
- data/ruby_whois_patches/whois.nic.or.kr.rb +101 -0
- data/ruby_whois_patches/whois.nic.tel.rb +129 -0
- data/ruby_whois_patches/whois.nic.tr.rb +133 -0
- data/ruby_whois_patches/whois.nic.us.rb +129 -0
- data/ruby_whois_patches/whois.nic.ve.rb +135 -0
- data/ruby_whois_patches/whois.norid.no.rb +127 -0
- data/ruby_whois_patches/whois.pandi.or.id.rb +118 -0
- data/ruby_whois_patches/whois.psi-usa.info.rb +63 -0
- data/ruby_whois_patches/whois.registro.br.rb +109 -0
- data/ruby_whois_patches/whois.registrygate.com.rb +55 -0
- data/ruby_whois_patches/whois.rrpproxy.net.rb +61 -0
- data/ruby_whois_patches/whois.sgnic.sg.rb +130 -0
- data/ruby_whois_patches/whois.srs.net.nz.rb +166 -0
- data/ruby_whois_patches/whois.tucows.com.rb +70 -0
- data/ruby_whois_patches/whois.twnic.net.tw.rb +133 -0
- data/settings/discovery_ports +24 -0
- data/settings/google_keywords.txt +9 -0
- data/settings/google_locator.txt +23 -0
- data/test/domain_tracker_test.rb +31 -0
- data/test/utils_test.rb +168 -0
- data/version.txt +13 -0
- data/wmap.gemspec +49 -0
- 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
|