check_snmp_int.pl: added ign-admindown, ign-emptyalias options. fixed unitialized variable warning by adding d/p/14_check_snmp_int_ign from upstream
This commit is contained in:
		
							parent
							
								
									b345ea5557
								
							
						
					
					
						commit
						a815051cc6
					
				
					 2 changed files with 188 additions and 0 deletions
				
			
		
							
								
								
									
										187
									
								
								debian/patches/14_check_snmp_int_ign
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								debian/patches/14_check_snmp_int_ign
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,187 @@
 | 
			
		|||
From 2d11bcf5c884793eb21a946fdd04cf87baf57ad3 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Stanislav Datskevych <me@nek0.net>
 | 
			
		||||
Date: Wed, 9 Jan 2019 11:25:39 +0100
 | 
			
		||||
Subject: [PATCH] added ign-admindown, ign-emptyalias options. fixed
 | 
			
		||||
 unitialized variable warning
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 plugins/check_snmp_int.pl | 98 +++++++++++++++++++++++++++++++--------
 | 
			
		||||
 1 file changed, 79 insertions(+), 19 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/plugins/check_snmp_int.pl b/plugins/check_snmp_int.pl
 | 
			
		||||
index e938131..721c3b2 100755
 | 
			
		||||
--- a/plugins/check_snmp_int.pl
 | 
			
		||||
+++ b/plugins/check_snmp_int.pl
 | 
			
		||||
@@ -35,7 +35,7 @@
 | 
			
		||||
 my $name_table         = '1.3.6.1.2.1.31.1.1.1.1';
 | 
			
		||||
 my $alias_table        = '.1.3.6.1.2.1.31.1.1.1.18';
 | 
			
		||||
 my $oper_table         = '1.3.6.1.2.1.2.2.1.8.';
 | 
			
		||||
-my $admin_table        = '1.3.6.1.2.1.2.2.1.7.';
 | 
			
		||||
+my $admin_table        = '1.3.6.1.2.1.2.2.1.7';
 | 
			
		||||
 my $speed_table        = '1.3.6.1.2.1.2.2.1.5.';
 | 
			
		||||
 my $speed_table_64     = '1.3.6.1.2.1.31.1.1.1.15.';
 | 
			
		||||
 my $in_octet_table     = '1.3.6.1.2.1.2.2.1.10.';
 | 
			
		||||
@@ -60,20 +60,22 @@
 | 
			
		||||
 # Globals
 | 
			
		||||
 
 | 
			
		||||
 # Standard options
 | 
			
		||||
-my $o_host    = undef;    # hostname
 | 
			
		||||
-my $o_port    = 161;      # port
 | 
			
		||||
-my $o_descr   = undef;    # description filter
 | 
			
		||||
-my $o_help    = undef;    # wan't some help ?
 | 
			
		||||
-my $o_admin   = undef;    # admin status instead of oper
 | 
			
		||||
-my $o_inverse = undef;    # Critical when up
 | 
			
		||||
-my $o_dormant = undef;    # Dormant state is OK
 | 
			
		||||
-my $o_down    = undef;    # Down state is OK
 | 
			
		||||
-my $o_verb    = undef;    # verbose mode
 | 
			
		||||
-my $o_version = undef;    # print version
 | 
			
		||||
-my $o_noreg   = undef;    # Do not use Regexp for name
 | 
			
		||||
-my $o_short   = undef;    # set maximum of n chars to be displayed
 | 
			
		||||
-my $o_label   = undef;    # add label before speed (in, out, etc...).
 | 
			
		||||
-my $o_weather = undef;    # output "weathermap" data for NagVis
 | 
			
		||||
+my $o_host              = undef;    # hostname
 | 
			
		||||
+my $o_port              = 161;      # port
 | 
			
		||||
+my $o_descr             = undef;    # description filter
 | 
			
		||||
+my $o_help              = undef;    # wan't some help ?
 | 
			
		||||
+my $o_admin             = undef;    # admin status instead of oper
 | 
			
		||||
+my $o_inverse           = undef;    # Critical when up
 | 
			
		||||
+my $o_dormant           = undef;    # Dormant state is OK
 | 
			
		||||
+my $o_down              = undef;    # Down state is OK
 | 
			
		||||
+my $o_ignore_admindown  = undef;    # Ignore interfaces in admin down state
 | 
			
		||||
+my $o_ignore_emptyalias = undef;    # ignore interfaces with empty alias (interface description string)
 | 
			
		||||
