rebbler 0.0.1
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.
- 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: []
|