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,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.nic.us parser
19
+ #
20
+ # Parser for the whois.nic.us 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 WhoisNicUs < Base
29
+
30
+ property_supported :status do
31
+ content_for_scanner.scan(/Domain Status:\s+(.+?)\n/).flatten
32
+ end
33
+
34
+ property_supported :available? do
35
+ !!(content_for_scanner =~ /Not found:/)
36
+ end
37
+
38
+ property_supported :registered? do
39
+ !available?
40
+ end
41
+
42
+
43
+ property_supported :created_on do
44
+ if content_for_scanner =~ /Domain Registration Date:\s+(.+?)\n/
45
+ Time.parse($1)
46
+ end
47
+ end
48
+
49
+ property_supported :updated_on do
50
+ if content_for_scanner =~ /Domain Last Updated Date:\s+(.+?)\n/
51
+ Time.parse($1)
52
+ end
53
+ end
54
+
55
+ property_supported :expires_on do
56
+ if content_for_scanner =~ /Domain Expiration Date:\s+(.+?)\n/
57
+ Time.parse($1)
58
+ end
59
+ end
60
+
61
+
62
+ property_supported :nameservers do
63
+ content_for_scanner.scan(/Name Server:\s+(.+)\n/).flatten.map do |name|
64
+ Record::Nameserver.new(:name => name.downcase)
65
+ end
66
+ end
67
+
68
+ # The following methods are implemented by Yang Li on 01/24/2013
69
+ # ----------------------------------------------------------------------------
70
+ property_supported :domain do
71
+ return $1 if content_for_scanner =~ /Domain Name:\s+(.*)\n/i
72
+ end
73
+
74
+ property_supported :domain_id do
75
+ return $1 if content_for_scanner =~ /Domain ID:\s+(.*)\n/i
76
+ end
77
+
78
+ property_supported :registrar do
79
+ reg=Record::Registrar.new
80
+ content_for_scanner.scan(/^(.*Registrar.*):\s+(.+)\n/).map do |entry|
81
+ reg["name"] = entry[1] if entry[0] =~ /Sponsoring Registrar$/i
82
+ reg["organization"] = entry[1] if entry[0] =~ /Sponsoring Registrar$/i
83
+ reg["url"] = entry[1] if entry[0] =~ /URL/i
84
+ end
85
+ return reg
86
+ end
87
+
88
+ property_supported :registrant_contacts do
89
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
90
+ end
91
+
92
+ property_supported :admin_contacts do
93
+ build_contact("Administrative Contact", Whois::Record::Contact::TYPE_ADMIN)
94
+ end
95
+
96
+ property_supported :technical_contacts do
97
+ build_contact("Technical Contact", Whois::Record::Contact::TYPE_TECHNICAL)
98
+ end
99
+
100
+ property_supported :billing_contacts do
101
+ build_contact("Billing Contact", Whois::Record::Contact::TYPE_BILLING)
102
+ end
103
+
104
+ private
105
+
106
+ def build_contact(element, type)
107
+ reg=Record::Contact.new(:type => type)
108
+ content_for_scanner.scan(/^(#{element}.*):\s+(.+)\n/).map do |entry|
109
+ reg["id"]=entry[1] if entry[0] =~ /#{element}\sID/i
110
+ reg["name"]=entry[1] if entry[0] =~ /#{element}\sName/i
111
+ reg["organization"]=entry[1] if entry[0]=~ /#{element}\sOrganization/i
112
+ reg["address"]=entry[1] if entry[0]=~ /#{element}\sAddress1/i
113
+ reg["city"]= entry[1] if entry[0]=~ /#{element}\sCity/i
114
+ reg["zip"]=entry[1] if entry[0]=~ /#{element}\sPostal\sCode/i
115
+ reg["state"]=entry[1] if entry[0]=~ /#{element}\sState\/Province/i
116
+ reg["country"]=entry[1] if entry[0]=~ /#{element}\sCountry$/i
117
+ reg["country_code"]=entry[1] if entry[0]=~ /#{element}\sCountry\sCode/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,135 @@
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.ve parser
19
+ #
20
+ # Parser for the whois.nic.ve 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 WhoisNicVe < Base
29
+
30
+ property_supported :status do
31
+ if content_for_scanner =~ /Estatus del dominio: (.+?)\n/
32
+ case $1.downcase
33
+ when "activo"
34
+ :registered
35
+ when "suspendido"
36
+ :inactive
37
+ else
38
+ Whois.bug!(ParserError, "Unknown status `#{$1}'.")
39
+ end
40
+ else
41
+ :available
42
+ end
43
+ end
44
+
45
+ property_supported :available? do
46
+ !!(content_for_scanner =~ /No match for "(.+?)"/)
47
+ end
48
+
49
+ property_supported :registered? do
50
+ !available?
51
+ end
52
+
53
+
54
+ property_supported :created_on do
55
+ if content_for_scanner =~ /Fecha de Creacion: (.+?)\n/
56
+ Time.parse($1)
57
+ end
58
+ end
59
+
60
+ property_supported :updated_on do
61
+ if content_for_scanner =~ /Ultima Actualizacion: (.+?)\n/
62
+ Time.parse($1)
63
+ end
64
+ end
65
+
66
+ property_supported :expires_on do
67
+ if content_for_scanner =~ /Fecha de Vencimiento: (.+?)\n/
68
+ Time.parse($1)
69
+ end
70
+ end
71
+
72
+ property_supported :nameservers do
73
+ if content_for_scanner =~ /Servidor\(es\) de Nombres de Dominio:\n\n((.+\n)+)\n/
74
+ $1.scan(/-\s(.*?)\n/).flatten.map do |name|
75
+ Record::Nameserver.new(:name => name)
76
+ end
77
+ end
78
+ end
79
+
80
+ # NEWPROPERTY
81
+ # def suspended?
82
+ # end
83
+
84
+ # The following methods are implemented by Yang Li on 01/29/2013
85
+ # ----------------------------------------------------------------------------
86
+ property_supported :domain do
87
+ return $1 if content_for_scanner =~ /Nombre de Dominio:\s+(.*)\n/i
88
+ end
89
+
90
+ property_not_supported :domain_id
91
+
92
+ property_not_supported :registrar
93
+
94
+ property_supported :admin_contacts do
95
+ build_contact("Contacto Administrativo", Whois::Record::Contact::TYPE_ADMIN)
96
+ end
97
+
98
+ property_supported :registrant_contacts do
99
+ build_contact("Titular", Whois::Record::Contact::TYPE_REGISTRANT)
100
+ end
101
+
102
+ property_supported :technical_contacts do
103
+ build_contact("Contacto Tecnico", Whois::Record::Contact::TYPE_TECHNICAL)
104
+ end
105
+
106
+ property_supported :billing_contacts do
107
+ build_contact("Contacto de Cobranza", Whois::Record::Contact::TYPE_BILLING)
108
+ end
109
+
110
+ private
111
+
112
+ def build_contact(element, type)
113
+ reg=Record::Contact.new(:type => type)
114
+ if content_for_scanner =~ /#{element}:\s*\n((.+\n)+)\n/i
115
+ line_num=1
116
+ $1.split(%r{\n}).each do |line|
117
+ titles=line.strip if line_num==1
118
+ reg["name"]=line.strip.split(%r{\t+}).first if line_num==1
119
+ reg["email"]=line.strip.split(%r{\t+}).last if line_num==1
120
+ reg["organization"]=line.strip if line_num==2
121
+ reg["address"]=line.strip if line_num==3
122
+ reg["city"]=line.strip if line_num==4
123
+ reg["phone"]=line.strip.split(%r{\s+}).first if line_num==5
124
+ reg["fax"]=line.split(%r{\s+}).last if line_num==5
125
+ line_num=line_num+1
126
+ end
127
+ end
128
+ return reg
129
+ end
130
+ # ----------------------------------------------------------------------------
131
+
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,127 @@
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.norid.no parser
19
+ #
20
+ # Parser for the whois.norid.no 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 WhoisNoridNo < 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 matches/)
40
+ end
41
+
42
+ property_supported :registered? do
43
+ !available?
44
+ end
45
+
46
+
47
+ property_supported :created_on do
48
+ if content_for_scanner =~ /Created:\s+(.*)\n/
49
+ Time.parse($1)
50
+ end
51
+ end
52
+
53
+ property_supported :updated_on do
54
+ if content_for_scanner =~ /Last updated:\s+(.*)\n/
55
+ Time.parse($1)
56
+ end
57
+ end
58
+
59
+ property_not_supported :expires_on
60
+
61
+ # The following methods are implemented by Yang Li on 02/12/2013
62
+ # ----------------------------------------------------------------------------
63
+ property_supported :domain do
64
+ return $1 if content_for_scanner =~ /Domain Name\.+:\s+(.*)\n/i
65
+ end
66
+
67
+ property_not_supported :domain_id
68
+
69
+ property_supported :registrar do
70
+ reg=Record::Registrar.new
71
+ reg["id"] = node("Registrar Handle")
72
+ return reg
73
+ end
74
+
75
+ property_supported :registrant_contacts do
76
+ build_contact("Domain Holder Handle", Whois::Record::Contact::TYPE_REGISTRANT)
77
+ end
78
+
79
+ property_supported :admin_contacts do
80
+ build_contact("Legal\-c Handle", Whois::Record::Contact::TYPE_ADMIN)
81
+ end
82
+
83
+ property_supported :technical_contacts do
84
+ build_contact("Tech\-c Handle", Whois::Record::Contact::TYPE_TECHNICAL)
85
+ end
86
+
87
+ property_supported :nameservers do
88
+ content_for_scanner.scan(/Name Server Handle\.+:\s+(.+)\n/).flatten.map do |name|
89
+ Record::Nameserver.new(:name => name + " - handle reference online at http://www.norid.no/domenenavnbaser/whois/kopirett.html")
90
+ end
91
+ end
92
+
93
+ property_not_supported :billing_contacts
94
+
95
+ private
96
+
97
+ def build_contact(element, type)
98
+ reg=Record::Contact.new(:type => type)
99
+ reg["id"]=node(element)
100
+ content_for_scanner.scan(/((.+\n)+)\n/).each do |x|
101
+ str=x.flatten.join
102
+ if str.include?(node(element))
103
+ str.scan(/^(.+?)\.+:\s+(.+)\n/).map do |entry|
104
+ reg["name"]=entry[1] if entry[0] =~ /Name$/
105
+ reg["address"]=entry[1] if entry[0]=~ /Post Address/i
106
+ reg["city"]= entry[1] if entry[0]=~ /Postal Area/i
107
+ reg["zip"]=entry[1] if entry[0]=~ /Postal Code/i
108
+ reg["state"]=entry[1] if entry[0]=~ /#{element}\sState\/Province/i
109
+ reg["country_code"]=entry[1] if entry[0]=~ /Country/i
110
+ reg["phone"]=entry[1] if entry[0]=~ /Phone Number/i
111
+ reg["fax"]=entry[1] if entry[0]=~ /Fax Number/i
112
+ reg["email"]=entry[1] if entry[0]=~ /Email/i
113
+ end
114
+ end
115
+ end
116
+ return reg
117
+ end
118
+
119
+ def node(element)
120
+ return $1 if content_for_scanner =~ /^#{element}\.+:\s*(.+)\n/
121
+ end
122
+ # ----------------------------------------------------------------------------
123
+
124
+ end
125
+ end
126
+ end
127
+ end
@@ -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
+ require 'whois/record/parser/base'
10
+
11
+ module Whois
12
+ class Record
13
+ class Parser
14
+
15
+ #
16
+ # = whois.pandi.or.id parser
17
+ #
18
+ # Parser for the whois.pandi.or.id server.
19
+ #
20
+ # NOTE: This parser is just a stub and provides only a few basic methods
21
+ # to check for domain availability and get domain status.
22
+ # Please consider to contribute implementing missing methods.
23
+ # See WhoisNicIt parser for an explanation of all available methods
24
+ # and examples.
25
+ #
26
+ class WhoisPandiOrId < Base
27
+
28
+ property_supported :status do
29
+ if content_for_scanner =~ /domain-status:\s+(.+)\n/
30
+ case $1.downcase
31
+ when "object is active"
32
+ :registered
33
+ else
34
+ Whois.bug!(ParserError, "Unknown status `#{$1}'.")
35
+ end
36
+ else
37
+ :available
38
+ end
39
+ end
40
+
41
+ property_supported :available? do
42
+ !!(content_for_scanner =~ /^Not found/)
43
+ end
44
+
45
+ property_supported :registered? do
46
+ !available?
47
+ end
48
+
49
+ property_supported :created_on do
50
+ if content_for_scanner =~ /Creation Date:\s+(.+)\n/
51
+ Time.parse($1)
52
+ end
53
+ end
54
+
55
+ property_supported :updated_on do
56
+ if content_for_scanner =~ /Last Updated On:\s+(.+)\n/
57
+ Time.parse($1)
58
+ end
59
+ end
60
+
61
+ property_supported :expires_on do
62
+ if content_for_scanner =~ /Expiration Date:\s+(.+)\n/
63
+ Time.parse($1)
64
+ end
65
+ end
66
+
67
+ property_supported :nameservers do
68
+ content_for_scanner.scan(/^Name Server:\s+(.+)\n/).flatten.map do |name|
69
+ Record::Nameserver.new(:name => name)
70
+ end
71
+ end
72
+
73
+ property_supported :domain do
74
+ return $1 if content_for_scanner =~ /Domain Name:\s+(.*)\n/i
75
+ end
76
+
77
+ property_not_supported :domain_id
78
+
79
+ property_supported :registrar do
80
+ reg=Record::Registrar.new
81
+ content_for_scanner.scan(/^(.*Registrar.*):\s+(.+)\n/).map do |entry|
82
+ reg["name"] = entry[1] if entry[0] =~ /Sponsoring/i
83
+ reg["organization"] = entry[1] if entry[0] =~ /Sponsoring/i
84
+ end
85
+ return reg
86
+ end
87
+
88
+ property_supported :registrant_contacts do
89
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
90
+ end
91
+
92
+ property_supported :admin_contacts do
93
+ build_contact("Admin Contact", Whois::Record::Contact::TYPE_ADMIN)
94
+ end
95
+
96
+ property_supported :technical_contacts do
97
+ build_contact("Tech Contact", Whois::Record::Contact::TYPE_TECHNICAL)
98
+ end
99
+
100
+ property_supported :billing_contacts do
101
+ build_contact("Billing Contact", Whois::Record::Contact::TYPE_BILLING)
102
+ end
103
+
104
+ private
105
+
106
+ def build_contact(element, type)
107
+ reg=Record::Contact.new(:type => type)
108
+ content_for_scanner.scan(/^(#{element}.*):\s+(.+)\n/).map do |entry|
109
+ reg["id"]=entry[1] if entry[0] =~ /ID/
110
+ end
111
+ return reg
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,63 @@
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.psi-usa.info server, added by Yang Li 02/10/2013.
16
+ class WhoisPsiUsaInfo < Base
17
+
18
+ property_supported :admin_contacts do
19
+ build_contact("\\[admin\-c\\]", Whois::Record::Contact::TYPE_ADMIN)
20
+ end
21
+
22
+ property_supported :registrant_contacts do
23
+ build_contact("\\[owner\-c\\]", Whois::Record::Contact::TYPE_REGISTRANT)
24
+ end
25
+
26
+ property_supported :technical_contacts do
27
+ build_contact("\\[tech\-c\\]", Whois::Record::Contact::TYPE_TECHNICAL)
28
+ end
29
+
30
+ property_supported :billing_contacts do
31
+ build_contact("\\[zone\-c\\]", Whois::Record::Contact::TYPE_BILLING)
32
+ end
33
+
34
+ private
35
+
36
+ def build_contact(element, type)
37
+ reg=Record::Contact.new(:type => type)
38
+ content_for_scanner.scan(/^#{element}(.+?):\s+(.+?)\n/).map do |entry|
39
+ reg["id"]=entry[1] if entry[0] =~ /handle/i
40
+ if entry[0] =~ /(fname|lname)/i
41
+ if reg["name"].nil?
42
+ reg["name"]=entry[1]
43
+ else
44
+ reg["name"]=reg["name"]+" "+entry[1]
45
+ end
46
+ end
47
+ reg["organization"]=entry[1] if entry[0]=~ /org/i
48
+ reg["address"]=entry[1] if entry[0]=~ /address/i
49
+ reg["city"]= entry[1] if entry[0]=~ /city/i
50
+ reg["zip"]=entry[1] if entry[0]=~ /pcode/i
51
+ reg["state"]=entry[1] if entry[0]=~ /state/i
52
+ reg["country_code"]=entry[1] if entry[0]=~ /country/i
53
+ reg["phone"]=entry[1] if entry[0]=~ /phone/i
54
+ reg["fax"]=entry[1] if entry[0]=~ /fax/i
55
+ reg["email"]=entry[1] if entry[0]=~ /email/i
56
+ end
57
+ return reg
58
+ end
59
+
60
+ end
61
+ end
62
+ end
63
+ 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
+ #
18
+ # = whois.registro.br parser
19
+ #
20
+ # Parser for the whois.registro.br 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 WhoisRegistroBr < 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 match for domain/)
40
+ end
41
+
42
+ property_supported :registered? do
43
+ !available?
44
+ end
45
+
46
+ property_supported :created_on do
47
+ if content_for_scanner =~ /created:\s+(.+?)(\s+#.+)?\n/
48
+ Time.parse($1)
49
+ end
50
+ end
51
+
52
+ property_supported :updated_on do
53
+ if content_for_scanner =~ /changed:\s+(.+?)\n/
54
+ Time.parse($1)
55
+ end
56
+ end
57
+
58
+ property_supported :expires_on do
59
+ if content_for_scanner =~ /expires:\s+(.+?)\n/
60
+ Time.parse($1)
61
+ end
62
+ end
63
+
64
+ property_supported :nameservers do
65
+ content_for_scanner.scan(/nserver:\s+(.+)\n/).flatten.map do |line|
66
+ name, ipv4 = line.strip.split(" ")
67
+ Record::Nameserver.new(:name => name, :ipv4 => ipv4)
68
+ end
69
+ end
70
+
71
+ # The following methods are implemented by Yang Li on 03/04/2013
72
+ # ----------------------------------------------------------------------------
73
+ property_supported :domain do
74
+ return build_node("domain",content_for_scanner)
75
+ end
76
+
77
+ property_not_supported :domain_id
78
+
79
+ property_not_supported :registrar
80
+
81
+ property_supported :registrant_contacts do
82
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
83
+ end
84
+
85
+ property_not_supported :admin_contacts
86
+
87
+ property_not_supported :technical_contacts
88
+
89
+ property_not_supported :billing_contacts
90
+
91
+ private
92
+
93
+ def build_contact(element, type)
94
+ reg=Record::Contact.new(:type => type)
95
+ reg["name"]=build_node("owner", content_for_scanner)
96
+ reg["organization"]=build_node("owner", content_for_scanner)
97
+ return reg
98
+ end
99
+
100
+ def build_node(element,context)
101
+ return $1.strip if context =~ /^#{element}:(.+)\n/i
102
+ end
103
+ # ----------------------------------------------------------------------------
104
+
105
+ end
106
+
107
+ end
108
+ end
109
+ end