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,118 @@
|
|
|
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.markmonitor.com server.
|
|
18
|
+
#
|
|
19
|
+
# @see Whois::Record::Parser::Example
|
|
20
|
+
# The Example parser for the list of all available methods.
|
|
21
|
+
class WhoisMarkmonitorCom < Base
|
|
22
|
+
|
|
23
|
+
property_not_supported :status
|
|
24
|
+
|
|
25
|
+
# The server is contacted only in case of a registered domain.
|
|
26
|
+
property_supported :available? do
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
property_supported :registered? do
|
|
31
|
+
!available?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
property_supported :created_on do
|
|
36
|
+
if content_for_scanner =~ /Created on\.+: (.+)\.\n/
|
|
37
|
+
Time.parse($1)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
property_supported :updated_on do
|
|
42
|
+
if content_for_scanner =~ /Record last updated on\.+: (.+)\.\n/
|
|
43
|
+
Time.parse($1)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
property_supported :expires_on do
|
|
48
|
+
if content_for_scanner =~ /Expires on\.+: (.+)\.\n/
|
|
49
|
+
Time.parse($1)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
property_supported :registrar do
|
|
55
|
+
Record::Registrar.new(
|
|
56
|
+
:name => content_for_scanner.slice(/Registrar Name: (.+)\n/, 1),
|
|
57
|
+
:url => content_for_scanner.slice(/Registrar Homepage: (.+)\n/, 1)
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
property_supported :registrant_contacts do
|
|
62
|
+
build_contact('Registrant:', Record::Contact::TYPE_REGISTRANT)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
property_supported :admin_contacts do
|
|
66
|
+
build_contact('Administrative Contact:', Record::Contact::TYPE_ADMIN)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
property_supported :technical_contacts do
|
|
70
|
+
build_contact('Technical Contact, Zone Contact:', Record::Contact::TYPE_TECHNICAL)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
property_supported :nameservers do
|
|
75
|
+
if content_for_scanner =~ /Domain servers in listed order:\n\n((?:\s*[^\s\n]+\n)+)/
|
|
76
|
+
$1.split("\n").map do |line|
|
|
77
|
+
Record::Nameserver.new(:name => line.strip)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def build_contact(element, type)
|
|
86
|
+
match = content_for_scanner.slice(/#{element}\n((.+\n){6})/, 1)
|
|
87
|
+
return unless match
|
|
88
|
+
|
|
89
|
+
lines = match.split("\n").map(&:strip)
|
|
90
|
+
|
|
91
|
+
# 0 DNS Admin
|
|
92
|
+
# 1 Google Inc.
|
|
93
|
+
# 2 1600 Amphitheatre Parkway
|
|
94
|
+
# 3 Mountain View CA 94043
|
|
95
|
+
# 4 US
|
|
96
|
+
# 5 dns-admin@google.com +1.6506234000 Fax: +1.6506188571
|
|
97
|
+
city, state, zip = lines[3].scan(/^(.+) ([A-Z]{2}) ([0-9]+)$/).first
|
|
98
|
+
email, phone, fax = lines[5].scan(/^(.+) (.+) Fax: (.+)$/).first
|
|
99
|
+
Record::Contact.new(
|
|
100
|
+
:type => type,
|
|
101
|
+
:name => lines[0],
|
|
102
|
+
:organization => lines[1],
|
|
103
|
+
:address => lines[2],
|
|
104
|
+
:city => city,
|
|
105
|
+
:state => state,
|
|
106
|
+
:zip => zip,
|
|
107
|
+
:country_code => lines[4],
|
|
108
|
+
:email => email,
|
|
109
|
+
:phone => phone,
|
|
110
|
+
:fax => fax
|
|
111
|
+
)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
require 'whois/record/parser/base'
|
|
10
|
+
|
|
11
|
+
module Whois
|
|
12
|
+
class Record
|
|
13
|
+
class Parser
|
|
14
|
+
|
|
15
|
+
# Parser for the whois.corporatedomains.com server, added by Yang Li 02/05/2013.
|
|
16
|
+
class WhoisMelbourneitCom < Base
|
|
17
|
+
|
|
18
|
+
property_supported :admin_contacts do
|
|
19
|
+
build_contact("Admin Name", Whois::Record::Contact::TYPE_ADMIN)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
property_supported :registrant_contacts do
|
|
23
|
+
build_contact("Domain Name", Whois::Record::Contact::TYPE_REGISTRANT)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
property_supported :technical_contacts do
|
|
27
|
+
build_contact("Tech Name", Whois::Record::Contact::TYPE_TECHNICAL)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
property_not_supported :billing_contacts
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def build_contact(element, type)
|
|
35
|
+
reg=Record::Contact.new(:type => type)
|
|
36
|
+
if content_for_scanner =~ /^#{element}\.+((.+\n)+)\n/i
|
|
37
|
+
line_num=1
|
|
38
|
+
addrs=''
|
|
39
|
+
$1.split(%r{\n}).each do |entry|
|
|
40
|
+
reg["name"]=entry if line_num==1
|
|
41
|
+
reg["organization"]=entry.strip.split(%r{\.\s}).last if entry =~ /Organisation Name/i
|
|
42
|
+
reg["phone"]=entry.strip.split(%r{\.\s}).last.strip if entry =~ /Phone/i
|
|
43
|
+
reg["fax"]=entry.strip.split(%r{\.\s}).last.strip if entry =~ /Fax/i
|
|
44
|
+
reg["email"]=entry.strip.split(%r{\.\s}).last.strip if entry =~ /Email/i
|
|
45
|
+
if entry =~ /Address\./i && !entry.strip.split(%r{\.\s})[1].nil?
|
|
46
|
+
addrs = addrs + entry.strip.split(%r{\.\s})[1] + ", "
|
|
47
|
+
end
|
|
48
|
+
reg["address"]=addrs
|
|
49
|
+
line_num=line_num+1
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
return reg
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
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.nic.as parser
|
|
19
|
+
#
|
|
20
|
+
# Parser for the whois.nic.as 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 WhoisNicAs < Base
|
|
29
|
+
|
|
30
|
+
property_supported :status do
|
|
31
|
+
if available?
|
|
32
|
+
:available
|
|
33
|
+
else
|
|
34
|
+
:registered
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
property_supported :available? do
|
|
39
|
+
!!(content_for_scanner =~ /Domain Not Found/)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
property_supported :registered? do
|
|
43
|
+
!available?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
property_not_supported :created_on
|
|
47
|
+
|
|
48
|
+
property_not_supported :updated_on
|
|
49
|
+
|
|
50
|
+
property_not_supported :expires_on
|
|
51
|
+
|
|
52
|
+
property_supported :nameservers do
|
|
53
|
+
if content_for_scanner =~ /Nameservers:\s((.+\n)+)\n/
|
|
54
|
+
$1.split("\n").reject { |value| value.strip.empty? }.map do |line|
|
|
55
|
+
line.strip =~ /(.+) \((.+)\)/
|
|
56
|
+
Record::Nameserver.new(:name => $1, :ipv4 => $2)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# The following methods are implemented by Yang Li on 02/092013
|
|
62
|
+
# ----------------------------------------------------------------------------
|
|
63
|
+
property_supported :domain do
|
|
64
|
+
return $1 if content_for_scanner =~ /Name:\s+(.*)\n/i
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
property_not_supported :domain_id
|
|
68
|
+
|
|
69
|
+
property_not_supported :registrar
|
|
70
|
+
|
|
71
|
+
property_supported :registrant_contacts do
|
|
72
|
+
build_contact("Registered by", Whois::Record::Contact::TYPE_REGISTRANT)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
property_not_supported :admin_contacts
|
|
76
|
+
|
|
77
|
+
property_not_supported :technical_contacts
|
|
78
|
+
|
|
79
|
+
property_not_supported :billing_contacts
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
def build_contact(element, type)
|
|
84
|
+
reg=Record::Contact.new(:type => type)
|
|
85
|
+
content_for_scanner.scan(/^(#{element}.*):\s+(.+)\n/).map do |entry|
|
|
86
|
+
reg["name"]=entry[1] if entry[0] =~ /#{element}/i
|
|
87
|
+
reg["organization"]=entry[1] if entry[0]=~ /#{element}/i
|
|
88
|
+
end
|
|
89
|
+
return reg
|
|
90
|
+
end
|
|
91
|
+
# ----------------------------------------------------------------------------
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
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.nic.at 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 WhoisNicAt < Base
|
|
27
|
+
|
|
28
|
+
property_supported :status do
|
|
29
|
+
if available?
|
|
30
|
+
:available
|
|
31
|
+
else
|
|
32
|
+
:registered
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
property_supported :available? do
|
|
37
|
+
!!(content_for_scanner =~ /% nothing found/)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
property_supported :registered? do
|
|
41
|
+
!available?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
property_not_supported :created_on
|
|
46
|
+
|
|
47
|
+
property_supported :updated_on do
|
|
48
|
+
if content_for_scanner =~ /changed:\s+(.*)\n/
|
|
49
|
+
Time.parse($1)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
property_not_supported :expires_on
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
property_supported :nameservers do
|
|
57
|
+
content_for_scanner.scan(/nserver:\s+(.+)\n/).flatten.map do |name|
|
|
58
|
+
Record::Nameserver.new(:name => name)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# The following methods are implemented by Yang Li on 01/29/2013
|
|
63
|
+
# ----------------------------------------------------------------------------
|
|
64
|
+
property_supported :domain do
|
|
65
|
+
return $1 if content_for_scanner =~ /domain:\s+(.*)\n/i
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
property_not_supported :domain_id
|
|
69
|
+
|
|
70
|
+
property_not_supported :registrar
|
|
71
|
+
|
|
72
|
+
property_supported :admin_contacts do
|
|
73
|
+
build_contact(1, Whois::Record::Contact::TYPE_ADMIN)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
property_supported :registrant_contacts do
|
|
77
|
+
build_contact(0, Whois::Record::Contact::TYPE_REGISTRANT)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
property_supported :technical_contacts do
|
|
81
|
+
build_contact(2, Whois::Record::Contact::TYPE_TECHNICAL)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
property_not_supported :billing_contacts
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def build_contact(index, type)
|
|
89
|
+
reg=Record::Contact.new(:type => type)
|
|
90
|
+
contacts=content_for_scanner.scan(/^(personname:.+\n((.+\n)+))\n/)
|
|
91
|
+
contacts[index][0].scan(/(.+):(.+)\n/).map do |entry|
|
|
92
|
+
reg["id"]=entry[1].strip if entry[0] =~ /nic-hdl/i
|
|
93
|
+
reg["name"]=entry[1].strip if entry[0] =~ /personname/i
|
|
94
|
+
reg["organization"]=entry[1].strip if entry[0]=~ /organization/i
|
|
95
|
+
reg["address"]=entry[1].strip if entry[0]=~ /street\saddress/i
|
|
96
|
+
reg["city"]= entry[1].strip if entry[0]=~ /city/i
|
|
97
|
+
reg["zip"]=entry[1].strip if entry[0]=~ /postal\scode/i
|
|
98
|
+
reg["country"]=entry[1].strip if entry[0]=~ /country/i
|
|
99
|
+
reg["phone"]=entry[1].strip if entry[0]=~ /phone/i
|
|
100
|
+
reg["fax"]=entry[1].strip if entry[0]=~ /fax\-no/i
|
|
101
|
+
reg["email"]=entry[1].strip if entry[0]=~ /e\-mail/i
|
|
102
|
+
end
|
|
103
|
+
return reg
|
|
104
|
+
end
|
|
105
|
+
# ----------------------------------------------------------------------------
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
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.nic.ch parser
|
|
19
|
+
#
|
|
20
|
+
# Parser for the whois.nic.ch 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 WhoisNicCh < Base
|
|
29
|
+
|
|
30
|
+
property_supported :status do
|
|
31
|
+
if available?
|
|
32
|
+
:available
|
|
33
|
+
else
|
|
34
|
+
:registered
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
property_supported :available? do
|
|
39
|
+
!!(content_for_scanner =~ /We do not have an entry/)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
property_supported :registered? do
|
|
43
|
+
!available?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
property_not_supported :created_on
|
|
48
|
+
|
|
49
|
+
property_not_supported :updated_on
|
|
50
|
+
|
|
51
|
+
property_not_supported :expires_on
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# Nameservers are listed in the following formats:
|
|
55
|
+
#
|
|
56
|
+
# ns1.citrin.ch
|
|
57
|
+
# ns1.citrin.ch [193.247.72.8]
|
|
58
|
+
#
|
|
59
|
+
property_supported :nameservers do
|
|
60
|
+
if content_for_scanner =~ /Name servers:\n((.+\n)+)(?:\n|\z)/
|
|
61
|
+
list = {}
|
|
62
|
+
order = []
|
|
63
|
+
$1.split("\n").map do |line|
|
|
64
|
+
if line =~ /(.+)\t\[(.+)\]/
|
|
65
|
+
name, ip = $1, $2
|
|
66
|
+
order << name unless order.include?(name)
|
|
67
|
+
list[name] ||= Record::Nameserver.new(:name => name)
|
|
68
|
+
list[name].ipv4 = ip if Whois::Server.valid_ipv4?(ip)
|
|
69
|
+
list[name].ipv6 = ip if Whois::Server.valid_ipv6?(ip)
|
|
70
|
+
else
|
|
71
|
+
order << line unless order.include?(line)
|
|
72
|
+
list[line] ||= Record::Nameserver.new(:name => line)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
order.map { |name| list[name] }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# The following methods are implemented by Yang Li on 01/29/2013
|
|
80
|
+
# ----------------------------------------------------------------------------
|
|
81
|
+
property_supported :domain do
|
|
82
|
+
return $1 if content_for_scanner =~ /Domain name:\n(.+\..+)\n/i
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
property_not_supported :domain_id
|
|
86
|
+
|
|
87
|
+
property_not_supported :registrar
|
|
88
|
+
|
|
89
|
+
property_not_supported :admin_contacts
|
|
90
|
+
|
|
91
|
+
property_supported :registrant_contacts do
|
|
92
|
+
build_contact("Holder of domain name", Whois::Record::Contact::TYPE_REGISTRANT)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
property_supported :technical_contacts do
|
|
96
|
+
build_tech_contact("Technical Contact", Whois::Record::Contact::TYPE_TECHNICAL)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
property_not_supported :billing_contacts
|
|
100
|
+
|
|
101
|
+
private
|
|
102
|
+
|
|
103
|
+
def build_contact(element, type)
|
|
104
|
+
reg=Record::Contact.new(:type => type)
|
|
105
|
+
if content_for_scanner =~ /^(#{element}:\n(.+\n)+)\n/i
|
|
106
|
+
line_num=1
|
|
107
|
+
$1.split(%r{\n}).each do |line|
|
|
108
|
+
reg["name"]=line.strip if line_num==3
|
|
109
|
+
reg["organization"]=line.strip if line_num==2
|
|
110
|
+
reg["address"]=line.strip if line_num==4
|
|
111
|
+
reg["city"]=line.strip if line_num==5
|
|
112
|
+
reg["country"]=line.strip if line_num==6
|
|
113
|
+
line_num=line_num+1
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
return reg
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def build_tech_contact(element, type)
|
|
120
|
+
reg=Record::Contact.new(:type => type)
|
|
121
|
+
if content_for_scanner =~ /^(#{element}:\n(.+\n)+)\n/i
|
|
122
|
+
line_num=1
|
|
123
|
+
$1.split(%r{\n}).each do |line|
|
|
124
|
+
reg["organization"]=line.strip if line_num==2
|
|
125
|
+
reg["name"]=line.strip if line_num==3
|
|
126
|
+
addrs=line.strip if line_num==4
|
|
127
|
+
addrs="#{addrs}"+"\n"+line.strip if line_num==5
|
|
128
|
+
reg["address"]=addrs if line_num==5
|
|
129
|
+
reg["city"]=line.strip if line_num==6
|
|
130
|
+
reg["country"]=line.strip if line_num==7
|
|
131
|
+
line_num=line_num+1
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
return reg
|
|
135
|
+
end
|
|
136
|
+
# ----------------------------------------------------------------------------
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
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.nic.cl parser
|
|
19
|
+
#
|
|
20
|
+
# Parser for the whois.nic.cl 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 WhoisNicCl < Base
|
|
29
|
+
|
|
30
|
+
property_supported :status do
|
|
31
|
+
if available?
|
|
32
|
+
:available
|
|
33
|
+
else
|
|
34
|
+
:registered
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
property_supported :available? do
|
|
39
|
+
!!(content_for_scanner =~ /^(.+?): no existe$/)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
property_supported :registered? do
|
|
43
|
+
!available?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
property_not_supported :created_on
|
|
47
|
+
|
|
48
|
+
# TODO: custom date format with foreign month names
|
|
49
|
+
# property_supported :updated_on do
|
|
50
|
+
# if content_for_scanner =~ /changed:\s+(.*)\n/
|
|
51
|
+
# Time.parse($1.split(" ", 2).last)
|
|
52
|
+
# end
|
|
53
|
+
# end
|
|
54
|
+
|
|
55
|
+
property_not_supported :expires_on
|
|
56
|
+
|
|
57
|
+
property_supported :updated_on do
|
|
58
|
+
if content_for_scanner =~ /\(data repository last updated on\):\s*(.+)\n/
|
|
59
|
+
Time.utc(*$1.split("/").reverse)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
property_supported :nameservers do
|
|
64
|
+
if content_for_scanner =~ /Servidores de nombre \(Domain servers\):\n((.+\n)+)\n/
|
|
65
|
+
$1.split("\n").map do |line|
|
|
66
|
+
line.strip!
|
|
67
|
+
line =~ /(.+) \((.+)\)/
|
|
68
|
+
Record::Nameserver.new(:name => $1, :ipv4 => $2)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# The following methods are implemented by Yang Li on 01/24/2013
|
|
74
|
+
# ----------------------------------------------------------------------------
|
|
75
|
+
property_supported :domain do
|
|
76
|
+
return $1 if content_for_scanner =~ /ACE:\s+(.+)\s*.+\n/i
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
property_supported :registrant_contacts do
|
|
80
|
+
build_contact_rc(Whois::Record::Contact::TYPE_REGISTRANT)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
property_supported :admin_contacts do
|
|
84
|
+
build_contact("Administrative Contact", Whois::Record::Contact::TYPE_ADMIN)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
property_supported :technical_contacts do
|
|
88
|
+
build_contact("Technical Contact", Whois::Record::Contact::TYPE_TECHNICAL)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
property_not_supported :billing_contacts
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
def build_contact(element, type)
|
|
96
|
+
reg=Record::Contact.new(:type => type)
|
|
97
|
+
if content_for_scanner.scan =~ /#{element}\):\n((.+\n)+)\n/
|
|
98
|
+
$1.scan(/^(.+):(.+)\n/).map do |entry|
|
|
99
|
+
reg["name"]=entry[1] if entry[0] =~ /Nombre/i
|
|
100
|
+
reg["organization"]=entry[1] if entry[0]=~ /Organiz/i
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
return reg
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def build_contact_rc(type)
|
|
107
|
+
reg=Record::Contact.new(:type => type)
|
|
108
|
+
reg["name"]=content_for_scanner.split(%r{\n})[4].strip
|
|
109
|
+
reg["organization"]=content_for_scanner.split(%r{\n})[4].strip
|
|
110
|
+
return reg
|
|
111
|
+
end
|
|
112
|
+
# ----------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|