diff -ruN nagiosplug-save/plugins-scripts/check_ifoperstatus.pl nagiosplug/plugins-scripts/check_ifoperstatus.pl
--- nagiosplug-save/plugins-scripts/check_ifoperstatus.pl	2003-11-05 22:59:41.000000000 +0000
+++ nagiosplug/plugins-scripts/check_ifoperstatus.pl	2004-03-27 22:09:37.000000000 +0000
@@ -1,6 +1,6 @@
-#!/usr/local/bin/perl -w
+#!/usr/bin/perl -wT
 #
-# check_ifoperstatus.pl - nagios plugin 
+# check_ifoperstatus.pl - nagios plugin
 #
 # Copyright (C) 2000 Christoph Kron,
 # Modified 5/2002 to conform to updated Nagios Plugin Guidelines
@@ -32,23 +32,151 @@
 #
 # Primary MIB reference - RFC 2863
 
-
+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($helpparameterlist $versionparameterlist $hostnameparameter $communityparameter
+			 $snmpversionparameter $authprotocolparameter $userparameter $authpasswordparameter
+			 $privpasswordparameter $snmpv3seclevelparameter $snmpcontextparameter
+			 $warningparameter $portparameter $timeoutparameter);
+
+use vars qw($hostname $community $snmp_version $seclevel $secname $context $authpass
+	    $authproto $privpass $snmpkey $ifDescr $lastc $port $ifXTable $ifName
+	    $dormantWarn $maxmsgsize $timeout $PROGNAME);
+
+use utils qw(%ERRORS &usage);
 
 use Net::SNMP;
-use Getopt::Long;
-&Getopt::Long::config('bundling');
 
