[Nagiosplug-checkins] CVS: nagiosplug/plugins-scripts check_ifoperstatus.pl,1.3,1.4
Subhendu Ghosh
sghosh at users.sourceforge.net
Mon Oct 13 20:16:15 CEST 2003
Update of /cvsroot/nagiosplug/nagiosplug/plugins-scripts
In directory sc8-pr-cvs1:/tmp/cvs-serv5489
Modified Files:
check_ifoperstatus.pl
Log Message:
snmpv3 patches
Index: check_ifoperstatus.pl
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins-scripts/check_ifoperstatus.pl,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** check_ifoperstatus.pl 12 Feb 2003 04:32:20 -0000 1.3
--- check_ifoperstatus.pl 14 Oct 2003 03:15:19 -0000 1.4
***************
*** 6,9 ****
--- 6,10 ----
# Modified 5/2002 to conform to updated Nagios Plugin Guidelines
# Added support for named interfaces per Valdimir Ivaschenko (S. Ghosh)
+ # Added SNMPv3 support (10/2003)
#
# This program is free software; you can redistribute it and/or
***************
*** 43,46 ****
--- 44,51 ----
my $PROGNAME = "check_ifoperstatus";
+ sub print_help ();
+ sub usage ();
+ sub process_arguments ();
+
my $status;
my %ifOperStatus = ('1','up',
***************
*** 56,59 ****
--- 61,66 ----
my $snmpkey = 0;
my $community = "public";
+ my $maxmsgsize = 1472 ; # Net::SNMP default is 1472
+ my ($seclevel, $authproto, $secname, $authpass, $privpass, $auth, $priv, $context);
my $port = 161;
my @snmpoids;
***************
*** 93,171 ****
### Validate Arguments
! $status = GetOptions(
! "V" => \$opt_V, "version" => \$opt_V,
! "h" => \$opt_h, "help" => \$opt_h,
! "v=i" => \$snmp_version, "snmp_version=i" => \$snmp_version,
! "C=s" =>\$community, "community=s" => \$community,
! "k=i" =>\$snmpkey, "key=i",\$snmpkey,
! "d=s" =>\$ifdescr, "descr=s" => \$ifdescr,
! "l=s" => \$lastc, "lastchange=s" => \$lastc,
! "p=i" =>\$port, "port=i",\$port,
! "H=s" => \$hostname, "hostname=s" => \$hostname,
! "I" => \$ifXTable, "ifmib" => \$ifXTable,
! "n=s" => \$ifName, "name=s" => \$ifName,
! "w=s" => \$dormantWarn, "warn=s" => \$dormantWarn );
!
!
!
! if ($status == 0)
! {
! print_help();
! exit $ERRORS{'OK'};
! }
!
! if ($opt_V) {
! print_revision($PROGNAME,'$Revision$ ');
! exit $ERRORS{'OK'};
! }
!
! if ($opt_h) {
! print_help();
! exit $ERRORS{'OK'};
! }
!
! if (! utils::is_hostname($hostname)){
! usage();
! exit $ERRORS{"UNKNOWN"};
! }
!
!
! unless ($snmpkey > 0 || defined $ifdescr){
! printf "Either a valid snmpkey key (-k) or a ifDescr (-d) must be provided)\n";
! usage();
! exit $ERRORS{"UNKNOWN"};
! }
!
!
! if (defined $name) {
! $ifXTable=1;
! }
!
! if ( $snmp_version =~ /[12]/ ) {
! ($session, $error) = Net::SNMP->session(
! -hostname => $hostname,
! -community => $community,
! -port => $port,
! -version => $snmp_version
! );
!
! if (!defined($session)) {
! $state='UNKNOWN';
! $answer=$error;
! print ("$state: $answer");
! exit $ERRORS{$state};
! }
! }elsif ( $snmp_version =~ /3/ ) {
! $state='UNKNOWN';
! print ("$state: No support for SNMP v3 yet\n");
! exit $ERRORS{$state};
! }else{
! $state='UNKNOWN';
! print ("$state: No support for SNMP v$snmp_version yet\n");
! exit $ERRORS{$state};
! }
!
! ## End validation
!
--- 100,104 ----
### Validate Arguments
! $status = process_arguments();
***************
*** 180,184 ****
if ($status==0) {
$state = "UNKNOWN";
! printf "$state: could not retrive snmpkey - $status-$snmpkey\n";
$session->close;
exit $ERRORS{$state};
--- 113,117 ----
if ($status==0) {
$state = "UNKNOWN";
! printf "$state: could not retrive ifdescr snmpkey - $status-$snmpkey\n";
$session->close;
exit $ERRORS{$state};
***************
*** 246,264 ****
} elsif ( $response->{$snmpIfOperStatus} == 5 ) {
if (defined $dormantWarn ) {
! if ($dormantWarn eq "w") {
! $state = 'WARNNG';
! $answer = "Interface $name (index $snmpkey) is dormant.";
! }elsif($dormantWarn eq "c") {
! $state = 'CRITICAL';
! $answer = "Interface $name (index $snmpkey) is dormant.";
}elsif($dormantWarn eq "i") {
! $state = 'OK';
! $answer = "Interface $name (index $snmpkey) is dormant.";
}
! }else{
! # dormant interface - but warning/critical/ignore not requested
! $state = 'CRITICAL';
! $answer = "Interface $name (index $snmpkey) is dormant.";
! }
} elsif ( $response->{$snmpIfOperStatus} == 6 ) {
$state = 'CRITICAL';
--- 179,197 ----
} elsif ( $response->{$snmpIfOperStatus} == 5 ) {
if (defined $dormantWarn ) {
! if ($dormantWarn eq "w") {
! $state = 'WARNNG';
! $answer = "Interface $name (index $snmpkey) is dormant.";
! }elsif($dormantWarn eq "c") {
! $state = 'CRITICAL';
! $answer = "Interface $name (index $snmpkey) is dormant.";
}elsif($dormantWarn eq "i") {
! $state = 'OK';
! $answer = "Interface $name (index $snmpkey) is dormant.";
}
! }else{
! # dormant interface - but warning/critical/ignore not requested
! $state = 'CRITICAL';
! $answer = "Interface $name (index $snmpkey) is dormant.";
! }
} elsif ( $response->{$snmpIfOperStatus} == 6 ) {
$state = 'CRITICAL';
***************
*** 312,316 ****
}
! sub usage {
printf "\nMissing arguments!\n";
printf "\n";
--- 245,249 ----
}
! sub usage() {
printf "\nMissing arguments!\n";
printf "\n";
***************
*** 325,329 ****
}
! sub print_help {
printf "check_ifoperstatus plugin for Nagios monitors operational \n";
printf "status of a particular network interface on the target host\n";
--- 258,262 ----
}
! sub print_help() {
printf "check_ifoperstatus plugin for Nagios monitors operational \n";
printf "status of a particular network interface on the target host\n";
***************
*** 336,339 ****
--- 269,282 ----
printf " SNMP v2c will use get_bulk for less overhead\n";
printf " if monitoring with -d\n";
+ printf " -L (--seclevel) choice of \"noAuthNoPriv\", \"authNoPriv\", or \"authPriv\"\n";
+ printf " -U (--secname) username for SNMPv3 context\n";
+ printf " -c (--context) SNMPv3 context name (default is empty string)";
+ printf " -A (--authpass) authentication password (cleartext ascii or localized key\n";
+ printf " in hex with 0x prefix generated by using \"snmpkey\" utility\n";
+ printf " auth password and authEngineID\n";
+ printf " -a (--authproto) Authentication protocol ( MD5 or SHA1)\n";
+ printf " -X (--privpass) privacy password (cleartext ascii or localized key\n";
+ printf " in hex with 0x prefix generated by using \"snmpkey\" utility\n";
+ printf " privacy password and authEngineID\n";
printf " -k (--key) SNMP IfIndex value\n";
printf " -d (--descr) SNMP ifDescr value\n";
***************
*** 344,347 ****
--- 287,291 ----
printf " (Implies the use of -I)\n";
printf " -w (--warn =i|w|c) ignore|warn|crit if the interface is dormant (default critical)\n";
+ printf " -M (--maxmsgsize) Max message size - usefull only for v1 or v2c\n";
printf " -V (--version) Plugin version\n";
printf " -h (--help) usage help \n\n";
***************
*** 354,355 ****
--- 298,488 ----
}
+
+ sub process_arguments() {
+ $status = GetOptions(
+ "V" => \$opt_V, "version" => \$opt_V,
+ "h" => \$opt_h, "help" => \$opt_h,
+ "v=i" => \$snmp_version, "snmp_version=i" => \$snmp_version,
+ "C=s" => \$community, "community=s" => \$community,
+ "L=s" => \$seclevel, "seclevel=s" => \$seclevel,
+ "a=s" => \$authproto, "authproto=s" => \$authproto,
+ "U=s" => \$secname, "secname=s" => \$secname,
+ "A=s" => \$authpass, "authpass=s" => \$authpass,
+ "X=s" => \$privpass, "privpass=s" => \$privpass,
+ "c=s" => \$context, "context=s" => \$context,
+ "k=i" => \$snmpkey, "key=i",\$snmpkey,
+ "d=s" => \$ifdescr, "descr=s" => \$ifdescr,
+ "l=s" => \$lastc, "lastchange=s" => \$lastc,
+ "p=i" = >\$port, "port=i" =>\$port,
+ "H=s" => \$hostname, "hostname=s" => \$hostname,
+ "I" => \$ifXTable, "ifmib" => \$ifXTable,
+ "n=s" => \$ifName, "name=s" => \$ifName,
+ "w=s" => \$dormantWarn, "warn=s" => \$dormantWarn,
+ "M=i" => \$maxmsgsize, "maxmsgsize=i" => \$maxmsgsize);
+
+
+
+ if ($status == 0){
+ print_help();
+ exit $ERRORS{'OK'};
+ }
+
+ if ($opt_V) {
+ print_revision($PROGNAME,'$Revision$ ');
+ exit $ERRORS{'OK'};
+ }
+
+ if ($opt_h) {
+ print_help();
+ exit $ERRORS{'OK'};
+ }
+
+ if (! utils::is_hostname($hostname)){
+ usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+
+ unless ($snmpkey > 0 || defined $ifdescr){
+ printf "Either a valid snmpkey key (-k) or a ifDescr (-d) must be provided)\n";
+ usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+
+ if (defined $name) {
+ $ifXTable=1;
+ }
+
+ if (defined $dormantWarn) {
+ unless ($dormantWarn =~ /^(w|c|i)$/ ) {
+ printf "Dormant alerts must be one of w|c|i \n";
+ exit $ERRORS{'UNKNOWN'};
+ }
+ }
+
+ if ($snmp_version =~ /3/ ) {
+ # Must define a security level even though default is noAuthNoPriv
+ # v3 requires a security username
+ if (defined $seclevel && defined $secname) {
+
+ # Must define a security level even though defualt is noAuthNoPriv
+ unless ($seclevel eq ('noAuthNoPriv' || 'authNoPriv' || 'authPriv' ) ) {
+ usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # Authentication wanted
+ if ($seclevel eq ('authNoPriv' || 'authPriv') ) {
+
+ unless ($authproto eq ('MD5' || 'SHA1') ) {
+ usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ( !defined $authpass) {
+ usage();
+ exit $ERRORS{"UNKNOWN"};
+ }else{
+ if ($authpass =~ /^0x/ ) {
+ $auth = "-authkey => $authpass" ;
+ }else{
+ $auth = "-authpassword => $authpass";
+ }
+ }
+
+ }
+
+ # Privacy (DES encryption) wanted
+ if ($seclevel eq 'authPriv' ) {
+ if (! defined $privpass) {
+ usage();
+ exit $ERRORS{"UNKNOWN"};
+ }else{
+ if ($privpass =~ /^0x/){
+ $priv = "-privkey => $privpass";
+ }else{
+ $priv = "-privpassword => $privpass";
+ }
+ }
+ }
+
+ # Context name defined or default
+
+ unless ( defined $context) {
+ $context = "";
+ }
+
+
+
+ }else {
+ usage();
+ exit $ERRORS{'UNKNOWN'}; ;
+ }
+ } # end snmpv3
+
+
+ if ( $snmp_version =~ /[12]/ ) {
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $hostname,
+ -community => $community,
+ -port => $port,
+ -version => $snmp_version,
+ -maxmsgsize => $maxmsgsize
+ );
+
+ if (!defined($session)) {
+ $state='UNKNOWN';
+ $answer=$error;
+ print ("$state: $answer");
+ exit $ERRORS{$state};
+ }
+
+ }elsif ( $snmp_version =~ /3/ ) {
+
+ if ($seclevel eq 'noAuthNoPriv') {
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $hostname,
+ -port => $port,
+ -version => $snmp_version,
+ -username => $secname,
+ );
+
+ }elsif ( $seclevel eq 'authNoPriv' ) {
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $hostname,
+ -port => $port,
+ -version => $snmp_version,
+ -username => $secname,
+ $auth,
+ -authprotocol => $authproto,
+ );
+ }elsif ($seclevel eq 'authPriv' ) {
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $hostname,
+ -port => $port,
+ -version => $snmp_version,
+ -username => $secname,
+ $auth,
+ -authprotocol => $authproto,
+ $priv
+ );
+ }
+
+
+ if (!defined($session)) {
+ $state='UNKNOWN';
+ $answer=$error;
+ print ("$state: $answer");
+ exit $ERRORS{$state};
+ }
+
+ }else{
+ $state='UNKNOWN';
+ print ("$state: No support for SNMP v$snmp_version yet\n");
+ exit $ERRORS{$state};
+ }
+
+ }
+ ## End validation
+
More information about the Commits
mailing list