Search Exchange
Search All Sites
Nagios Live Webinars
Let our experts show you how Nagios can help your organization.Login
Directory Tree
Directory
rracosta
byrracosta, April 4, 2012
Hi,
I have used this script for a while and is working fine for a number of cisco models, but I noticed that in devices with a lot of interfaces snmpwalk the full interface table is taking a bit too long and if there is packet loss, Nagios will log a solf alarm; Therefore I have added a small modification in which it is possible to pass ifIndex as an argument with a huge increase in speed, the script also suggest what index to use.
#!/usr/bin/perl -w
# $Header$
# # ============================================================================
# #
# #
# # 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, 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, 675 Mass Ave, Cambridge, MA 02139, USA.
# #
# # ============================================================================
# #
# # Description:
=head1 DESCRIPTION
Used to check integrity of port channels on cisco switches; tested on 4500
=cut
=head2 VERSION
Version 1.0 Stable
=cut
=head3 USAGE
./check_snmp_cisco_port_channel.pl -h -c -p
=cut
#
## ============================================================================
#
###################Setting up some parameters#########################
use strict;
use Getopt::Long;
my $OK = 0;
my $WARNING = 1;
my $CRITICAL = 2;
my $UNKNOWN = 3;
my $host = "127.0.0.1";
my $community = "public";
my $poChannel="Po1";
my $maxSpeed=1000;
my $snmpPoChannel="9999";
my $kProvided = 1;
my $snmpIfName = '1.3.6.1.2.1.31.1.1.1.1';
###################Getting options##############################
GetOptions(
"host|h=s" => \$host,
"community|c=s" => \$community,
"poChannel|p=s" => \$poChannel,
"maxSpeed|s=i" => \$maxSpeed,
"ifIndex|k=i" => \$snmpPoChannel
);
#################################################################
#if ifIndex is not provide, it snmpwalk the interfaces to find it, otherwise snmpget ifName
if($snmpPoChannel == "9999"){
$kProvided=0;
my @ifIDs = snmpwalk($host, $community, ".1.3.6.1.2.1.31.1.1.1.1","-Oqs");
foreach (@ifIDs) { if ($_ =~ /ifName.(.*)$poChannel$/) { $snmpPoChannel= $1; } }
if($snmpPoChannel eq "9999"){
print "Sorry, I don't know that port channel. Check your syntax.\n";
usage();
exit $UNKNOWN;
}
}else{
$poChannel=snmpget($host, $community, "$snmpIfName.$snmpPoChannel","-Oqvn");
}
#Get status for port channel
my $poSpeed=snmpget($host, $community, ".1.3.6.1.2.1.31.1.1.1.15.$snmpPoChannel","-Oqvn");
my $poStatus=snmpget($host, $community, ".1.3.6.1.2.1.2.2.1.8.$snmpPoChannel");
#change port description in case that index id provied
checkPortChannel();
###################Sub Routines##################################
sub checkPortChannel
{
if($poStatus =~ /down/){
print "$poChannel: Down\n";
exit $CRITICAL;
}elsif(($poSpeed eq $maxSpeed) && ($kProvided == 0)){
print "OK - $poChannel: All members are up, To improve performance add -k , witch is $snmpPoChannel for $poChannel\n";
exit $OK;
}elsif(($poSpeed eq $maxSpeed) && ($kProvided == 1)){
print "OK - $poChannel: All members are up\n";
exit $OK;
}elsif($poSpeed lt $maxSpeed){
print "WARNING - $poChannel: One of the members of this channel is down\n";
exit $WARNING;
}else{
print "UNKNOWN - $poChannel: Can't find specified port channel\n";
exit $UNKNOWN;
}
}
sub usage
{
print "\nSyntax:\n";
print "./check_snmp_cisco_portChannel.pl -h -c [-p ] -s [-k ] \n\n";
print "Usage Example:\n";
print "./check_snmp_cisco_portChannel.pl -h 192.168.0.1 -c public -p Po1 -s 2000\n\n";
}
sub snmpwalk
{
my ($host, $community, $tree, $opts)=@_;
my @walk = `snmpwalk -v 2c -c $community $opts $host $tree`;
return @walk;
}
sub snmpget
{
my ($host, $community, $tree, $opts)=@_;
if (! $opts ) { $opts ="" }
my $get = `snmpget -v 2c -c $community $opts $host $tree`;
chomp($get);
return $get;
}
#===============================================================
=tail1 AUTHORS
by Jared DeWitt
=cut
=tail2 Thanks
Thanks to R3dl!GhT for writing snmpwalk and snmpget subs
=cut
=tail3 COPYWRIGHT
Copywrite (C) Jared DeWitt 2008.
This module is free software; you can redistribute it and/or
modify it under the terms of the GNU Public License.
=cut
#===============================================================
I have used this script for a while and is working fine for a number of cisco models, but I noticed that in devices with a lot of interfaces snmpwalk the full interface table is taking a bit too long and if there is packet loss, Nagios will log a solf alarm; Therefore I have added a small modification in which it is possible to pass ifIndex as an argument with a huge increase in speed, the script also suggest what index to use.
#!/usr/bin/perl -w
# $Header$
# # ============================================================================
# #
# #
# # 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, 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, 675 Mass Ave, Cambridge, MA 02139, USA.
# #
# # ============================================================================
# #
# # Description:
=head1 DESCRIPTION
Used to check integrity of port channels on cisco switches; tested on 4500
=cut
=head2 VERSION
Version 1.0 Stable
=cut
=head3 USAGE
./check_snmp_cisco_port_channel.pl -h -c -p
=cut
#
## ============================================================================
#
###################Setting up some parameters#########################
use strict;
use Getopt::Long;
my $OK = 0;
my $WARNING = 1;
my $CRITICAL = 2;
my $UNKNOWN = 3;
my $host = "127.0.0.1";
my $community = "public";
my $poChannel="Po1";
my $maxSpeed=1000;
my $snmpPoChannel="9999";
my $kProvided = 1;
my $snmpIfName = '1.3.6.1.2.1.31.1.1.1.1';
###################Getting options##############################
GetOptions(
"host|h=s" => \$host,
"community|c=s" => \$community,
"poChannel|p=s" => \$poChannel,
"maxSpeed|s=i" => \$maxSpeed,
"ifIndex|k=i" => \$snmpPoChannel
);
#################################################################
#if ifIndex is not provide, it snmpwalk the interfaces to find it, otherwise snmpget ifName
if($snmpPoChannel == "9999"){
$kProvided=0;
my @ifIDs = snmpwalk($host, $community, ".1.3.6.1.2.1.31.1.1.1.1","-Oqs");
foreach (@ifIDs) { if ($_ =~ /ifName.(.*)$poChannel$/) { $snmpPoChannel= $1; } }
if($snmpPoChannel eq "9999"){
print "Sorry, I don't know that port channel. Check your syntax.\n";
usage();
exit $UNKNOWN;
}
}else{
$poChannel=snmpget($host, $community, "$snmpIfName.$snmpPoChannel","-Oqvn");
}
#Get status for port channel
my $poSpeed=snmpget($host, $community, ".1.3.6.1.2.1.31.1.1.1.15.$snmpPoChannel","-Oqvn");
my $poStatus=snmpget($host, $community, ".1.3.6.1.2.1.2.2.1.8.$snmpPoChannel");
#change port description in case that index id provied
checkPortChannel();
###################Sub Routines##################################
sub checkPortChannel
{
if($poStatus =~ /down/){
print "$poChannel: Down\n";
exit $CRITICAL;
}elsif(($poSpeed eq $maxSpeed) && ($kProvided == 0)){
print "OK - $poChannel: All members are up, To improve performance add -k , witch is $snmpPoChannel for $poChannel\n";
exit $OK;
}elsif(($poSpeed eq $maxSpeed) && ($kProvided == 1)){
print "OK - $poChannel: All members are up\n";
exit $OK;
}elsif($poSpeed lt $maxSpeed){
print "WARNING - $poChannel: One of the members of this channel is down\n";
exit $WARNING;
}else{
print "UNKNOWN - $poChannel: Can't find specified port channel\n";
exit $UNKNOWN;
}
}
sub usage
{
print "\nSyntax:\n";
print "./check_snmp_cisco_portChannel.pl -h -c [-p ] -s [-k ] \n\n";
print "Usage Example:\n";
print "./check_snmp_cisco_portChannel.pl -h 192.168.0.1 -c public -p Po1 -s 2000\n\n";
}
sub snmpwalk
{
my ($host, $community, $tree, $opts)=@_;
my @walk = `snmpwalk -v 2c -c $community $opts $host $tree`;
return @walk;
}
sub snmpget
{
my ($host, $community, $tree, $opts)=@_;
if (! $opts ) { $opts ="" }
my $get = `snmpget -v 2c -c $community $opts $host $tree`;
chomp($get);
return $get;
}
#===============================================================
=tail1 AUTHORS
by Jared DeWitt
=cut
=tail2 Thanks
Thanks to R3dl!GhT for writing snmpwalk and snmpget subs
=cut
=tail3 COPYWRIGHT
Copywrite (C) Jared DeWitt 2008.
This module is free software; you can redistribute it and/or
modify it under the terms of the GNU Public License.
=cut
#===============================================================