[Nagiosplug-help] new plugin, need review

Subhendu Ghosh sghosh at sghosh.org
Thu Jan 16 08:25:07 CET 2003


Comments:

1. Looks like you are only checking for InErrors and not OutErrors

2. Do you really care about an actual Error count or should that be more 
of an error rate.

3. ifName in the IFMIB (1.3.6.1.2.1.31...) is distinct for each interface. 
The oid you are using belongs to ifDescr whose values could be the same 
for a number of interfaces.

-sg

On Thu, 16 Jan 2003 jgking at packetstorm.org wrote:

> check_snmp_iferrors: walks thre tree and reports if in/out errors are <= 
> to the -w value passed.
> 
> although im already doing this with check_snmp, I needed to try to first 
> create a failry simple plugin and so I created the check_snmp_iferrors 
> perl script.
> 
> Its pretty straightforward but I would like it reviewed by others and if 
> it all looks good then i know ive got at least a half-clue on this :)
> 
> thanks!
> 
> 
> 

-- 

-------------- next part --------------
#! /usr/bin/perl -w
#
# check_snmp_iferrors - nagios plugin 
# 
#
# Greg King
# Modified from the check_ifstatus code written by Christoph Kron
#

# 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.
#
#
# Report bugs to: jgking at packetstorm.org
# 
#

use POSIX;
use strict;
use lib "/usr/local/nagios/libexec"  ;
use utils qw($TIMEOUT %ERRORS &print_revision &support);

use Net::SNMP;
use Getopt::Long;
Getopt::Long::Configure('bundling');

my $PROGNAME = "check_snmp_iferrors";


my $status;
my $state = "UNKNOWN";
my $answer = "";
my $snmpkey=0;
my $snmpoid=0;
my $key=0;
my $community = "public";
my $port = 161;
my @snmpoids;
my $snmpifInErrors = '1.3.6.1.2.1.2.2.1.14';   
my $snmpifOutErrors = '1.3.6.1.2.1.2.2.1.20'; 
my $snmpIfName = '1.3.6.1.2.1.2.2.1.2'; 
my $hostname;
my $session;
my $error;
my $response;
my $ifmessage = "";
my $snmp_version = 1;
my $opt_h ;
my $opt_V ;
my $warn_level = 1;
my %ifStatus;
my $iferrors = 0;



# Just in case of problems, let's not hang Nagios
$SIG{'ALRM'} = sub {
     print ("ERROR: No snmp response from $hostname (alarm timeout)\n");
     exit $ERRORS{"UNKNOWN"};
};
alarm($TIMEOUT);



#Option checking
$status = GetOptions(
		"V"   => \$opt_V, "version"    => \$opt_V,
		"h"   => \$opt_h, "help"       => \$opt_h,
		"v=i" => \$snmp_version, "snmp_version=i"  => \$snmp_version,
		"C=s" =>\$community,"community=s" => \$community,
		"p=i" =>\$port, "port=i" => \$port,
		"w=i" =>\$warn_level, "warn_level=i" => \$warn_level,
		"H=s" => \$hostname, "hostname=s" => \$hostname );
		
if ($status == 0)
{
	print_help() ;
	exit $ERRORS{'OK'};
}


if ($opt_V) {
	print_revision($PROGNAME,'$Revision: 1.0 $ ');
	exit $ERRORS{'OK'};
}

if ($opt_h) {
	print_help();
	exit $ERRORS{'OK'};
}

if (! utils::is_hostname($hostname)){
	usage();
	exit $ERRORS{"UNKNOWN"};
}

if ( ! $snmp_version ) {
	$snmp_version =1 ;
}else{
	if ( $snmp_version =~ /[12]/ ) {
			
		($session, $error) = Net::SNMP->session(
		      -hostname  => $hostname,
		      -community => $community,
		      -port      => $port,
			  -version	=> $snmp_version
			   );

		if (!defined($session)) {
		      $state='UNKNOWN';
		      $answer=$error;
		      print ("$state: $answer");
		      exit $ERRORS{$state};
		}

		
	}elsif ( $snmp_version =~ /3/ ) {
		$state='UNKNOWN';
		print ("$state: No support for SNMP v3 yet\n");
		exit $ERRORS{$state};
	}else{
		$state='UNKNOWN';
		print ("$state: No support for SNMP v$snmp_version yet\n");
		exit $ERRORS{$state};
	}
}


push(@snmpoids,$snmpifInErrors);
push(@snmpoids,$snmpifOutErrors);
push(@snmpoids,$snmpIfName);

foreach $snmpoid (@snmpoids) {

   if (!defined($response = $session->get_table($snmpoid))) {
      $answer=$session->error;
      $session->close;
      $state = 'CRITICAL';
      print ("$state: $answer for $snmpoid  with snmp version $snmp_version\n");
      exit $ERRORS{$state};
   }

   foreach $snmpkey (keys %{$response}) {
	$snmpkey =~ /.*\.(\d+)$/;
	$key = $1;
	$ifStatus{$key}{$snmpoid} = $response->{$snmpkey};
   }
}


$session->close;

foreach $key (keys %ifStatus) {
	#print "DEBG : $key :: $ifStatus{$key}{$snmpIfName} \n";

	if ($ifStatus{$key}{$snmpifInErrors} >= $warn_level ) {
		$iferrors++;
		$ifmessage .= sprintf("%s: has %s errors<BR>",
		$ifStatus{$key}{$snmpIfName},
		$ifStatus{$key}{$snmpifInErrors});
	}
}

if ($iferrors > 0) {
      $state = 'WARNING';
}
else {
      $state = 'OK';
}

print ("$state: $ifmessage\n");
exit $ERRORS{$state};


sub usage {
	printf "\nMissing arguments!\n";
	printf "\n";
	printf "check_snmp_iferrors -C <READCOMMUNITY> -p <PORT> -H <HOSTNAME> -w <WARN LEVEL>\n";
	printf "Copyright (C) 2003 Greg King\n";
	printf "\n\n";
	support();
	exit $ERRORS{"UNKNOWN"};
}

sub print_help {
	printf "check_snmp_iferrors plugin for Nagios monitors interface error \n";
  	printf "status of each network interface on the target host\n";
	printf "\nUsage:\n";
	printf "   -H (--hostname)   Hostname to query - (required)\n";
	printf "   -C (--community)  SNMP read community (defaults to public,\n";
	printf "                     used with SNMP v1 and v2c\n";
	printf "   -v (--snmp_version)  1 for SNMP v1 (default)\n";
	printf "                        2 for SNMP v2c\n";
	printf "                        SNMP v2c will use get_bulk for less overhead\n";
	printf "   -p (--port)       SNMP port (default 161)\n";
	printf "   -I (--ifmib)      Agent supports IFMIB ifXTable.  Do not use if\n";
	printf "                     you don't know what this is.\n";
	printf "   -w (--warn)       Warn level integer\n";
	printf "   -V (--version)    Plugin version\n";
	printf "   -h (--help)       usage help \n\n";
	print_revision($PROGNAME, '$Revision: 1.1 $');
	
}


More information about the Help mailing list