-my $PROGNAME = "check_ifoperstatus";
-sub print_help ();
-sub usage ();
-sub process_arguments ();
+$hostnameparameter->binding(\$hostname);
+$communityparameter->binding(\$community);
+$snmpversionparameter->binding(\$snmp_version);
+$snmpv3seclevelparameter->binding(\$seclevel);
+$userparameter->name("secname");
+$userparameter->flags([ 'U', 'secname']);
+$userparameter->description("username for SNMPv3 context");
+$userparameter->binding(\$secname);
+$snmpcontextparameter->binding(\$context);
+$authpasswordparameter->binding(\$authpass);
+$authprotocolparameter->binding(\$authproto);
+$privpasswordparameter->flags([ 'X', 'privpass']);
+$privpasswordparameter->binding(\$privpass);
+my $keyparameter = new Plugin::Parameter(-name => "ifIndex", -flags => [ 'k', 'key' ],
+					 -optional => "yes", -valueoptional => "no", -type => "INTEGER",
+					 -default => 0,
+					 -binding => \$snmpkey,
+					 -checker => \&Plugin::Parameter::_check_integer,
+					 -description => "SNMP IfIndex value");
+my $descrparameter = new Plugin::Parameter(-name => "ifDescr", -flags => [ 'd', 'descr' ],
+					   -optional => "yes", -valueoptional => "no", -type => "SNMPIFDESC",
+					   -binding => \$ifDescr,
+					   -description => "SNMP ifDescr value");
+my $lastchangeparameter = new Plugin::Parameter(-name => "lastchange", -flags => [ 'l', 'lastchange' ],
+						-optional => "yes", -valueoptional => "no", -type => "STRING",
+						-binding => \$lastc,
+						-description => "***** What is this *****");
+$portparameter->binding(\$port);
+$portparameter->default("snmp");
+my $ifmibparameter = new Plugin::Parameter(-name => "ifmib", -flags => [ 'I', 'ifmib' ],
+					   -optional => "yes", -valueoptional => "yes", -type => "NONE",
+					   -binding => \$ifXTable,
+					   -description => "Agent support IFMIB ifXTable. 'Do not use this if you do not know what it is'");
+my $nameparameter = new Plugin::Parameter(-name => "name", -flags => [ 'n', 'name' ],
+					  -optional => "yes", -valueoptional => "no", -type => "NAME",
+					  -binding => \$ifName,
+					  -description => "the value should match the returned ifName, implies use of ifmib flag");
+$warningparameter->binding(\$dormantWarn);
+$warningparameter->type("STRING");
+$warningparameter->checker(sub { my ($opt, $parameter, $plugin) = @_;
+				 $$opt =~ m/^(i|w|c)$/;
+				 $$opt = $1;
+			       });
+$warningparameter->default("c");
+$warningparameter->optional("yes");
+my $maxmsgsizeparameter = new Plugin::Parameter(-name => "maxmsgsize", -flags => [ 'M', 'maxmsgsize' ],
+						-optional => "yes", -valueoptional => "no", -type => "INTEGER",
+						-default => 1472,
+						-binding => \$maxmsgsize,
+						-description => "Maximum message size - useful only for v1 and v2c queries");
+$timeoutparameter->binding(\$timeout);
+
+my $plugin = new Plugin(-revision => '$Revision: 1.5 $',
+			-copyright => "2000 Christoph Kron, 2004 Howard Wilkinson <howard\@cohtech.com>",
+			-shortcomment => "check_ifoperstatus plugin for Nagios monitors operational status of a particular network interface in the target host",
+			-longcomment => "Note: either -k or -d must be specified and -d is much more network intensive.  Use it sparingly or not at all.  -n is used to match against a much more descriptive ifName value in the IfXTable to verify that the snmpkey has not changed to some other network interface after a reboot.",
+			-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 ($snmpkey && $ifDescr) {
+					    $plugin->usage();
+					    usage("$PROGNAME UNKNOWN: Cannot specify both key and descr\n");
+					  }
+					  if ($ifName) {
+					    $ifXTable = 1;
+					  }
+					  if ( ! utils::is_hostname($hostname)) {
+					    $plugin->usage();
+					    usage("$PROGNAME UNKNOWN: Invalid hostname\n");
+					  }
+					  unless ($snmpkey > 0 || defined $ifDescr){
+					    $plugin->usage();
+					    usage("$PROGNAME UNKNOWN: Either a valid snmpkey key (-k) or a ifDescr (-d) must be provided)\n");
+					  }
+					},
+			-parameterlists => [ [ $hostnameparameter,
+					       $communityparameter,
+					       $snmpversionparameter,
+					       $snmpv3seclevelparameter,
+					       $userparameter,
+					       $snmpcontextparameter,
+					       $authpasswordparameter,
+					       $authprotocolparameter,
+					       $privpasswordparameter,
+					       $keyparameter,
+					       $portparameter,
+					       $descrparameter,
+					       $lastchangeparameter,
+					       $ifmibparameter,
+					       $nameparameter,
+					       $warningparameter,
+					       $maxmsgsizeparameter,
+					       $timeoutparameter ],
+					     $helpparameterlist,
+					     $versionparameterlist ]);
+
+
+sub setupsnmp();
 