+my $o_verb              = undef;    # verbose mode
 | 
			
		||||
+my $o_version           = undef;    # print version
 | 
			
		||||
+my $o_noreg             = undef;    # Do not use Regexp for name
 | 
			
		||||
+my $o_short             = undef;    # set maximum of n chars to be displayed
 | 
			
		||||
+my $o_label             = undef;    # add label before speed (in, out, etc...).
 | 
			
		||||
+my $o_weather           = undef;    # output "weathermap" data for NagVis
 | 
			
		||||
 
 | 
			
		||||
 # Performance data options
 | 
			
		||||
 my $o_perf  = undef;      # Output performance data
 | 
			
		||||
@@ -224,6 +226,10 @@ sub help {
 | 
			
		||||
    Dormant state is an OK state
 | 
			
		||||
 --down
 | 
			
		||||
    Down state is an OK state
 | 
			
		||||
+--ign-admindown
 | 
			
		||||
+   Ignore interfaces in Admin down state
 | 
			
		||||
+--ign-emptyalias
 | 
			
		||||
+   Ignore interfaces having empty alias (port description)
 | 
			
		||||
 -o, --octetlength=INTEGER
 | 
			
		||||
   max-size of the SNMP message, usefull in case of Too Long responses.
 | 
			
		||||
   Be carefull with network filters. Range 484 - 65535, default are
 | 
			
		||||
@@ -358,7 +364,9 @@ sub check_options {
 | 
			
		||||
         'dormant'       => \$o_dormant,
 | 
			
		||||
         'down'          => \$o_down,
 | 
			
		||||
         'W'             => \$o_weather,
 | 
			
		||||
-        'weather'       => \$o_weather
 | 
			
		||||
+        'weather'       => \$o_weather,
 | 
			
		||||
+        'ign-admindown' => \$o_ignore_admindown,
 | 
			
		||||
+        'ign-emptyalias' => \$o_ignore_emptyalias,
 | 
			
		||||
     );
 | 
			
		||||
     if (defined($o_help))    { help();      exit $ERRORS{"UNKNOWN"} }
 | 
			
		||||
     if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"} }
 | 
			
		||||
@@ -489,6 +497,14 @@ sub check_options {
 | 
			
		||||
         print_usage();
 | 
			
		||||
         exit $ERRORS{"UNKNOWN"};
 | 
			
		||||
     }
 | 
			
		||||
+
 | 
			
		||||
+    #### check if --admin and --ign-admindown are put together.
 | 
			
		||||
+    #### --ign-admindown expects the open_state of the port to be used
 | 
			
		||||
+    if (defined($o_ignore_admindown) && defined($o_admin)) {
 | 
			
		||||
+        print "ERROR: --ign-admindown and -a are mutually exclusive. Please select only one.\n\n";
 | 
			
		||||
+        print_usage();
 | 
			
		||||
+        exit $ERRORS{"UNKNOWN"};
 | 
			
		||||
+    }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 ########## MAIN #######
 | 
			
		||||
@@ -616,6 +632,31 @@ sub check_options {
 | 
			
		||||
     $in_octet_table  = $in_octet_table_64;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+# If --ign-admindown is set, we need to have admin status table
 | 
			
		||||
+my $admin_status_table;
 | 
			
		||||
+if (defined($o_ignore_admindown)) {
 | 
			
		||||
+    $admin_status_table = $session->get_table(Baseoid => $admin_table);
 | 
			
		||||
+
 | 
			
		||||
+    if (!defined($admin_status_table)) {
 | 
			
		||||
+        printf("ERROR: Admin status table : %s.\n", $session->error);
 | 
			
		||||
+        $session->close;
 | 
			
		||||
+        exit $ERRORS{"UNKNOWN"};
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+# If --ign-emptyalias is set, we need to have aliases table
 | 
			
		||||
+my $interfaces_aliases;
 | 
			
		||||
+if (defined($o_ignore_emptyalias)) {
 | 
			
		||||
+    $interfaces_aliases = $session->get_table(Baseoid => $alias_table);
 | 
			
		||||
+
 | 
			
		||||
+    if (!defined($interfaces_aliases)) {
 | 
			
		||||
+        printf("ERROR: Alias status table : %s.\n", $session->error);
 | 
			
		||||
+        $session->close;
 | 
			
		||||
+        exit $ERRORS{"UNKNOWN"};
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+
 | 
			
		||||
 # Select interface by regexp of exact match
 | 
			
		||||
 # and put the oid to query in an array
 | 
			
		||||
 
 | 
			
		||||
@@ -623,12 +664,30 @@ sub check_options {
 | 
			
		||||
 foreach my $key (sort { $$resultat{$a} cmp $$resultat{$b} } keys %$resultat) {
 | 
			
		||||
     verb("OID : $key, Desc : $$resultat{$key}");
 | 
			
		||||
 
 | 
			
		||||
+    my $ignore = 0;
 | 
			
		||||
+    my $prefix = $query_table . ".";
 | 
			
		||||
+    my ($ifindex) = $key =~ /$prefix(\d+)$/;
 | 
			
		||||
+
 | 
			
		||||
+    # if ign-admindown is set, check the ifIndex against admin status
 | 
			
		||||
+    if (defined($o_ignore_admindown)) {
 | 
			
		||||
+	my $index = $admin_table . "." . $ifindex;
 | 
			
		||||
+        my $admstatus = $$admin_status_table{$index};
 | 
			
		||||
+        $ignore = 1 if ($admstatus == 2);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    # if ign-emptyalias is set, check the ifIndex against alias string
 | 
			
		||||
+    if (defined($o_ignore_emptyalias)) {
 | 
			
		||||
+	my $index = $alias_table . "." . $ifindex;
 | 
			
		||||
+        my $alias = $$interfaces_aliases{$index};
 | 
			
		||||
+        $ignore = 1 if ($alias eq "");
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     # test by regexp or exact match
 | 
			
		||||
     my $test
 | 
			
		||||
         = defined($o_noreg)
 | 
			
		||||
         ? $$resultat{$key} eq $o_descr
 | 
			
		||||
         : $$resultat{$key} =~ /$o_descr/;
 | 
			
		||||
-    if ($test) {
 | 
			
		||||
+    if ($test && !$ignore) {
 | 
			
		||||
 
 | 
			
		||||
         # get the index number of the interface
 | 
			
		||||
         my @oid_list = split(/\./, $key);
 | 
			
		||||
@@ -645,7 +704,7 @@ sub check_options {
 | 
			
		||||
             # Get rid of special caracters (specially for Windows)
 | 
			
		||||
             $descr[$num_int] =~ s/[[:cntrl:]]//g;
 | 
			
		||||
             # put the admin or oper oid in an array
 | 
			
		||||
-            $oids[$num_int]= defined ($o_admin) ? $admin_table . $tindex[$num_int] 
 | 
			
		||||
+            $oids[$num_int]= defined ($o_admin) ? $admin_table . "." . $tindex[$num_int]
 | 
			
		||||
 			: $oper_table . $tindex[$num_int];
 | 
			
		||||
 
 | 
			
		||||
             # Put the performance oid 
 | 
			
		||||
@@ -724,7 +783,7 @@ sub check_options {
 | 
			
		||||
     # Get the status of the current interface
 | 
			
		||||
     my $int_status
 | 
			
		||||
         = defined($o_admin)
 | 
			
		||||
-        ? $$result{ $admin_table . $tindex[$i] }
 | 
			
		||||
+        ? $$result{ $admin_table . "." . $tindex[$i] }
 | 
			
		||||
         : $$result{ $oper_table . $tindex[$i] };
 | 
			
		||||
 
 | 
			
		||||
     # Make the bandwith & error checks if necessary
 | 
			
		||||
@@ -976,6 +1035,7 @@ sub check_options {
 | 
			
		||||
             $perf_out .= "'" . $descr[$i] =~ s/\./_/r . "_out_discard'=" . $$result{ $oid_perf_outdisc[$i] } . "c ";
 | 
			
		||||
         }
 | 
			
		||||
         if (defined($o_perfs)) {
 | 
			
		||||
+	    my $speed_real = "" unless (defined($speed_real));
 | 
			
		||||
             $perf_out .= "'" . $descr[$i] =~ s/\./_/r . "_speed_bps'=" . $speed_real . " ";
 | 
			
		||||
         }
 | 
			
		||||
         if (defined($o_weather) && $usable_data == 1) {
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/patches/series
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/patches/series
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -2,5 +2,6 @@
 | 
			
		|||
11_check_snmp_int_agent_workaround
 | 
			
		||||
12_check_snmp_mem_perf
 | 
			
		||||
13_check_snmp_process_new_features
 | 
			
		||||
14_check_snmp_int_ign
 | 
			
		||||
50_disable_epn
 | 
			
		||||
51_fix_privacy_doc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue