#!/usr/bin/perl
#
# check_rbl : check that the IP is not on any of the RBL lists
# DO NOT run this more often than every 1 hour since it would
# cause undue load on the RBL servers
#
# Steve Shipway, University of Auckland, 2006
# http://www.steveshipway.org/software
#
# Usage: check_rbl ip-address
#
# Version: 1.1 - Parameter can be hostname as well as IP address.
use strict;
my($IP,$PFX);
my($MSG,$STATUS);
my($DOM,$URL,$DESC);
my($rv);
##############################################################################
# Blacklists
my( @BLACKLISTS ) = (
# DNS blackhole domain, name, optional website address
# NJABL has now been superceded by pbl.spamhaus
# [ "combined.njabl.org", "NJA Blacklist", "http://www.njabl.org/" ],
# OpenRBL now only allow HTTP queries, and rate limit them, so we cant check
# them using this plugin.
# [ "openrbl.org", "OpenRBL Blacklist", "http://www.openrbl.org/" ],
[ "dnsbl.sorbs.net", "SORBS", "http://www.sorbs.net/" ],
[ "list.dsbl.org", "Distributed Sender", "http://dsbl.org/" ],
[ "zen.spamhaus.org", "Spamhaus SBL/XBL/PBL", "http://www.spamhaus.org/" ],
[ "fuldom.rfc-ignorant.org", "RFC-Ignorant", "http://www.rfc-ignorant.org/" ],
[ "bl.spamcop.net", "SpamCop", "http://www.spamcop.net/" ],
[ "blackholes.mail-abuse.org", "Mail-abuse.org", "http://www.mail-abuse.org/" ]
);
##############################################################################
# Functions
sub checkdom($) {
my($n,$a,$at,$l,@ad) = gethostbyname($PFX.".".$_[0]);
my(@addr);
return 0 if(!$n);
@addr = unpack('C4',$ad[0]);
return $addr[3];
}
##############################################################################
# MAIN
shift @ARGV if($ARGV[0] and $ARGV[0] eq '-H');
if(!$ARGV[0]) {
print "Usage: check_rbl ipaddress\n";
exit 3; # Unknown
}
if( $ARGV[0]=~/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ ) {
$PFX = "$4.$3.$2.$1";
$IP = $ARGV[0];
} else {
# Resolve a host name
my ( $lhname, $aliases, $addrtype, $length, @addrs)
= gethostbyname( $ARGV[0] );
$IP = $addrs[0];
if(!$IP) {
print "Hostname ".$ARGV[0]." does not resolve.\n";
exit 3;
}
$IP=~/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ ;
$PFX = "$4.$3.$2.$1";
}
$STATUS = 0; $MSG = "";
foreach ( @BLACKLISTS ) {
($DOM,$DESC,$URL) = @$_;
$rv = checkdom($DOM);
if($rv) {
$MSG .= "
" if($MSG);
$MSG .= "Listed on ";
$MSG .= "" if($URL);
$MSG .= $DESC;
$MSG .= "" if($URL);
$MSG .= "($rv)";
$STATUS = 2; # Critical!
}
}
if(!$MSG) {
$MSG = "";
foreach ( @BLACKLISTS ) {
($DOM,$DESC,$URL) = @$_;
$MSG .= ", " if($MSG);
$MSG .= $DESC;
}
$MSG = "All OK: $MSG";
}
print "$MSG\n";
exit $STATUS;