rebbler 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. checksums.yaml +15 -0
  2. data/bin/rebbler +80 -0
  3. data/lib/app.rb +45 -0
  4. data/lib/checker.rb +59 -0
  5. data/rbls.txt +62 -0
  6. data/views/index.haml +80 -0
  7. metadata +49 -0
@@ -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=
@@ -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
+
@@ -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
@@ -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
+
@@ -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
@@ -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: []