packages: nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec, nagios-plug...
glen
glen at pld-linux.org
Tue Apr 6 19:43:08 CEST 2010
Author: glen Date: Tue Apr 6 17:43:08 2010 GMT
Module: packages Tag: HEAD
---- Log message:
- add mdns support (parallel DNS lookups instead of forking), performs a lot better
- also adds support of reporting timeouting dns servers, which do not affect check result
---- Files affected:
packages/nagios-plugin-check_rbl:
nagios-plugin-check_rbl.spec (1.8 -> 1.9) , mdns.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: packages/nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec
diff -u packages/nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec:1.8 packages/nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec:1.9
--- packages/nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec:1.8 Tue Apr 6 19:29:11 2010
+++ packages/nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec Tue Apr 6 19:43:02 2010
@@ -8,7 +8,7 @@
Summary: Nagios plugin to check if an server is blacklisted in RBL servers
Name: nagios-plugin-%{plugin}
Version: 1.1.0
-Release: 3
+Release: 4
License: GPL
Group: Networking
Source0: https://trac.id.ethz.ch/projects/nagios_plugins/downloads/%{plugin}-%{version}.tar.gz
@@ -91,6 +91,10 @@
All persons listed below can be reached at <cvs_login>@pld-linux.org
$Log$
+Revision 1.9 2010/04/06 17:43:02 glen
+- add mdns support (parallel DNS lookups instead of forking), performs a lot better
+- also adds support of reporting timeouting dns servers, which do not affect check result
+
Revision 1.8 2010/04/06 17:29:11 glen
- report stuff upstream
- while RBL mostly used for SMTP, it's not limited to that
================================================================
Index: packages/nagios-plugin-check_rbl/mdns.patch
diff -u /dev/null packages/nagios-plugin-check_rbl/mdns.patch:1.1
--- /dev/null Tue Apr 6 19:43:08 2010
+++ packages/nagios-plugin-check_rbl/mdns.patch Tue Apr 6 19:43:02 2010
@@ -0,0 +1,298 @@
+--- check_rbl-1.1.0/check_rbl 2010-04-06 20:26:18.598337785 +0300
++++ check_rbl-1.2.0/check_rbl 2010-04-06 20:40:42.858468257 +0300
+@@ -2,8 +2,9 @@
+ # check_rbl is a Nagios plugin to check if an SMTP server is blacklisted
+ #
+ # See the INSTALL file for installation instructions
+ #
+ # Copyright (c) 2007, ETH Zurich.
++# Copyright (c) 2010, Elan Ruusamäe <glen at delfi.ee>.
+ #
+ # This module is free software; you can redistribute it and/or modify it
+ # under the terms of GNU general public license (gpl) version 3.
+@@ -22,14 +23,12 @@
+ use strict;
+ use warnings;
+
+-use Carp;
+-use English '-no_match_vars';
+ use Nagios::Plugin::Threshold;
+ use Nagios::Plugin;
+ use Nagios::Plugin::Getopt;
+ use Net::DNS;
+-use Parallel::Iterator qw(iterate);
++use IO::Select;
+ use Readonly;
+
+ Readonly my $DEFAULT_RETRIES => 4;
+ Readonly my $DEFAULT_WORKERS => 20;
+@@ -47,48 +46,15 @@
+ #
+ use vars qw(
+ @BLACKLISTED
++ @TIMEOUTS
+ $IP
+ $OPTIONS
+ $PLUGIN
+ $THRESHOLD
++ $res
+ );
+
+ ##############################################################################
+-# Usage : my $ip = lookup( $hostname );
+-# Purpose : DNS lookup
+-# Returns : $ip if found; undef if not found
+-# Arguments : $hostname : the FQDN to resolve
+-# Throws : n/a
+-# Comments : n/a
+-# See also : n/a
+-sub lookup {
+-
+- my ($hostname) = @_;
+-
+- require Net::DNS;
+-
+- my $res = Net::DNS::Resolver->new;
+-
+- $res->retry( $OPTIONS->retry() );
+-
+- my $query = $res->search($hostname);
+-
+- if ($query) {
+- foreach my $rr ( $query->answer ) {
+- if ( $rr->type eq 'A' ) {
+- return $rr->address;
+- }
+- }
+- }
+- else {
+- return;
+- }
+-
+- return; # dead code to make perlcritic happy
+-
+-}
+-
+-##############################################################################
+ # Usage : verbose("some message string", $optional_verbosity_level);
+ # Purpose : write a message if the verbosity level is high enough
+ # Returns : n/a
+@@ -122,37 +88,119 @@
+
+ }
+
+-##############################################################################
+-# Usage : check_server( $ip, $server )
+-# Purpose : checks if $ip is blacklisted by $server
+-# Returns : n/a
+-# Arguments : $ip : host IP
+-# $server : RBL server
+-# Throws : n/a
+-# Comments : if blacklisted pushed $server onto @blacklisted
+-# See also : n/a
+-sub check_server {
+-
+- my ($server) = @_;
+-
+- my $lookup_ip = $IP;
++=item B<mdns(\@addresses, $callback)>
+
+- $lookup_ip =~
+-s/(\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3})/$4.$3.$2.$1.$server/mxs;
+-
+- verbose " -> $lookup_ip\n";
+-
+- if ( lookup($lookup_ip) ) {
+-
+- verbose "LISTED: $lookup_ip\n";
+- return $lookup_ip;
+-
+- }
++Resolves all IPs in C<@addresses> in parallel.
++If answer is found C<$callback> is called with arguments as: $name, $host.
+
+- verbose "OK: $lookup_ip\n";
++Perform multiple DNS lookups in parallel. Based on Perl Net-DNS/mresolv.
++Elan Ruusamäe <glen at delfi.ee>, (c) 1999-2010
+
+- return 0;
++=cut
++sub mdns {
++ my $data = shift;
++ my $callback = shift;
++
++ # number of requests to have outstanding at any time
++ my $opt_n = $OPTIONS->workers;
++ # timeout per query (seconds)
++ my $opt_t = 15;
++ my $opt_d = $OPTIONS->verbose;
++
++ my $sel = IO::Select->new;
++ my $eof = 0;
++
++ my @addrs = @$data;
++ my %addrs;
++ while (1) {
++ my ($name, $sock);
++
++ #----------------------------------------------------------------------
++ # Read names until we've filled our quota of outstanding requests.
++ #----------------------------------------------------------------------
++
++ while (!$eof && $sel->count < $opt_n) {
++ print "DEBUG: reading..." if $opt_d;
++ $name = shift @addrs;
++ unless (defined $name) {
++ print "EOF.\n" if $opt_d;
++ $eof = 1;
++ last;
++ }
++ print "NAME: $name\n" if $opt_d;
++ $sock = $res->bgsend($name);
++
++ # we store in a hash the query we made, as parsing it back from
++ # response gives different ip for ips with multiple hosts
++ $addrs{$sock} = $name;
++ $sel->add($sock);
++ print "name = $name, outstanding = ", $sel->count, "\n" if $opt_d;
++ }
++
++ #----------------------------------------------------------------------
++ # Wait for any replies. Remove any replies from the outstanding pool.
++ #----------------------------------------------------------------------
++
++ my @ready;
++ my $timed_out = 1;
++
++ print "DEBUG: waiting for replies\n" if $opt_d;
++
++ for (@ready = $sel->can_read($opt_t);
++ @ready;
++ @ready = $sel->can_read(0)) {
++
++ $timed_out = 0;
++
++ print "DEBUG: replies received: ", scalar @ready, "\n" if $opt_d;
++
++ foreach $sock (@ready) {
++ print "DEBUG: handling a reply\n" if $opt_d;
++ my $addr = $addrs{$sock};
++ delete $addrs{$sock};
++ $sel->remove($sock);
++
++ my $ans = $res->bgread($sock);
++ my $host;
++ if ($ans) {
++ foreach my $rr ($ans->answer) {
++ next unless $rr->type eq 'A';
++ $host = $rr->address;
++ # take just first answer
++ last;
++ }
++ } else {
++ print "DEBUG: no answer: ". $res->errorstring. "\n" if $opt_d;
++ }
++ &$callback($addr, $host);
++ }
++ }
++
++ #----------------------------------------------------------------------
++ # If we timed out waiting for replies, remove all entries from the
++ # outstanding pool.
++ #----------------------------------------------------------------------
++
++ if ($timed_out) {
++ print "DEBUG: timeout: clearing the outstanding pool.\n" if $opt_d;
++ my $sock;
++ foreach $sock ($sel->handles) {
++ my $addr = $addrs{$sock};
++ delete $addrs{$sock};
++ $sel->remove($sock);
++ # callback for hosts that timed out
++ &$callback($addr, '');
++ }
++ }
++
++ print "DEBUG: outstanding = ", $sel->count, ", eof = $eof\n" if $opt_d;
++
++ #----------------------------------------------------------------------
++ # We're done if there are no outstanding queries and we've read EOF.
++ #----------------------------------------------------------------------
+
++ last if ($sel->count == 0) && $eof;
++ }
+ }
+
+ ##############################################################################
+@@ -232,9 +280,16 @@
+ 'critical has to be greater or equal warning' );
+ }
+
++$res = new Net::DNS::Resolver;
++$res->force_v4(1) if $res->can('force_v4');
++$res->retry($OPTIONS->retry());
++
+ $IP = $OPTIONS->host;
+-if ( $IP =~ m/[[:lower:]]/mxs ) {
+- $IP = lookup( $OPTIONS->host );
++if ($IP =~ m/[[:lower:]]/mxs) {
++ mdns([ $OPTIONS->host ], sub {
++ my ($addr, $host) = @_;
++ $IP = $host;
++ });
+ }
+
+ if ( !$IP ) {
+@@ -259,28 +314,37 @@
+
+ verbose 'Checking ' . $OPTIONS->host . " ($IP) on $nservers server(s)\n";
+
+-my $iter = iterate(
+- { workers => $OPTIONS->workers },
+- \&check_server,
+- sub {
+- while ( my $server = pop @servers ) {
+- return $server;
+- }
+- return;
+- }
+-);
+-
+-while ( my ( $server, $result ) = $iter->() ) {
+- if ($result) {
+- push @BLACKLISTED, $server;
+- }
++# build address lists
++my @addrs;
++foreach my $server (@servers) {
++ (my $ip = $IP) =~ s/(\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3}) [.] (\d{1,3})/$4.$3.$2.$1.$server/x;
++ push(@addrs, $ip);
+ }
+
++mdns(\@addrs, sub {
++ my ($addr, $host) = @_;
++ # extract RBL we checked
++ $addr =~ s/^(?:\d+\.){4}//;
++ if (defined $host) {
++ if ($host eq '') {
++ push @TIMEOUTS, $addr;
++ } else {
++ verbose "listed in $addr as $host\n";
++ push @BLACKLISTED, $addr;
++ }
++ }
++});
++
+ my $total = scalar @BLACKLISTED;
+
+ my $status =
+ $OPTIONS->host. " BLACKLISTED on $total " . ( ( $total == 1 ) ? 'server' : 'servers' ) . " of $nservers";
+
++# append timeout info, but do not account these in status
++if (@TIMEOUTS) {
++ $status .= sprintf(" (%d servers timeout: %s)", scalar @TIMEOUTS, join(', ', @TIMEOUTS));
++}
++
+ if ( $total > 0 ) {
+ $status .= " (@BLACKLISTED)";
+ }
================================================================
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/nagios-plugin-check_rbl/nagios-plugin-check_rbl.spec?r1=1.8&r2=1.9&f=u
More information about the pld-cvs-commit
mailing list