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