#!/usr/bin/perl -w # # check_bl plugin for nagios # $Revision: 1.0 $ # # Nagios plugin designed to warn you if you mail servers appear in one of the # many anti-spam 'blacklists' # # By Sam Bashton, Bashton Ltd # bashton.com/content/nagios-plugins # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA use strict; use lib "/usr/lib/nagios/plugins"; use utils qw($TIMEOUT %ERRORS &print_revision &support); use Net::DNS; use vars qw($PROGNAME); my ($verbose,$host),; my ($opt_V,$opt_h,$opt_B,$opt_H,$opt_c); $opt_V = $opt_h = $opt_B = $opt_H = $opt_c = ''; my $state = 'UNKNOWN'; sub print_help(); sub print_usage(); $PROGNAME = "check_bl"; $ENV{'BASH_ENV'}=''; $ENV{'ENV'}=''; $ENV{'PATH'}=''; $ENV{'LC_ALL'}='C'; use Getopt::Long; Getopt::Long::Configure('bundling'); GetOptions( "V" => \$opt_V, "version" => \$opt_V, "h" => \$opt_h, "help" => \$opt_h, "H=s" => \$opt_H, "hostname=s" => \$opt_H, "B=s" => \$opt_B, "blacklists=s" => \$opt_B, "c=s" => \$opt_c, "critical=s" => \$opt_c ); # -h means display verbose help screen if ($opt_h) { print_help(); exit $ERRORS{'OK'}; } # -V means display version number if ($opt_V) { print_revision($PROGNAME,'$Revision: 1.0 $ '); exit $ERRORS{'OK'}; } # First check the hostname is OK.. unless ($opt_H) { print_usage(); exit $ERRORS{'UNKNOWN'}; } if (! utils::is_hostname($opt_H)){ print "$opt_H is not a valid host name\n"; print_usage(); exit $ERRORS{"UNKNOWN"}; }else{ if ($opt_H =~ /[a-zA-Z]/ ) # If the host contains letters we assume it's a hostname, not an IP { $host = lookup($opt_H); } else { $host = $opt_H } } # $opt_c is a count of the blacklists a mail server is in, # after which state will be CRITICAL rather than WARNING # By default any listing is CRITICAL my $critcount = 0; if ($opt_c) { $critcount = $opt_c }; # $opt_B is a comma seperated list of blacklists $opt_B = shift unless ($opt_B); unless ($opt_B) { print_usage(); exit -1 } my @bls = split(/,/, $opt_B); # Just in case of problems, let's not hang Nagios $SIG{'ALRM'} = sub { print ("ERROR: No response from BL server (alarm)\n"); exit $ERRORS{"UNKNOWN"}; }; # XXX Originally, $TIMEOUT was used here. However, that's a static 15 # seconds whereas our actual timeout is much longer. Hence, adjust it. alarm(240 - 10); my %listed; # Hash of blacklists we're listed in. foreach(@bls) { if (blcheck($host,$_)) { $listed{$_} = 1 } } if (scalar(keys(%listed)) == 0) { $state = 'OK' } elsif (scalar(keys(%listed)) < $critcount) { $state = 'WARNING' } else { $state = 'CRITICAL' } if (%listed) { print "Listed at"; foreach (keys(%listed)) { print " $_" } print "\n"; } else { print "Not black-listed\n" } exit $ERRORS{$state}; ######## Subroutines ========================== sub print_help() { print_revision($PROGNAME,'$Revision: 1.0 $ '); print "\n"; support(); } sub print_usage () { print "Usage: \n"; print " $PROGNAME -H host -B [blacklist1],[blacklist2] [-c critnum]\n"; print " $PROGNAME [-h | --help]\n"; print " $PROGNAME [-V | --version]\n"; } sub blcheck { my ($ip, $bl) = @_; my $lookupip = $ip; $lookupip =~ s/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/$4.$3.$2.$1.$bl/; if (lookup($lookupip)) { return 1 } else { return 0 } } sub lookup { my $tolookup = shift; my $res = Net::DNS::Resolver->new; my $query = $res->search($tolookup); if ($query) { foreach my $rr ($query->answer) { next unless $rr->type eq "A"; # We're not interested in TXT records return $rr->address; } } }