rebbler 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/bin/rebbler +80 -0
- data/lib/app.rb +45 -0
- data/lib/checker.rb +59 -0
- data/rbls.txt +62 -0
- data/views/index.haml +80 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjRmNzFjY2Y0Y2QzM2QzOTQ3ZDAxYTNjZGVjOWM2MjBjY2ZjN2UyZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
N2MxOWZlNzRmZjQwZGJhMmU5MzRhYjAwYWU2ZWE4Njc1NDM0OThjMQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MWQ3MWNmMjIyODQwMTYzYmI2NWZkZDg0NDBkOTY4YzJiMzA4Njc2M2ZlNGE2
|
10
|
+
Y2YzMDc2M2Y3YjEzMzFlNzU2Y2I1NGVkZWFlNTQ3MDUxZTZjNTVhNDM3Nzc0
|
11
|
+
ZTA0ZjllMjZhZDk2MDZiNjE1ZWI0MjIxZjY2YzQyMjY4NmU2MTc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDc3NzI0MzQ1N2Y4OWJlMDI0ZGY0N2QwZjJkNmY2MDlkZDIwMWUxM2JhMTA4
|
14
|
+
NjUzNWNkZTk2Y2E2NjZjMzY3NTAwZTAwOTQwYTdkZDUyMTQwNGQ2ZWQyZjY5
|
15
|
+
ZTdjNWQwZTQ3OGJmOGIyY2QwOTU3NzQyZTdhMzFkOWIzMDY0NjI=
|
data/bin/rebbler
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'net/dns'
|
5
|
+
require 'pp'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'optparse'
|
8
|
+
|
9
|
+
require_relative '../lib/checker'
|
10
|
+
require_relative '../lib/app'
|
11
|
+
|
12
|
+
def do_commandline
|
13
|
+
format = "%-55s %-16s %-s"
|
14
|
+
@checker.check do |response|
|
15
|
+
response = OpenStruct.new response
|
16
|
+
puts format % [ response.rbl, response.result, response.message ]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def do_nagios_check(key)
|
21
|
+
format = "%-55s %-16s %-s"
|
22
|
+
hits = []
|
23
|
+
|
24
|
+
@checker.check do |response|
|
25
|
+
hits << OpenStruct.new(response)
|
26
|
+
end
|
27
|
+
|
28
|
+
hits = hits.reject { |v| v.result.to_s == "" }
|
29
|
+
|
30
|
+
if hits.length == 0
|
31
|
+
puts "RBL OK - %s not listed on any RBLS|" % [ key ]
|
32
|
+
exit 0
|
33
|
+
else
|
34
|
+
puts "RBL WARNING - %s listed on %s RBLS||" % [ key, hits.length ]
|
35
|
+
hits.each { |hit|
|
36
|
+
puts format % [ hit.rbl, hit.result, hit.message ]
|
37
|
+
}
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
options = OpenStruct.new
|
43
|
+
|
44
|
+
OptionParser.new do |opts|
|
45
|
+
opts.banner = "Usage: #{File.basename(__FILE__)} [options]"
|
46
|
+
|
47
|
+
opts.on("-s", "--server", "Run web server") do |v|
|
48
|
+
options.server = v
|
49
|
+
end
|
50
|
+
|
51
|
+
opts.on("-r", "--rbls=filename", "file of RBLs one per line") do |v|
|
52
|
+
puts "Setting rbl list from #{v}"
|
53
|
+
options.rbl_file = v
|
54
|
+
RBL::Loader.file = v
|
55
|
+
end
|
56
|
+
|
57
|
+
opts.on("-n", "--nagios-check", "Nagios RBL check") do |v|
|
58
|
+
options.nagios = v
|
59
|
+
end
|
60
|
+
end.parse!
|
61
|
+
|
62
|
+
if options.server
|
63
|
+
App.run!
|
64
|
+
else
|
65
|
+
key = ARGV.first
|
66
|
+
|
67
|
+
if key == "" or key.nil?
|
68
|
+
$stderr.puts "USAGE: %s {ip|hostname}" % [ File.basename(__FILE__) ]
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
@checker = Checker.new key
|
73
|
+
|
74
|
+
if options.nagios
|
75
|
+
do_nagios_check(key)
|
76
|
+
else
|
77
|
+
do_commandline
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
data/lib/app.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require "sinatra/reloader" if Sinatra::Base.development?
|
3
|
+
require 'sinatra-websocket'
|
4
|
+
require 'haml'
|
5
|
+
require 'json'
|
6
|
+
require 'rbconfig'
|
7
|
+
|
8
|
+
class App < Sinatra::Base
|
9
|
+
set :server, 'thin'
|
10
|
+
set :root, File.join(File.dirname(__FILE__), '..')
|
11
|
+
|
12
|
+
|
13
|
+
get '/', provides: 'html' do
|
14
|
+
haml :index
|
15
|
+
end
|
16
|
+
|
17
|
+
get '/req' do
|
18
|
+
return unless request.websocket?
|
19
|
+
|
20
|
+
request.websocket do |ws|
|
21
|
+
ws.onopen do
|
22
|
+
end
|
23
|
+
|
24
|
+
ws.onmessage do |msg|
|
25
|
+
thing = Thread.new do
|
26
|
+
begin
|
27
|
+
checker = Checker.new msg
|
28
|
+
checker.check do |response|
|
29
|
+
EM.next_tick { ws.send(response.to_json + "\n\n") }
|
30
|
+
end
|
31
|
+
rescue Exception => e
|
32
|
+
puts e
|
33
|
+
raise e
|
34
|
+
end
|
35
|
+
Thread.self.join
|
36
|
+
ws.close()
|
37
|
+
end
|
38
|
+
thing.run
|
39
|
+
end
|
40
|
+
|
41
|
+
ws.onclose do
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/checker.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
class Checker
|
3
|
+
module RBL
|
4
|
+
class Loader
|
5
|
+
def self.file= file
|
6
|
+
@@filename = file
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.load
|
10
|
+
@@filename ||= File.join(File.dirname(__FILE__), '..', 'rbls.txt')
|
11
|
+
File.readlines(@@filename).sort
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :ip
|
17
|
+
|
18
|
+
def initialize(to_check)
|
19
|
+
@ip = resolve_to_ip(to_check)
|
20
|
+
end
|
21
|
+
|
22
|
+
def resolve_to_ip name_to_lookup
|
23
|
+
begin
|
24
|
+
IPAddr.new(name_to_lookup)
|
25
|
+
rescue ArgumentError => e
|
26
|
+
Resolver(name_to_lookup).answer.first.address
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check(&blk)
|
31
|
+
rbls.each do |line|
|
32
|
+
rbl_domain = line.strip
|
33
|
+
name = name_to_lookup rbl_domain
|
34
|
+
|
35
|
+
answer = resolver.query(name).answer
|
36
|
+
if answer.length > 0
|
37
|
+
rbl_response_code = answer.first.address
|
38
|
+
text = resolver.query(name, Net::DNS::TXT).answer
|
39
|
+
rbl_txt_message = text.first.nil? ? "" : text.first.txt
|
40
|
+
yield({ rbl: rbl_domain, result: rbl_response_code, message: rbl_txt_message })
|
41
|
+
else
|
42
|
+
yield({ rbl: rbl_domain, result: "", message: 'Not Listed' })
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def rbls
|
48
|
+
@@rbls ||= RBL::Loader.load
|
49
|
+
end
|
50
|
+
|
51
|
+
def name_to_lookup(rbl_domain)
|
52
|
+
ip.reverse.gsub(/in-addr.arpa/, rbl_domain)
|
53
|
+
end
|
54
|
+
|
55
|
+
def resolver
|
56
|
+
@resolver ||= Net::DNS::Resolver.new(:nameservers => ['8.8.8.8','8.8.4.4'] * 10, :log_file => nil)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
data/rbls.txt
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
dnsbl.kineticweb.com
|
2
|
+
cbl.abuseat.org
|
3
|
+
b.barracudacentral.org
|
4
|
+
dnsbl.sorbs.net
|
5
|
+
http.dnsbl.sorbs.net
|
6
|
+
dul.dnsbl.sorbs.net
|
7
|
+
misc.dnsbl.sorbs.net
|
8
|
+
smtp.dnsbl.sorbs.net
|
9
|
+
socks.dnsbl.sorbs.net
|
10
|
+
spam.dnsbl.sorbs.net
|
11
|
+
web.dnsbl.sorbs.net
|
12
|
+
zombie.dnsbl.sorbs.net
|
13
|
+
dnsbl-1.uceprotect.net
|
14
|
+
dnsbl-2.uceprotect.net
|
15
|
+
dnsbl-3.uceprotect.net
|
16
|
+
pbl.spamhaus.org
|
17
|
+
sbl.spamhaus.org
|
18
|
+
xbl.spamhaus.org
|
19
|
+
zen.spamhaus.org
|
20
|
+
bl.spamcannibal.org
|
21
|
+
psbl.surriel.com
|
22
|
+
ubl.unsubscore.com
|
23
|
+
dnsbl.njabl.org
|
24
|
+
combined.njabl.org
|
25
|
+
rbl.spamlab.com
|
26
|
+
dnsbl.ahbl.org
|
27
|
+
ircbl.ahbl.org
|
28
|
+
dyna.spamrats.com
|
29
|
+
noptr.spamrats.com
|
30
|
+
spam.spamrats.com
|
31
|
+
cbl.anti-spam.org.cn
|
32
|
+
cdl.anti-spam.org.cn
|
33
|
+
dnsbl.inps.de
|
34
|
+
drone.abuse.ch
|
35
|
+
httpbl.abuse.ch
|
36
|
+
dul.ru
|
37
|
+
korea.services.net
|
38
|
+
short.rbl.jp
|
39
|
+
virus.rbl.jp
|
40
|
+
spamrbl.imp.ch
|
41
|
+
wormrbl.imp.ch
|
42
|
+
virbl.bit.nl
|
43
|
+
rbl.suresupport.com
|
44
|
+
dsn.rfc-ignorant.org
|
45
|
+
ips.backscatterer.org
|
46
|
+
spamguard.leadmon.net
|
47
|
+
opm.tornevall.org
|
48
|
+
netblock.pedantic.org
|
49
|
+
multi.surbl.org
|
50
|
+
ix.dnsbl.manitu.net
|
51
|
+
tor.dan.me.uk
|
52
|
+
rbl.efnetrbl.org
|
53
|
+
relays.mail-abuse.org
|
54
|
+
blackholes.mail-abuse.org
|
55
|
+
rbl-plus.mail-abuse.org
|
56
|
+
dnsbl.dronebl.org
|
57
|
+
access.redhawk.org
|
58
|
+
db.wpbl.info
|
59
|
+
rbl.interserver.net
|
60
|
+
query.senderbase.org
|
61
|
+
bogons.cymru.com
|
62
|
+
csi.cloudmark.com
|
data/views/index.haml
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
!!!html
|
2
|
+
|
3
|
+
%head
|
4
|
+
%title Rebbler
|
5
|
+
|
6
|
+
:css
|
7
|
+
#field, #results {
|
8
|
+
box-shadow: 1px 1px 5px #888888;
|
9
|
+
border: 1px solid black;
|
10
|
+
}
|
11
|
+
|
12
|
+
#field {
|
13
|
+
height: 1.5em;
|
14
|
+
background-color: #a8a8a8;
|
15
|
+
margin: 0;
|
16
|
+
padding: 15px;
|
17
|
+
}
|
18
|
+
|
19
|
+
#field input { border: 1px solid black; }
|
20
|
+
|
21
|
+
#server { width: 200px; }
|
22
|
+
|
23
|
+
#results {
|
24
|
+
margin-top: 10px;
|
25
|
+
width: 100%;
|
26
|
+
border-collapse: collapse;
|
27
|
+
border-spacing: 0;
|
28
|
+
}
|
29
|
+
|
30
|
+
#results tr:nth-child(odd) { background-color: #A2A2A2; }
|
31
|
+
#results .rbl { width: 200px; }
|
32
|
+
#results .response { width: 200px; }
|
33
|
+
#results tr.danger { background-color: yellow; }
|
34
|
+
|
35
|
+
%script{ :language => 'javascript', :src => 'https://code.jquery.com/jquery-2.1.1.min.js' }
|
36
|
+
|
37
|
+
:javascript
|
38
|
+
$(function() {
|
39
|
+
$('#server').focus()
|
40
|
+
|
41
|
+
$('#server').keypress(function(e) {
|
42
|
+
if(e.which == 13)
|
43
|
+
$('#submit').click()
|
44
|
+
})
|
45
|
+
|
46
|
+
$('#submit').click(function(e) {
|
47
|
+
$('#results tr:not(:first-child)').remove()
|
48
|
+
var host = window.location.host
|
49
|
+
var path = '/req'
|
50
|
+
var ws = new WebSocket('ws://' + host + path)
|
51
|
+
|
52
|
+
ws.onopen = function() { ws.send($('#server').get(0).value) }
|
53
|
+
|
54
|
+
ws.onclose = function() { console.log('websocket closed'); }
|
55
|
+
|
56
|
+
ws.onmessage = function(m) {
|
57
|
+
var rbl = JSON.parse(m.data)
|
58
|
+
tr = $('<tr>')
|
59
|
+
if(rbl.result.length > 0)
|
60
|
+
tr.addClass('danger')
|
61
|
+
tr.append($('<td>').css('class', 'rbl').text(rbl.rbl))
|
62
|
+
tr.append($('<td>').css('class', 'result').text(rbl.result))
|
63
|
+
tr.append($('<td>').css('class', 'message').text(rbl.message))
|
64
|
+
$('#results').append(tr)
|
65
|
+
};
|
66
|
+
})
|
67
|
+
})
|
68
|
+
|
69
|
+
%body
|
70
|
+
#field
|
71
|
+
Server Name or IP:
|
72
|
+
%input{ :id => 'server', :type => 'text', :name => 'server' }
|
73
|
+
%input{ :id => 'submit', :type => 'submit', :name => 'submit' }
|
74
|
+
|
75
|
+
%table#results
|
76
|
+
%tr.heading
|
77
|
+
%th.rbl RBL
|
78
|
+
%th.response Response
|
79
|
+
%th.message Message
|
80
|
+
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rebbler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Libby
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-19 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: DNS Block List Lookup Tool
|
14
|
+
email: alibby@xforty.com
|
15
|
+
executables:
|
16
|
+
- rebbler
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/rebbler
|
21
|
+
- lib/app.rb
|
22
|
+
- lib/checker.rb
|
23
|
+
- rbls.txt
|
24
|
+
- views/index.haml
|
25
|
+
homepage: http://rubygems.org/gems/hola
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.2.2
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: DNS Block List Lookup Tool
|
49
|
+
test_files: []
|