From 7856c1a1e02a8b5a218088b16569929047323370 Mon Sep 17 00:00:00 2001 From: Steve Kemp Date: Mon, 5 Aug 2013 20:38:30 +0100 Subject: DNSBL test. --- lib/custodian/protocoltest/dnsbl.rb | 113 ++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 lib/custodian/protocoltest/dnsbl.rb (limited to 'lib/custodian/protocoltest/dnsbl.rb') 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 -- cgit v1.2.1