1114 lines
39 KiB
Perl
Executable file
1114 lines
39 KiB
Perl
Executable file
#!/usr/bin/perl -w
|
|
#
|
|
# check_iftraffic.pl - Nagios(r) network traffic monitor plugin
|
|
# Copyright (C) 2004 Gerd Mueller / Netways GmbH
|
|
# $Id: check_iftraffic.pl 1119 2006-02-09 10:30:09Z gmueller $
|
|
# Version: .77
|
|
#
|
|
# mw = Markus Werner mw+nagios@wobcom.de
|
|
# Remarks (mw):
|
|
#
|
|
# I adopted as much as possible the programming style of the origin code.
|
|
#
|
|
# There should be a function to exit this program,
|
|
# instead of calling print and exit statements all over the place.
|
|
#
|
|
# minor changes by mw
|
|
# The snmp if_counters on net devices can have overflows.
|
|
# I wrote this code to address this situation.
|
|
# It has no automatic detection and which point the overflow
|
|
# occurs but it will generate a warning state and you
|
|
# can set the max value by calling this script with an additional
|
|
# arg.
|
|
#
|
|
# minor cosmetic changes by mw
|
|
# Sorry but I couldn't sustain to clean up some things.
|
|
#
|
|
# gj = Greg Frater gregATfraterfactory.com
|
|
# Remarks (gj):
|
|
# minor (gj):
|
|
#
|
|
# * fixed the performance data, formating was not to spec
|
|
# * Added a check of the interfaces status (up/down).
|
|
# If interface is down the check returns a critical status.
|
|
# * Support both textual or the numeric index values.
|
|
# * If the interface speed is not specified on the command line
|
|
# it gets it automatically from IfHighSpeed (or ifSpeed if IfHighSpeed
|
|
# counter is not available)
|
|
# * Added option to specify a second Speed parameter to allow for
|
|
# asymetrcal links such as a DSL line or cable modem where the
|
|
# download and upload speeds are different
|
|
# * Added -B option to display results in bits/sec instead of Bytes/sec
|
|
# * Added the current usage in Bytes/s (or bit/s) to the perfdata output
|
|
# * Added ability for plugin to determine interface to query by matching IP
|
|
# address of host with entry in ipAdEntIfIndex (.1.3.6.1.2.1.4.20.1.2)
|
|
# * Added -L flag to list entries found in the ipAdEntIfIndex table
|
|
# Otherwise, it works as before.
|
|
# * resorted options in help
|
|
# * Added auto detection mode (now the default), tries 64 bit counters first then uses 32
|
|
# bit if 64 bit values are not available
|
|
# * Added force flag to force 64 or 32 bit only mode (disables auto detection)
|
|
# * Reworked the status output, tried to make it a little more readable
|
|
# * Cleaned up logic of Units designator inside script
|
|
# * Added checks for bad interface speed values (zero, error, etc.)
|
|
# * 12_09_2014 Fixed unit label issue (thanks Gerhard Mourani for catching it)
|
|
# * 12_09_2014 Changed labels from index -> interface on output when interface is not up
|
|
# * 12_09_2014 Removed spurious '<br>' from output
|
|
# * 12_09_2014 Changed the $suffix from 'Bs' or 'bs' to 'B' or 'b'
|
|
# * 12_10_2014 Fixed issue when using string description for interface printing extra line with interface name and OID
|
|
# * 07_06_2015 Added SNMP v3 support, base code provided by Rogerio Tomassoni de Araujo Junio <rogerio.tomassoni (at) cnpem.br>
|
|
# * 12_02_2015 Set the inbandwidth and outbandwidth of the perfdata to a fixed base unit (bits or Bytes depending on switches used).
|
|
# * Thanks to Philip Ho <pcbho (at) hku.hk> and Fai Wong <fai.wong (at) masterson-tech.com> for pointing this out.
|
|
# * 12_08_2015 Fixed 'Return code of 25 is out of bounds' errors with an internal timeout setting. Thanks to Philip Ho
|
|
# <pcbho (at) hku.hk> for directing me to the underlying problem
|
|
# based on check_traffic from Adrian Wieczorek, <ads (at) irc.pila.pl>
|
|
# * 05_13_2016 Changed perf data for in_ave and out_ave to always be in Bytes (no Bits allowed) to align with perf data output rules
|
|
# Thanks to Mark Rittinghaus <rittinghaus.mark (at) lumberg.com> for pointing this out and recommending a fix.
|
|
# * 05_13_2016 Changed perf data for absolute Bytes ($in_bytes_abs/$out_bytes_abs) from Bytes units to 'c' for continuous
|
|
# Thanks to Mark Rittinghaus <rittinghaus.mark (at) lumberg.com> for suggesting this change.
|
|
# * 03_27_2018 No functional changes, just some code comment cleanup.
|
|
#
|
|
# Send us bug reports, questions and comments about this plugin.
|
|
# Latest version of this software: http://exchange.nagios.org
|
|
#
|
|
#
|
|
# 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
|
|
|
|
|
|
# Set Perl environ
|
|
use strict;
|
|
use Data::Dumper;
|
|
use Net::SNMP;
|
|
use Getopt::Long;
|
|
&Getopt::Long::config('bundling');
|
|
|
|
# Set script parameters
|
|
my $error;
|
|
my $host_address;
|
|
my $host_ip;
|
|
my $iface_descr;
|
|
my $iface_number;
|
|
my $iface_speed;
|
|
my $iface_speedOut;
|
|
my $ifspeed64;
|
|
my $ifspeed32;
|
|
my $inbytes64;
|
|
my $inbytes32;
|
|
my $outbytes64;
|
|
my $outbytes32;
|
|
my $in_ave = 0;
|
|
my $pin_ave = 0;
|
|
my $in_tot = 0;
|
|
my $index_list;
|
|
my $max_value; #added 20050614 by mw
|
|
my $max_bytes;
|
|
my $opt_h;
|
|
my $out_ave = 0;
|
|
my $pout_ave = 0;
|
|
my $port = 161;
|
|
my $out_tot = 0;
|
|
my $response;
|
|
my $session;
|
|
my @snmpoids;
|
|
my $units;
|
|
|
|
# SNMP OIDs for Traffic
|
|
my $snmpIfOperStatus = '1.3.6.1.2.1.2.2.1.8'; # Operational state of interface (i.e. 1-up, 2-down, etc.)
|
|
my $snmpIfInOctets32 = '1.3.6.1.2.1.2.2.1.10'; # Total Octets entering interface (in) - 32 bit counter
|
|
my $snmpIfOutOctets32 = '1.3.6.1.2.1.2.2.1.16'; # Total Octets leaving interface (out) - 32 bit counter
|
|
my $snmpIfInOctets = '1.3.6.1.2.1.31.1.1.1.6'; # Total Octets entering interface (in) - 64 bit counter
|
|
my $snmpIfOutOctets = '1.3.6.1.2.1.31.1.1.1.10'; # Total Octets leaving interface (out) - 64 bit counter
|
|
my $snmpIfDescr = '1.3.6.1.2.1.2.2.1.2'; # Textual string describing interface
|
|
my $snmpIfSpeed32 = '1.3.6.1.2.1.2.2.1.5'; # bits per second
|
|
my $snmpIfSpeed = '1.3.6.1.2.1.31.1.1.1.15'; # Mbits per second
|
|
my $snmpIPAdEntIfIndex = '1.3.6.1.2.1.4.20.1.2'; # Index of interface using hosts IP addr
|
|
|
|
|
|
|
|
# Path to tmp files
|
|
my $TRAFFIC_FILE = "/usr/local/nagios/libexec/traffic/";
|
|
|
|
# Create tmp file location if it does not exist
|
|
if ( ! -d $TRAFFIC_FILE ) {
|
|
mkdir $TRAFFIC_FILE;
|
|
}
|
|
|
|
# changes sos 20090717 UNKNOWN must be 3
|
|
# Set status codes
|
|
my %STATUS_CODE =
|
|
( 'UNKNOWN' => '3', 'OK' => '0', 'WARNING' => '1', 'CRITICAL' => '2' );
|
|
|
|
#default values;
|
|
my $bits = undef;
|
|
my $COMMUNITY = "public";
|
|
my $crit_usage = 98;
|
|
my $debug = 0;
|
|
my $force = undef;
|
|
my $if_status = '4';
|
|
my ( $in_bytes, $out_bytes, $in_bytes32, $out_bytes32 ) = 0;
|
|
my $label = "";
|
|
my $output = "";
|
|
my $snmp_version = 2;
|
|
my $state = "UNKNOWN";
|
|
my $suffix = "B";
|
|
my $thirtytwo = undef;
|
|
my $use_reg = undef; # Use Regexp for name
|
|
my $warn_usage = 85;
|
|
my $timeout = 10;
|
|
my $username;
|
|
my $authpasswd;
|
|
my $authproto = 'MD5';
|
|
my $privpasswd;
|
|
my $privproto = 'DES';
|
|
|
|
#cosmetic changes 20050614 by mw, see old versions for detail
|
|
# Added options for bits and second max ifspeed 20100202 by gj
|
|
# Added options for specific IP addr to match 20100405 by gj
|
|
my $status = GetOptions(
|
|
"h|help" => \$opt_h,
|
|
"authpassword=s" => \$authpasswd,
|
|
"authprotocol=s" => \$authproto,
|
|
'B' => \$bits,
|
|
'bits' => \$bits,
|
|
"C|community=s" => \$COMMUNITY,
|
|
"w|warning=s" => \$warn_usage,
|
|
"c|critical=s" => \$crit_usage,
|
|
"b|bandwidth|I|inBandwidth=i" => \$iface_speed,
|
|
"O|outBandwidth=i" => \$iface_speedOut,
|
|
'f|force' => \$force, #added 20130429 by gjf
|
|
'r' => \$use_reg,
|
|
'noregexp' => \$use_reg,
|
|
"privpassword=s" => \$privpasswd,
|
|
"privprotocol=s" => \$privproto,
|
|
"p|port=i" => \$port,
|
|
"u|units=s" => \$units,
|
|
"i|interface=s" => \$iface_descr,
|
|
"A|address=s" => \$host_ip,
|
|
"H|hostname=s" => \$host_address,
|
|
'L' => \$index_list,
|
|
"d|debug=i" => \$debug,
|
|
'list' => \$index_list,
|
|
"user|username=s" => \$username,
|
|
"v|Version=s" => \$snmp_version,
|
|
"M|max=i" => \$max_value, #added 20050614 by mw
|
|
"32|32bit" => \$thirtytwo #added 20101104 by gjf
|
|
);
|
|
|
|
# Set internal timeout to address 'Return code of 25 is out of bounds' errors
|
|
eval {
|
|
local %SIG;
|
|
$SIG{ALRM}=
|
|
sub{
|
|
die "UKNOWN: script timeout\n";
|
|
exit -1;
|
|
};
|
|
alarm 15;
|
|
|
|
|
|
# Print help if no options given
|
|
if ( $status == 0 ) {
|
|
print_help();
|
|
exit $STATUS_CODE{'OK'};
|
|
}
|
|
|
|
debugout ("DEBUG ENABLED at level: $debug", "1");
|
|
debugout ("INTERFACE DESCR: $iface_descr", "2"), if ( defined($iface_descr) );
|
|
|
|
# Changed 20091214 gj
|
|
# Check for missing options
|
|
if ( !$host_address ) {
|
|
print "\nMissing host address!\n\n";
|
|
stop(print_usage(),"OK");
|
|
} elsif ( ( $iface_speed ) and ( !$units ) ){
|
|
print "\nMissing units!\n\n";
|
|
stop(print_usage(),"OK");
|
|
} elsif ( ( $units ) and ( ( !$iface_speed ) and ( !$iface_speedOut ) ) ) {
|
|
print "\nMissing (-I or -O) interface maximum speed!\n\n";
|
|
stop(print_usage(),"OK");
|
|
} elsif ( ( $iface_speedOut ) and ( !$units ) ) {
|
|
print "\nMissing units (-u) for Out maximum speed!\n\n";
|
|
stop(print_usage(),"OK");
|
|
} elsif ( ( $max_value ) and ( !$units ) ) {
|
|
print "\nMissing units (-u) for maximum counter!\n\n";
|
|
stop(print_usage(),"OK");
|
|
} elsif ( ( $snmp_version == 3 ) and ( $authpasswd ) and ( !$username ) ) {
|
|
print "\nMissing version 3 username!\n\n";
|
|
stop(print_usage(),"OK");
|
|
} elsif ( ( $snmp_version == 3 ) and ( $privpasswd ) and ( !$authpasswd ) ) {
|
|
print "\nMissing version 3 auth password!\n\n";
|
|
stop(print_usage(),"OK");
|
|
}
|
|
|
|
# Set default units if undefined
|
|
if ( !defined($units) ){
|
|
#bits
|
|
$units = "b";
|
|
}
|
|
|
|
# Switch output from Bytes to bits if changed on command line
|
|
if ($bits) {
|
|
$suffix = "b"
|
|
}
|
|
|
|
if ( $iface_speed ) {
|
|
#change 20050414 by mw
|
|
# Added iface_speedOut 20100202 by gj
|
|
# Convert interface speed to Bytes
|
|
debugout("UNIT: $units","3");
|
|
$iface_speed = bits2bytes( $iface_speed, $units );
|
|
if ( $iface_speedOut ) {
|
|
$iface_speedOut = bits2bytes( $iface_speedOut, $units );
|
|
}
|
|
}
|
|
|
|
if ( !$max_value ) {
|
|
|
|
# If no -M Parameter was set, set it to 64Bit Overflow
|
|
$max_bytes = 18446744073709600000; # the value is (2^64)
|
|
|
|
if ( defined($thirtytwo) ){
|
|
# If using 32bit counters set to 32bit overflow
|
|
$max_bytes = 4294967296; # the value is (2^32)
|
|
}
|
|
} else {
|
|
# Max value specified, used given value, convert to Bytes
|
|
$max_bytes = unit2bytes( $max_value, $units );
|
|
}
|
|
|
|
debugout ("BYTE COUNTER max_value: $max_bytes", "2");
|
|
|
|
####### Can only be set after interface 'speed in' and 'out' and 'max bytes' have all been converted to Bytes
|
|
# Bytes
|
|
$units = "B";
|
|
|
|
# Check snmp version, set snmp parameters
|
|
if ( $snmp_version =~ /[12]/ ) {
|
|
( $session, $error ) = Net::SNMP->session(
|
|
-hostname => $host_address,
|
|
-community => $COMMUNITY,
|
|
-port => $port,
|
|
-version => $snmp_version
|
|
);
|
|
|
|
if ( !defined($session) ) {
|
|
stop("UNKNOWN: $error","UNKNOWN");
|
|
}
|
|
} elsif ( $snmp_version =~ /3/ ) {
|
|
#print "\nSNMP v3 \n\n";
|
|
#authPriv
|
|
if ( $username and $authpasswd and $privpasswd ) {
|
|
( $session, $error ) = Net::SNMP->session(
|
|
-hostname => $host_address,
|
|
-version => $snmp_version,
|
|
-username => $username,
|
|
-authpassword => $authpasswd,
|
|
-authprotocol => $authproto,
|
|
-privpassword => $privpasswd,
|
|
-privprotocol => $privproto,
|
|
-port => $port,
|
|
-timeout =>$timeout
|
|
|
|
);
|
|
#authNoPriv
|
|
} elsif ( $username and $authpasswd ) {
|
|
( $session, $error ) = Net::SNMP->session(
|
|
-hostname => $host_address,
|
|
-version => $snmp_version,
|
|
-username => $username,
|
|
-authpassword => $authpasswd,
|
|
-authprotocol => $authproto,
|
|
-port => $port,
|
|
-timeout =>$timeout
|
|
);
|
|
#NoauthNoPriv
|
|
} else {
|
|
( $session, $error ) = Net::SNMP->session(
|
|
-hostname => $host_address,
|
|
-version => $snmp_version,
|
|
-username => $username,
|
|
-port => $port,
|
|
-timeout =>$timeout
|
|
);
|
|
}
|
|
if ( !defined($session) ) {
|
|
stop("UNKNOWN: $error","UNKNOWN");
|
|
}
|
|
} else {
|
|
$state = 'UNKNOWN';
|
|
stop("$state: It appears you are missing one or more parameters necessary for v$snmp_version to function.\n",$state);
|
|
}
|
|
|
|
debugout("SNMP:\n\tver: $snmp_version\n\tcommunity: $COMMUNITY\n\tport: $port", "3");
|
|
if ( $username ) {
|
|
debugout("\n\tuser: $username", "3");
|
|
}
|
|
if ( $authpasswd ) {
|
|
debugout("\n\tauth password: $authpasswd\n\tauth protocol: $authproto", "3");
|
|
}
|
|
if ( $privpasswd ) {
|
|
debugout("\n\tpriv password: $privpasswd\n\tpriv protocol: $privproto", "3");
|
|
}
|
|
|
|
# Neither Interface Index nor Host IP address were specified
|
|
if ( !$iface_descr ) {
|
|
if ( !$host_ip ){
|
|
# Try to resolve host name and find index from ip addr
|
|
debugout("DETECT INTERFACE start with hostname", "1");
|
|
$iface_descr = fetch_Ip2IfIndex( $session, $host_address );
|
|
} else {
|
|
# Use ip addr to find index
|
|
debugout("DETECT INTERFACE start with IP addr","1");
|
|
$iface_descr = fetch_Ip2IfIndex( $session, $host_ip );
|
|
}
|
|
}
|
|
|
|
# Added 20091209 gj
|
|
# Detect if a string description was given or a numeric interface index number
|
|
if ( $iface_descr =~ /[^0123456789]+/ ) {
|
|
$iface_number = fetch_ifdescr( $session, $iface_descr );
|
|
debugout("INTERFACE from text string","1");
|
|
} else {
|
|
$iface_number = $iface_descr;
|
|
}
|
|
|
|
debugout("USING INT#: $iface_number", "2");
|
|
debugout("OID's:","2");
|
|
debugout("\tIfOperStatus: $snmpIfOperStatus.$iface_number","2");
|
|
debugout("\tIfSpeed: $snmpIfSpeed.$iface_number","2");
|
|
debugout("\tIfSpeed32: $snmpIfSpeed32.$iface_number","2");
|
|
debugout("\tInOctets: $snmpIfInOctets.$iface_number","2");
|
|
debugout("\tInOctets32: $snmpIfInOctets32.$iface_number","2");
|
|
debugout("\tOutOctets: $snmpIfOutOctets.$iface_number","2");
|
|
debugout("\tOutOctets32: $snmpIfOutOctets32.$iface_number","2");
|
|
|
|
# Get SNMP values, flag errors
|
|
debugout("RESULTS:","3");
|
|
my $res_status = $session->get_request(-varbindlist => [ $snmpIfOperStatus . "." . $iface_number ],);
|
|
if ( defined $res_status ){
|
|
$if_status = $res_status->{ $snmpIfOperStatus . "." . $iface_number };
|
|
debugout("\tOperational Status: $if_status","3");
|
|
} else {
|
|
$if_status = "DNE - " . $session->error();
|
|
debugout("\tOperational Status not defined!: $if_status","2");
|
|
}
|
|
my $res_ifspeed64 = $session->get_request(-varbindlist => [ $snmpIfSpeed . "." . $iface_number ],);
|
|
if ( defined $res_ifspeed64 ){
|
|
$ifspeed64 = $res_ifspeed64->{ $snmpIfSpeed . "." . $iface_number };
|
|
debugout("\tInterface Speed (64bit): $ifspeed64 Mbits","3");
|
|
} else {
|
|
$ifspeed64 = "DNE - " . $session->error();
|
|
debugout("\tInterface Speed (64bit) not defined or bad value!: $ifspeed64","2");
|
|
}
|
|
my $res_ifspeed32 = $session->get_request(-varbindlist => [ $snmpIfSpeed32 . "." . $iface_number ],);
|
|
if ( defined $res_ifspeed32 ){
|
|
$ifspeed32 = $res_ifspeed32->{ $snmpIfSpeed32 . "." . $iface_number };
|
|
debugout("\tInterface Speed (32bit): $ifspeed32 bits","3");
|
|
} else {
|
|
$ifspeed32 = "DNE - " . $session->error();
|
|
debugout("\tInterface Speed (32bit) not defined!: $ifspeed32","2");
|
|
}
|
|
my $res_inbytes64 = $session->get_request(-varbindlist => [ $snmpIfInOctets . "." . $iface_number ],);
|
|
if ( defined $res_inbytes64 ){
|
|
$inbytes64 = $res_inbytes64->{ $snmpIfInOctets . "." . $iface_number };
|
|
debugout("\tIn Bytes (64bit): $inbytes64","2");
|
|
} else {
|
|
$inbytes64 = "DNE - " . $session->error();
|
|
debugout("\tIn Bytes (64bit) not defined!: $inbytes64","2");
|
|
}
|
|
my $res_inbytes32 = $session->get_request(-varbindlist => [ $snmpIfInOctets32 . "." . $iface_number ],);
|
|
if ( defined $res_inbytes32 ){
|
|
$inbytes32 = $res_inbytes32->{ $snmpIfInOctets32 . "." . $iface_number };
|
|
debugout("\tIn Bytes (32bit): $inbytes32","3");
|
|
} else {
|
|
$inbytes32 = "DNE - " . $session->error();
|
|
debugout("\tIn Bytes (32bit) not defined!: $inbytes32","2");
|
|
}
|
|
my $res_outbytes64 = $session->get_request(-varbindlist => [ $snmpIfOutOctets . "." . $iface_number ],);
|
|
if ( defined $res_outbytes64 ){
|
|
$outbytes64 = $res_outbytes64->{ $snmpIfOutOctets . "." . $iface_number };
|
|
debugout("\tOut Bytes (64bit): $outbytes64","3");
|
|
} else {
|
|
$outbytes64 = "DNE - " . $session->error();
|
|
debugout("\tOut Bytes (64bit) not defined!: $outbytes64","2");
|
|
}
|
|
my $res_outbytes32 = $session->get_request(-varbindlist => [ $snmpIfOutOctets32 . "." . $iface_number ],);
|
|
if ( defined $res_outbytes32 ){
|
|
$outbytes32 = $res_outbytes32->{ $snmpIfOutOctets32 . "." . $iface_number };
|
|
debugout("\tOut Bytes (32bit): $outbytes32","3");
|
|
} else {
|
|
$outbytes32 = "DNE - " . $session->error();
|
|
debugout("\tOut Bytes (32bit) not defined!: $outbytes32","2");
|
|
}
|
|
|
|
# Check interface status, quit check if interface status is error or not '1'.
|
|
if ( defined $res_status ){
|
|
if ( $if_status =~ /^DNE -|error|noSuchObject|noSuchInstance/i ) {
|
|
debugout("if_status is not a number\n","4");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: Improper interface status, status received: " . $if_status . "\n",$state);
|
|
} elsif ( $if_status == 1 ) {
|
|
# No action necessary, continue on!
|
|
} elsif ($if_status == 2 ) {
|
|
# Quit, interface is down
|
|
$state = 'CRITICAL';
|
|
stop("$state: Interface is \'down\' (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
} elsif ($if_status == 3 ) {
|
|
# Quit, interface is testing
|
|
$state = 'CRITICAL';
|
|
stop("$state: Interface is reporting \'testing\' (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
} elsif ($if_status == 4 ) {
|
|
# Quit, interface is unknown
|
|
$state = 'CRITICAL';
|
|
stop("$state: Interface is reporting \'unknown\' (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
} elsif ($if_status == 5 ) {
|
|
# Quit, interface is dormant
|
|
$state = 'CRITICAL';
|
|
stop("$state: Interface is reporting \'dormant\' (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
} elsif ($if_status == 6 ) {
|
|
# Quit, interface is notPresent
|
|
$state = 'CRITICAL';
|
|
stop("$state: Interface is reporting \'notPresent\' (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
} elsif ($if_status == 7 ) {
|
|
# Quit, interface is lowerLayerDown
|
|
$state = 'CRITICAL';
|
|
stop("$state: Interface is reporting \'lowerLayerDown\' (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
} else {
|
|
# Interface is in an unknown state
|
|
$state = 'UNKNOWN';
|
|
stop("$state: Interface is reporting unknown status (interface: " . $iface_number . " status: " . $if_status . ")\n",$state);
|
|
}
|
|
} else {
|
|
$state = 'UNKNOWN';
|
|
stop("$state: Improper interface status, status received: " . $if_status . "\n",$state);
|
|
}
|
|
|
|
# Determine which values to use
|
|
if ( !defined($force) and !defined($thirtytwo) ){
|
|
#default - use 64 then 32 bit values
|
|
debugout("USING 64 THEN 32 bit VALUES:","4");
|
|
|
|
# Speed test
|
|
if ( !$iface_speed ) {
|
|
debugout("\t(Interface speed not provided on command line, determine from host)","4");
|
|
if ( $ifspeed64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i or $ifspeed64 < 1 ){
|
|
debugout("\t\tBad 64bit speed value: $ifspeed64","3");
|
|
if ( $ifspeed32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i or $ifspeed32 < 1 or $ifspeed32 > 4294967295 ){
|
|
debugout("\t\tBad 32bit speed value: $ifspeed32","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No usable interface speed available 64: $ifspeed64 32: $ifspeed32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 32bit speed value: $ifspeed32","3");
|
|
$iface_speed = bits2bytes( $ifspeed32, "b" );
|
|
}
|
|
} else {
|
|
debugout("\tUsing 64bit speed value: $ifspeed64","3");
|
|
# Convert Mbits to bits, bits to Bytes
|
|
$iface_speed = $ifspeed64 * 1000 * 1000;
|
|
$iface_speed = bits2bytes( $iface_speed, "b" );
|
|
}
|
|
}
|
|
|
|
# InBytes test
|
|
if ( $inbytes64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 64bit in bytes value: $inbytes64","3");
|
|
if ( $inbytes32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 32bit in bytes value: $inbytes32","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No in bytes available 64: $inbytes64 32: $inbytes32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 32bit in bytes value: $inbytes32","3");
|
|
$in_bytes = $inbytes32;
|
|
}
|
|
} else {
|
|
debugout("\tUsing 64bit in bytes value: $inbytes64","3");
|
|
$in_bytes = $inbytes64;
|
|
}
|
|
|
|
# OutBytes test
|
|
if ( $outbytes64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 64bit out bytes value: $outbytes64","3");
|
|
if ( $outbytes32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 32bit out bytes value: $outbytes32","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No out bytes available 64: $outbytes64 32: $outbytes32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 32bit out bytes value: $outbytes32","3");
|
|
$out_bytes = $outbytes32;
|
|
}
|
|
} else {
|
|
debugout("\tUsing 64bit out bytes value: $outbytes64","3");
|
|
$out_bytes = $outbytes64;
|
|
}
|
|
|
|
} elsif ( !defined($force) and defined($thirtytwo) ){
|
|
debugout("USING 32 THEN 64 bit VALUES:","4");
|
|
|
|
# Speed test
|
|
if ( !$iface_speed ) {
|
|
debugout("\t(Interface speed not provided on command line, determine from host)","4");
|
|
if ( $ifspeed32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i or $ifspeed32 < 1 or $ifspeed32 >= 4294967295 ){
|
|
debugout("\t\tBad 32bit speed value: $ifspeed32","3");
|
|
if ( $ifspeed64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i or $ifspeed64 < 1 ){
|
|
debugout("\t\tBad 64bit speed value: $ifspeed64","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No usable interface speed available 64: $ifspeed64 32: $ifspeed32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 64bit speed value: $ifspeed64","3");
|
|
# Convert Mbits to bits, bits to Bytes
|
|
$iface_speed = $ifspeed64 * 1000 * 1000;
|
|
$iface_speed = bits2bytes( $iface_speed, "b" );
|
|
}
|
|
} else {
|
|
debugout("\tUsing 32bit speed value: $ifspeed32","3");
|
|
$iface_speed = bits2bytes( $ifspeed32, "b" );
|
|
}
|
|
}
|
|
|
|
# InBytes test
|
|
if ( $inbytes32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 32bit in bytes value: $inbytes32","3");
|
|
if ( $inbytes64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 64bit in bytes value: $inbytes64","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No in bytes available 64: $inbytes64 32: $inbytes32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 64bit in bytes value: $inbytes64","3");
|
|
$in_bytes = $inbytes64;
|
|
}
|
|
} else {
|
|
debugout("\tUsing 32bit in bytes value: $inbytes32","3");
|
|
$in_bytes = $inbytes32;
|
|
}
|
|
|
|
# OutBytes test
|
|
if ( $outbytes32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 32bit out bytes value: $outbytes32","3");
|
|
if ( $outbytes64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 64bit out bytes value: $outbytes64","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No out bytes available 64: $outbytes64 32: $outbytes32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 64bit out bytes value: $outbytes64","3");
|
|
$out_bytes = $outbytes64;
|
|
}
|
|
} else {
|
|
debugout("\tUsing 32bit out bytes value: $outbytes32","3");
|
|
$out_bytes = $outbytes32;
|
|
}
|
|
|
|
} elsif ( defined($force) and defined($thirtytwo) ){
|
|
debugout("USING 32 bit VALUES ONLY:","4");
|
|
|
|
# Speed test
|
|
if ( !$iface_speed ) {
|
|
debugout("\t(Interface speed not provided on command line, determine from host)","4");
|
|
if ( $ifspeed32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i or $ifspeed32 < 1 or $ifspeed32 > 4294967295 ){
|
|
debugout("\t\tBad 32bit speed value: $ifspeed32","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No usable interface speed available: $ifspeed32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 32bit speed value: $ifspeed32","3");
|
|
$iface_speed = bits2bytes( $ifspeed32, "b" );
|
|
}
|
|
}
|
|
|
|
# InBytes test
|
|
if ( $inbytes32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 32bit in bytes value: $inbytes32","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No in bytes available: $inbytes32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 32bit in bytes value: $inbytes32","3");
|
|
$in_bytes = $inbytes32;
|
|
}
|
|
|
|
# OutBytes test
|
|
if ( $outbytes32 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 32bit out bytes value: $outbytes32","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No out bytes available: $outbytes32\n",$state);
|
|
} else {
|
|
debugout("\tUsing 32bit out bytes value: $outbytes32","3");
|
|
$out_bytes = $outbytes32;
|
|
}
|
|
|
|
} elsif ( defined($force) and !defined($thirtytwo) ){
|
|
debugout("USING 64 bit ONLY:","4");
|
|
|
|
# Speed test
|
|
if ( !$iface_speed ) {
|
|
debugout("\t(Interface speed not provided on command line, determine from host)","4");
|
|
if ( $ifspeed64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i or $ifspeed64 < 1 ){
|
|
debugout("\t\tBad 64bit speed value: $ifspeed64","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No usable interface speed available: $ifspeed64\n",$state);
|
|
} else {
|
|
debugout("\tUsing 64bit speed value: $ifspeed64","3");
|
|
# Convert Mbits to bits, bits to Bytes
|
|
$iface_speed = $ifspeed64 * 1000 * 1000;
|
|
$iface_speed = bits2bytes( $iface_speed, "b" );
|
|
}
|
|
}
|
|
|
|
# InBytes test
|
|
if ( $inbytes64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 64bit in bytes value: $inbytes64","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No in bytes available: $inbytes64\n",$state);
|
|
} else {
|
|
debugout("\tUsing 64bit in bytes value: $inbytes64","3");
|
|
$in_bytes = $inbytes64;
|
|
}
|
|
|
|
# OutBytes test
|
|
if ( $outbytes64 =~ /^DNE -|error|noSuchObject|noSuchInstance/i ){
|
|
debugout("\t\tBad 64bit out bytes value: $outbytes64","3");
|
|
$state = 'UNKNOWN';
|
|
stop("$state: No out bytes available: $outbytes64\n",$state);
|
|
} else {
|
|
debugout("\tUsing 64bit out bytes value: $outbytes64","3");
|
|
$out_bytes = $outbytes64;
|
|
}
|
|
|
|
}
|
|
|
|
# Added 20100201 gj
|
|
# Check if Out max speed was provided, use same IF speed for both if not
|
|
if (!$iface_speedOut) {
|
|
$iface_speedOut = $iface_speed;
|
|
}
|
|
|
|
debugout ("UNITS: $units", "2");
|
|
debugout ("Interface speed calculated as: $iface_speed $units", "1");
|
|
debugout ("Interface speed OUT: $iface_speedOut $units", "4");
|
|
|
|
# close SNMP
|
|
$session->close;
|
|
|
|
my $row;
|
|
my $last_check_time = time - 1;
|
|
my $last_in_bytes = $in_bytes;
|
|
my $last_out_bytes = $out_bytes;
|
|
|
|
if (
|
|
open( FILE,
|
|
"<" . $TRAFFIC_FILE . $host_address . "_if-" . $iface_number )
|
|
)
|
|
{
|
|
while ( $row = <FILE> ) {
|
|
|
|
( $last_check_time, $last_in_bytes, $last_out_bytes ) =
|
|
split( ":", $row );
|
|
|
|
### by sos 17.07.2009 check for last_bytes
|
|
if ( ! $last_in_bytes ) { $last_in_bytes=$in_bytes; }
|
|
if ( ! $last_out_bytes ) { $last_out_bytes=$out_bytes; }
|
|
|
|
if ($last_in_bytes !~ m/\d/) { $last_in_bytes=$in_bytes; }
|
|
if ($last_out_bytes !~ m/\d/) { $last_out_bytes=$out_bytes; }
|
|
}
|
|
close(FILE);
|
|
}
|
|
|
|
my $update_time = time;
|
|
debugout ("CURRENT timestamp: $update_time", "1");
|
|
debugout ("FILE PATH: $TRAFFIC_FILE" . $host_address . "_if-" . $iface_number, "1");
|
|
debugout("READ FROM FILE:\n\tlast time: $last_check_time\n\tlast in bytes: $last_in_bytes\n\tlast out bytes: $last_out_bytes","4");
|
|
|
|
open( FILE, ">" . $TRAFFIC_FILE . $host_address . "_if-" . $iface_number )
|
|
or die "Can't open $TRAFFIC_FILE for writing: $!";
|
|
|
|
printf FILE ( "%s:%.0ld:%.0ld\n", $update_time, $in_bytes, $out_bytes );
|
|
close(FILE);
|
|
|
|
debugout("WRITTEN TO FILE:\n\ttime: $update_time\n\tin_bytes: $in_bytes\n\tout bytes: $out_bytes","4");
|
|
|
|
#added 20050614 by mw
|
|
#Check for and correct counter overflow (if possible).
|
|
#See function counter_overflow.
|
|
$in_bytes = counter_overflow( $in_bytes, $last_in_bytes, $max_bytes );
|
|
$out_bytes = counter_overflow( $out_bytes, $last_out_bytes, $max_bytes );
|
|
|
|
# Calculate traffic since last check (RX\TX)
|
|
my $in_traffic = sprintf( "%.2lf",
|
|
( $in_bytes - $last_in_bytes ) / ( time - $last_check_time ) );
|
|
my $out_traffic = sprintf( "%.2lf",
|
|
( $out_bytes - $last_out_bytes ) / ( time - $last_check_time ) );
|
|
|
|
debugout("in_traffic: $in_traffic\nout_traffic: $out_traffic","1");
|
|
# sos 20090717 changed because rrdtool needs bytes
|
|
my $in_bytes_abs = $in_bytes;
|
|
my $out_bytes_abs = $out_bytes;
|
|
|
|
debugout("iface_speed: $iface_speed $units\nin_traffic: $in_traffic\nout_traffic: $out_traffic", "1");
|
|
|
|
# Calculate usage percentages
|
|
my $in_ave_pct = sprintf( "%.2f", ( 1.0 * $in_traffic * 100 ) / $iface_speed );
|
|
my $out_ave_pct = sprintf( "%.2f", ( 1.0 * $out_traffic * 100 ) / $iface_speedOut );
|
|
|
|
# Don't scale perf data or change it to bits from bytes
|
|
$pin_ave = $in_traffic;
|
|
$pout_ave = $out_traffic;
|
|
|
|
if ($bits) {
|
|
# Convert output from Bytes to bits
|
|
$label = "bits";
|
|
$in_tot = $in_bytes * 8;
|
|
$out_tot = $out_bytes * 8;
|
|
$in_ave = $in_traffic * 8;
|
|
$out_ave = $out_traffic * 8;
|
|
} else {
|
|
$label = "Bytes";
|
|
$in_tot = $in_bytes;
|
|
$out_tot = $out_bytes;
|
|
$in_ave = $in_traffic;
|
|
$out_ave = $out_traffic;
|
|
}
|
|
|
|
debugout("OUTPUT:\n\tlabel: $label", "4");
|
|
debugout("\tin_tot: $in_tot\n\tout_tot: $out_tot\n\tin_ave: $in_ave\n\tout_ave: $out_ave", "4");
|
|
debugout("\tin_ave_pct: $in_ave_pct\n\tout_ave_pct: $out_ave_pct\n\tin_bytes_abs: $in_bytes_abs\n\tout_bytes_abs: $out_bytes_abs", "4");
|
|
|
|
# Scale ave and tot for output
|
|
$in_tot = unit2scale($in_tot);
|
|
$out_tot = unit2scale($out_tot);
|
|
$in_ave = unit2scale($in_ave);
|
|
$out_ave = unit2scale($out_ave);
|
|
|
|
# Convert from Bytes/bits to megaBytes/bits
|
|
$in_bytes = sprintf( "%.2f", $in_bytes / (1024 * 1000) );
|
|
$out_bytes = sprintf( "%.2f", $out_bytes / (1024 * 1000) );
|
|
|
|
# Changed 20091209 gj, updated 20130424 gj
|
|
# Check/Set state of service check
|
|
if ( ( $in_ave_pct < $warn_usage ) and ( $out_ave_pct < $warn_usage ) ) {
|
|
$state = 'OK';
|
|
$output =
|
|
"$state - Average IN: "
|
|
. $in_ave . $suffix . " (" . $in_ave_pct . "%), "
|
|
. "Average OUT: " . $out_ave . $suffix . " (" . $out_ave_pct . "%)";
|
|
$output .= "Total RX: $in_tot" . "$label, Total TX: $out_tot" . "$label";
|
|
} elsif ( $in_ave_pct > $crit_usage ) {
|
|
$state = 'CRITICAL';
|
|
$output = "$state - IN bandwidth ($in_ave_pct%) too high";
|
|
} elsif ( $out_ave_pct > $crit_usage ) {
|
|
$state = 'CRITICAL';
|
|
$output = "$state - OUT bandwidth ($out_ave_pct%) too high";
|
|
} elsif ( $in_ave_pct > $warn_usage ) {
|
|
$state = 'WARNING';
|
|
$output = "$state - IN bandwidth ($in_ave_pct%) too high";
|
|
} elsif ( $out_ave_pct > $warn_usage ) {
|
|
$state = 'WARNING';
|
|
$output = "$state - OUT bandwidth ($out_ave_pct%) too high";
|
|
}
|
|
|
|
# Changed 20091214 gj - commas should have been semicolons
|
|
$output .=
|
|
"|inUsage=$in_ave_pct%;$warn_usage;$crit_usage outUsage=$out_ave_pct%;$warn_usage;$crit_usage"
|
|
. " inBandwidth=" . $pin_ave . "B outBandwidth=" . $pout_ave . "B"
|
|
. " inAbsolut=$in_bytes_abs" . "c" . " outAbsolut=$out_bytes_abs" . "c";
|
|
debugout ("",1);
|
|
stop($output, $state);
|
|
|
|
|
|
# end of internal timeout eval group
|
|
alarm 0;
|
|
};
|
|
|
|
sub fetch_Ip2IfIndex {
|
|
my $state;
|
|
my $response;
|
|
|
|
my $snmpkey;
|
|
my $answer;
|
|
my $key;
|
|
|
|
my ( $session, $host ) = @_;
|
|
|
|
# Determine if we have a host name or IP addr
|
|
if ( $host =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ ){
|
|
debugout("I found an IP address: $host","3");
|
|
} else {
|
|
debugout("RESOLVING hostname $host","3");
|
|
$host = get_ip ( $host );
|
|
debugout("HOSTNAME RESOLVED to IP addr: $host","3");
|
|
}
|
|
|
|
# Quit if results not found
|
|
if ( !defined( $response = $session->get_table($snmpIPAdEntIfIndex) ) ) {
|
|
$answer = $session->error;
|
|
$session->close;
|
|
$state = 'CRITICAL';
|
|
stop ("$state: Interface index not detected ERROR: $answer",$state);
|
|
}
|
|
|
|
my %resp = %{$response};
|
|
|
|
if ( $index_list ){
|
|
print ("\nInterfaces found:\n");
|
|
print (" IP Addr\tIndex\n");
|
|
print ("------------------------\n");
|
|
}
|
|
# Check each returned value
|
|
foreach $key ( keys %resp ) {
|
|
|
|
if ( $index_list ){
|
|
my $index_addr = substr $key, 21;
|
|
print ($index_addr,"\t ",$resp{$key},"\n");
|
|
}
|
|
|
|
# Check for ip address match in returned index results
|
|
if ( $key =~ /$host$/ ) {
|
|
$snmpkey = $resp{$key};
|
|
}
|
|
}
|
|
unless ( defined $snmpkey ) {
|
|
$session->close;
|
|
$state = 'CRITICAL';
|
|
stop("$state: Could not find index matching $host",$state);
|
|
}
|
|
return $snmpkey;
|
|
}
|
|
|
|
sub fetch_ifdescr {
|
|
my $state;
|
|
my $response;
|
|
|
|
my $snmpkey;
|
|
my $answer;
|
|
my $key;
|
|
|
|
my ( $session, $ifdescr ) = @_;
|
|
|
|
if ( !defined( $response = $session->get_table($snmpIfDescr) ) ) {
|
|
$answer = $session->error;
|
|
$session->close;
|
|
$state = 'CRITICAL';
|
|
exit $STATUS_CODE{$state};
|
|
}
|
|
|
|
foreach $key ( keys %{$response} ) {
|
|
|
|
# added 20070816 by oer: remove trailing 0 Byte for Windows :-(
|
|
my $resp=$response->{$key};
|
|
$resp =~ s/\x00//;
|
|
|
|
|
|
my $test = defined($use_reg)
|
|
? $resp =~ /$ifdescr/
|
|
: $resp eq $ifdescr;
|
|
|
|
if ($test) {
|
|
|
|
$key =~ /.*\.(\d+)$/;
|
|
$snmpkey = $1;
|
|
|
|
debugout("\t$ifdescr = $key / $snmpkey","2");
|
|
}
|
|
}
|
|
unless ( defined $snmpkey ) {
|
|
$session->close;
|
|
$state = 'CRITICAL';
|
|
printf "$state: Could not match $ifdescr \n";
|
|
exit $STATUS_CODE{$state};
|
|
}
|
|
return $snmpkey;
|
|
}
|
|
|
|
#added 20050416 by mw
|
|
#Converts an input value to value in bits
|
|
sub bits2bytes {
|
|
return unit2bytes(@_) / 8;
|
|
}
|
|
|
|
#added 20050416 by mw
|
|
#Converts an input value to value in bytes
|
|
sub unit2bytes {
|
|
my ( $value, $unit ) = @_;
|
|
|
|
if ( $unit eq "g" ) {
|
|
return $value * 1000 * 1000 * 1000;
|
|
}
|
|
elsif ( $unit eq "m" ) {
|
|
return $value * 1000 * 1000;
|
|
}
|
|
elsif ( $unit eq "k" ) {
|
|
return $value * 1000;
|
|
}
|
|
elsif ( $unit eq "b" ) {
|
|
return $value * 1;
|
|
}
|
|
else {
|
|
print "You have to supply a supported unit (g,m,k,b)\n";
|
|
exit $STATUS_CODE{'UNKNOWN'};
|
|
}
|
|
}
|
|
|
|
sub unit2scale {
|
|
# Scale output, expecting Bits\Bytes input
|
|
my ($val) = @_;
|
|
my $prefix = "";
|
|
|
|
# I'm not sure which should be used here 1024 or 1000 but 1000 is easier on the
|
|
# eye when looking at the plug-in output
|
|
#if ( $val > 1024 ) {
|
|
if ( $val > 1000 ) {
|
|
# $val = sprintf( "%.2f", $val / 1024 );
|
|
$val = sprintf( "%.2f", $val / 1000 );
|
|
$prefix = "K";
|
|
}
|
|
if ( $val > 1000 ) {
|
|
$val = sprintf( "%.2f", $val / 1000 );
|
|
$prefix = "M";
|
|
}
|
|
if ( $val > 1000 ) {
|
|
$val = sprintf( "%.2f", $val / 1000 );
|
|
$prefix = "G";
|
|
}
|
|
return $val . $prefix;
|
|
}
|
|
|
|
# Convert from Bytes/bits to megaBytes/bits
|
|
# added 20050414 by mw
|
|
# This function detects if an overflow occurs. If so, it returns
|
|
# a computed value for $bytes.
|
|
# If there is no counter overflow it simply returns the original value of $bytes.
|
|
# IF there is a Counter reboot wrap, just use previous output.
|
|
sub counter_overflow {
|
|
my ( $bytes, $last_bytes, $max_bytes ) = @_;
|
|
|
|
$bytes += $max_bytes if ( $bytes < $last_bytes );
|
|
$bytes = $last_bytes if ( $bytes < $last_bytes );
|
|
return $bytes;
|
|
}
|
|
|
|
# Added 20100202 by gj
|
|
# Print results and exit script
|
|
sub stop {
|
|
my $result = shift;
|
|
my $exit_code = shift;
|
|
print $result . "\n";
|
|
exit ( $STATUS_CODE{$exit_code} );
|
|
}
|
|
|
|
# Added 20100405 by gj
|
|
# Lookup hosts ip address
|
|
sub get_ip {
|
|
use Net::DNS;
|
|
|
|
my ( $host_name ) = @_;
|
|
|
|
my $res = Net::DNS::Resolver->new;
|
|
my $query = $res->search($host_name);
|
|
|
|
if ($query) {
|
|
foreach my $rr ($query->answer) {
|
|
next unless $rr->type eq "A";
|
|
return $rr->address;
|
|
}
|
|
} else {
|
|
|
|
stop("Error: IP address not resolved","UNKNOWN");
|
|
}
|
|
}
|
|
|
|
sub debugout {
|
|
|
|
my ( $text, $level ) = @_;
|
|
|
|
if ( $level <= $debug) {
|
|
print "$text\n";
|
|
}
|
|
}
|
|
|
|
#cosmetic changes 20050614 by mw
|
|
#Couldn't sustain "HERE";-), either.
|
|
sub print_usage {
|
|
print <<EOU;
|
|
Usage: check_iftraffic64.pl -H host [ -C community_string ] [ -i if_index|if_descr ] [ -r ] [ -b if_max_speed_in | -I if_max_speed_in ] [ -O if_max_speed_out ] [ -u ] [ -B ] [ --32bit ] [ -f ] [ -A IP Address ] [ -L ] [ -M ] [ -w warn ] [ -c crit ] [ -v 1|2|3 ] [ --username <username> ] [ --authpassword <authpassword> ] [ --authprotocol MD5|SHA ] [ --privpassword <privpassword> ] [ --privprotocol DES|AES|3DES ]
|
|
|
|
Example 1: check_iftraffic64.pl -H host1 -C sneaky
|
|
Example 2: check_iftraffic64.pl -H host1 -C sneaky -i "Intel Pro" -r -B
|
|
Example 3: check_iftraffic64.pl -H host1 -C sneaky -i 5
|
|
Example 4: check_iftraffic64.pl -H host1 -C sneaky -i 5 -B -b 100 -u m --32bit
|
|
Example 5: check_iftraffic64.pl -H host1 -C sneaky -i 5 -B -I 20 -O 5 -u m
|
|
Example 6: check_iftraffic64.pl -H host1 -C sneaky -A 192.168.1.1 -B -b 100 -u m
|
|
Example 7: check_iftraffic64.pl -H host1 -C sneaky -A 192.168.1.1 --force --32bit
|
|
Example 8: check_iftraffic64.pl -H host1 --username admin --authpassword sneaky
|
|
Example 9: check_iftraffic64.pl -H host1 --username admin --authpassword sneaky123 --privpassword reallysneaky --privprotocol 3DES
|
|
|
|
Options:
|
|
|
|
|
|
-b, --bandwidth INTEGER
|
|
-I, --inBandwidth INTEGER
|
|
Interface maximum speed in kilo/mega/giga/bits per second. Applied to
|
|
both IN and OUT if out (-O) max speed is not provided. Requires -u.
|
|
-O, --outBandwidth INTEGER
|
|
Interface maximum speed in kilo/mega/giga/bits per second. Applied to
|
|
OUT traffic. Uses the same units value given for -b. Requires -u.
|
|
-i, --interface STRING
|
|
Interface Name
|
|
-M, --max INTEGER
|
|
Max Counter Value (in bits) of net devices in giga/mega/kilo/bits. Requires -u.
|
|
-r, --regexp
|
|
Use regexp to match NAME in description OID
|
|
-u, --units STRING
|
|
g=gigabits/s,m=megabits/s,k=kilobits/s,b=bits/s. Required if -b, -I, -M,
|
|
or -O are used.
|
|
|
|
-A, --address STRING (IP Address)
|
|
IP Address to use when determining the interface index to use. Can be
|
|
used when the index changes frequently or as in the case of Windows
|
|
servers the index is different depending on the NIC installed.
|
|
-C, --community STRING
|
|
SNMP Community.
|
|
-H, --host STRING or IPADDRESS
|
|
Check interface on the indicated host.
|
|
-c, --critical INTEGER
|
|
% of bandwidth usage necessary to result in critical status (default: 98%)
|
|
-w, --warning INTEGER
|
|
% of bandwidth usage necessary to result in warning status (default: 85%)
|
|
|
|
--32bit FLAG
|
|
Set to use 32 bit counters instead of 64 bit (default: 64 bit).
|
|
-B, --bits FLAG
|
|
Display results in bits per second b/s (default: Bytes/s)
|
|
-f, --force FLAG
|
|
Set to force either 64 bit or 32 bit only checking (32 bit requires --32bit flag).
|
|
-d, --debug INTEGER
|
|
Output some debug info, not supported inside of Nagios but may be useful
|
|
from the command line. Levels 1-4 can be specified, 4 being the most information.
|
|
-h, --help
|
|
Displays this help text
|
|
-L, --list FLAG (on/off)
|
|
Tell plugin to list available interfaces. This is not supported inside
|
|
of Nagios but may be useful from the command line.
|
|
-v, --Version STRING
|
|
Set SNMP version (defaults to 2). Version 2 or 3 required for 64 bit counters.
|
|
|
|
--authpassword STRING
|
|
Set v3 authorization password.
|
|
--authprotocol STRING
|
|
Set v3 authorization protocol (default: MD5).
|
|
--privpassword STRING
|
|
Set v3 privilege (encryption) string.
|
|
--privprotocol STRING
|
|
Set v3 privilege (encryption) protocol (default: DES).
|
|
EOU
|
|
|
|
}
|
|
|