diff -ruN nagiosplug-save/plugins-scripts/check_ifstatus.pl nagiosplug/plugins-scripts/check_ifstatus.pl
--- nagiosplug-save/plugins-scripts/check_ifstatus.pl	2003-11-05 22:59:41.000000000 +0000
+++ nagiosplug/plugins-scripts/check_ifstatus.pl	2004-03-27 22:10:19.000000000 +0000
@@ -1,4 +1,4 @@
-#!/usr/local/bin/perl -w
+#! /usr/bin/perl -wT
 #
 # check_ifstatus.pl - nagios plugin 
 # 
@@ -31,21 +31,104 @@
 #
 # $Id: check_ifstatus.pl,v 1.8 2003/11/05 22:59:41 sghosh Exp $
 
+require 5.004;
 use POSIX;
 use strict;
 use lib utils.pm ;
-use utils qw($TIMEOUT %ERRORS &print_revision &support);
+use Plugin;
+use Plugin::Parameter qw(:DEFAULT :standard :snmp);
+
+use vars qw($hostname $snmp_version $community $seclevel $authproto $secname $authpass $privpass
+	    $context $port $ifXTable $opt_x $opt_u $maxmsgsize $timeout $PROGNAME);
+use utils qw(%ERRORS &usage);
 
 use Net::SNMP;
-use Getopt::Long;
-Getopt::Long::Configure('bundling');
 
-my $PROGNAME = "check_ifstatus";
+$H_opt->binding(\$hostname);
 
-sub print_help ();
-sub usage ();
-sub process_arguments ();
+my $v_opt = $snmpversionparameter;
+$v_opt->flags([ 'v', 'snmp_version' ]);
+$v_opt->binding(\$snmp_version);
+
+$C_opt->binding(\$community);
+
+$snmpv3seclevelparameter->binding(\$seclevel);
+$authprotocolparameter->binding(\$authproto);
+my $U_opt = $u_opt; # Use the exported username object
+$U_opt->name("secname");
+$U_opt->flags([ 'U', 'secname' ]);
+$U_opt->binding(\$secname);
+$authpasswordparameter->binding(\$authpass);
+$privpasswordparameter->binding(\$privpass);
+$snmpcontextparameter->binding(\$context);
+$privprotocolparameter->flags([ "privprotocol" ]);
+
+$p_opt->default(161);
+$p_opt->binding(\$port);
+
+$t_opt->binding(\$timeout);
+my $I_opt = new Plugin::Parameter(-name => "ifmib", -flags => [ 'I', 'ifmib' ],
+				  -optional => "yes", -valueoptional => "yes", -type => "NONE",
+				  -binding => \$ifXTable,
+				  -description => "Agent supports IFMIB ifXTable. For Cisco - this will provide the descriptive name. DO not use if you don't know what this is.");
+my $x_opt = new Plugin::Parameter(-name => "exclude", -flags => [ 'x', 'exclude' ],
+				  -optional => "yes", -valueoptional => "no", -type => "STRING",
+				  -binding => \$opt_x,
+				  -description => "A comma separated list of ifType values that should be excluded from the report. An empty list defaults to PPP(23).  See the IANAifType-MIB for a list of interface types");
+my $u_opt = new Plugin::Parameter(-name => "unusedports", -flags => [ 'u', 'unused-ports' ],
+				  -optional => "yes", -valueoptional => "no", -type => "STRING",
+				  -binding => \$opt_u,
+				  -description => "A comma separated list of ifIndex values that should be excluded from the report.");
+my $M_opt = new Plugin::Parameter(-name => "maxmsgsize", -flags => [ 'M', 'maxmsgsize' ],
+				  -optional => "yes", -valueoptional => "no", -type => "INTEGER",
+				  -binding => \$maxmsgsize,
+				  -default => 1472,
+				  -description => "Max message size - useful only for v1 or v2c");
+
+my @cmndopts = ( $H_opt, @snmpparameters, $I_opt, $x_opt, $u_opt, $M_opt, $t_opt );
+my $plugin = new Plugin(-revision => '$Revision: 1.8 $',
+			-copyright => " 2000 Christoph Kron, 2002 Subhendu Ghosh, 2004 Howard Wilkinson <howard\@cohtech.com>",
+			-shortcomment => "check_ifstatus plugin for Nagios monitors operational status of each network interface on the target host",
+			-longcomment => "",
+			-checker => sub { my ($plugin) = @_;
+					  # Check the version against options
+					  if ($snmp_version =~ m/3/) {
+					    # Can't do this check as community has a default
+					    #if ($community) {
+					    #  $plugin->usage();
+					    #  usage("$PROGNAME UNKNOWN: Community specified for SNMPV3 - inconsistent\n");
+					    #}
+					    unless (defined $seclevel && defined $secname) {
+					      $plugin->usage();
+					      usage("$PROGNAME UNKNOWN: Seclevel and Security name must be defined\n");
+					    }
+					    if ($seclevel =~ m/^auth(No)?Priv$/i) {
+					      unless (defined $authpass) {
+						$plugin->usage();
+						usage("$PROGNAME UNKNOWN: Authentication Password required\n");
+					      }
+					      if ($seclevel =~ m/^authPriv$/i) {
+						unless (defined $privpass) {
+						  $plugin->usage();
+						  usage("$PROGNAME UNKNOWN: Privacy password required\n");
+						}
+					      }
+					    }
+					  } else {
+					    # Can't do this check as seclevel has a default
+					    #if ($seclevel || $authproto || $secname || $authpass || $privpass || $context) {
+					    #  $plugin->usage();
+					    #  usage("$PROGNAME UNKNOWN: SNMPv1 and SNMPv2c only require commmunity\n");
+					    #}
+					  }
+					  if ( ! utils::is_hostname($hostname)) {
+					    $plugin->usage();
+					    usage("$PROGNAME UNKNOWN: Invalid hostname\n");
+					  }
+					},
+			-parameterlists => [ \@cmndopts, $h_opts, $V_opts ]);
 
+sub setupsnmp ();
 
 my $status;
 my %ifOperStatus =	('1','up',
@@ -56,17 +139,9 @@
 			 '6','notPresent',
 			 '7','lowerLayerDown');  # down due to the state of lower layer interface(s));
 
-my $timeout ;
 my $state = "UNKNOWN";
 my $answer = "";
-my $snmpkey=0;
-my $snmpoid=0;
-my $key=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;
+
 my $snmpIfAdminStatus = '1.3.6.1.2.1.2.2.1.7';
 my $snmpIfDescr = '1.3.6.1.2.1.2.2.1.2';
 my $snmpIfOperStatus = '1.3.6.1.2.1.2.2.1.8';
@@ -74,386 +149,154 @@
 my $snmpIfAlias = '1.3.6.1.2.1.31.1.1.1.18';
 my $snmpLocIfDescr = '1.3.6.1.4.1.9.2.2.1.1.28';
 my $snmpIfType = '1.3.6.1.2.1.2.2.1.3';
-my $hostname;
-my $session;
-my $error;
-my $response;
-my %ifStatus;
-my $ifup =0 ;
-my $ifdown =0;
-my $ifdormant = 0;
-my $ifexclude = 0 ;
-my $ifunused = 0;
-my $ifmessage = "";
-my $snmp_version = 1;
-my $ifXTable;
-my $opt_h ;
-my $opt_V ;
-my $opt_u;
-my $opt_x ;
-my %excluded ;
-my @unused_ports ;
-
-
-
-
+my @snmpoids = ($snmpIfOperStatus,
+		$snmpIfAdminStatus,
+		$snmpIfDescr,
+		$snmpIfType);
+		
 
-# Just in case of problems, let's not hang Nagios
-$SIG{'ALRM'} = sub {
-     print ("ERROR: No snmp response from $hostname (alarm timeout)\n");
-     exit $ERRORS{"UNKNOWN"};
-};
+$plugin->init();
 
+$plugin->start_timeout($timeout, "No snmp response from $hostname (alarm timeout)");
 
 #Option checking
-$status = process_arguments();
-
-if ($status != 0)
-{
-	print_help() ;
-	exit $ERRORS{'OK'};
-}
-
+my ($session, $error) = setupsnmp();
 
-alarm($timeout);
+push @snmpoids, $snmpIfName, $snmpIfAlias if ( defined $ifXTable);
 
