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,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