diff options
| -rwxr-xr-x | plugins-scripts/check_ifstatus.pl | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/plugins-scripts/check_ifstatus.pl b/plugins-scripts/check_ifstatus.pl index 181fb7d7..cb8b5d00 100755 --- a/plugins-scripts/check_ifstatus.pl +++ b/plugins-scripts/check_ifstatus.pl | |||
| @@ -70,11 +70,14 @@ my %ifStatus; | |||
| 70 | my $ifup =0 ; | 70 | my $ifup =0 ; |
| 71 | my $ifdown =0; | 71 | my $ifdown =0; |
| 72 | my $ifdormant = 0; | 72 | my $ifdormant = 0; |
| 73 | my $ifexclude =0 ; | ||
| 73 | my $ifmessage = ""; | 74 | my $ifmessage = ""; |
| 74 | my $snmp_version = 1; | 75 | my $snmp_version = 1; |
| 75 | my $ifXTable; | 76 | my $ifXTable; |
| 76 | my $opt_h ; | 77 | my $opt_h ; |
| 77 | my $opt_V ; | 78 | my $opt_V ; |
| 79 | my $opt_x ; | ||
| 80 | my %excluded ; | ||
| 78 | 81 | ||
| 79 | 82 | ||
| 80 | 83 | ||
| @@ -97,7 +100,8 @@ $status = GetOptions( | |||
| 97 | "C=s" =>\$community,"community=s" => \$community, | 100 | "C=s" =>\$community,"community=s" => \$community, |
| 98 | "p=i" =>\$port, "port=i" => \$port, | 101 | "p=i" =>\$port, "port=i" => \$port, |
| 99 | "H=s" => \$hostname, "hostname=s" => \$hostname, | 102 | "H=s" => \$hostname, "hostname=s" => \$hostname, |
| 100 | "I" => \$ifXTable, "ifmib" => \$ifXTable ); | 103 | "I" => \$ifXTable, "ifmib" => \$ifXTable, |
| 104 | "x:s" => \$opt_x, "exclude:s" => \$opt_x); | ||
| 101 | 105 | ||
| 102 | if ($status == 0) | 106 | if ($status == 0) |
| 103 | { | 107 | { |
| @@ -116,6 +120,22 @@ if ($opt_h) { | |||
| 116 | exit $ERRORS{'OK'}; | 120 | exit $ERRORS{'OK'}; |
| 117 | } | 121 | } |
| 118 | 122 | ||
| 123 | |||
| 124 | if (defined $opt_x) { | ||
| 125 | my @x = split(",", $opt_x); | ||
| 126 | my $x; | ||
| 127 | if ( @x) { | ||
| 128 | foreach $x (@x){ | ||
| 129 | $excluded{$x} = 1; | ||
| 130 | } | ||
| 131 | }else{ | ||
| 132 | $excluded{23} = 1; # default PPP(23) if empty list - note (AIX seems to think PPP is 22 according to a post) | ||
| 133 | } | ||
| 134 | #debugging | ||
| 135 | #foreach $x (keys %excluded) | ||
| 136 | # { print "key = $x val = $excluded{$x}\n";} | ||
| 137 | } | ||
| 138 | |||
| 119 | if (! utils::is_hostname($hostname)){ | 139 | if (! utils::is_hostname($hostname)){ |
| 120 | usage(); | 140 | usage(); |
| 121 | exit $ERRORS{"UNKNOWN"}; | 141 | exit $ERRORS{"UNKNOWN"}; |
| @@ -159,6 +179,8 @@ push(@snmpoids,$snmpIfAdminStatus); | |||
| 159 | push(@snmpoids,$snmpIfDescr); | 179 | push(@snmpoids,$snmpIfDescr); |
| 160 | push(@snmpoids,$snmpIfType); | 180 | push(@snmpoids,$snmpIfType); |
| 161 | push(@snmpoids,$snmpIfName) if ( defined $ifXTable); | 181 | push(@snmpoids,$snmpIfName) if ( defined $ifXTable); |
| 182 | push(@snmpoids,$snmpIfAlias) if ( defined $ifXTable); | ||
| 183 | |||
| 162 | 184 | ||
| 163 | 185 | ||
| 164 | 186 | ||
| @@ -168,7 +190,11 @@ foreach $snmpoid (@snmpoids) { | |||
| 168 | $answer=$session->error; | 190 | $answer=$session->error; |
| 169 | $session->close; | 191 | $session->close; |
| 170 | $state = 'CRITICAL'; | 192 | $state = 'CRITICAL'; |
| 171 | print ("$state: $answer for $snmpoid with snmp version $snmp_version\n"); | 193 | if ( ( $snmpoid =~ $snmpIfName ) && defined $ifXTable ) { |
| 194 | print ("$state: Device does not support ifTable - try without -I option\n"); | ||
| 195 | }else{ | ||
| 196 | print ("$state: $answer for $snmpoid with snmp version $snmp_version\n"); | ||
| 197 | } | ||
| 172 | exit $ERRORS{$state}; | 198 | exit $ERRORS{$state}; |
| 173 | } | 199 | } |
| 174 | 200 | ||
| @@ -186,40 +212,52 @@ foreach $key (keys %ifStatus) { | |||
| 186 | 212 | ||
| 187 | # check only if interface is administratively up | 213 | # check only if interface is administratively up |
| 188 | if ($ifStatus{$key}{$snmpIfAdminStatus} == 1 ) { | 214 | if ($ifStatus{$key}{$snmpIfAdminStatus} == 1 ) { |
| 189 | # check only if interface is not of type 23 aka PPP interface | 215 | |
| 190 | if ($ifStatus{$key}{$snmpIfType} != 23 ) { | 216 | # check only if interface type is not listed in %excluded |
| 217 | |||
| 218 | if (!defined $excluded{$ifStatus{$key}{$snmpIfType}} ) { | ||
| 191 | if ($ifStatus{$key}{$snmpIfOperStatus} == 1 ) { $ifup++ ;} | 219 | if ($ifStatus{$key}{$snmpIfOperStatus} == 1 ) { $ifup++ ;} |
| 192 | if ($ifStatus{$key}{$snmpIfOperStatus} == 2 ) { | 220 | if ($ifStatus{$key}{$snmpIfOperStatus} == 2 ) { |
| 193 | $ifdown++ ; | 221 | $ifdown++ ; |
| 194 | $ifmessage .= sprintf("%s: down -> %s<BR>", | 222 | if (defined $ifXTable) { |
| 195 | $ifStatus{$key}{$snmpIfDescr}, | 223 | $ifmessage .= sprintf("%s: down -> %s<BR>", |
| 196 | $ifStatus{$key}{$snmpIfName}); | 224 | $ifStatus{$key}{$snmpIfName}, |
| 225 | $ifStatus{$key}{$snmpIfAlias}); | ||
| 226 | }else{ | ||
| 227 | $ifmessage .= sprintf("%s: down <BR>", | ||
| 228 | $ifStatus{$key}{$snmpIfDescr}); | ||
| 229 | } | ||
| 197 | } | 230 | } |
| 198 | if ($ifStatus{$key}{$snmpIfOperStatus} == 5 ) { $ifdormant++ ;} | 231 | if ($ifStatus{$key}{$snmpIfOperStatus} == 5 ) { $ifdormant++ ;} |
| 232 | }else{ | ||
| 233 | $ifexclude++; | ||
| 199 | } | 234 | } |
| 235 | |||
| 200 | } | 236 | } |
| 201 | 237 | ||
| 202 | } | 238 | } |
| 203 | 239 | ||
| 204 | if ($ifdown > 0) { | 240 | if ($ifdown > 0) { |
| 205 | $state = 'CRITICAL'; | 241 | $state = 'CRITICAL'; |
| 206 | $answer = sprintf("host '%s', interfaces up: %d, down: %d, dormant: %d<BR>", | 242 | $answer = sprintf("host '%s', interfaces up: %d, down: %d, dormant: %d, excluded: %d<BR>", |
| 207 | $hostname, | 243 | $hostname, |
| 208 | $ifup, | 244 | $ifup, |
| 209 | $ifdown, | 245 | $ifdown, |
| 210 | $ifdormant); | 246 | $ifdormant, |
| 247 | $ifexclude); | ||
| 211 | $answer = $answer . $ifmessage . "\n"; | 248 | $answer = $answer . $ifmessage . "\n"; |
| 212 | } | 249 | } |
| 213 | else { | 250 | else { |
| 214 | $state = 'OK'; | 251 | $state = 'OK'; |
| 215 | $answer = sprintf("host '%s', interfaces up: %d, down: %d, dormant: %d\n", | 252 | $answer = sprintf("host '%s', interfaces up: %d, down: %d, dormant: %d, excluded: %d", |
| 216 | $hostname, | 253 | $hostname, |
| 217 | $ifup, | 254 | $ifup, |
| 218 | $ifdown, | 255 | $ifdown, |
| 219 | $ifdormant); | 256 | $ifdormant, |
| 257 | $ifexclude); | ||
| 220 | } | 258 | } |
| 221 | 259 | my $perfdata = sprintf("up:%d,down:%d,dormant:%d,excluded:%d",$ifup,$ifdown,$ifdormant,$ifexclude); | |
| 222 | print ("$state: $answer"); | 260 | print ("$state: $answer |$perfdata\n"); |
| 223 | exit $ERRORS{$state}; | 261 | exit $ERRORS{$state}; |
| 224 | 262 | ||
| 225 | 263 | ||
| @@ -236,7 +274,7 @@ sub usage { | |||
| 236 | 274 | ||
| 237 | sub print_help { | 275 | sub print_help { |
| 238 | printf "check_ifstatus plugin for Nagios monitors operational \n"; | 276 | printf "check_ifstatus plugin for Nagios monitors operational \n"; |
| 239 | printf "status of each network interface (except PPP interfaces) on the target host\n"; | 277 | printf "status of each network interface on the target host\n"; |
| 240 | printf "\nUsage:\n"; | 278 | printf "\nUsage:\n"; |
| 241 | printf " -H (--hostname) Hostname to query - (required)\n"; | 279 | printf " -H (--hostname) Hostname to query - (required)\n"; |
| 242 | printf " -C (--community) SNMP read community (defaults to public,\n"; | 280 | printf " -C (--community) SNMP read community (defaults to public,\n"; |
| @@ -245,8 +283,11 @@ sub print_help { | |||
| 245 | printf " 2 for SNMP v2c\n"; | 283 | printf " 2 for SNMP v2c\n"; |
| 246 | printf " SNMP v2c will use get_bulk for less overhead\n"; | 284 | printf " SNMP v2c will use get_bulk for less overhead\n"; |
| 247 | printf " -p (--port) SNMP port (default 161)\n"; | 285 | printf " -p (--port) SNMP port (default 161)\n"; |
| 248 | printf " -I (--ifmib) Agent supports IFMIB ifXTable. Do not use if\n"; | 286 | printf " -I (--ifmib) Agent supports IFMIB ifXTable. For Cisco - this will provide\n"; |
| 249 | printf " you don't know what this is.\n"; | 287 | printf " the descriptive name. Do not use if you don't know what this is. \n"; |
| 288 | printf " -x (--exclude) A comma separated list of ifType values that should be excluded \n"; | ||
| 289 | printf " from the report (default for an empty list is PPP(23).\n"; | ||
| 290 | printf " See the IANAifType-MIB for a list of interface types.\n"; | ||
| 250 | printf " -V (--version) Plugin version\n"; | 291 | printf " -V (--version) Plugin version\n"; |
| 251 | printf " -h (--help) usage help \n\n"; | 292 | printf " -h (--help) usage help \n\n"; |
| 252 | print_revision($PROGNAME, '$Revision$'); | 293 | print_revision($PROGNAME, '$Revision$'); |
