diff options
| author | Steve Kemp <steve@steve.org.uk> | 2013-08-05 20:38:30 +0100 | 
|---|---|---|
| committer | Steve Kemp <steve@steve.org.uk> | 2013-08-05 20:38:30 +0100 | 
| commit | 7856c1a1e02a8b5a218088b16569929047323370 (patch) | |
| tree | 37900c2ae9e309be8383c49861569b97dbe282c1 /lib/custodian/protocoltest | |
| parent | 7d53524988106819d9f75678819b427e1a49d378 (diff) | |
  DNSBL test.
Diffstat (limited to 'lib/custodian/protocoltest')
| -rw-r--r-- | lib/custodian/protocoltest/dnsbl.rb | 113 | 
1 files changed, 113 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 | 
