Code

check_ifoperstatus -n flag now works as expected (sf.net #1569488)
authorMatthias Eble <psychotrahe@users.sourceforge.net>
Wed, 22 Oct 2008 21:35:15 +0000 (21:35 +0000)
committerMatthias Eble <psychotrahe@users.sourceforge.net>
Wed, 22 Oct 2008 21:35:15 +0000 (21:35 +0000)
check_ifoperstatus now supports ifType based lookup for ifIndex

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@2061 f882894a-f735-0410-b71e-b25c423dba1c

BUGS
NEWS
plugins-scripts/check_ifoperstatus.pl

diff --git a/BUGS b/BUGS
index 0ab19af3d512abdf4e0beea30eaf1dc7b9cbd470..9e4c5a00789dbd7ef18e281b968b3dae01ff7c87 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -15,11 +15,9 @@ For the 1.4.13 release:
 1904965 - check_apt: SECURITY_RE is not correct
 1894850 - check_ping: incorrectly parses ping6 output
 1868822 - check_http link fails with openssl installed
-1867716 - check_snmp invalid performance data
 1864404 - check_smtp/check_http miscalculate timezones in cert expiry
 1681516 - output too verbose for various checks
 1670261 - check_snmp might require snmpget with LD_LIBRARY_PATH
-1569488 - check_ifoperstatus.pl: -n option does't work (help required!)
 1523748 - check_disk should error if warn range is subset of critical
 1478287 - check_dns fails with CNAMEs
 1469468 - signal handler in popen.c is broken
diff --git a/NEWS b/NEWS
index d261aec922628cc04cb7ac35cb3e31306b000e29..e5c7d11e36bae09f9ded5e5e97dd528df04ffdf9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ This file documents the major additions and syntax changes between releases.
 1.4.14 ...
        check_users thresholds were not working excatly as documented (>= rather than >)
        Updated tinderbox_build script to point to new tinderbox server
+       check_ifoperstatus -n flag now works as expected (sf.net #1569488)
+       check_ifoperstatus now supports ifType based lookup for ifIndex
 
 1.4.13 25th Sept 2008
        Fix Debian bug #460097: check_http --max-age broken (Hilko Bengen)
index 62891ff76ea80a1421904ccb9b119dbaea038a06..75e852de9c2819cc73dd64b3a59c2e07e4fbe4bc 100644 (file)
@@ -67,6 +67,7 @@ my $port = 161;
 my @snmpoids;
 my $sysUptime        = '1.3.6.1.2.1.1.3.0';
 my $snmpIfDescr      = '1.3.6.1.2.1.2.2.1.2';
+my $snmpIfType       = '1.3.6.1.2.1.2.2.1.3';
 my $snmpIfAdminStatus = '1.3.6.1.2.1.2.2.1.7';
 my $snmpIfOperStatus = '1.3.6.1.2.1.2.2.1.8';
 my $snmpIfName       = '1.3.6.1.2.1.31.1.1.1.1';
@@ -83,6 +84,7 @@ my $ifXTable;
 my $opt_h ;
 my $opt_V ;
 my $ifdescr;
+my $iftype;
 my $key;
 my $lastc;
 my $dormantWarn;
@@ -105,15 +107,18 @@ alarm($timeout);
 
 ## map ifdescr to ifindex - should look at being able to cache this value
 
-if (defined $ifdescr) {
+if (defined $ifdescr || defined $iftype) {
        # escape "/" in ifdescr - very common in the Cisco world
-       $ifdescr =~ s/\//\\\//g;
-
-       $status=fetch_ifdescr();  # if using on device with large number of interfaces
-                                                         # recommend use of SNMP v2 (get-bulk)
+       if (defined $iftype) {
+               $status=fetch_ifindex($snmpIfType, $iftype);  
+       } else {
+               $ifdescr =~ s/\//\\\//g;
+               $status=fetch_ifindex($snmpIfDescr, $ifdescr);  # if using on device with large number of interfaces
+                                                               # recommend use of SNMP v2 (get-bulk)
+       }
        if ($status==0) {
                $state = "UNKNOWN";
-               printf "$state: could not retrive ifdescr snmpkey - $status-$snmpkey\n";
+               printf "$state: could not retrive ifdescr/iftype snmpkey - $status-$snmpkey\n";
                $session->close;
                exit $ERRORS{$state};
        }
@@ -152,10 +157,10 @@ push(@snmpoids,$snmpIfAlias) if (defined $ifXTable) ;
 
    ## Check to see if ifName match is requested and it matches - exit if no match
    ## not the interface we want to monitor
-   if ( defined $name && not ($response->{$snmpIfName} eq $name) ) {
+   if ( defined $ifName && not ($response->{$snmpIfName} eq $ifName) ) {
       $state = 'UNKNOWN';
-      $answer = "Interface name ($name) doesn't match snmp value ($response->{$snmpIfName}) (index $snmpkey)";
-      print ("$state: $answer");
+      $answer = "Interface name ($ifName) doesn't match snmp value ($response->{$snmpIfName}) (index $snmpkey)";
+      print ("$state: $answer\n");
       exit $ERRORS{$state};
    } 
 
@@ -219,14 +224,17 @@ push(@snmpoids,$snmpIfAlias) if (defined $ifXTable) ;
 
 
 
-print ("$state: $answer");
+print ("$state: $answer\n");
 exit $ERRORS{$state};
 
 
 ### subroutines
 
-sub fetch_ifdescr {
-       if (!defined ($response = $session->get_table($snmpIfDescr))) {
+sub fetch_ifindex {
+       my $oid = shift;
+       my $lookup = shift;
+
+       if (!defined ($response = $session->get_table($oid))) {
                $answer=$session->error;
                $session->close;
                $state = 'CRITICAL';
@@ -236,10 +244,10 @@ sub fetch_ifdescr {
        }
        
        foreach $key ( keys %{$response}) {
-               if ($response->{$key} =~ /^$ifdescr$/) {
+               if ($response->{$key} =~ /^$lookup$/) {
                        $key =~ /.*\.(\d+)$/;
                        $snmpkey = $1;
-                       #print "$ifdescr = $key / $snmpkey \n";  #debug
+                       #print "$lookup = $key / $snmpkey \n";  #debug
                }
        }
        unless (defined $snmpkey) {
@@ -288,6 +296,7 @@ sub print_help() {
        printf "                     privacy password and authEngineID\n";
        printf "   -k (--key)        SNMP IfIndex value\n";
        printf "   -d (--descr)      SNMP ifDescr value\n";
+       printf "   -T (--type)       SNMP ifType integer value (see http://www.iana.org/assignments/ianaiftype-mib)\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";
@@ -299,8 +308,8 @@ sub print_help() {
        printf "   -t (--timeout)    seconds before the plugin times out (default=$TIMEOUT)\n";
        printf "   -V (--version)    Plugin version\n";
        printf "   -h (--help)       usage help \n\n";
-       printf " -k or -d must be specified\n\n";
-       printf "Note: either -k or -d must be specified and -d is much more network \n";
+       printf " -k or -d or -T must be specified\n\n";
+       printf "Note: either -k or -d or -T must be specified and -d and -T are much more network \n";
        printf "intensive.  Use it sparingly or not at all.  -n is used to match against\n";
        printf "a much more descriptive ifName value in the IfXTable to verify that the\n";
        printf "snmpkey has not changed to some other network interface after a reboot.\n\n";
@@ -331,6 +340,7 @@ sub process_arguments() {
                        "D=s" => \$adminWarn, "admin-down=s" => \$adminWarn,
                        "M=i" => \$maxmsgsize, "maxmsgsize=i" => \$maxmsgsize,
                        "t=i" => \$timeout,    "timeout=i" => \$timeout,
+                       "T=i" => \$iftype,    "type=i" => \$iftype,
                        );
 
 
@@ -356,7 +366,7 @@ sub process_arguments() {
        }
 
 
-       unless ($snmpkey > 0 || defined $ifdescr){
+       unless ($snmpkey > 0 || defined $ifdescr || defined $iftype){
                printf "Either a valid snmpkey key (-k) or a ifDescr (-d) must be provided)\n";
                usage();
                exit $ERRORS{"UNKNOWN"};
@@ -451,7 +461,7 @@ sub process_arguments() {
                if (!defined($session)) {
                        $state='UNKNOWN';
                        $answer=$error;
-                       print ("$state: $answer");
+                       print ("$state: $answer\n");
                        exit $ERRORS{$state};
                }
        
@@ -490,7 +500,7 @@ sub process_arguments() {
                if (!defined($session)) {
                                        $state='UNKNOWN';
                                        $answer=$error;
-                                       print ("$state: $answer");
+                                       print ("$state: $answer\n");
                                        exit $ERRORS{$state};
                }