summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Kemp <steve@steve.org.uk>2013-08-05 20:38:30 +0100
committerSteve Kemp <steve@steve.org.uk>2013-08-05 20:38:30 +0100
commit7856c1a1e02a8b5a218088b16569929047323370 (patch)
tree37900c2ae9e309be8383c49861569b97dbe282c1
parent7d53524988106819d9f75678819b427e1a49d378 (diff)
DNSBL test.
-rw-r--r--lib/custodian/protocoltest/dnsbl.rb113
-rw-r--r--lib/custodian/protocoltests.rb1
2 files changed, 114 insertions, 0 deletions
diff --git a/lib/custodian/protocoltest/dnsbl.rb b/lib/custodian/protocoltest/dnsbl.rb
new file mode 100644
index 0000000..7cdf0b9
--- /dev/null
+++ b/lib/custodian/protocoltest/dnsbl.rb
@@ -0,0 +1,113 @@
+require 'resolv'
+
+
+
+
+#
+# The DNSBL test.
+#
+# This object is instantiated if the parser sees a line such as:
+#
+###
+### 1.2.3.4 must not run dnsbl via zen.spamhaus.org otherwise 'The IP is blacklisted in spamhaus'.
+###
+#
+#
+
+module Custodian
+
+ module ProtocolTest
+
+ class DNSBLTest < TestFactory
+
+
+ #
+ # Save away state from the configuration line.
+ #
+ def initialize( line )
+ @line = line
+ @host = line.split( /\s+/)[0]
+
+ #
+ # Ensure the host is an IP address.
+ #
+ raise ArgumentError, "The target must be an IP address" unless( @host =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/ )
+
+ #
+ # Save the host we're testing against
+ #
+ if ( line =~ /via\s+([0-9]+)/ )
+ @zones = $1.dup
+ else
+ @zones = "zen.spamhaus.org"
+ end
+
+ #
+ # Is this test inverted?
+ #
+ if ( line =~ /must\s+not\s+run\s+/ )
+ @inverted = true
+ else
+ @inverted = false
+ end
+ end
+
+
+
+ #
+ # Allow this test to be serialized.
+ #
+ def to_s
+ @line
+ end
+
+
+
+ #
+ # Run the test.
+ #
+ # Return "true" on success - if the IP is listed. False if not.
+ #
+ def run_test
+
+ # The error is empty.
+ @error = nil
+
+ @zones.split( "," ).each do |zone|
+
+ #
+ # Convert the IP to be looked up.
+ #
+ # Given IP 1.2.3.4 we lookup the address of the name
+ # 4.3.2.1.$zone
+ #
+ if ( @host =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/ )
+ name = "#{$4}.#{$3}.#{$2}.#{$1}.#{zone}"
+
+ result = Custodian::Util::DNS.hostname_to_ip( name )
+
+ if ( ( !result.nil? ) && ( result.length > 0 ) )
+ @error = "IP #{@host} listed in blacklist #{zone}. Lookup of #{name} lead to result: #{result}"
+ return true
+ end
+
+ end
+ #
+ end
+
+ return false
+ end
+
+
+ #
+ # If the test failed here we will return a suitable error message.
+ #
+ def error
+ @error
+ end
+
+ # register ourselves with the class-factory
+ register_test_type "dnsbl"
+ end
+ end
+end
diff --git a/lib/custodian/protocoltests.rb b/lib/custodian/protocoltests.rb
index cd5eea5..8b236c8 100644
--- a/lib/custodian/protocoltests.rb
+++ b/lib/custodian/protocoltests.rb
@@ -12,6 +12,7 @@
#
require 'custodian/protocoltest/tcp'
require 'custodian/protocoltest/dns'
+require 'custodian/protocoltest/dnsbl'
require 'custodian/protocoltest/ftp'
require 'custodian/protocoltest/http'
require 'custodian/protocoltest/jabber'