freebsd-ports/net-mgmt/nagios-check_netsnmp/files/check_netsnmp.in
Dmitry Marakasov 61075c2f9a - Fix shebangs
- Add NO_ARCH

Approved by:	portmgr blanket
MFH:		2015Q3 (blanket)
2015-07-15 18:56:49 +00:00

257 lines
7.6 KiB
Text

#!%%PERL%% -w
# ----------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42, (c) Poul-Henning Kamp):
# Dmitry Sivachenko <mitya@cavia.pp.ru> wrote this file. As long as you
# retain this notice you can do whatever you want with this stuff. If we
# meet some day, and you think this stuff is worth it, you can buy me a
# beer in return.
#
# Dmitry Sivachenko
# ----------------------------------------------------------------------------
use strict;
use Getopt::Long;
use Net::SNMP;
use lib "/usr/local/libexec/nagios";
use utils qw($TIMEOUT %ERRORS);
my $load = '.1.3.6.1.4.1.2021.10.1.';
my $proc = '.1.3.6.1.4.1.2021.2.1.';
my $disk = '.1.3.6.1.4.1.2021.9.1.';
my $file = '.1.3.6.1.4.1.2021.15.1.';
my $swap = '.1.3.6.1.4.1.2021.4.';
my $exec = '.1.3.6.1.4.1.2021.8.1.';
my $errorFlag = '100';
my $errorMsg = '101';
my $TotalSwap = '.1.3.6.1.4.1.2021.4.3.0';
my $AvailSwap = '.1.3.6.1.4.1.2021.4.4.0';
my $laLoad1 = '.1.3.6.1.4.1.2021.10.1.3.1';
my $laLoad5 = '.1.3.6.1.4.1.2021.10.1.3.2';
my $laLoad15 = '.1.3.6.1.4.1.2021.10.1.3.3';
my $errflag = $ERRORS{'OK'};
my $execMode = 0;
my ($opt_h, $opt_d, $opt_C, $opt_H, $opt_o, $opt_p, $opt_t);
Getopt::Long::Configure('bundling');
GetOptions(
"h" => \$opt_h, "help" => \$opt_h,
"C=s" => \$opt_C, "community=s" => \$opt_C,
"H=s" => \$opt_H, "hostname=s" => \$opt_H,
"d=s" => \$opt_d, "domain=s" => \$opt_d,
"o=s" => \$opt_o, "oid=s" => \$opt_o,
"p=i" => \$opt_p, "port=i" => \$opt_p,
"t=i" => \$opt_t, "timeout=i" => \$opt_t
);
if ($opt_h) {
print_help();
exit $ERRORS{'OK'};
}
if (! utils::is_hostname($opt_H)){
print_help();
exit $ERRORS{"UNKNOWN"};
}
if ($opt_o ne 'disk' && $opt_o ne 'swap' && $opt_o ne 'proc' &&
$opt_o ne 'load' && $opt_o ne 'file' &&
$opt_o !~ /^\d+$/ && $opt_o !~ /^(\.\d+)+\.$/) {
print_help();
exit $ERRORS{"UNKNOWN"};
}
# Just in case of problems, let's not hang Nagios
$SIG{'ALRM'} = sub {
print ("ERROR: No response from SNMP server (alarm)\n");
exit $ERRORS{"UNKNOWN"};
};
alarm($TIMEOUT * 6); # 1.5 minutes
if (!defined($opt_d)) {
my @addrv4 = gethostbyname($opt_H) or $opt_d = 'udp/ipv6';
};
my ($session, $error) = Net::SNMP->session(
-timeout => $opt_t || $TIMEOUT,
-hostname => $opt_H,
-domain => $opt_d || 'udp/ipv4',
-community => $opt_C || 'public',
-port => $opt_p || 161
);
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
exit $ERRORS{'UNKNOWN'};
}
if (!defined($opt_o)) {
print("Please specify OID to query (-c).\n");
exit $ERRORS{'UNKNOWN'};
}
checkOID($opt_o);
$session->close;
exit $errflag;
sub getOID {
my $result = $session->get_request(-varbindlist => [$_[0]]);
if (defined($result)) {
return $result->{$_[0]};
} else {
return undef;
}
}
sub checkOID {
my $baseOID; my $i; my $first_query = 1; my $first_error = 1;
if ($_[0] eq 'swap') {
$i = 0;
} else {
$i = 1;
}
if ($_[0] eq 'load') {
$baseOID = $load;
} elsif ($_[0] eq 'proc') {
$baseOID = $proc;
} elsif ($_[0] eq 'disk') {
$baseOID = $disk;
} elsif ($_[0] eq 'swap') {
$baseOID = $swap;
} elsif ($_[0] eq 'file') {
$baseOID = $file;
} else {
if ($_[0] =~ /^\d+$/) {
$execMode = 1;
$baseOID = $exec;
$i = $_[0];
} else {
$baseOID = $_[0];
}
}
my $tmpOID = $baseOID . $errorFlag . ".$i";
my $res = getOID($tmpOID);
while (defined($res)) {
if ($res != 0) {
$errflag = $ERRORS{'CRITICAL'};
$tmpOID = $baseOID . $errorMsg . ".$i";
my $res1 = getOID($tmpOID);
if (defined($res1)) {
if (!$first_error) {
print ", ";
}
print $res1;
} else {
print 'Unable to get error message!';
}
$first_error = 0;
}
$first_query = 0;
last if $execMode > 0;
$i++; $tmpOID = $baseOID . $errorFlag . ".$i";
$res = getOID($tmpOID);
}
if ($errflag == $ERRORS{'OK'} && !$first_query) {
if ($_[0] eq 'load') {
my $tmp;
$tmp = getOID($laLoad1);
if (defined($tmp)) {
print "Load-1: $tmp, ";
} else {
$errflag = $ERRORS{'UNKNOWN'};
print "Error obtaining OID $laLoad1!";
}
$tmp = getOID($laLoad5);
if (defined($tmp)) {
print "Load-5: $tmp, ";
} else {
$errflag = $ERRORS{'UNKNOWN'};
print "Error obtaining OID $laLoad5!";
}
$tmp = getOID($laLoad15);
if (defined($tmp)) {
print "Load-15: $tmp";
} else {
$errflag = $ERRORS{'UNKNOWN'};
print "Error obtaining OID $laLoad15!";
}
} elsif ($_[0] eq 'proc') {
print "Processes ok";
} elsif ($_[0] eq 'disk') {
print "Disks ok";
} elsif ($_[0] eq 'file') {
print "File sizes ok";
} elsif ($_[0] eq 'swap') {
my $tmp;
$tmp = getOID($TotalSwap);
if (defined($tmp)) {
my $tmp1 = int($tmp/1024);
print "Total: $tmp1" . "Mb, ";
} else {
$errflag = $ERRORS{'UNKNOWN'};
print "Error obtaining OID $TotalSwap!";
}
$tmp = getOID($AvailSwap);
if (defined($tmp)) {
my $tmp1 = int($tmp/1024);
print "Free: $tmp1" . "Mb";
} else {
$errflag = $ERRORS{'UNKNOWN'};
print "Error obtaining OID $AvailSwap!";
}
} else {
my $tmp;
if ($execMode > 0) {
$tmp = getOID("$baseOID$errorMsg.$_[0]");
} else {
$tmp = getOID("$baseOID$errorMsg.1");
}
if (defined($tmp)) {
print $tmp;
} else {
$errflag = $ERRORS{'UNKNOWN'};
print "Error obtaining OID $baseOID$errorMsg.1!";
}
}
} elsif ($first_query) {
print "Error obtaining OID $tmpOID! (no response?)";
$errflag = $ERRORS{'UNKNOWN'};
}
}
sub print_help {
print "Usage: $0 [-C COMMUNITY] [-p port] -H HOSTNAME -o swap|proc|load|disk|file|<OID>|<exec num>\n";
print "
-C, --community
Community name to use in queries. (default: public)
-H, --hostname
Hostname to send SNMP queries to.
-p, --port
Port number to send SNMP requests to. (default: 161)
-t, --timeout=INTEGER
Seconds before connection times out (default: 15)
-o, --oid
OID to query. $errorFlag is queried to check for errors and $errorMsg
is queried for error message set by snmpd. Shortcuts are:
swap (.1.3.6.1.4.1.2021.4). For use in conjunction with
'swap' keyword in snmpd.conf.
proc (.1.3.6.1.4.1.2021.2.1). For use in conjunction with
'proc' keyword in snmpd.conf.
load (.1.3.6.1.4.1.2021.10.1). For use in conjunction with
'load' keyword in snmpd.conf.
disk (.1.3.6.1.4.1.2021.9.1). For use in conjunction with
'disk' keyword in snmpd.conf.
<OID>. Query the specified OID. For use in conjunction with
'exec' keyword in snmpd.conf.
file (.1.3.6.1.4.1.2021.15.1). For use in conjunction with
'file' keyword in snmpd.conf.
<exec num>. Query the specified number in the 'exec' OID tree.
Equivalent to '.1.3.6.1.4.1.2021.8.<exec num>'.
";
}