-my $timeout;
-my $status;
 my %ifOperStatus = 	('1','up',
 			 '2','down',
 			 '3','testing',
@@ -59,11 +187,7 @@
 
 my $state = "UNKNOWN";
 my $answer = "";
-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;
 my $sysUptime        = '1.3.6.1.2.1.1.3.0';
 my $snmpIfDescr      = '1.3.6.1.2.1.2.2.1.2';
@@ -73,52 +197,30 @@
 my $snmpIfLastChange = '1.3.6.1.2.1.2.2.1.9';
 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 $hostname;
-my $ifName;
-my $session;
-my $error;
-my $response;
-my $snmp_version = 1 ;
-my $ifXTable;
-my $opt_h ;
-my $opt_V ;
-my $ifdescr;
-my $key;
-my $lastc;
-my $dormantWarn;
-my $name;
 
 ### Validate Arguments
 
-$status = process_arguments();
+$plugin->init();
 
+$plugin->start_timeout($timeout, "No snmp response from $hostname (alarm)");
 
-# Just in case of problems, let's not hang Nagios
-$SIG{'ALRM'} = sub {
-     print ("ERROR: No snmp response from $hostname (alarm)\n");
-     exit $ERRORS{"UNKNOWN"};
-};
-
-alarm($timeout);
-
+my ($session, $error) = setupsnmp();
 
 ## map ifdescr to ifindex - should look at being able to cache this value
 
-if (defined $ifdescr) {
-	# escape "/" in ifdescr - very common in the Cisco world
-	$ifdescr =~ s/\//\\\//g;
-
-	$status=fetch_ifdescr();  # if using on device with large number of interfaces
-							  # recommend use of SNMP v2 (get-bulk)
-	if ($status==0) {
-		$state = "UNKNOWN";
-		printf "$state: could not retrive ifdescr snmpkey - $status-$snmpkey\n";
-		$session->close;
-		exit $ERRORS{$state};
-	}
+if (defined $ifDescr) {
+  # escape "/" in ifdescr - very common in the Cisco world
+  $ifDescr =~ s/\//\\\//g;
+  my $status=fetch_ifdescr();  # if using on device with large number of interfaces
+                               # recommend use of SNMP v2 (get-bulk)
+  if ($status==0) {
+    $state = "UNKNOWN";
+    printf "$PROGNAME $state: could not retrive ifdescr snmpkey - $status-$snmpkey\n";
+    $session->close;
+    exit $ERRORS{$state};
+  }
 }
 
-
 ## Main function
 
 $snmpIfAdminStatus = $snmpIfAdminStatus . "." . $snmpkey;
@@ -133,363 +235,149 @@
 push(@snmpoids,$snmpIfName) if (defined $ifXTable) ;
 push(@snmpoids,$snmpIfAlias) if (defined $ifXTable) ;
 
-   if (!defined($response = $session->get_request(@snmpoids))) {
-      $answer=$session->error;
-      $session->close;
-      $state = 'WARNING';
-      print ("$state: SNMP error: $answer\n");
-      exit $ERRORS{$state};
-   }
-
-   $answer = sprintf("host '%s', %s(%s) is %s\n", 
-      $hostname, 
-      $response->{$snmpIfDescr},
-      $snmpkey, 
-      $ifOperStatus{$response->{$snmpIfOperStatus}}
-   );
-
-
-   ## Check to see if ifName match is requested and it matches - exit if no match
-   ## not the interface we want to monitor
-   if ( defined $name && not ($response->{$snmpIfName} eq $name) ) {
-      $state = 'UNKNOWN';
-      $answer = "Interface name ($name) doesn't match snmp value ($response->{$snmpIfName}) (index $snmpkey)";
-      print ("$state: $answer");
-      exit $ERRORS{$state};
-   } 
-
-   ## define the interface name
-   if (defined $ifXTable) {
-     $name = $response->{$snmpIfName} ." - " .$response->{$snmpIfAlias} ; 
-   }else{
-     $name = $response->{$snmpIfDescr} ;
-   }
-   
-   ## if AdminStatus is down - some one made a consious effort to change config
-   ##
-   if ( not ($response->{$snmpIfAdminStatus} == 1) ) {
-      $state = 'WARNING';
-      $answer = "Interface $name (index $snmpkey) is administratively down.";
-
-   } 
-   ## Check operational status
-   elsif ( $response->{$snmpIfOperStatus} == 2 ) {
-      $state = 'CRITICAL';
-      $answer = "Interface $name (index $snmpkey) is down.";
-   } 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';
-	   $answer = "Interface $name (index $snmpkey) notPresent - possible hotswap in progress.";
-   } elsif ( $response->{$snmpIfOperStatus} == 7 ) {
-	   $state = 'CRITICAL';
-	   $answer = "Interface $name (index $snmpkey) down due to lower layer being down.";
-
-   } elsif ( $response->{$snmpIfOperStatus} == 3 || $response->{$snmpIfOperStatus} == 4  ) {
-	   $state = 'CRITICAL';
-	   $answer = "Interface $name (index $snmpkey) down (testing/unknown).";
-
-   } else {
-      $state = 'OK';
-      $answer = "Interface $name (index $snmpkey) is up.";
-   }
+my $response = $session->get_request(@snmpoids);
 
+if (!defined $response) {
+  $answer=$session->error;
+  $session->close;
+  $state = 'WARNING';
+  print ("$state: SNMP error: $answer\n");
+  exit $ERRORS{$state};
+}
+$answer = sprintf("host '%s', %s(%s) is %s\n", 
+		  $hostname, 
+		  $response->{$snmpIfDescr},
+		  $snmpkey, 
+		  $ifOperStatus{$response->{$snmpIfOperStatus}});
+
+$plugin->stop_timeout();
+
+## Check to see if ifName match is requested and it matches - exit if no match
+## not the interface we want to monitor
+if ( defined $ifName && not ($response->{$snmpIfName} eq $ifName) ) {
+  $state = 'UNKNOWN';
+  $answer = "Interface name ($ifName) doesn't match snmp value ($response->{$snmpIfName}) (index $snmpkey)";
+  print ("$state: $answer");
+  exit $ERRORS{$state};
+}
+## define the interface name
+if (defined $ifXTable) {
+  $ifName = $response->{$snmpIfName} ." - " .$response->{$snmpIfAlias} ; 
+}else{
+  $ifName = $response->{$snmpIfDescr} ;
+}
 
+## if AdminStatus is down - some one made a consious effort to change config
+##
+if ( not ($response->{$snmpIfAdminStatus} == 1) ) {
+  $state = 'WARNING';
+  $answer = "Interface $ifName (index $snmpkey) is administratively down.";
+} elsif ( $response->{$snmpIfOperStatus} == 2 ) { ## Check operational status
+  $state = 'CRITICAL';
+  $answer = "Interface $ifName (index $snmpkey) is down.";
+} elsif ( $response->{$snmpIfOperStatus} == 5 ) {
+  if (defined $dormantWarn ) {
+    if ($dormantWarn eq "w") {
+      $state = 'WARNNG';
+      $answer = "Interface $ifName (index $snmpkey) is dormant.";
+    }elsif($dormantWarn eq "c") {
+      $state = 'CRITICAL';
+      $answer = "Interface $ifName (index $snmpkey) is dormant.";
+    }elsif($dormantWarn eq "i") {
+      $state = 'OK';
+      $answer = "Interface $ifName (index $snmpkey) is dormant.";
+    }
+  }else{
+    # dormant interface  - but warning/critical/ignore not requested
+    $state = 'CRITICAL';
+    $answer = "Interface $ifName (index $snmpkey) is dormant.";
+  }
+} elsif ( $response->{$snmpIfOperStatus} == 6 ) {
+  $state = 'CRITICAL';
+  $answer = "Interface $ifName (index $snmpkey) notPresent - possible hotswap in progress.";
+} elsif ( $response->{$snmpIfOperStatus} == 7 ) {
+  $state = 'CRITICAL';
+  $answer = "Interface $ifName (index $snmpkey) down due to lower layer being down.";
+} elsif ( $response->{$snmpIfOperStatus} == 3 || $response->{$snmpIfOperStatus} == 4  ) {
+  $state = 'CRITICAL';
+  $answer = "Interface $ifName (index $snmpkey) down (testing/unknown).";
+} else {
+  $state = 'OK';
+  $answer = "Interface $ifName (index $snmpkey) is up.";
+}
 
-print ("$state: $answer");
+print ("$PROGNAME $state: $answer");
 exit $ERRORS{$state};
 
 
 ### subroutines
 
 sub fetch_ifdescr {
-	if (!defined ($response = $session->get_table($snmpIfDescr))) {
-		$answer=$session->error;
-		$session->close;
-		$state = 'CRITICAL';
-		printf ("$state: SNMP error with snmp version $snmp_version ($answer)\n");
-		$session->close;
-		exit $ERRORS{$state};
-	}
-	
-	foreach $key ( keys %{$response}) {
-		if ($response->{$key} =~ /^$ifdescr$/) {
-			$key =~ /.*\.(\d+)$/;
-			$snmpkey = $1;
-			#print "$ifdescr = $key / $snmpkey \n";  #debug
-		}
-	}
-	unless (defined $snmpkey) {
-		$session->close;
-		$state = 'CRITICAL';
-		printf "$state: Could not match $ifdescr on $hostname\n";
-		exit $ERRORS{$state};
-	}
-	
-	return $snmpkey;
-}
+  if (!defined ($response = $session->get_table($snmpIfDescr))) {
+    $answer=$session->error;
+    $session->close;
+    $state = 'CRITICAL';
+    printf ("$state: SNMP error with snmp version $snmp_version ($answer)\n");
+    $session->close;
+    exit $ERRORS{$state};
+  }
+
+  foreach my $key ( keys %{$response}) {
+    if ($response->{$key} =~ /^$ifDescr$/) {
+      $key =~ /.*\.(\d+)$/;
+      $snmpkey = $1;
+    }
+  }
+  unless (defined $snmpkey) {
+    $session->close;
+    $state = 'CRITICAL';
+    printf "$state: Could not match $ifDescr on $hostname\n";
+    exit $ERRORS{$state};
+  }
 
-sub usage() {
-  printf "\nMissing arguments!\n";
-  printf "\n";
-  printf "usage: \n";
-  printf "check_ifoperstatus -k <IF_KEY> -H <HOSTNAME> [-C <community>]\n";
-  printf "Copyright (C) 2000 Christoph Kron\n";
-  printf "check_ifoperstatus.pl comes with ABSOLUTELY NO WARRANTY\n";
-  printf "This programm is licensed under the terms of the ";
-  printf "GNU General Public License\n(check source code for details)\n";
-  printf "\n\n";
-  exit $ERRORS{"UNKNOWN"};
+  return $snmpkey;
 }
 
-sub print_help() {
-	printf "check_ifoperstatus plugin for Nagios monitors operational \n";
-  	printf "status of a particular 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 "                        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";
-	printf "   -p (--port)       SNMP port (default 161)\n";
-	printf "   -I (--ifmib)      Agent supports IFMIB ifXTable.  Do not use if\n";
-	printf "                     you don't know what this is. \n";
-	printf "   -n (--name)       the value should match the returned ifName\n";
-	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 "   -t (--timeout)    seconds before the plugin times out (default=$TIMEOUT)\n";
-	printf "   -V (--version)    Plugin version\n";
-	printf "   -h (--help)       usage help \n\n";
-	printf " -k or -d must be specified\n\n";
-	printf "Note: either -k or -d must be specified and -d is much more network \n";
-	printf "intensive.  Use it sparingly or not at all.  -n is used to match against\n";
-	printf "a much more descriptive ifName value in the IfXTable to verify that the\n";
-	printf "snmpkey has not changed to some other network interface after a reboot.\n\n";
-	print_revision($PROGNAME, '$Revision: 1.5 $');
-	
-}
-
-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,
-			"t=i" => \$timeout,    "timeout=i" => \$timeout,
-			);
-
-
-				
-	if ($status == 0){
-		print_help();
-		exit $ERRORS{'OK'};
-	}
-  
-	if ($opt_V) {
-		print_revision($PROGNAME,'$Revision: 1.5 $ ');
-		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'};
-		}
-	}
-	
-	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
-
-
-	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};
-	}
-
+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
+      $snmpArgs{-username} = $secname;
+      if ($seclevel eq ('authNoPriv' || 'authPriv') ) {
+	$snmpArgs{-authprotocol} = $authproto;
+	if ($authpass =~ /^0x/ ) {
+	  $snmpArgs{-authkey} = $authpass;
+	} else {
+	  $snmpArgs{-authpassword} = $authpass;
+	}
+	if ($seclevel eq  'authPriv') { # Privacy (DES encryption) wanted
+	  if ($privpass =~ /^0x/){
+	    $snmpArgs{-privkey} = $privpass;
+	  } else {
+	    $snmpArgs{-privpassword} = $privpass;
+	  }
+	}
+      }
+    }
+  }
+  my ($session, $error) = Net::SNMP->session(%snmpArgs);
+  if (!defined($session)) {
+    $state='UNKNOWN';
+    $answer=$error;
+    print ("$PROGNAME $state: $answer\n");
+    exit $ERRORS{$state};
+  }
+  return ($session, $error);
 }
 ## End validation
 
