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,149 @@
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
+ # Base parser for CoCCA servers.
18
+ #
19
+ # @abstract
20
+ class BaseCocca2 < Base
21
+
22
+ property_supported :domain do
23
+ content_for_scanner =~ /Domain Name: (.+)\n/
24
+ $1 || Whois.bug!(ParserError, "Unable to parse domain.")
25
+ end
26
+
27
+ property_not_supported :domain_id
28
+
29
+ # TODO: /pending delete/ => :redemption
30
+ # TODO: /pending purge/ => :redemption
31
+ property_supported :status do
32
+ list = statuses
33
+ case
34
+ when list.empty?
35
+ Whois.bug!(ParserError, "Unable to parse status.")
36
+ when list.include?("available")
37
+ :available
38
+ when list.include?("ok")
39
+ :registered
40
+ else
41
+ Whois.bug!(ParserError, "Unknown status `#{list.join(", ")}'.")
42
+ end
43
+ end
44
+
45
+ property_supported :available? do
46
+ status == :available
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 =~ /Creation Date: (.+?)\n/
56
+ parse_time($1)
57
+ end
58
+ end
59
+
60
+ property_supported :updated_on do
61
+ if content_for_scanner =~ /Updated Date: (.+?)\n/
62
+ parse_time($1)
63
+ end
64
+ end
65
+
66
+ property_supported :expires_on do
67
+ if content_for_scanner =~ /Registry Expiry Date: (.+?)\n/
68
+ parse_time($1)
69
+ end
70
+ end
71
+
72
+ property_supported :registrar do
73
+ if content_for_scanner =~ /Sponsoring Registrar: (.+?)\n/
74
+ Record::Registrar.new(
75
+ :name => $1,
76
+ :organization => nil,
77
+ :url => content_for_scanner.slice(/Sponsoring Registrar URL: (.+)\n/, 1)
78
+ )
79
+ end
80
+ end
81
+
82
+ property_supported :nameservers do
83
+ content_for_scanner.scan(/Name Server: (.+)\n/).flatten.map do |name|
84
+ Record::Nameserver.new(:name => name)
85
+ end
86
+ end
87
+
88
+ def statuses
89
+ content_for_scanner.scan(/Domain Status: (.+)\n/).flatten.map(&:downcase)
90
+ end
91
+
92
+ # The following methods are implemented by Yang Li on 01/24/2013
93
+ # ----------------------------------------------------------------------------
94
+
95
+ property_supported :domain_id do
96
+ return $1 if content_for_scanner =~ /Domain ID:\s+(.*)\n/i
97
+ end
98
+
99
+ property_supported :registrant_contacts do
100
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
101
+ end
102
+
103
+ property_supported :admin_contacts do
104
+ build_contact("Admin", Whois::Record::Contact::TYPE_ADMIN)
105
+ end
106
+
107
+ property_supported :technical_contacts do
108
+ build_contact("Tech", Whois::Record::Contact::TYPE_TECHNICAL)
109
+ end
110
+
111
+ property_supported :billing_contacts do
112
+ build_contact("Billing", Whois::Record::Contact::TYPE_BILLING)
113
+ end
114
+
115
+ private
116
+
117
+ def parse_time(value)
118
+ # Hack to remove usec. Do you know a better way?
119
+ Time.utc(*Time.parse(value).to_a)
120
+ end
121
+
122
+ def build_contact(element, type)
123
+ reg=Record::Contact.new(:type => type)
124
+ strs=''
125
+ content_cleanup=content_for_scanner.split(%r{/n}).delete_if { |x| x !~ /(.+):(.+)/ }
126
+ content_cleanup.join('\n').scan(/^#{element}(.+):(.+)\n/).map do |entry|
127
+ reg["id"]=entry[1].strip if entry[0] =~ /ID/i
128
+ reg["name"]=entry[1].strip if entry[0] =~ /Name/i
129
+ reg["organization"]=entry[1].strip if entry[0]=~ /Organization/i
130
+ if (entry[0]=~ /Street/i)
131
+ strs=strs+entry[1].strip+", "
132
+ end
133
+ reg["address"]=strs
134
+ reg["city"]= entry[1].strip if entry[0]=~ /City/i
135
+ reg["zip"]=entry[1].strip if entry[0]=~ /Postal\sCode/i
136
+ reg["state"]=entry[1].strip if entry[0]=~ /State\/Province/i
137
+ reg["country_code"]=entry[1].strip if entry[0]=~ /Country/i
138
+ reg["email"]=entry[1].strip if entry[0]=~ /Email/i
139
+ reg["phone"]=entry[1].strip if entry[0] =~ /Phone$/i
140
+ reg["fax"]=entry[1].strip if (entry[0] =~ /Fax$/i)
141
+ end
142
+ return reg
143
+ end
144
+ # ----------------------------------------------------------------------------
145
+
146
+ end
147
+ end
148
+ end
149
+ 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 kero.yachay.pe 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 KeroYachayPe < Base
27
+
28
+ property_supported :status do
29
+ if content_for_scanner =~ /Status:\s+(.+?)\n/
30
+ case $1.downcase
31
+ when "active"
32
+ :registered
33
+ when "not registered"
34
+ :available
35
+ when "inactive"
36
+ :inactive
37
+ else
38
+ Whois.bug!(ParserError, "Unknown status `#{$1}'.")
39
+ end
40
+ else
41
+ Whois.bug!(ParserError, "Unable to parse status.")
42
+ end
43
+ end
44
+
45
+ property_supported :available? do
46
+ status == :available
47
+ end
48
+
49
+ property_supported :registered? do
50
+ !available?
51
+ end
52
+
53
+ property_not_supported :created_on
54
+
55
+ property_not_supported :updated_on
56
+
57
+ property_not_supported :expires_on
58
+
59
+ property_supported :nameservers do
60
+ if content_for_scanner =~ /\nName Servers:\n((.+\n)+)\n/
61
+ $1.split(%r{\n}).map do |name|
62
+ Record::Nameserver.new(:name => name.strip)
63
+ end
64
+ end
65
+ end
66
+
67
+ # Checks whether the response has been throttled.
68
+ #
69
+ # @return [Boolean]
70
+ #
71
+ # @example
72
+ # Looup quota exceeded.
73
+ #
74
+ def response_throttled?
75
+ !content_for_scanner.match(/Looup quota exceeded./).nil?
76
+ end
77
+
78
+ # The following methods are implemented by Yang Li on 2/12/2013
79
+ # ----------------------------------------------------------------------------
80
+
81
+ property_supported :registrar do
82
+ reg=Record::Registrar.new
83
+ reg["name"] = $1 if content_for_scanner =~ /^Registrar:\s+(.+)\n/
84
+ return reg
85
+ end
86
+
87
+ property_supported :registrant_contacts do
88
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
89
+ end
90
+
91
+ property_supported :admin_contacts do
92
+ build_contact("Administrative Contact", Whois::Record::Contact::TYPE_ADMIN)
93
+ end
94
+
95
+ property_not_supported :technical_contacts
96
+
97
+ property_not_supported :billing_contacts
98
+
99
+ private
100
+
101
+ def build_contact(element, type)
102
+ reg=Record::Contact.new(:type => type)
103
+ if content_for_scanner =~ /#{element}:\n((.+\n)+)\n/
104
+ line_num=1
105
+ $1.split(%r{\n}).each do |entry|
106
+ entry=entry.strip
107
+ reg["name"]=entry if line_num==1
108
+ reg["organization"]=entry if line_num==1
109
+ reg["email"]=entry if entry =~ /.+\@.+\.\w+/
110
+ line_num=line_num+1
111
+ end
112
+ end
113
+ return reg
114
+ end
115
+ # ----------------------------------------------------------------------------
116
+
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,124 @@
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
+ # The parser was implemented by Yang Li on 02/27/2013
10
+
11
+ require 'whois/record/parser/base'
12
+
13
+
14
+ module Whois
15
+ class Record
16
+ class Parser
17
+
18
+ #
19
+ # = whois.PublicDomainRegistry.com parser
20
+ #
21
+ # Parser for the whois.PublicDomainRegistry.com server.
22
+ #
23
+ # NOTE: This parser is just a stub and provides only a few basic methods
24
+ # to check for domain availability and get domain status.
25
+ # Please consider to contribute implementing missing methods.
26
+ # See WhoisNicIt parser for an explanation of all available methods
27
+ # and examples.
28
+ #
29
+ class WhoisPublicdomainregistryCom < Base
30
+
31
+ property_supported :status do
32
+ if available?
33
+ :available
34
+ else
35
+ :registered
36
+ end
37
+ end
38
+
39
+ property_supported :available? do
40
+ !(content_for_scanner =~ /Status:LOCKED/)
41
+ end
42
+
43
+ property_supported :registered? do
44
+ !available?
45
+ end
46
+
47
+
48
+ property_supported :created_on do
49
+ if content_for_scanner =~ /Registration Date:\s+(.*)\n/
50
+ Time.parse($1)
51
+ end
52
+ end
53
+
54
+ property_not_supported :updated_on
55
+
56
+ property_supported :expires_on do
57
+ if content_for_scanner =~ /Expiration Date:\s+(.*)\n/
58
+ Time.parse($1)
59
+ end
60
+ end
61
+
62
+ property_supported :domain do
63
+ return $1 if content_for_scanner =~ /Domain Name:\s+(.*)\n/i
64
+ end
65
+
66
+ property_not_supported :domain_id
67
+
68
+ property_supported :registrar do
69
+ reg=Record::Registrar.new
70
+ reg["name"] = node("Registrar")
71
+ reg["url"] = node("Referral URL")
72
+ return reg
73
+ end
74
+
75
+ property_supported :registrant_contacts do
76
+ build_contact("Registrant Contact Details", Whois::Record::Contact::TYPE_REGISTRANT)
77
+ end
78
+
79
+ property_supported :admin_contacts do
80
+ build_contact("Administrative Contact Details", Whois::Record::Contact::TYPE_ADMIN)
81
+ end
82
+
83
+ property_supported :technical_contacts do
84
+ build_contact("Technical Contact Details", Whois::Record::Contact::TYPE_TECHNICAL)
85
+ end
86
+
87
+ property_supported :billing_contacts do
88
+ build_contact("Billing Contact Details", Whois::Record::Contact::TYPE_BILLING)
89
+ end
90
+
91
+ private
92
+
93
+ def build_contact(element, type)
94
+ reg=Record::Contact.new(:type => type)
95
+ if content_for_scanner =~ /^\s*#{element}:\s*\n((.+\n)+)\n/
96
+ line_num=1
97
+ $1.split(%r{\n}).each do |line|
98
+ line=line.strip
99
+ reg["id"]=$1 if line =~ /(ID#\d+)/
100
+ reg["name"]=line if line_num==1
101
+ reg["organization"]=line if line_num==4
102
+ reg["address"]=line if line_num==5
103
+ reg["city"]= line.split(',')[0] if line_num==6
104
+ reg["zip"]= line.split(',')[1].split(%r{\s+})[1] if line_num==6
105
+ reg["state"]=line.split(',')[1].split(%r{\s+})[0] if line_num==6
106
+ reg["country_code"]=line if line_num==7
107
+ reg["phone"]=line.split('Tel.')[1] if line =~ /Tel\./i
108
+ reg["fax"]=line.split('Fax.')[1] if line =~ /Fax\./i
109
+ reg["email"]=$1 if line =~ /(\(.+\@\.+\.\w+\))/
110
+ line_num=line_num+1
111
+ end
112
+ end
113
+ return reg
114
+ end
115
+
116
+ def node(element)
117
+ return $1 if content_for_scanner =~ /^\s*#{element}\.+:\s*(.+)\n/
118
+ end
119
+ # ----------------------------------------------------------------------------
120
+
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,61 @@
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.above.com server, added by Yang Li 02/11/2013.
16
+ class WhoisAboveCom < Base
17
+
18
+ property_supported :admin_contacts do
19
+ build_contact("Administrative Contact", Whois::Record::Contact::TYPE_ADMIN)
20
+ end
21
+
22
+ property_supported :registrant_contacts do
23
+ build_contact("Registrant", Whois::Record::Contact::TYPE_REGISTRANT)
24
+ end
25
+
26
+ property_supported :technical_contacts do
27
+ build_contact("Technical Contact", Whois::Record::Contact::TYPE_TECHNICAL)
28
+ end
29
+
30
+ property_supported :billing_contacts do
31
+ build_contact("Billing Contact", 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
+ if content_for_scanner =~ /^\s+#{element}:\n((.+\n)+)\n/
39
+ line_num=1
40
+ $1.split(%r{\n}).each do |line|
41
+ line=line.strip unless line.nil?
42
+ reg["name"]=line if line_num==1
43
+ reg["organization"]=line if line_num==1
44
+ reg["address"]=line if line_num==2
45
+ reg["city"]= line if line_num==3
46
+ reg["state"]=line if line_num==4
47
+ reg["zip"]=line if line_num==5
48
+ reg["country_code"]=line if line_num==6
49
+ reg["phone"]=line.split('Tel.')[1] if line=~ /Tel/i
50
+ reg["fax"]=line.split('Fax.')[1] if line=~ /Fax/i
51
+ reg["email"]=line if line =~ /\w+\@.+\.\w+/
52
+ line_num=line_num+1
53
+ end
54
+ end
55
+ return reg
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,107 @@
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.adamsnames.tc
19
+ #
20
+ # Parser for the whois.adamsnames.tc 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 WhoisAdamsnamesTc < 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 =~ /is not registered/)
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
+ content_for_scanner.scan(/\s+ns\s+(.+?)\s+\n/).flatten.map do |name|
54
+ Record::Nameserver.new(:name => name)
55
+ end
56
+ end
57
+
58
+ # The following methods are implemented by Yang Li on 02/26/2013
59
+ # ----------------------------------------------------------------------------
60
+ property_supported :domain do
61
+ return $1 if content_for_scanner =~ /domain name:\s+(.+)\n/i
62
+ end
63
+
64
+ property_not_supported :domain_id
65
+
66
+ property_supported :admin_contacts do
67
+ build_contact("admin", Whois::Record::Contact::TYPE_ADMIN)
68
+ end
69
+
70
+ property_supported :registrant_contacts do
71
+ build_contact("owner", Whois::Record::Contact::TYPE_REGISTRANT)
72
+ end
73
+
74
+ property_supported :technical_contacts do
75
+ build_contact("tech", Whois::Record::Contact::TYPE_TECHNICAL)
76
+ end
77
+
78
+ property_supported :billing_contacts do
79
+ build_contact("billing", Whois::Record::Contact::TYPE_BILLING)
80
+ end
81
+
82
+ private
83
+
84
+ def build_contact(element, type)
85
+ reg=Record::Contact.new(:type => type)
86
+ if content_for_scanner =~ /^#{element}\-contact:.+\n((.+\n)+)\n/i
87
+ $1.scan(/^#{element}\-(.+):\s+(.+)\n/).map do |entry|
88
+ reg["id"]=entry[1] if entry[0] =~ /contact/i
89
+ reg["name"]=entry[1] if entry[0] =~ /name/i
90
+ reg["organization"]=entry[1] if entry[0]=~ /organization/i
91
+ reg["address"]=entry[1] if entry[0]=~ /street/i
92
+ reg["city"]= entry[1] if entry[0]=~ /city/i
93
+ reg["zip"]=entry[1] if entry[0]=~ /zip/i
94
+ reg["country_code"]=entry[1] if entry[0]=~ /country/i
95
+ reg["phone"]=entry[1] if entry[0]=~ /phone/i
96
+ reg["fax"]=entry[1] if entry[0]=~ /fax/i
97
+ reg["email"]=entry[1] if entry[0]=~ /email/i
98
+ end
99
+ end
100
+ return reg
101
+ end
102
+ # ----------------------------------------------------------------------------
103
+
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,105 @@
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.aeda.net.ae parser
19
+ #
20
+ # Parser for the whois.aeda.net.ae 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 WhoisAedaNetAe < Base
29
+
30
+ property_supported :status do
31
+ if content_for_scanner =~ /Status:\s+(.+?)\n/
32
+ case $1.downcase
33
+ when "ok" 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.strip == "No Data Found"
44
+ end
45
+
46
+ property_supported :registered? do
47
+ !available?
48
+ end
49
+
50
+
51
+ property_not_supported :created_on
52
+
53
+ property_not_supported :updated_on
54
+
55
+ property_not_supported :expires_on
56
+
57
+
58
+ property_supported :nameservers do
59
+ content_for_scanner.scan(/Name Server:\s+(.+)\n/).flatten.map do |name|
60
+ Record::Nameserver.new(:name => name)
61
+ end
62
+ end
63
+
64
+ # The following methods are implemented by Yang Li on 12/19/2012
65
+ # ----------------------------------------------------------------------------
66
+ property_supported :domain do
67
+ return $1 if content_for_scanner =~ /Domain Name:\s+(.*)\n/i
68
+ end
69
+
70
+ property_not_supported :domain_id
71
+
72
+ property_supported :registrar do
73
+ reg=Record::Registrar.new
74
+ content_for_scanner.scan(/^(Registrar.*):\s+(.+)\n/).map do |entry|
75
+ reg["id"] = entry[1] if entry[0] =~ /Registrar\sID/i
76
+ reg["name"] = entry[1] if entry[0] =~ /Registrar\sName$/i
77
+ end
78
+ return reg
79
+ end
80
+
81
+ property_supported :registrant_contacts do
82
+ build_contact("Registrant Contact", Whois::Record::Contact::TYPE_REGISTRANT)
83
+ end
84
+
85
+ property_supported :technical_contacts do
86
+ build_contact("Tech Contact", Whois::Record::Contact::TYPE_TECHNICAL)
87
+ end
88
+
89
+ private
90
+
91
+ def build_contact(element, type)
92
+ reg=Record::Contact.new(:type => type)
93
+ content_for_scanner.scan(/^(#{element}.*):\s+(.+)\n/).map do |entry|
94
+ reg["id"]=entry[1] if entry[0] =~ /#{element}\sID/i
95
+ reg["name"]=entry[1] if entry[0] =~ /#{element}\sName/i
96
+ reg["email"]=entry[1] if entry[0]=~ /#{element}\sEmail/i
97
+ end
98
+ return reg
99
+ end
100
+ # ----------------------------------------------------------------------------
101
+
102
+ end
103
+ end
104
+ end
105
+ end