-push(@snmpoids,$snmpIfOperStatus);
-push(@snmpoids,$snmpIfAdminStatus);
-push(@snmpoids,$snmpIfDescr);
-push(@snmpoids,$snmpIfType);
-push(@snmpoids,$snmpIfName) if ( defined $ifXTable);
-push(@snmpoids,$snmpIfAlias) if ( defined $ifXTable);
-
-
-
-
-foreach $snmpoid (@snmpoids) {
-
-   if (!defined($response = $session->get_table($snmpoid))) {
-      $answer=$session->error;
-      $session->close;
-      $state = 'CRITICAL';
-			if ( ( $snmpoid =~ $snmpIfName ) && defined $ifXTable ) {
-				print ("$state: Device does not support ifTable - try without -I option\n");
-			}else{
-				print ("$state: $answer for $snmpoid  with snmp version $snmp_version\n");
-			}
-      exit $ERRORS{$state};
-   }
-
-   foreach $snmpkey (keys %{$response}) {
-      $snmpkey =~ /.*\.(\d+)$/;
-      $key = $1;
-      $ifStatus{$key}{$snmpoid} = $response->{$snmpkey};
-   }
+my %ifStatus = ();
+# Excluded interface ports (ifIndex) - management reasons
+if ($opt_u) {
+  my @unused_ports = split(/,/,$opt_u);
+  foreach my $key (@unused_ports) { 
+    $ifStatus{$key}{'notInUse'}++ ;
+  }
 }
 
+foreach my $snmpoid (@snmpoids) {
+  my $response = $session->get_table($snmpoid);
+  if (!defined $response) {
+    $answer=$session->error;
+    $session->close;
+    $state = 'CRITICAL';
+    if ( ( $snmpoid =~ $snmpIfName ) && defined $ifXTable ) {
+      print ("$PROGNAME $state: Device does not support ifTable - try without -I option\n");
+    }else{
+      print ("$PROGNAME $state: $answer for $snmpoid  with snmp version $snmp_version\n");
+    }
+    exit $ERRORS{$state};
+  }
+  foreach my $snmpkey (keys %{$response}) {
+    $snmpkey =~ /.*\.(\d+)$/;
+    my $key = $1;
+    $ifStatus{$key}{$snmpoid} = $response->{$snmpkey};
+  }
+}
 
 $session->close;
 
-alarm(0);
+$plugin->stop_timeout();
 
-foreach $key (keys %ifStatus) {
+my %excluded = ();
+# Excluded interfaces types (ifType) (backup interfaces, dial-on demand interfaces, PPP interfaces
+if (defined $opt_x) {
+  my @x = split(/,/, $opt_x);
+  if ( @x) {
+    foreach my $key (@x){
+      $excluded{$key} = 1;
+    }
+  }else{
+    $excluded{23} = 1; # default PPP(23) if empty list - note (AIX seems to think PPP is 22 according to a post)
+  }
+}
 
-	# skip unused interfaces
-	if (!defined($ifStatus{$key}{'notInUse'})) {
-		# check only if interface is administratively up
+my $ifup =0 ;
+my $ifdown =0;
+my $ifdormant = 0;
+my $ifexclude = 0 ;
+my $ifunused = 0;
+my $ifmessage = "";
+
+foreach my $key (keys %ifStatus) {
+  # skip unused interfaces
+  if (!defined($ifStatus{$key}{'notInUse'})) {
+    # check only if interface is administratively up
     if ($ifStatus{$key}{$snmpIfAdminStatus} == 1 ) {
-    
-			# check only if interface type is not listed in %excluded
-			if (!defined $excluded{$ifStatus{$key}{$snmpIfType}} ) {
-				if ($ifStatus{$key}{$snmpIfOperStatus} == 1 ) { $ifup++ ;}
-				if ($ifStatus{$key}{$snmpIfOperStatus} == 2 ) {
-								$ifdown++ ;
-								if (defined $ifXTable) {
-									$ifmessage .= sprintf("%s: down -> %s<BR>",
-                                $ifStatus{$key}{$snmpIfName},
-																$ifStatus{$key}{$snmpIfAlias});
-								}else{
-									$ifmessage .= sprintf("%s: down <BR>",
-																$ifStatus{$key}{$snmpIfDescr});
-								}
-				}
-				if ($ifStatus{$key}{$snmpIfOperStatus} == 5 ) { $ifdormant++ ;}
-			}else{
-				$ifexclude++;
-			}
-		
-		}
-	}else{
-		$ifunused++;
+      # check only if interface type is not listed in %excluded
+      if (!defined $excluded{$ifStatus{$key}{$snmpIfType}} ) {
+	if ($ifStatus{$key}{$snmpIfOperStatus} == 1 ) { $ifup++ ;}
+	if ($ifStatus{$key}{$snmpIfOperStatus} == 2 ) {
+	  $ifdown++ ;
+	  if (defined $ifXTable) {
+	    $ifmessage .= sprintf("%s: down -> %s<BR>",
+				  $ifStatus{$key}{$snmpIfName},
+				  $ifStatus{$key}{$snmpIfAlias});
+	  }else{
+	    $ifmessage .= sprintf("%s: down <BR>",
+				  $ifStatus{$key}{$snmpIfDescr});
+	  }
 	}
+	if ($ifStatus{$key}{$snmpIfOperStatus} == 5 ) { $ifdormant++ ;}
+      }else{
+	$ifexclude++;
+      }
+    }
+  }else{
+    $ifunused++;
+  }
 }
 
-   if ($ifdown > 0) {
-      $state = 'CRITICAL';
-      $answer = sprintf("host '%s', interfaces up: %d, down: %d, dormant: %d, excluded: %d, unused: %d<BR>",
-                        $hostname,
-			$ifup,
-			$ifdown,
-			$ifdormant,
-			$ifexclude,
-			$ifunused);
-      $answer = $answer . $ifmessage . "\n";
-   }
-   else {
-      $state = 'OK';
-      $answer = sprintf("host '%s', interfaces up: %d, down: %d, dormant: %d, excluded: %d, unused: %d",
-                        $hostname,
-			$ifup,
-			$ifdown,
-			$ifdormant,
-			$ifexclude,
-			$ifunused);
-   }
-my $perfdata = sprintf("up:%d,down:%d,dormant:%d,excluded:%d,unused:%d",$ifup,$ifdown,$ifdormant,$ifexclude,$ifunused);
-print ("$state: $answer |$perfdata\n");
-exit $ERRORS{$state};
-
-
-sub usage (){
-	printf "\nMissing arguments!\n";
-	printf "\n";
-	printf "check_ifstatus -C <READCOMMUNITY> -p <PORT> -H <HOSTNAME>\n";
-	printf "Copyright (C) 2000 Christoph Kron\n";
-	printf "Updates 5/2002 Subhendu Ghosh\n";
-	printf "\n\n";
-	support();
-	exit $ERRORS{"UNKNOWN"};
-}
+my $perfdata = sprintf("host '%s', interfaces up:%d, down:%d, dormant:%d, excluded:%d, unused:%d",
+		       $hostname, $ifup, $ifdown, $ifdormant, $ifexclude, $ifunused);
 
-sub print_help (){
-	printf "check_ifstatus plugin for Nagios monitors operational \n";
-	printf "status of each network interface on the target host\n";
-	printf "\nUsage:\n";
-	printf "   -H (--hostname)   Hostname to query - (required)\n";
-	printf "   -C (--community)  SNMP read community (defaults to public,\n";
-	printf "                     used with SNMP v1 and v2c\n";
-	printf "   -v (--snmp_version)  1 for SNMP v1 (default)\n";
-	printf "                        2 for SNMP v2c\n";
-	printf "                          SNMP v2c will use get_bulk for less overhead\n";
-	printf "                        3 for SNMPv3 (requires -U option)";
-	printf "   -p (--port)       SNMP port (default 161)\n";
-	printf "   -I (--ifmib)      Agent supports IFMIB ifXTable.  For Cisco - this will provide\n";
-	printf "                     the descriptive name.  Do not use if you don't know what this is. \n";
-	printf "   -x (--exclude)    A comma separated list of ifType values that should be excluded \n";
-	printf "                     from the report (default for an empty list is PPP(23).\n";
-	printf "   -u (--unused_ports) A comma separated list of ifIndex values that should be excluded \n";
-	printf "                     from the report (default is an empty exclusion list).\n";
-	printf "                     See the IANAifType-MIB for a list of interface types.\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 "   -M (--maxmsgsize) Max message size - usefull only for v1 or v2c\n";
-	printf "   -t (--timeout)    seconds before the plugin times out (default=$TIMEOUT)\n";
-	printf "   -V (--version)    Plugin version\n";
-	printf "   -h (--help)       usage help \n\n";
-	print_revision($PROGNAME, '$Revision: 1.8 $');
-	
+if ($ifdown > 0) {
+  $state = 'CRITICAL';
+  $perfdata .= $ifmessage;
+} else {
+  $state = 'OK';
 }
 
-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,
-		"p=i" =>\$port, "port=i" => \$port,
-		"H=s" => \$hostname, "hostname=s" => \$hostname,
-		"I"		=> \$ifXTable, "ifmib" => \$ifXTable,
-		"x:s"		=>	\$opt_x,   "exclude:s" => \$opt_x,
-		"u=s" => \$opt_u,  "unused_ports=s" => \$opt_u,
-		"M=i" => \$maxmsgsize, "maxmsgsize=i" => \$maxmsgsize,
-		"t=i" => \$timeout,    "timeout=i" => \$timeout,
-		);
-		
-	if ($status == 0){
-		print_help() ;
-		exit $ERRORS{'OK'};
-	}
-	if ($opt_V) {
-		print_revision($PROGNAME,'$Revision: 1.8 $ ');
-		exit $ERRORS{'OK'};
-	}
-
-	if ($opt_h) {
-		print_help();
-		exit $ERRORS{'OK'};
-	}
-
-	unless (defined $timeout) {
-		$timeout = $TIMEOUT;
-	}
-
-	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
-
-	# for snmp v1 & v2c we default to community = "public"
-	
-	# Excluded interfaces types (ifType) (backup interfaces, dial-on demand interfaces, PPP interfaces
-	if (defined $opt_x) {
-		my @x = split(/,/, $opt_x);
-		if ( @x) {
-			foreach $key (@x){
-				$excluded{$key} = 1;
-			}
-		}else{
-			$excluded{23} = 1; # default PPP(23) if empty list - note (AIX seems to think PPP is 22 according to a post)
-		}
-	}
-	
-	# Excluded interface ports (ifIndex) - management reasons
-	if ($opt_u) {
-		@unused_ports = split(/,/,$opt_u);
-		foreach $key (@unused_ports) { 
-			$ifStatus{$key}{'notInUse'}++ ;
-		}
-	}
-
-	if (! utils::is_hostname($hostname)){
-		usage();
-		exit $ERRORS{"UNKNOWN"};
-	}
-
-	# create SNMP session handle based on options passed.
-
-	if ( ! $snmp_version ) {
-		$snmp_version =1 ;
-	}else{
-		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/ ) {
+print ("$PROGNAME $state: $perfdata\n");
+exit $ERRORS{$state};
 
-		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,
-				-authprotocol => $authproto,
-				$auth
-			);	
-		}elsif ($seclevel eq 'authPriv' ) {
-			($session, $error) = Net::SNMP->session(
-				-hostname  => $hostname,
-				-port      => $port,
-				-version  => $snmp_version,
-				-username => $secname,
-				-authprotocol => $authproto,
-				$auth,
-				$priv
-			);
-		}
-					
-					
-		if (!defined($session)) {
-					$state='UNKNOWN';
-					$answer=$error;
-					print ("$state: $answer");
-					exit $ERRORS{$state};
-		}
-			
+sub setupsnmp() {
+  my %snmpArgs = ( -hostname => $hostname,
+		   -port => $port,
+		   -version => $snmp_version,
+		   -timeout => $timeout );
+  if ( $snmp_version =~ /[12]/ ) {
+    $snmpArgs{-community} = $community;
+    $snmpArgs{-maxmsgsize} = $maxmsgsize;
+  }elsif ($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
+      # Authentication wanted
+      if ($seclevel eq ('authNoPriv' || 'authPriv') ) {
+	$snmpArgs{-authprotocol} = $authproto;
+	if ($authpass =~ /^0x/) {
+	  $snmpArgs{-authkey} = $authpass;
 	}else{
-		$state='UNKNOWN';
-		print ("$state: No support for SNMP v$snmp_version yet\n");
-		exit $ERRORS{$state};
+	  $snmpArgs{-authpassword} = $authpass;
 	}
-}
-
-return $ERRORS{"OK"};
-				
+	if ($seclevel eq  'authPriv' ) {	# Privacy (DES encryption) wanted
+	  if ($privpass =~ /^0x/){
+	    $snmpArgs{-privkey} = $privpass;
+	  }else{
+	    $snmpArgs{-privpassword} = $privpass;
+	  }
+	}
+      }
+    }
+  } # end snmpv3
+
+  ($session, $error) = Net::SNMP->session(%snmpArgs);
+  if (!defined($session)) {
+    $state='UNKNOWN';
+    $answer=$error;
+    print ("$state: $answer");
+    exit $ERRORS{$state};
+  }
+  return ($session, $error);
 }
