dnsbl-client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Chris Lee
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,24 @@
1
+ = dnsbl-client
2
+
3
+ This library queries DNS Blacklists for listings. Currently this only does IP lookups, but the next version will handle domains.
4
+
5
+ require "dnsbl-client"
6
+ c = DNSBL::Client.new
7
+ c.lookup("203.150.14.85")
8
+ => [#<struct DNSBL::DNSBLResult dnsbl="UCEPROTECT1", query="85.14.150.203.dnsbl-1.uceprotect.net", result="127.0.0.2", meaning="Blacklisted", timing=0.0247988700866699>, #<struct DNSBL::DNSBLResult dnsbl="BARRACUDA", query="85.14.150.203.b.barracudacentral.org", result="127.0.0.2", meaning="Listed", timing=0.0266849994659424>]
9
+
10
+ == Contributing to dnsbl-client
11
+
12
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
13
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
14
+ * Fork the project
15
+ * Start a feature/bugfix branch
16
+ * Commit and push until you are happy with your contribution
17
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
18
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
19
+
20
+ == Copyright
21
+
22
+ Copyright (c) 2011 Chris Lee. See LICENSE.txt for
23
+ further details.
24
+
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ require 'dnsbl-client'
3
+
4
+ c = DNSBL::Client.new
5
+ if ARGV.length > 0
6
+ c.lookup(ARGV).each do |res|
7
+ sep = ""
8
+ res.members.each do |member|
9
+ print sep
10
+ print res[member]
11
+ sep = "\t"
12
+ end
13
+ end
14
+ else
15
+ $stdin.each_line do |ip|
16
+ ip.chomp!
17
+ c.lookup(ip).each do |res|
18
+ sep = ""
19
+ res.members.each do |member|
20
+ print sep
21
+ print res[member]
22
+ sep = "\t"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1 @@
1
+ require 'dnsbl-client/dnsbl-client'
@@ -0,0 +1,83 @@
1
+ # DESCRIPTION: is a module that queries dnsbls. The configuration is in a YAML file.
2
+ require 'resolv'
3
+ require 'socket'
4
+ require 'thread'
5
+ require 'yaml'
6
+
7
+ module DNSBL
8
+ class DNSBLResult < Struct.new(:dnsbl,:query,:result,:meaning,:timing); end
9
+ class Client
10
+ def initialize(configfile = File.dirname(__FILE__)+"/dnsbl.yaml")
11
+ @dnsbls = YAML.load(File.open(configfile).read)
12
+ nameservers = Resolv::DNS::Config.new.nameserver_port
13
+ sock = UDPSocket.new
14
+ sock.connect(nameservers[0][0],nameservers[0][1])
15
+ @sockets = [sock]
16
+ @socket_index = 0
17
+ end
18
+ def add_dnsbl(name,domain,type='ip',codes={"0"=>"OK","127.0.0.2"=>"Blacklisted"})
19
+ @dnsbls[name] = codes
20
+ @dnsbls[name]['domain'] = domain
21
+ @dnsbls[name]['type'] = type
22
+ end
23
+ def dnsbls
24
+ @dnsbls.keys
25
+ end
26
+ def _encode_query(ip,domain)
27
+ revip = ip.split(/\./).reverse.join(".")
28
+ lookup = "#{revip}.#{domain}"
29
+ txid = lookup.sum
30
+ message = Resolv::DNS::Message.new(txid)
31
+ message.rd = 1
32
+ message.add_question(lookup,Resolv::DNS::Resource::IN::A)
33
+ message.encode
34
+ end
35
+ def _decode_response(buf)
36
+ reply = Resolv::DNS::Message.decode(buf)
37
+ results = []
38
+ reply.each_answer do |name,ttl,data|
39
+ if name.to_s =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(.+)$/
40
+ ip = [$4,$3,$2,$1].join(".")
41
+ domain = $5
42
+ @dnsbls.each do |dnsblname,config|
43
+ if domain == config['domain']
44
+ meaning = config[data.address.to_s] || data.address.to_s
45
+ results << DNSBLResult.new(dnsblname,name.to_s,data.address.to_s,meaning,Time.now.to_f - @starttime)
46
+ break
47
+ end
48
+ end
49
+ end
50
+ end
51
+ results
52
+ end
53
+ def lookup(ip)
54
+ ips = ip
55
+ if ip.is_a? String
56
+ ips = [ip]
57
+ end
58
+ results = []
59
+ ips.each do |ip|
60
+ sent = 0
61
+ @starttime = Time.now.to_f
62
+ @dnsbls.each do |name,config|
63
+ next unless config['type'] == 'ip'
64
+ msg = _encode_query(ip,config['domain'])
65
+ @sockets[@socket_index].send(msg,0)
66
+ @socket_index += 1
67
+ @socket_index %= @sockets.length
68
+ sent += 1
69
+ end
70
+ while sent > 0
71
+ r,_,_ = IO.select(@sockets,nil,nil,1.5)
72
+ break unless r
73
+ r.each do |s|
74
+ response = _decode_response(s.recv(4096))
75
+ results += response
76
+ sent -= 1
77
+ end
78
+ end
79
+ end
80
+ results
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,207 @@
1
+ ---
2
+ VIRBL:
3
+ domain: virbl.dnsbl.bit.nl
4
+ type: ip
5
+ "0": OK
6
+ 127.0.0.2: List of malware or phishing email sources
7
+ SPAMHAUS:
8
+ 127.0.0.3: Illegal 3rd party exploits, including proxies, worms and trojan exploits
9
+ 127.0.0.4: Illegal 3rd party exploits, including proxies, worms and trojan exploits
10
+ 127.0.0.5: Illegal 3rd party exploits, including proxies, worms and trojan exploits
11
+ 127.0.0.6: Illegal 3rd party exploits, including proxies, worms and trojan exploits
12
+ domain: zen.spamhaus.org
13
+ type: ip
14
+ "0": OK
15
+ 127.0.0.2: Direct UBE sources, verified spam services and ROKSO spammers
16
+ 127.0.0.10: ISP Maintained Policy Block List
17
+ 127.0.0.11: SpamHaus Maintained Policy Block List
18
+ URIBL:
19
+ 127.0.0.4: Address found in UBE/UCE, and probably honour opt-out requests
20
+ domain: multi.uribl.com
21
+ type: ip
22
+ "0": OK
23
+ 127.0.0.8: Address not listed on black and are either very young (domain age via whois), or use whois privacy features to protect their identity.
24
+ 127.0.0.2: Address belonging to and used by spammers
25
+ SURBL:
26
+ 127.0.0.64: jwSpamSpy + Prolocation data source
27
+ 127.0.0.32: AbuseButler spamvertised sites
28
+ 127.0.0.4: sa-blacklist and other sources
29
+ domain: multi.surbl.org
30
+ type: ip
31
+ "0": OK
32
+ 127.0.0.8: Phishing data source
33
+ 127.0.0.16: Outblaze spamvertised sites
34
+ 127.0.0.2: SpamCop message-body URI domains
35
+ NJABL:
36
+ 127.0.0.3: Dial-up/dynamic IP range
37
+ 127.0.0.4: Spam source
38
+ 127.0.0.5: Multi-stage open relays
39
+ domain: dnsbl.njabl.org
40
+ type: ip
41
+ "0": OK
42
+ 127.0.0.8: Insecure CGI web server, possible spam source
43
+ 127.0.0.9: Open proxy servers
44
+ 127.0.0.2: Open relay
45
+ SPAMCOP:
46
+ domain: bl.spamcop.net
47
+ type: ip
48
+ "0": OK
49
+ 127.0.0.2: Spam source
50
+ SORBS:
51
+ 127.0.0.3: List of Open SOCKS Proxy Servers
52
+ 127.0.0.10: List of Dial Up Users
53
+ 127.0.0.11: List of domain names where the A or MX records point to bad address space
54
+ 127.0.0.4: List of Misc Open Proxy Servers
55
+ 127.0.0.12: List of domain names where the owners have indicated no mail should ever be sent with these domains
56
+ 127.0.0.5: List of Open SMTP Relays
57
+ 127.0.0.6: List of Spam Sources
58
+ domain: dnsbl.sorbs.net
59
+ 127.0.0.7: List of web (WWW) server which have spammer abused vulnerabilities (e.g. FormMail scripts)
60
+ type: ip
61
+ "0": OK
62
+ 127.0.0.8: List of List of hosts demanding they are never tested by SORBS
63
+ 127.0.0.9: List of Botnet/DDoS Zombies
64
+ 127.0.0.2: List of Open HTTP Proxy Servers
65
+ AHBL:
66
+ 127.0.0.20: Blog/Wiki/Comment Spammer
67
+ 127.0.0.3: Open Proxy
68
+ 127.0.0.10: Shoot On Sight
69
+ 127.0.0.11: Non-RFC Compliant (missing postmaster or abuse)
70
+ 127.0.0.4: Spam Source
71
+ 127.0.0.12: Does not properly handle 5xx errors
72
+ 127.0.0.5: Provisional Spam Source Listing block (will be removed if spam stops)
73
+ 127.0.0.127: Other
74
+ 127.0.0.13: Other Non-RFC Compliant
75
+ 127.0.0.6: Formmail Spam
76
+ domain: dnsbl.ahbl.org
77
+ 127.0.0.14: Compromised System => DDoS
78
+ 127.0.0.7: Spam Supporter
79
+ type: ip
80
+ "0": OK
81
+ 127.0.0.15: Compromised System => Relay
82
+ 127.0.0.8: Spam Supporter (indirect)
83
+ 127.0.0.16: Compromised System => Autorooter/Scanner
84
+ 127.0.0.9: End User (non mail system)
85
+ 127.0.0.17: Compromised System => Worm or mass mailing virus
86
+ 127.0.0.18: Compromised System => Other virus
87
+ 127.0.0.19: Open Proxy
88
+ 127.0.0.2: Open Relay
89
+ DRONEBL:
90
+ domain: dnsbl.dronebl.org
91
+ type: ip
92
+ "0": OK
93
+ 127.0.0.1: Host listed in DroneBL
94
+ 127.0.0.2: Sample
95
+ 127.0.0.3: IRC Drone
96
+ 127.0.0.5: Bottler
97
+ 127.0.0.6: Unknown spambot or drone
98
+ 127.0.0.7: DDOS Drone
99
+ 127.0.0.8: SOCKS Proxy
100
+ 127.0.0.9: HTTP Proxy
101
+ 127.0.0.10: ProxyChain
102
+ 127.0.0.13: Brute force attackers
103
+ 127.0.0.14: Open Wingate Proxy
104
+ 127.0.0.15: Compromised router / gateway
105
+ 127.0.0.255: Unknown
106
+ BARRACUDA:
107
+ domain: b.barracudacentral.org
108
+ type: ip
109
+ "0": OK
110
+ 127.0.0.2: Listed
111
+ DRONE_ABUSE_CH:
112
+ domain: drone.abuse.ch
113
+ type: ip
114
+ "0": OK
115
+ 127.0.0.2: Spam related FastFlux Bot
116
+ 127.0.0.3: Malware related FastFlux Bot
117
+ 127.0.0.4: Phish related FastFlux Bot
118
+ 127.0.0.5: Scam related FastFlux Bot
119
+ HTTPBL_ABUSE_CH:
120
+ domain: httpbl.abuse.ch
121
+ type: ip
122
+ "0": OK
123
+ 127.0.0.2: Hacking activities
124
+ 127.0.0.3: Hijacked server automated scanning drone
125
+ 127.0.0.4: Referrer spam
126
+ SPAM_ABUSE_CH:
127
+ domain: spam.abuse.ch
128
+ type: ip
129
+ 0: OK
130
+ 127.0.0.1: Sends spam to spamtrap
131
+ MAILSHELL:
132
+ domain: dnsbl.mailshell.net
133
+ type: ip
134
+ 0: OK
135
+ 127.0.0.2: Blacklisted
136
+ 127.0.0.188: Blacklisted
137
+ 127.0.0.190: Blacklisted
138
+ CBL:
139
+ domain: cbl.abuseat.org
140
+ type: ip
141
+ 0: OK
142
+ 127.0.0.2: Blacklisted
143
+ RHSBL:
144
+ domain: rhsbl.ahbl.org
145
+ type: domain
146
+ 0: OK
147
+ 127.0.0.2: Blacklisted
148
+ FIVETENSG:
149
+ domain: blackholes.five-ten-sg.com
150
+ type: ip
151
+ 127.0.0.2: Spam
152
+ 127.0.0.3: Dialup
153
+ 127.0.0.4: Bulk
154
+ 127.0.0.5: Multistage
155
+ 127.0.0.6: Singlestage
156
+ 127.0.0.7: Spam-support
157
+ 127.0.0.8: Webform
158
+ 127.0.0.9: Misc
159
+ 127.0.0.10: klez
160
+ 127.0.0.11: tcpa
161
+ 127.0.0.12: free
162
+ 127.0.0.13: cr
163
+ INPS:
164
+ domain: dnsbl.inps.de
165
+ type: ip
166
+ 127.0.0.2: Blacklisted
167
+ MANITU:
168
+ domain: ix.dnsbl.manitu.net
169
+ type: ip
170
+ 127.0.0.2: Blacklisted
171
+ NOMOREFUN:
172
+ domain: no-more-funn.moensted.dk
173
+ type: ip
174
+ 127.0.0.2: Direct spam sources
175
+ 127.0.0.3: Dynamic IP or generic rDNS.
176
+ 127.0.0.4: Bulk mailers
177
+ 127.0.0.5: Multi stage open relay
178
+ 127.0.0.6: single stage open relay
179
+ 127.0.0.7: Ignoring complaints of spamming by customers
180
+ 127.0.0.8: Please update your formmail.pl script
181
+ 127.0.0.9: See http://moensted.dk/spam/no-more-funn/?addr=$
182
+ 127.0.0.10: posible open proxies
183
+ 127.0.0.11: Please stop testing our servers
184
+ SPAMCANNIBAL:
185
+ domain: bl.spamcannibal.org
186
+ type: ip
187
+ 127.0.0.2: Blacklisted
188
+ UCEPROTECT1:
189
+ domain: dnsbl-1.uceprotect.net
190
+ type: ip
191
+ 127.0.0.2: Blacklisted
192
+ UCEPROTECT2:
193
+ domain: dnsbl-2.uceprotect.net
194
+ type: ip
195
+ 127.0.0.2: Blacklisted
196
+ UCEPROTECT3:
197
+ domain: dnsbl-3.uceprotect.net
198
+ type: ip
199
+ 127.0.0.2: Blacklisted
200
+ WHITELIST:
201
+ domain: ips.whitelisted.org
202
+ type: ip
203
+ 127.0.0.2: Whitelisted
204
+ BACKSCATTERER:
205
+ domains: ips.backscatterer.org
206
+ type: ip
207
+ 127.0.0.2: Backscatterer
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'dnsbl-client'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,14 @@
1
+ require 'helper'
2
+
3
+ class TestDnsblClient < Test::Unit::TestCase
4
+ should "return no hits for 127.0.0.255" do
5
+ c = DNSBL::Client.new
6
+ res = c.lookup("127.0.0.255")
7
+ assert_equal(0,res.length)
8
+ end
9
+ should "return all lists for 127.0.0.2" do
10
+ c = DNSBL::Client.new
11
+ res = c.lookup("127.0.0.2")
12
+ assert(res.length >= c.dnsbls.length)
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dnsbl-client
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Chris Lee
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain:
17
+ - |
18
+ -----BEGIN CERTIFICATE-----
19
+ MIIDYjCCAkqgAwIBAgIBADANBgkqhkiG9w0BAQUFADBXMREwDwYDVQQDDAhydWJ5
20
+ Z2VtczEYMBYGCgmSJomT8ixkARkWCGNocmlzbGVlMRMwEQYKCZImiZPyLGQBGRYD
21
+ ZGhzMRMwEQYKCZImiZPyLGQBGRYDb3JnMB4XDTExMDIyNzE1MzAxOVoXDTEyMDIy
22
+ NzE1MzAxOVowVzERMA8GA1UEAwwIcnVieWdlbXMxGDAWBgoJkiaJk/IsZAEZFghj
23
+ aHJpc2xlZTETMBEGCgmSJomT8ixkARkWA2RoczETMBEGCgmSJomT8ixkARkWA29y
24
+ ZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALNM1Hjs6q58sf7Jp64A
25
+ vEY2cnRWDdFpD8UWpwaJK5kgSHOVgs+0mtszn+YlYjmx8kpmuYpyU4g9mNMImMQe
26
+ ow8pVsL4QBBK/1Ozgdxrsptk3IiTozMYA+g2I/+WvZSEDu9uHkKe8pvMBEMrg7RJ
27
+ IN7+jWaPnSzg3DbFwxwOdi+QRw33DjK7oFWcOaaBqWTUpI4epdi/c/FE1I6UWULJ
28
+ ZF/Uso0Sc2Pp/YuVhuMHGrUbn7zrWWo76nnK4DTLfXFDbZF5lIXT1w6BtIiN6Ho9
29
+ Rdr/W6663hYUo3WMsUSa3I5+PJXEBKmGHIZ2TNFnoFIRHha2fmm1HC9+BTaKwcO9
30
+ PLcCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQURzsNkZo2rv86Ftc+hVww
31
+ RNICMrwwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQBRRw/iNA/PdnvW
32
+ OBoNCSr/IiHOGZqMHgPJwyWs68FhThnLc2EyIkuLTQf98ms1/D3p0XX9JsxazvKT
33
+ W/in8Mm/R2fkVziSdzqChtw/4Z4bW3c+RF7TgX6SP5cKxNAfKmAPuItcs2Y+7bdS
34
+ hr/FktVtT2iAmISRnlEbdaTpfl6N2ZWNT83khV6iOs5xRkX/+0e+GgAv9mE6nqr1
35
+ AkuDXMhposxcnFZUrZ3UtMPEe/JnyP7Vv6pvr3qtZm8FidFZU91+rX/fwdyBU8RP
36
+ /5l8uLWXXNt1wEbtu4N1I66LwTK2iRrQZE8XtlgZGbxYDFUkiurq3OafF2YwRs6W
37
+ 6yhklP75
38
+ -----END CERTIFICATE-----
39
+
40
+ date: 2011-03-14 00:00:00 -04:00
41
+ default_executable:
42
+ dependencies:
43
+ - !ruby/object:Gem::Dependency
44
+ version_requirements: &id001 !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ hash: 3
50
+ segments:
51
+ - 0
52
+ version: "0"
53
+ requirement: *id001
54
+ prerelease: false
55
+ name: shoulda
56
+ type: :development
57
+ - !ruby/object:Gem::Dependency
58
+ version_requirements: &id002 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ hash: 23
64
+ segments:
65
+ - 1
66
+ - 0
67
+ - 0
68
+ version: 1.0.0
69
+ requirement: *id002
70
+ prerelease: false
71
+ name: bundler
72
+ type: :development
73
+ - !ruby/object:Gem::Dependency
74
+ version_requirements: &id003 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ hash: 7
80
+ segments:
81
+ - 1
82
+ - 5
83
+ - 2
84
+ version: 1.5.2
85
+ requirement: *id003
86
+ prerelease: false
87
+ name: jeweler
88
+ type: :development
89
+ - !ruby/object:Gem::Dependency
90
+ version_requirements: &id004 !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 0
98
+ version: "0"
99
+ requirement: *id004
100
+ prerelease: false
101
+ name: rcov
102
+ type: :development
103
+ description: simple interface to lookup blacklists results
104
+ email: rubygems@chrislee.dhs.org
105
+ executables: []
106
+
107
+ extensions: []
108
+
109
+ extra_rdoc_files:
110
+ - LICENSE.txt
111
+ - README.rdoc
112
+ files:
113
+ - bin/dnsbl-client
114
+ - lib/dnsbl-client.rb
115
+ - lib/dnsbl-client/dnsbl-client.rb
116
+ - lib/dnsbl-client/dnsbl.yaml
117
+ - LICENSE.txt
118
+ - README.rdoc
119
+ - test/helper.rb
120
+ - test/test_dnsbl-client.rb
121
+ has_rdoc: true
122
+ homepage: http://github.com/chrislee35/dnsbl-client
123
+ licenses:
124
+ - MIT
125
+ post_install_message:
126
+ rdoc_options: []
127
+
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ hash: 3
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ hash: 3
145
+ segments:
146
+ - 0
147
+ version: "0"
148
+ requirements: []
149
+
150
+ rubyforge_project:
151
+ rubygems_version: 1.6.1
152
+ signing_key:
153
+ specification_version: 3
154
+ summary: queries various DNS Blacklists
155
+ test_files:
156
+ - test/helper.rb
157
+ - test/test_dnsbl-client.rb
Binary file