Merge pull request #8 from cadeef/pagerduty-fix

Correct location of Pagerduty handler
diff --git a/sensu/files/checks/check_ceilometer-api b/sensu/files/checks/check_ceilometer-api
new file mode 100755
index 0000000..4e9111a
--- /dev/null
+++ b/sensu/files/checks/check_ceilometer-api
@@ -0,0 +1,83 @@
+#!/bin/bash
+#
+# Ceilometer API monitoring script for Nagios
+#
+# Copyright © 2013 eNovance <licensing@enovance.com>
+#
+# Author: Emilien Macchi <emilien.macchi@enovance.com>
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+
+set -e
+
+STATE_OK=0
+STATE_WARNING=1
+STATE_CRITICAL=2
+STATE_UNKNOWN=3
+STATE_DEPENDENT=4
+
+usage ()
+{
+    echo "Usage: $0 [OPTIONS]"
+    echo " -h               Get help"
+    echo " -H <Auth URL>    URL for obtaining an auth token"
+    echo " -U <username>    Username to use to get an auth token"
+    echo " -T <tenant>      Tenant to use to get an auth token"
+    echo " -P <password>    Password to use ro get an auth token"
+}
+
+while getopts 'h:H:U:T:P:' OPTION
+do
+    case $OPTION in
+        h)
+            usage
+            exit 0
+            ;;
+        H)
+            export OS_AUTH_URL=$OPTARG
+            ;;
+        U)
+            export OS_USERNAME=$OPTARG
+            ;;
+        T)
+            export OS_TENANT_NAME=$OPTARG
+            ;;
+        P)
+            export OS_PASSWORD=$OPTARG
+            ;;
+        *)
+            usage
+            exit 1
+            ;;
+    esac
+done
+
+
+if ! which ceilometer >/dev/null 2>&1
+then
+    echo "python-ceilometerclient is not installed."
+    exit $STATE_UNKNOWN
+fi
+
+
+if ! KEY=$(ceilometer meter-list 2>/dev/null)
+then
+    echo "Unable to list meters"
+    exit $STATE_CRITICAL
+fi
+
+count=$(($(ceilometer meter-list 2>/dev/null | wc -l)-4))
+
+echo "Ceilometer API is working with $count meters."
diff --git a/sensu/files/checks/check_cinder_api.sh b/sensu/files/checks/check_cinder_api.sh
index 0aa9e06..87b608d 100644
--- a/sensu/files/checks/check_cinder_api.sh
+++ b/sensu/files/checks/check_cinder_api.sh
@@ -55,7 +55,7 @@
 fi
 
 START=`date +%s`
-QUOTAS=$(curl -s -H "X-Auth-Token: $TOKEN" $HOST:8776/v1/$TENANT_ID/os-quota-sets/$TENANT/defaults | grep "gigabytes")
+QUOTAS=$(cinder --os-username $USER --os-password $PASSWD --os-tenant-name $TENANT --os-auth-url $HOST:5000/v2.0 quota-show $TENANT_ID | grep "gigabytes")
 END=`date +%s`
 
 LIST_TIME=$[END-START]
diff --git a/sensu/files/checks/check_cinder_services.sh b/sensu/files/checks/check_cinder_services.sh
index e294869..8948dfd 100755
--- a/sensu/files/checks/check_cinder_services.sh
+++ b/sensu/files/checks/check_cinder_services.sh
@@ -39,7 +39,7 @@
     exit_critical "Unknown error."
 fi
 
-read -ra cinder_state_down <<< $(cinder --os-username $user --os-password $passwd --os-tenant-name $tenant --os-auth-url $host service-list | head -n -1 | tr -d "|" | awk '/'down'/ {print "Service " $1 " on " $2 " is DOWN" ";"}')
+read -ra cinder_state_down <<< $(cinder --os-username $user --os-password $passwd --os-tenant-name $tenant --os-auth-url $host service-list | head -n -1 | tr -d "|" | grep enabled | awk '/'down'/ {print "Service " $1 " on " $2 " is DOWN" ";"}')
 
 EXITVAL=0
 
diff --git a/sensu/files/checks/check_fujitsu_server.pl b/sensu/files/checks/check_fujitsu_server.pl
new file mode 100755
index 0000000..117b387
--- /dev/null
+++ b/sensu/files/checks/check_fujitsu_server.pl
@@ -0,0 +1,7502 @@
+#!/usr/bin/perl
+
+## 
+##  Copyright (C) Fujitsu Technology Solutions 2012, 2013, 2014, 2015, 2016
+##  All rights reserved
+##
+
+# version string
+our $version = '3.30.02';
+# Version:	3.30.00
+# Date:		2016-05-19
+#
+# Based on SNMP MIB  2013-04 or higher
+# ...	SNMP PRIMEQUEST 1st changes for Cassiopeia (2013-02)
+# ...	SVUpdate.mib (2013)
+
+use strict;
+use warnings;
+use Getopt::Long qw(:config no_ignore_case bundling);
+use Getopt::Long qw(GetOptions);
+use Pod::Usage  qw(pod2usage);
+use Net::SNMP;
+use Time::Local 'timelocal';
+#use Time::localtime 'ctime';
+use utf8;
+
+##### HELP ################################
+
+=head1 NAME
+
+check_fujitsu_server.pl - Nagios-Check-Plugin for various Fujitsu servers
+
+=head1 SYNOPSIS
+
+check_fujitsu_server.pl 
+  { -H|--host=<host>  [-A|--admin=<host>]
+    [-P|--port=<port>] [-T|--transport=<type>] [--snmp=<n>]
+    { [ -C|--community=<SNMP community string> ] | 
+      { -u|--user=<username> 
+        [--authpassword=<pwd>] [--authkey=<key>] [--authprot=<prot>] 
+        [--privpassword=<pwd>] [--privkey=<key>] [--privprot=<prot>]
+        [--ctxengine=<id>] [--ctxname=<name>]
+      }
+      -I|--inputfile=<filename>
+    }
+    { [--chkuptime] | [--systeminfo] |
+      [--chkmemperf [-w<percent>] [-c<percent>] ] |
+      [--chkfsperf  [-w<percent>] [-c<percent>] ] |
+      [--chknetperf  [-w<kbytesec>] [-c<kbytesec>] ] |
+      { { [--blade] } | { [--pq | --primequest] } 
+          { [--chksystem] 
+            {[--chkenv] | [--chkenv-fan|--chkcooling] [--chkenv-temp] }
+            [--chkpower] 
+            {[--chkhardware] | [--chkcpu] [--chkvoltage] 
+             [--chkmemmodule]}
+            [--chkstorage] 
+            [--chkdrvmonitor]
+            [--chkupdate [{--difflist|--instlist}  [-O|--outputdir=<dir>]]]
+          }
+      } |
+      { [--bladeinside] | 
+        [--bladesrv] [--bladestore] [--bladekvm] 
+        {[--bladeio] | [--bladeio-switch] [--bladeio-phy] 
+          [--bladeio-fcswitch] [--bladeio-sasswitch] 
+          [--bladeio-fsiom]  
+        }
+      } |
+      { --rack }
+    }
+    [-t|--timeout=<timeout in seconds>]
+    [-v|--verbose=<verbose mode level>]
+  } |
+  [-h|--help] | [-V|--version] 
+
+Checks a Fujitsu server using SNMP.
+
+=head1 OPTIONS
+
+=over 4
+
+=item -H|--host=<name-or-ip> [-A|--admin=<ip>]
+
+Host address as DNS name or IP address of the server.
+With optional option -A an administrative IP address can be specified.
+This might be the address of iRMC as an example.
+The communication is done via the admin address if specified.
+
+These options are used for Net::SNMP calles without any preliminary checks.
+
+=item [-P|--port=<port>] [-T|--transport=<type>] [--snmp=<n>]
+
+SNMP service port number (default is 161) and SNMP transport socket type
+like 'udp' or 'tcp' or 'udp6' or 'tcp6'.
+The Perl Net::SNMP option for -T is in SNMP naming the '-domain' parameter.
+With the "snmp" option 1=SNMPv1 or 2=SNMPv2c can be specified - SNMPv3 is 
+automaticaly enabled if username is specified. All other values are ignored !
+
+ATTENTION: IPv6 addresses require Net::SNMP version V6 or higher.
+
+These options are used for Net::SNMP calles without any preliminary checks.
+
+=item -C|--community=<SNMP community string>
+
+SNMP community of the server - usable for SNMPv1 and SNMPv2. Default is 'public'.
+
+These options are used for Net::SNMP calles without any preliminary checks.
+
+=item --user=<username> 
+[--authpassword=<pwd>] [--authkey=<key>] [--authprot=<prot>] 
+[--privpassword=<pwd>] [--privkey=<key>] [--privprot=<prot>]
+[--ctxengine=<id>] [--ctxname=<name>]
+
+SNMPv3 authentication data. Default of authprotocol is 'md5' - Default of
+privprotocol is 'des'. More about this options see Perl Net::SNMP session options.
+
+These options are used for Net::SNMP calles without any preliminary checks.
+
+=item -I|--inputfile=<filename>
+
+Host specific options read from <filename>. All options but '-I' can be
+set in <filename>. These options overwrite options from command line.
+
+=item --chkuptime
+
+Tool option to check the SNMP access by reading the SNMP uptime via RFC1213.
+This option can not be combined with other check options
+
+=item --systeminfo
+
+Only print available system information (dependent on server type and SNMP support).
+This option can not be combined with other check options
+
+=item --chkmemperf [-w<percent>] [-c<percent>]
+
+PRIMERGY server: Get memory usage performance data (in percent).
+This option can not be combined with other check options
+
+With options -w and -c the warning and critical threshold limit can be set.
+<percent> should be a simple integer 0..100
+
+=item --chkfsperf [-w<percent>] [-c<percent>]
+
+PRIMERGY server: Get file system performance data.
+This option can not be combined with other check options
+
+With options -w and -c the warning and critical threshold limit can be set.
+<percent> should be a simple integer 0..100
+
+=item --chknetperf [-w<kbytesec>] [-c<kbytesec>]
+
+PRIMERGY server: Get network interface performance data.
+This option can not be combined with other check options
+
+With options -w and -c the warning and critical threshold limit can be set.
+<kbytesec> should be a simple integer for KByte/sec
+
+=item --blade
+
+Check management blade (MMB)
+
+=item --pq or --primequest
+
+Check management information for a PRIMEQUEST system
+
+=item --chksystem 
+
+=item --chkenv | [--chkenv-fan|--chkcooling] [--chkenv-temp]
+
+=item --chkpower
+
+=item --chkhardware | [--chkcpu] [--chkvoltage] [--chkmemmodule]
+
+Select range of system information: System meaning anything besides
+Environment (Cooling Devices, Temperature) or Power (Supply units and consumption).
+
+"Check Hardware" can be combined only with PRIMEQUEST option and returns voltage,
+cpu and memory-module information.
+
+Options chkenv and chkhardware can be splittet to select only parts of the above mentioned
+ranges.
+
+Hint: --chkenf-fan is an option available for compatibility reasons. 
+The selected functionality is identic to chkcooling which supports the monitoring
+for any cooling device: fans and liquid pumps
+
+=item --chkhardware | [--chkcpu] [--chkvoltage] [--chkmemmodule]
+
+=item --chkstorage
+
+For PRIMERGY server these options can be used to monitor only "Hardware" or only "MassStorage" parts.
+These areas are part of the Primergy System Information
+
+=item --chkdrvmonitor
+
+For PRIMERGY server: monitor "DriverMonitor" parts.
+
+=item --chkupdate [{--difflist|--instlist}  [-O|--outputdir=<dir>]]
+
+For PRIMERGY server: monitor "Update Agent" status.
+
+difflist:
+Fetch Update component difference list and print the first 10 ones of these and store
+all of these in an host specific output file in directory <dir> if specified.
+
+instlist:
+Fetch Update installed component list and print the first 10 ones of these and store
+all of these in an  host specific output file in directory <dir> if specified.
+
+=item --bladeinside
+
+Check all sub blade status values in a PRIMERGY Blade server. This is a combination
+of --bladesrv --bladeio --bladekvm --bladestore where messages that one part doesn't
+exist were suppressed.
+(Do not combine with --blade - Use only for PRIMERGY Blades)
+
+=item --bladesrv
+
+Check server blade status values in a PRIMERGY Blade server.
+(Do not combine with --blade - Use only for PRIMERGY Blades)
+
+=item --bladeio |  --bladeio-***
+
+Check io connection blade status values in a PRIMERGY Blade server. 
+This option can be splitted for single types: 
+[--bladeio-switch] [--bladeio-phy] [--bladeio-fcswitch] [--bladeio-sasswitch] [--bladeio-fsiom]
+(Do not combine with --blade - Use only for PRIMERGY Blades)
+
+=item --bladekvm
+
+Check key/video/mouse blade status values in a PRIMERGY Blade server. 
+(Do not combine with --blade - Use only for PRIMERGY Blades)
+
+=item --bladestore
+
+Check storage blade status values in a PRIMERGY Blade server. 
+(Do not combine with --blade - Use only for PRIMERGY Blades)
+
+=item --rack
+
+Get monitoring information for RackCDU-TM.
+
+=item -t|--timeout=<timeout in seconds>
+
+Timeout for the script processing.
+
+=item -v|--verbose=<verbose mode level>
+
+Enable verbose mode (levels: 1,2).
+Generates Multi-line output with verbose level 2.
+
+=item -V|--version
+
+Print version information and help text.
+
+=item -h|--help
+
+Print help text.
+
+=cut
+
+#####################################
+
+# HIDDEN OPTION #####################
+# --agentinfo --chkfan --chktemp
+
+#### GLOBALS ########################
+# global control definitions
+our $skipInternalNamesForNotifies = 1;
+
+
+# define states
+#### TEXT LANGUAGE AWARENESS (Standard in Nagios-Plugin)
+our @state = ('OK', 'WARNING', 'CRITICAL', 'UNKNOWN');
+
+# init main options
+our $argvCnt = $#ARGV + 1;
+our $optHost = '';
+our $optTimeout = 0;
+our $optShowVersion = undef;
+our $optHelp = undef;
+our $optPort = undef;
+our $optCommunity = undef; #SNMPv1, SNMPv2
+our $optUserName = undef;	#SNMPv3
+our $optAuthKey = undef;	#SNMPv3
+our $optAuthPassword = undef;	#SNMPv3
+our $optAuthProt = undef;	#SNMPv3
+our $optPrivKey = undef;	#SNMPv3
+our $optPrivPassword = undef;	#SNMPv3
+our $optPrivProt = undef;	#SNMPv3
+our $optCtxEngine = undef;	#SNMPv3
+our $optCtxName = undef;	#SNMPv3
+our $optTransportType = undef;
+our $optSNMP = undef;
+our $optAdminHost = undef;
+
+# global option
+$main::verbose = 0;
+$main::verboseTable = 0;
+
+#$main::useNotify = 1;
+
+# init additional options
+our $optChkSystem = undef;
+our $optChkEnvironment = undef;
+our	$optChkEnv_Fan = undef;
+our       $optChkFanPerformance	= undef;
+our	$optChkEnv_Temp = undef;
+our $optChkPower = undef;
+our $optChkHardware = undef;
+our	$optChkCPU = undef;
+our	$optChkVoltage = undef;
+our	$optChkMemMod = undef;
+our $optChkStorage = undef;
+our $optChkDrvMonitor = undef;
+#our $optChkTpm = undef;
+our $optChkCpuLoadPerformance	= undef;
+our $optChkMemoryPerformance	= undef;
+our $optChkFileSystemPerformance = undef;
+our $optChkNetworkPerformance	= undef;
+our $optChkUpdate = undef;
+our     $optChkUpdDiffList	= undef;
+our	$optChkUpdInstList	= undef;
+our	$optOutdir		= undef;
+
+our $optBlade = undef;
+our $optBladeContent = undef;
+our $optBladeSrv = undef;
+our $optBladeIO = undef;
+our	$optBladeIO_Switch = undef;
+our	$optBladeIO_FCPT = undef;
+our	$optBladeIO_Phy = undef;
+our	$optBladeIO_FCSwitch = undef;
+our	$optBladeIO_IBSwitch = undef;
+our	$optBladeIO_SASSwitch = undef;
+our	$optBladeIO_FSIOM = undef;
+our $optBladeKVM = undef;
+our $optBladeStore = undef;
+
+our $optPrimeQuest = undef;
+
+our $optRackCDU = undef;
+
+our $optChkUpTime = undef;
+our $optSystemInfo = undef;
+our $optAgentInfo = undef;
+our $optUseDegree = undef;
+
+# special sub options
+our $optWarningLimit = undef;
+our $optCriticalLimit = undef;
+
+# option cross check result
+our $setOverallStatus = undef;	# no chkoptions
+our $setOnlySystem = undef;	# only --chksystem
+
+# init output data
+our $exitCode = 3;
+our $error = '';
+our $msg = '';
+our $longMessage = '';
+our $performanceData = '';
+our $variableVerboseMessage = '';
+our $notifyMessage = '';
+
+# init some multi used processing variables
+our $session;
+our $useSNMPv3 = undef;
+our $serverID = undef;
+our $useDegree = 0;
+our $PSConsumptionBTUH = 0;
+#our %snmpSessionOpts;
+
+#########################################################################################
+#----------- multi usable functions
+  sub finalize {
+	my $tmpExitCode = shift;
+	$|++; # for unbuffered stdout print (due to Perl documentation)
+	my $string = "@_";
+	$string =~ s/\s*$//;
+	print "$string" if ($string);
+	print "\n";
+	alarm(0); # stop timeout
+	exit($tmpExitCode);
+  }
+  sub simpleSNMPget {
+	my $oid = shift;
+	my $topic = shift;
+	my $useSNMPv3ctx = undef;
+	$useSNMPv3ctx = 1 if ($useSNMPv3 and ($optCtxEngine or $optCtxName));
+
+	print '-> OID \'' . $oid . '\' (required) ' if ($main::verbose >= 10);
+	my $response = undef;
+	$response = $main::session->get_request($oid) if (!$useSNMPv3ctx);
+	$response = $main::session->get_request(
+            -contextengineid	=> $optCtxEngine,
+            -contextname	=> $optCtxName,
+	    -varbindlist	=> [ $oid ],
+	) if ($useSNMPv3ctx);
+	finalize(3, $state[3], 'SNMP::get_request(' . $topic . '): ' . $main::session->error) unless (defined $response);
+	print '<- response: ' . ($response?$response->{$oid}:'---') . "\n" 
+	    if ($main::verbose >= 10);
+	# SNMPv3 exception:
+	$response->{$oid} = undef if ($response and $response->{$oid} and $response->{$oid} =~ m/noSuchObject/i);
+	return $response->{$oid};
+  }
+  sub trySNMPget {
+	my $oid = shift;
+	my $topic = shift; # unused
+	my $useSNMPv3ctx = undef;
+	$useSNMPv3ctx = 1 if ($useSNMPv3 and ($optCtxEngine or $optCtxName));
+
+	print '-> OID \'' . $oid . '\' ' if ($main::verbose >= 10);
+	my $response = undef;
+	$response = $main::session->get_request($oid) if (!$useSNMPv3ctx);
+	$response = $main::session->get_request(
+            -contextengineid	=> $optCtxEngine,
+            -contextname	=> $optCtxName,
+	    -varbindlist	=> [ $oid ],
+	) if ($useSNMPv3ctx);
+	print '<- response: ' . ($response?$response->{$oid}:'---') . "\n" 
+		if ($main::verbose >= 10) ;
+	my $snmpErr = $main::session->error;
+	print "--- SNMP ERROR TEXT: $snmpErr\n" if (!$response and $snmpErr and $snmpErr !~ m/noSuchName/
+	    and $main::verbose >= 60);
+	# SNMPv3 exception:
+	$response->{$oid} = undef if ($response and $response->{$oid} and $response->{$oid} =~ m/noSuchObject/i);
+	return ($response?$response->{$oid}:undef);
+  }
+  sub getSNMPtable {
+	my $tableCheckRef = shift;
+      	my $entries = undef;
+	my $useSNMPv3ctx = undef;
+	$useSNMPv3ctx = 1 if ($useSNMPv3 and ($optCtxEngine or $optCtxName));
+	return undef if (!$tableCheckRef);
+	my $thefirst = $tableCheckRef->[0];
+	$thefirst =~ s/\d+$/\*/ if ($thefirst);
+	print "<--> try TABLE OIDs '$thefirst\'\n" if ($main::verbose >= 10);
+	$entries = $main::session->get_entries( -columns => $tableCheckRef ) if (!$useSNMPv3ctx);
+	$entries = $main::session->get_entries( 
+            -contextengineid	=> $optCtxEngine,
+            -contextname	=> $optCtxName,
+	    -columns => $tableCheckRef 
+	) if ($useSNMPv3ctx);
+	if ($main::verbose >= 10) {
+		foreach my $snmpKey ( keys %{$entries} ) {
+			print "$snmpKey --- $entries->{$snmpKey}\n";
+		}		
+	}
+	# SNMPv3 exception:
+	if ($useSNMPv3 and $entries) {
+		foreach my $snmpKey ( keys %{$entries} ) {
+			$entries->{$snmpKey} = undef if ($snmpKey and $entries->{$snmpKey}
+			and $entries->{$snmpKey} =~ m/noSuchObject/i);
+			print "$snmpKey --- $entries->{$snmpKey}\n";
+		}		
+	}
+	return $entries;
+  } # getSNMPtable
+  sub getSNMPTableIndex {
+	my $entries = shift;
+	my $oidSelector = shift;
+	my $indexSelector = shift;
+	my @snmpIDs = ();
+
+	return @snmpIDs if (!$entries or !$oidSelector or (defined $indexSelector and $indexSelector > 4));
+
+	if ($indexSelector == 0) { # anything after . ..... UNUSED
+		foreach my $snmpKey ( keys %{$entries} ) {
+			push(@snmpIDs, $1) if ($snmpKey =~ m/$oidSelector.(.*)/);
+		}
+	}
+	if ($indexSelector == 1) { # 1 index - type =  dezimal
+		foreach my $snmpKey ( keys %{$entries} ) {
+			push(@snmpIDs, $1) if ($snmpKey =~ m/$oidSelector.(\d+)/);
+		}
+	}
+	if ($indexSelector == 2) { # 2 index, type = dezimal
+		foreach my $snmpKey ( keys %{$entries} ) {
+			push(@snmpIDs, $1) if ($snmpKey =~ m/$oidSelector.(\d+\.\d+)/);
+		}
+	}
+	if ($indexSelector == 3) { # 3 index, type = dezimal
+		foreach my $snmpKey ( keys %{$entries} ) {
+			push(@snmpIDs, $1) if ($snmpKey =~ m/$oidSelector.(\d+\.\d+\.\d+)/);
+		}
+	}
+	if ($indexSelector == 4) { # 4 index, type = dezimal
+		foreach my $snmpKey ( keys %{$entries} ) {
+			push(@snmpIDs, $1) if ($snmpKey =~ m/$oidSelector.(\d+\.\d+\.\d+\.\d+)/);
+		}
+	}
+	@snmpIDs = Net::SNMP::oid_lex_sort(@snmpIDs);
+	return @snmpIDs;
+  } #getSNMPTableIndex
+  sub openSNMPsession 
+  {
+	my $error = undef;
+	# connect to SNMP host
+	my $host = $optHost;
+	$host = $optAdminHost if ($optAdminHost);
+	#my %snmpSessionOpts = (
+	#		-hostname   => $host,
+	#);
+	my %snmpSessionOpts;
+	$snmpSessionOpts{'-hostname'}	= $host;
+	$snmpSessionOpts{'-port'}	= $optPort if (defined $optPort);
+	$snmpSessionOpts{'-domain'}	= $optTransportType if ($optTransportType);
+	my $trySNMPv3 = 0;
+	if (defined $optUserName or ($optSNMP and $optSNMP==3)) {
+		$trySNMPv3 = 1;
+		# Syntax
+		# http://net-snmp.sourceforge.net/docs/perl-SNMP-README.html
+		#	versus
+		# http://search.cpan.org/~dtown/Net-SNMP-v6.0.1/lib/Net/SNMP.pm
+		#
+		$variableVerboseMessage .= "--- SNMPv3 ---\n" if ($main::verbose >= 44);
+		my %snmp3SessionOpts = %snmpSessionOpts;
+		$snmp3SessionOpts{'-version'}		= "3";
+		$snmp3SessionOpts{'-maxmsgsize'}		= "1472";
+		$snmp3SessionOpts{'-username'}		= $optUserName if ($optUserName);
+		if ($optAuthKey or $optAuthPassword) {
+		    $snmp3SessionOpts{'-authkey'}	= $optAuthKey if ($optAuthKey);
+		    $snmp3SessionOpts{'-authpassword'}	= $optAuthPassword if ($optAuthPassword);
+		    $snmp3SessionOpts{'-authprotocol'}	= $optAuthProt || 'md5';
+		}
+		if ($optPrivKey or $optPrivPassword) {
+		    $snmp3SessionOpts{'-privkey'}	= $optPrivKey if ($optPrivKey);
+		    $snmp3SessionOpts{'-privpassword'}	= $optPrivPassword if ($optPrivPassword);
+		    $snmp3SessionOpts{'-privprotocol'}	= $optPrivProt || 'des';
+		}
+		($main::session, $error) = Net::SNMP->session(%snmp3SessionOpts);
+		#$variableVerboseMessage .= "ATTENTION - SNMPv3 Error=$error" 
+		#	if ((!defined $main::session));
+		$useSNMPv3 = 1 if (defined $main::session);
+		#### TODO-QUESTION: Should I switch automaticaly to SNMP1/2 in case of errors for SNMPv3 ???
+	} # SNMPv3 user
+	else {
+	    if (!defined $main::session) {
+		    $snmpSessionOpts{'-community'}	= $optCommunity || 'public';
+	    }
+	    if (!defined $main::session and !$optSNMP) {
+		    $variableVerboseMessage .= "--- SNMP ---\n" if ($main::verbose >= 44);
+		    ($main::session, $error) = Net::SNMP->session(%snmpSessionOpts);
+		    #$variableVerboseMessage .= "SNMP Error=$error" 
+			#    if (!defined $main::session and $main::verbose >= 5);
+	    }
+	    if (!defined $main::session and (!$optSNMP or $optSNMP==1)) {
+		    $variableVerboseMessage .= "--- SNMPv1 ---\n" if ($main::verbose >= 44);
+		    $snmpSessionOpts{'-version'}		= 'snmpv1';
+		    ($main::session, $error) = Net::SNMP->session(%snmpSessionOpts);
+		    #$variableVerboseMessage .= "SNMP Error=$error" 
+			#    if (!defined $main::session and $main::verbose >= 5);
+	    }
+	    if (!defined $main::session and (!$optSNMP or $optSNMP==2)) {
+		    $variableVerboseMessage .= "--- SNMPv2c ---\n" if ($main::verbose >= 44);
+		    $snmpSessionOpts{'-version'}		= 'snmpv2c';
+		    ($main::session, $error) = Net::SNMP->session(%snmpSessionOpts);
+		    #$variableVerboseMessage .= "SNMP Error=$error" 
+			#    if (!defined $main::session and $main::verbose >= 5);
+	    }
+	}
+	$exitCode = 2 unless $main::session;
+	$error = "$error - Perl-Net::SNMP does not support transport type -T $optTransportType"
+		if ($error and $error =~ m/Invalid argument \'-domain\'/);
+	$error = "..undefined.." if (!$main::session and !defined $error);
+	if ($trySNMPv3 and !$main::session) {
+	    finalize(3, $state[3], "[SNMPv3] SNMP::session(): $error") unless $main::session;
+	} else {
+	    finalize(3, $state[3], "SNMP::session(): $error") unless $main::session;
+	}
+  } #openSNMPsession
+  sub closeSNMPsession {
+	# close SNMP session
+	return if (!defined $main::session);
+	$main::session->close;
+	$main::session = undef;
+  } #closeSNMPsession
+###############################################################################
+use IO::Socket;
+  sub socket_checkSCS {
+	my $host = shift;
+	return undef if (!$host);
+	my $EOL = "\015\012";
+	my $BLANK = $EOL x 2;
+	my $document = "/cmd?t=connector.What&aid=svnagioscheck";
+	my $remote = undef;
+
+	$remote = IO::Socket::INET->new( 
+		Proto => "tcp",
+		PeerAddr => $host,
+		PeerPort => "3172",
+		Timeout => 10,
+	);
+	return undef if (!$remote); # no connection
+	$remote->autoflush(1);
+	print $remote "GET $document HTTP/1.0" . $BLANK;
+	my $response = undef;
+	while ( <$remote> ) { $response .= $_; }
+	close $remote;
+	undef $remote;
+	if ($main::verbose >= 10 and $response) {
+	    print $response;
+	    print "___\n";
+	}
+	my $version = undef;
+	if ($response and $response =~ m/HTTP.*200/) {
+	    $version = $1 if ($response =~ m/<wcs version=\"([^\"]+)\"/m);
+	}
+	return $version;
+  } #socket_checkSCS
+
+  sub socket_checkSSM {
+	my $host = shift;
+	my $agentVersion = shift;
+	return undef if (!$host);
+	my $EOL = "\015\012";
+	my $BLANK = $EOL x 2;
+	my $ssmDocument = "/ssm/index.html";
+	my $lt720document = "/ssm/desktop/index.html";
+	my $versionDocument = "/ssm/version.txt";
+	my $versionlt720Document = "/ssm/desktop/version.txt";
+	my $remote = undef;
+	# with IO::SOCKET we try only http
+
+	$remote = IO::Socket::INET->new( 
+		Proto => "tcp",
+		PeerAddr => $host,
+		PeerPort => "3172",
+	);
+	return undef if (!$remote); # no connection
+	$remote->autoflush(1);
+	print $remote "GET $versionDocument HTTP/1.0" . $EOL . "Host: $optHost:3172" . $BLANK;
+	my $response = undef;
+	while ( <$remote> ) { $response .= $_; }
+	close $remote;
+	undef $remote;
+	if ($main::verbose >= 10 and $response) {
+	    print $response;
+	    print "\n";
+	}
+	my $address = undef;
+	#### older version ( less than 7.20.10 )
+	# TODO ... with 7.20.10 ssm/index.html is living ... check agent version
+	if ( $response and $response !~ m/HTTP.*404/ 
+	and ($response =~ m/HTTP.*301/ or $response =~ m/^\s*$/)) 
+	{
+	    my $isOld = 0;
+	    if ($agentVersion =~ m/^(\d+)[^\d](\d+)/) {
+		my $main = $1; 
+		my $sec = $2;
+		$isOld = 1 if ($main < 7);
+		$isOld = 1 if (!$isOld and $main==7 and $sec < 20);
+	    }
+	    if (!$isOld) {
+		$address = "https://$optHost:3172$ssmDocument" if ($optHost !~ m/:/);
+		$address = "https://[$optHost]:3172$ssmDocument" if ($optHost =~ m/:/);
+	    } else {
+		$address = "https://$optHost:3172$lt720document" if ($optHost !~ m/:/);
+		$address = "https://[$optHost]:3172$lt720document" if ($optHost =~ m/:/);
+	    }
+	}
+	return $address;
+  } #socket_checkSSM
+
+  sub socket_getSSM_URL {
+	my $agentVersion = shift;
+	my $ssmAddress = undef;
+	my $chkSSM = 0;
+	my $isiRMC = undef;
+	$isiRMC = 1 if (!defined $notifyMessage or !$notifyMessage or $notifyMessage =~ m/iRMC/ or $notifyMessage !~ m/Description/i);
+	if (!$isiRMC) {
+	    my $scsVersion = socket_checkSCS($optHost);
+	    $chkSSM = 1 if ($scsVersion and $scsVersion =~ m/^V2.00.0[4-9]/);
+	    $chkSSM = 1 if ($scsVersion and $scsVersion =~ m/^V2.00.[1-9]/);
+	    $chkSSM = 1 if ($scsVersion and $scsVersion =~ m/^V2.[1-9]/);
+	    $chkSSM = 1 if ($scsVersion and $scsVersion =~ m/^V[3-9]/);
+	}
+	if ($chkSSM) {
+		$ssmAddress = socket_checkSSM($optHost, $agentVersion);
+	}
+	return $ssmAddress;
+  } #socket_getSSM_URL
+
+###############################################################################
+#----------- RFC1213
+sub RFC1213sysinfoUpTime {
+	# RFC1213.mib
+	my $snmpOidSystem = '.1.3.6.1.2.1.1.'; #system
+	my $snmpOidUpTime	= $snmpOidSystem . '3.0'; #sysUpTime.0
+	my $uptime = trySNMPget($snmpOidUpTime,"sysUpTime");
+	if ($uptime) {
+		$exitCode = 0;
+		$msg .= "- SNMP access OK - SNMP UpTime = $uptime";
+	} else {
+		$msg .= "- Unable to get SNMP information";
+		$longMessage .= "SNMP::get_request: " . $main::session->error;
+	}
+}
+our $prgSystemName = undef;
+sub RFC1213sysinfoToLong {
+	# RFC1213.mib
+	my $snmpOidSystem = '.1.3.6.1.2.1.1.'; #system
+	my $snmpOidDescr	= $snmpOidSystem . '1.0'; #sysDescr.0
+	my $snmpOidContact	= $snmpOidSystem . '4.0'; #sysContact.0
+	my $snmpOidName		= $snmpOidSystem . '5.0'; #sysName.0
+	my $snmpOidLocation	= $snmpOidSystem . '6.0'; #sysLocation.0
+
+	my $descr = trySNMPget($snmpOidDescr,"sysDescr");
+	return if ($main::session->error =~ m/No response from remote host/);
+	my $name = trySNMPget($snmpOidName,"sysName");
+	my $contact = trySNMPget($snmpOidContact,"sysContact");
+	my $location = trySNMPget($snmpOidLocation,"sysLocation");
+
+	$prgSystemName = $name;
+	$name =~ s/\0//g if ($name);
+
+	addKeyValue("n","Systemname",$name);
+	addKeyLongValue("n","Description",$descr);
+	addLocationContact("n",$location, $contact);
+} #RFC1213sysinfoToLong
+sub mibTestSNMPget {
+
+	my $oid = shift;
+	my $topic = shift;
+	my $skipRFC1213 = shift;
+
+	print '-> OID \'' . $oid . '\' (REQUIRED) ' if ($main::verbose >= 10);
+	my $response = $main::session->get_request($oid);
+	my $printresponse = '<nothing>';
+	$printresponse = $response->{$oid} if ($response);
+	print '<- response: ' . $printresponse . "\n" if ($main::verbose >= 10);
+	# ATTENTION - THIS SHOULD BE CHANGED
+	if (!$skipRFC1213) {
+		RFC1213sysinfoToLong() unless (defined $response);
+		$longMessage .= "\n" unless (defined $response);
+	}
+	$notifyMessage =~ s/^\s+//m; # remove leading blanks
+	$notifyMessage =~ s/\s+$//m; # remove last blanks
+	finalize(3, $state[3], 
+			"Unable to get SNMP " . $topic . " information for this host",
+			($main::session->error?"\nSNMP::get_request: " . $main::session->error:''),
+			(! $notifyMessage ? '': "\n" . $notifyMessage),
+			($longMessage?"\n" . $longMessage:''),
+	        ) 
+		unless (defined $response);
+	return ($response?$response->{$oid}:undef);
+}
+#------------ other helpers
+  sub addExitCode {
+	my $addCode = shift;
+	if (defined $addCode) {
+		if ($exitCode == 3) {
+			$exitCode = $addCode;
+		} else {
+			$exitCode = $addCode if ($addCode < 3 and $addCode > $exitCode);
+		}
+	}
+  } #addExitCode
+  sub addTmpExitCode {
+	my $addCode = shift;
+	my $tmpCode = shift;
+	if (defined $addCode) {
+		if ($tmpCode == 3) {
+			$tmpCode = $addCode;
+		} else {
+			$tmpCode = $addCode if ($addCode < 3 and $addCode > $tmpCode);
+		}
+	}
+	return $tmpCode;
+  } #addTmpExitCode
+  sub negativeValueCheck {
+		my $val = shift;
+		my $maxval = 0xFFFFFFFF;
+		return undef if (!defined $val);
+		return $val if ($val < 0x7FFFFFFF);
+		return 0 if ($val == 4294967295); # -0
+
+		my $diffval = $maxval - $val;
+		my $newval = "-" . "$diffval";
+		return $newval;
+  } #negativeValueCheck
+sub utf8tohex {
+	my $maxlen = shift;
+	my $string = shift;
+	my $result = "";
+	my $rest = $string;
+	# maxlen is required because length could not be calculated if there are
+	# control bytes inside like \0 or \f
+	for (my $i=0;$i<=$maxlen;$i++) { 
+		if ($rest) {
+			for (my $t=0;$t<=255;$t++) {
+				my $subs  = sprintf("%02X", $t);
+				if ($rest =~ m/^\x$subs/) { # found hex value
+					$result = $result . "$subs";
+					$rest =~ s/^\x$subs//; # cut with care
+					#print ">>>$rest\n";
+					$t = 256; # ... break loop
+				}
+			}
+		} # rest is not empty 
+		else {
+			$i = $maxlen + 1;
+		}
+	} #for
+	return $result;
+}
+#----------- performance data functions
+  sub addKeyUnitToPerfdata {
+	my $name = shift;
+	my $suffix = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $min = shift;
+	my $max = shift;
+
+	return if (!defined $current);
+
+	if (defined $name and $current) {
+		$performanceData .= ' ' . $name . '=' if ($name);
+		$performanceData .= $current;
+		$performanceData .= $suffix;
+		$performanceData .= ';' 
+		    if (defined $warning or defined $critical 
+		    or  defined $min     or  defined $max);
+		$performanceData .= "$warning" if ($warning);
+		$performanceData .= ';' 
+		    if (defined $critical 
+		    or  defined $min     or  defined $max);
+		$performanceData .= "$critical" if ($critical);
+		$performanceData .= ';' 
+		    if (defined $min     or  defined $max);
+		$performanceData .= "$min" if (defined $min);
+		$performanceData .= ';' 
+		    if (defined $max);
+		$performanceData .= "$max" if (defined $max);
+	}
+  } #addKeyUnitToPerfdata
+  sub addTemperatureToPerfdata {
+	my $name = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	#my $min = shift;
+	#my $max = shift;
+
+	if (defined $name and $current) {
+		$name =~ s/[\(\)\.]/_/g;
+		while ($name =~ m/__/) {
+		    $name =~ s/__/_/g;
+		} #while
+		$name =~ s/_+$//;
+		$performanceData .= ' ' . $name . '=' if ($name);
+		$performanceData .= $current;
+		$performanceData .= "\xc2\xb0" if ($useDegree);
+		$performanceData .= 'C';
+		$performanceData .= ';' if ($warning or $critical);
+		$performanceData .= "$warning" if ($warning);
+		$performanceData .= ';' if ($critical);
+		$performanceData .= "$critical" if ($critical);
+	}
+  } #addTemperatureToPerfdata
+  sub addPowerConsumptionToPerfdata {
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $min = shift;
+	my $max = shift;
+
+	$current = 0 if (defined $current and $current == 4294967295); # -0
+	$current = undef if (defined $current and $current == -1);
+
+	if (defined $current) {
+		$current = negativeValueCheck($current);
+		$warning = undef	if (defined $warning and ($warning == 0 or $warning ==-1));
+		$critical = undef	if (defined $critical and ($critical == 0 or $critical ==-1));
+		$min = undef		if (defined $min and ($min == 0 or $min == -1));
+		$max = undef		if (defined $max and ($max == 0 or $max == -1));
+		$warning = negativeValueCheck($warning);
+		$critical = negativeValueCheck($critical);
+		$min = negativeValueCheck($min);
+		$max = negativeValueCheck($max);
+
+		$warning = ''		if (!defined $warning and (defined $critical or defined $min or defined $max));
+		$critical = ''		if (!defined $critical and (defined $min or defined $max));
+		$min = ''		if (!defined $min and defined $max);
+
+		my $unit = "Watt";
+		$unit = "Btu/h" if ($PSConsumptionBTUH);
+
+		$performanceData .= " PowerConsumption=$current" . $unit;
+		$performanceData .= ";$warning" if (defined $warning);
+		$performanceData .= ";$critical" if (defined $critical);
+		$performanceData .= ";$min" if (defined $min);
+		$performanceData .= ";$max" if (defined $max);
+	}
+  } #addPowerConsumptionToPerfdata
+  sub addPercentageToPerfdata {
+	my $name = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+
+	return if (!defined $current and !defined $warning and !defined $critical);
+	$current = 0 if ($current and $current == 4294967295);
+	$warning = 0 if ($warning and $warning == 4294967295);
+	$critical = 0 if ($critical and $critical == 4294967295);
+
+	$performanceData .= ' ' . $name if ($name);
+	$performanceData .= '=' . $current . '%' if (defined $current);
+	$performanceData .= ';' if ($warning or $critical);
+	$performanceData .= "$warning" if ($warning);
+	$performanceData .= ';' if ($critical);
+	$performanceData .= "$critical" if ($critical);
+  } #addPercentageToPerfdata
+  sub addKBsecToPerfdata {
+	my $name = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+
+	$performanceData .= ' ' . $name if ($name);
+	$performanceData .= '=' . $current . 'KB/sec' if (defined $current);
+	$performanceData .= ';' if ($warning or $critical);
+	$performanceData .= "$warning" if ($warning);
+	$performanceData .= ';' if ($critical);
+	$performanceData .= "$critical" if ($critical);
+  } #addKBsecToPerfdata
+  sub addRpmToPerfdata {
+	my $name = shift;
+	my $speed = shift;
+	my $warning = shift;
+	my $critical = shift;
+	$speed = undef if (defined $speed and $speed == -1);
+	return if (!$name or !defined $speed);
+	$performanceData .= ' ' . $name . '=' . $speed . 'rpm' if (defined $speed);
+	$performanceData .= ';' if ($warning or $critical);
+	$performanceData .= "$warning" if ($warning);
+	$performanceData .= ';' if ($critical);
+	$performanceData .= "$critical" if ($critical);
+  } #addRpmToPerfdata
+  sub addPressureToPerfdata {
+	my $name = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	#my $min = shift;
+	#my $max = shift;
+
+	if (defined $name and $current) {
+		$performanceData .= ' ' . $name . '=' if ($name);
+		$performanceData .= $current;
+		$performanceData .= 'bar';
+		$performanceData .= ';' if ($warning or $critical);
+		$performanceData .= "$warning" if ($warning);
+		$performanceData .= ';' if ($critical);
+		$performanceData .= "$critical" if ($critical);
+	}
+  } #addPressureToPerfdata
+#----------- synchronize verbose output format functions
+sub addMessage {
+	my $container = shift;
+	my $string = "@_";
+	$string =~ s/\x00(.)/$1/g;
+	if ($string) {
+		$msg .= $string				if ($container =~ m/.*m.*/);
+		$notifyMessage .= $string		if ($container =~ m/.*n.*/);
+		$longMessage .= $string			if ($container =~ m/.*l.*/);
+		$variableVerboseMessage .= $string	if ($container =~ m/.*v.*/);
+	}
+}
+sub addTopicInLine {
+	my $container = shift;
+	my $topic = shift;
+	my $tmp = '';
+	return if (!$topic);
+	$tmp .= " - $topic:";
+	addMessage($container, $tmp);
+}
+sub addComponentStatus {
+	my $container = shift;
+	my $comp = shift;
+	my $status = shift;
+	my $tmp = '';
+	$tmp .= " $comp($status)" if ($comp and defined $status);
+	addMessage($container, $tmp);
+}
+sub addTopicStatusCount {
+	my $container = shift;
+	my $topic = shift;
+	my $tmp = '';
+	return if (!$topic);
+	$tmp .= " $topic";
+	addMessage($container, $tmp);
+}
+sub addStatusCount {
+	my $container = shift;
+	my $status = shift;
+	my $count = shift;
+	my $tmp = '';
+	return if (!$status or !$count);
+	$tmp .= "-$status($count)";
+	addMessage($container, $tmp);
+}
+sub addStatusTopic {
+	my $container = shift;
+	my $status = shift;
+	my $topic = shift;
+	my $index = shift;
+	my $tmp = '';
+	$tmp .= "$status:" if (defined $status);
+	$tmp .= " " if (defined $status and ($topic or $index));
+	$tmp .= "$topic" if ($topic);
+	$tmp .= "[$index]" if (defined $index);
+	$tmp .= " -" if (!defined $status and ($topic or $index));
+	addMessage($container,$tmp);
+}
+sub addTableHeader {
+	my $container = shift;
+	my $header = shift;
+	my $tmp = '';
+	$tmp .= "* $header:\n" if ($header);
+	addMessage($container,$tmp);
+}
+sub addKeyValue {
+	my $container = shift;
+	my $key = shift;
+	my $value = shift;
+	my $tmp = '';
+	$tmp .= " $key=$value" if ($value);
+	addMessage($container, $tmp);
+}
+sub addKeyLongValue {
+	my $container = shift;
+	my $key = shift;
+	my $value = shift;
+	my $tmp = '';
+	$tmp .= " $key=\"$value\"" if ($value);
+	addMessage($container, $tmp);
+}
+sub addKeyIntValue {
+	my $container = shift;
+	my $key = shift;
+	my $value = shift;
+	my $tmp = '';
+	$tmp .= " $key=$value" if (defined $value);
+	addMessage($container, $tmp);
+}
+sub addKeyUnsignedIntValue {
+	my $container = shift;
+	my $key = shift;
+	my $value = shift;
+	my $tmp = '';
+	$tmp .= " $key=..undef.." if (!defined $value and $main::verbose > 9);
+	$value = undef if (defined $value and $value < 0);
+	$tmp .= " $key=$value" if (defined $value);
+	addMessage($container, $tmp);
+}
+sub addKeyValueUnit {
+	my $container = shift;
+	my $key = shift;
+	my $value = shift;
+	my $addon = shift;
+	my $tmp = '';
+	if ($value) {
+		$tmp .= " $key=$value";
+		$tmp .= "$addon";
+		addMessage($container, $tmp);
+	}
+}
+sub addKeyIntValueUnit {
+	my $container = shift;
+	my $key = shift;
+	my $value = shift;
+	my $addon = shift;
+	my $tmp = '';
+	if (defined $value) {
+		$tmp .= " $key=$value";
+		$tmp .= "$addon";
+		addMessage($container, $tmp);
+	}
+}
+#
+sub addKeyPercent {
+	my $container = shift;
+	my $key = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $min = shift;
+	my $max = shift;
+	my $tmp = '';
+	$current = 0 if ($current and $current == 4294967295);
+	$warning = 0 if ($warning and $warning == 4294967295);
+	$critical = 0 if ($critical and $critical == 4294967295);
+	$min = 0 if ($min and $min == 4294967295);
+	$max = 0 if ($max and $max == 4294967295);
+	$tmp .= " $key=$current" . "%" if (defined $current and $current != -1);
+	$tmp .= " Warning=$warning" . "%" if (defined $warning and $warning != -1);
+	$tmp .= " Critical=$critical" . "%" if (defined $critical and $critical != -1);
+	$tmp .= " Min=$min" . "%" if (defined $min and $min != -1);
+	$tmp .= " Max=$max" . "%" if (defined $max and $max != -1);
+	addMessage($container, $tmp);
+}
+sub addKeyMB {
+	my $container = shift;
+	my $key = shift;
+	my $mbytes = shift;
+	my $tmp = '';
+	$mbytes = undef if (defined $mbytes and $mbytes < 0);
+	$tmp .= " $key=$mbytes" . "MB" if (defined $mbytes);
+	addMessage($container, $tmp);
+}
+#
+sub addSerialIDs {
+	my $container = shift;
+	my $id = shift;
+	my $id2 = shift;
+	my $tmp = '';
+	if ((defined $id) && ($id =~ m/00000000000/)) {
+		$id = undef;
+	}
+	if ((defined $id) && ($id =~ m/0xffffffff/)) {
+		$id = undef;
+	}
+	$tmp .= " ID=$id" if ($id or $container =~ m/.*m.*/);
+	$tmp .= " ID2=$id2" if ($id2);
+	addMessage($container, $tmp);
+}
+sub addLocationContact {
+	my $container = shift;
+	my $location = shift;
+	my $contact = shift;
+	my $tmp = '';
+	$location = undef if(defined $location and $location eq '');
+	$contact = undef if(defined $contact and $contact eq '');
+	$tmp .= " Location=\"$location\"" if ($location);
+	$tmp .= " Contact=\"$contact\"" if ($contact);
+	addMessage($container, $tmp);
+}
+sub addAdminURL {
+	my $container = shift;
+	my $admURL = shift;
+	my $tmp = '';
+	$admURL = undef if ($admURL and ($admURL !~ m/http/));
+	$admURL = undef if ($admURL and ($admURL =~ m/0\.0\.0\.0/));
+	$admURL = undef if ($admURL and ($admURL =~ m/255\.255\.255\.255/));
+	$admURL = undef if ($admURL and ($admURL =~ m/\/\/127\./));
+	$tmp .= " AdminURL=$admURL" if ($admURL);
+	addMessage($container, $tmp);
+}
+sub addIP {
+	my $container = shift;
+	my $ip = shift;
+	my $tmp = '';
+	$ip = undef if (($ip) and ($ip =~ m/0\.0\.0\.0/));
+
+	$tmp .= " IP=$ip" if ($ip);
+	addMessage($container, $tmp);
+}
+sub addProductModel {
+	my $container = shift;
+	my $product = shift;
+	my $model = shift;
+	my $tmp = '';
+	if ((defined $product) 
+	&& ($product =~ m/0xffffffff/)
+	) {
+		$product = undef;
+	}
+	if ($container =~ m/.*n.*/ and defined $product and $skipInternalNamesForNotifies
+	and ($product =~ m/^D\d{4}$/)
+	) {
+		$product = undef;
+	}
+	if ((defined $model) 
+	&& ($model =~ m/0xfffffff/)) {
+		$model = undef;
+	}
+	if ($container =~ m/.*n.*/ and defined $model and $skipInternalNamesForNotifies
+	and ($model =~ m/A3C\d{8}/)) {
+		$model = undef;
+	}
+	$tmp .= " Product=\"$product\"" if ($product);
+	$tmp .= " Model=\"$model\"" if ($model);
+	addMessage($container, $tmp);
+}
+sub addName {
+	my $container = shift;
+	my $name = shift;
+	my $tmp = '';
+	$name = undef if (defined $name and $name eq '');
+	$name = "\"$name\"" if ($name and $name =~ m/.* .*/);
+	$tmp .= " Name=$name" if ($name);
+	addMessage($container,$tmp);
+}
+sub addHostName {
+	my $container = shift;
+	my $hostname = shift;
+	my $tmp = '';
+	$tmp .= " Hostname=$hostname" if ($hostname);
+	addMessage($container,$tmp);
+}
+our $internBeautifyMAC = 1;
+  sub addMAC { #1.20
+	my $container = shift;
+	my $mac = shift;
+	my $tmp = '';
+	$mac = undef if (!$mac);
+	if (defined $mac and $mac and $mac =~ m/[^\w:]/) {
+		my $newMac = utf8tohex(6,$mac);
+		$mac = $newMac if ($newMac);
+	}
+	if ($internBeautifyMAC and defined $mac and $mac and $mac !~ m/[:]/) {
+		$mac =~ tr/a-f/A-F/ if ($mac =~ m/^0x/); # ... all to UPPER case
+		$mac =~ s/0x//;		# ... remove prefix 0x
+		$mac =~ s/(..)/$1:/g;	# ... add : inside
+		$mac =~ s/:$//;		# ... remove last :
+	}
+	$tmp .= " MAC=$mac" if ($mac);
+	addMessage($container,$tmp);
+  }
+  sub addSlotID {
+	my $container = shift;
+	my $slot = shift;
+	my $tmp = '';
+	$tmp .= " Slot=$slot" if (defined $slot);
+	addMessage($container,$tmp);
+  }
+  sub addCelsius {
+	my $container = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $tmp = '';
+	my $suf = undef;
+	$suf .= "\xc2\xb0" if ($useDegree);
+	$suf .= "C";
+	if ($current) {
+		$tmp .= " Temperature=$current" . $suf;
+		$tmp .= " Warning=$warning" . $suf if (defined $warning and $warning !~ m/:/);
+		$tmp .= " Critical=$critical" . $suf if (defined $critical and $critical !~ m/:/);
+		$tmp .= " WarningRange=$warning" . $suf if (defined $warning and $warning =~ m/:/);
+		$tmp .= " CriticalRange=$critical" . $suf if (defined $critical and $critical =~ m/:/);
+	}
+	addMessage($container,$tmp);
+  }
+  sub addPressure {
+	my $container = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $tmp = '';
+	my $suf = undef;
+	$suf .= "bar";
+	if ($current) {
+		$tmp .= " Pressure=$current" . $suf;
+		$tmp .= " Warning=$warning" . $suf if (defined $warning and $warning !~ m/:/);
+		$tmp .= " Critical=$critical" . $suf if (defined $critical and $critical !~ m/:/);
+		$tmp .= " WarningRange=$warning" . $suf if (defined $warning and $warning =~ m/:/);
+		$tmp .= " CriticalRange=$critical" . $suf if (defined $critical and $critical =~ m/:/);
+	}
+	addMessage($container,$tmp);
+  }
+  sub addFlow {
+	my $container = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $tmp = '';
+	my $suf = undef;
+	$suf .= "l/h";
+	if ($current) {
+		$tmp .= " Flow=$current" . $suf;
+		$tmp .= " Warning=$warning" . $suf if (defined $warning and $warning !~ m/:/);
+		$tmp .= " Critical=$critical" . $suf if (defined $critical and $critical !~ m/:/);
+		$tmp .= " WarningRange=$warning" . $suf if (defined $warning and $warning =~ m/:/);
+		$tmp .= " CriticalRange=$critical" . $suf if (defined $critical and $critical =~ m/:/);
+	}
+	addMessage($container,$tmp);
+  }
+  sub addmVolt {
+	my $container = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $min = shift;
+	my $max = shift;
+	my $tmp = '';
+	$current = negativeValueCheck($current);
+	$warning = negativeValueCheck($warning);
+	$critical = negativeValueCheck($critical);
+	$min = negativeValueCheck($min);
+	$max = negativeValueCheck($max);
+	$tmp .= " Current=$current" . "mV" if (defined $current and $current != -1);
+	$tmp .= " Warning=$warning" . "mV" if (defined $warning and $warning != -1);
+	$tmp .= " Critical=$critical" . "mV" if (defined $critical and $critical != -1);
+	$tmp .= " Min=$min" . "mV" if (defined $min and $min != -1);
+	$tmp .= " Max=$max" . "mV" if (defined $max and $max != -1);
+	addMessage($container,$tmp);
+  }
+sub addKeyRpm {
+	my $container = shift;
+	my $key = shift;
+	my $speed = shift;
+	my $tmp = '';
+	$speed = undef if (defined $speed and $speed == -1);
+	$tmp .= " $key=$speed" . "rpm" if ($speed);
+	addMessage($container,$tmp);
+}
+sub addKeyMHz {
+	my $container = shift;
+	my $key = shift;
+	my $speed = shift;
+	my $tmp = '';
+	$speed = undef if (defined $speed and $speed == -1);
+	$tmp .= " $key=$speed" . "MHz" if ($speed);
+	addMessage($container,$tmp);
+}
+sub addKeyGB {
+	my $container = shift;
+	my $key = shift;
+	my $gbytes = shift;
+	my $tmp = '';
+	$gbytes = undef if (defined $gbytes and $gbytes < 0);
+	$tmp .= " $key=$gbytes" . "GB" if (defined $gbytes);
+	addMessage($container,$tmp);
+}
+sub addKeyWatt {
+	my $container = shift;
+	my $key = shift;
+	my $current = shift;
+	my $warning = shift;
+	my $critical = shift;
+	my $min = shift;
+	my $max = shift;
+	my $tmp = '';
+	my $unit = "Watt";
+	$unit = "Btu/h" if ($PSConsumptionBTUH);
+	$tmp .= " $key=$current" . $unit if ($current and $current != -1);
+	$tmp .= " Warning=$warning" . $unit if ($warning and $warning != -1);
+	$tmp .= " Critical=$critical" . $unit if ($critical and $critical != -1);
+	$tmp .= " Min=$min" . $unit if ($min and $min != -1);
+	$tmp .= " Max=$max" . $unit if ($max and $max != -1);
+	addMessage($container,$tmp);
+}
+####
+sub endVariableVerboseMessageLine {
+	$variableVerboseMessage .= "\n";
+}
+sub endLongMessageLine {
+	$longMessage .= "\n";
+}
+#################################################################################
+# OPTIONS
+  sub readDataFile {
+	my( $fileName ) = shift;
+
+	if (! $fileName) {
+		$exitCode = 10;	
+		print "readDataFile: no filename \n" if ($main::verbose >= 60);
+		return undef;
+	}
+
+	print "readDataFile [$fileName] \n" if ($main::verbose >= 60);
+
+	if (! -r $fileName) {
+		$exitCode = 11;
+		print "readDataFile: [$fileName] not found \n" if ($main::verbose >= 60);
+		return undef;
+	}
+	
+	my $fileText = undef;
+	open (my $infile, "<", $fileName);
+	if (!$infile) {
+	    $exitCode = 12;
+	    return undef;
+	} else {
+	    $fileText = join('', <$infile> );
+	    close $infile;
+	    print "readDataFile: fileText [$fileText]\n" if ($main::verbose >= 60);
+	}
+
+	return ( $fileText );
+  } #readDataFile
+
+  sub getScriptOpts {	# script specific
+
+	my $stringInput = shift;
+	my $inputType = shift;
+
+	my %options = ();
+
+	print "getScriptOpts: stringInput = $stringInput\n" if ($stringInput && $main::verbose >= 60);
+	print "getScriptOpts: inputType = $inputType\n" if ($inputType && $main::verbose >= 60);
+
+	if (! $stringInput) {
+    		GetOptions(\%options, 
+			"H|host=s",	
+			"C|community=s",	
+		       	"P|p|port=i",	
+		       	"T|transport=s",
+		        "A|admin=s", 
+			"snmp=i",
+		       	"t|timeout=i",	
+		       	"v|verbose=i",
+			"vtab=i",
+		       	"V|version",	
+			"h|help",	
+			"w|warning=i",
+			"c|critical=i",
+		    
+			"chkuptime"		,
+			"systeminfo"		,
+			"agentinfo"		,
+			"pq"			,
+			"primequest"		,
+			"rack"			,
+			"blade"			,
+			"bladeinside"		,
+			"bladesrv"		,
+			"bladeio"		,
+			"bladeio-switch"	,
+			"bladeio-fcpt"		,
+			"bladeio-phy"		,
+			"bladeio-fcswitch"	,
+			"bladeio-ibswitch"	,
+			"bladeio-sasswitch"	,
+			"bladeio-fsiom"		,
+			"bladekvm"		,
+			"bladestore"		,
+			"chksystem"		,
+			"chkenv"		,
+			"chkenv-fan|chkfan|chkcooling"	,
+			"chkenv-temp|chktemp"	,
+			"chkpower"		,
+			"chkhardware|chkboard"	,
+			"chkcpu"		,
+			"chkvoltage"		,
+			"chkmemmodule"		,
+			"chkdrvmonitor"		,
+			"chkupdate"		,
+			"chkstorage"		,
+			"chkcpuload"		,
+			"chkmemperf"		,
+			"chkfsperf"		,
+			"chknetperf"		,
+			"chkfanperf"		,
+			"degree!",
+
+			"difflist",
+			"instlist",
+			  "O|outputdir=s",
+
+	   		"u|user=s"		,
+	   		"authkey=s"		,
+	   		"authpassword=s"	,
+	   		"authprot=s"		,
+	   		"privkey=s"		,
+	   		"privpassword=s"	,
+	   		"privprot=s"		,	   		
+	   		"ctxengine=s"		,
+	   		"ctxname=s"		,
+			"I|inputfile=s", 
+			"inputdir=s",
+		) or pod2usage({
+			-msg     => "\n" . 'Invalid argument!' . "\n",
+			-verbose => 1,
+			-exitval => 3
+		});
+	}
+	else {
+	     if ($inputType && $inputType == 1) {	#inputFile
+		    # same options as above, but without '-I'
+
+		    # @ARGV = split(/\s/,$stringInput);
+		    require Text::ParseWords;
+		    my $argsRef = [ Text::ParseWords::shellwords($stringInput)];
+		    @ARGV = @{$argsRef};
+
+		    #GetOptionsFromString($stringInput, \%options, 
+		    GetOptions(\%options, 
+			"H|host=s",	
+			"C|community=s",	
+		       	"P|p|port=i",	
+		       	"T|transport=s",
+		        "A|admin=s", 
+			"snmp=i",
+		       	"t|timeout=i",	
+		       	"v|verbose=i",
+		       	"V|version",	
+			"h|help",	
+			"w|warning=i",
+			"c|critical=i",
+		    
+			"chkuptime"		,
+			"systeminfo"		,
+			"agentinfo"		,
+			"pq"			,
+			"primequest"		,
+			"rack"			,
+			"blade"			,
+			"bladeinside"		,
+			"bladesrv"		,
+			"bladeio"		,
+			"bladeio-switch"	,
+			"bladeio-fcpt"		,
+			"bladeio-phy"		,
+			"bladeio-fcswitch"	,
+			"bladeio-ibswitch"	,
+			"bladeio-sasswitch"	,
+			"bladeio-fsiom"		,
+			"bladekvm"		,
+			"bladestore"		,
+			"chksystem"		,
+			"chkenv"		,
+			"chkenv-fan|chkfan|chkcooling"	,
+			"chkenv-temp|chktemp"	,
+			"chkpower"		,
+			"chkhardware|chkboard"	,
+			"chkcpu"		,
+			"chkvoltage"		,
+			"chkmemmodule"		,
+			"chkdrvmonitor"		,
+			"chkupdate"		,
+			"chkstorage"		,
+			"chkcpuload"		,
+			"chkmemperf"		,
+			"chkfsperf"		,
+			"chknetperf"		,
+			"chkfanperf"		,
+			"degree!",
+
+			"difflist",
+			"instlist",
+			  "O|outputdir=s",
+
+	   		"u|user=s"		,
+	   		"authkey=s"		,
+	   		"authpassword=s"	,
+	   		"authprot=s"		,
+	   		"privkey=s"		,
+	   		"privpassword=s"	,
+	   		"privprot=s"		,
+	   		"ctxengine=s"		,
+	   		"ctxname=s"		,
+		    ) or pod2usage({
+			    -msg     => "\n" . 'Invalid argument!' . "\n",
+			    -verbose => 1,
+			    -exitval => 3
+		    });
+	     }
+	}
+
+    	return ( %options );
+  } #getScriptOpts
+
+  sub getOptionsFromFile {
+
+	my $filename = shift;
+	my $inputType = shift;
+	my %options = ();
+
+
+    	my $infileString = readDataFile( $filename);
+	if (defined $infileString) {
+		%options = getScriptOpts($infileString, $inputType);
+	}
+	else {
+		print "+++getOptionsFromFile: no data read from [$filename]" if ($main::verbose >= 60);
+	}
+
+    	return ( %options );
+  } #getOptionsFromFile
+
+  sub readOptions {
+	my %mainOptions;	# command line optiond
+	my %ifileOptions;	# -I inputfile options (command line)
+
+	#
+	# command line options first
+	#
+	%mainOptions = getScriptOpts();
+
+	my $ibasename = $mainOptions{"I"};
+	my $idirname = $mainOptions{"inputdir"};
+	
+	if ($ibasename) {
+		my $chkFileName = "";
+		$chkFileName .= $idirname . "/" if ($idirname 
+		    and $ibasename and $ibasename !~ m/^\//);
+		$chkFileName .= $ibasename;
+		#$optInputFile = $chkFileName;
+		%ifileOptions = getOptionsFromFile($chkFileName, 1);
+		if ($exitCode == 10 or $exitCode == 11 or $exitCode == 12 and $chkFileName) {
+			pod2usage(
+				-msg		=> "\n" . "-I $chkFileName: filename empty !" . "\n",
+				-verbose	=> 0,
+				-exitval	=> 3
+			) if ($exitCode == 10);
+			pod2usage(
+				-msg		=> "\n" . "-I $chkFileName: file not existing or readable !" . "\n",
+				-verbose	=> 0,
+				-exitval	=> 3
+			) if ($exitCode == 11);
+			pod2usage(
+				-msg		=> "\n" . "-I $chkFileName: error reading file !" . "\n",
+				-verbose	=> 0,
+				-exitval	=> 3
+			) if ($exitCode == 12);
+		}
+	} # ibasename
+	
+	#
+	# store all read options in %mainOptions
+	# options from -I inputFile overwrite command line options and
+	# options from -E encFile overwrite both, command line and input file
+	# 
+	print "\n+++mainOptions before merge with file contents\n" if ($main::verbose >= 60);
+	foreach my $key_m (sort keys %mainOptions) {
+		print " $key_m = $mainOptions{$key_m}\n" if ($main::verbose >= 60);
+	}
+	print "+++\n" if ($main::verbose >= 60);
+
+	foreach my $key_i (sort keys %ifileOptions) {
+		print "inputfile: $key_i = $ifileOptions{$key_i}\n" if ($main::verbose >= 60);
+		$mainOptions{$key_i} = $ifileOptions{$key_i};
+	}
+
+	print "\n+++mainOptions at the end\n" if ($main::verbose >= 60);
+	foreach my $key_m (sort keys %mainOptions) {
+		print " $key_m = $mainOptions{$key_m}\n" if ($main::verbose >= 60);
+	}
+	print "+++\n" if ($main::verbose >= 60);
+
+	return ( %mainOptions);
+  } #readOptions
+
+  sub setOptions { # script specific
+	my $refOptions = shift;
+	my %options =%$refOptions;
+	#
+	# assign to global variables
+	# for options like 'x|xample' the hash key is always 'x'
+	#
+	my $k=undef;
+	$k="A";		$optAdminHost		= $options{$k} if (defined $options{$k});
+	$k="agentinfo";	$optAgentInfo		= $options{$k} if (defined $options{$k});
+	$k="ctxengine";	$optCtxEngine		= $options{$k} if (defined $options{$k});
+	$k="ctxname";	$optCtxName		= $options{$k} if (defined $options{$k});
+	$k="degree";	$optUseDegree		= $options{$k} if (defined $options{$k});
+	$k="difflist";	$optChkUpdDiffList	= $options{$k} if (defined $options{$k});
+	$k="instlist";	$optChkUpdInstList	= $options{$k} if (defined $options{$k});
+	$k="rack";	$optRackCDU		= $options{$k} if (defined $options{$k});
+	$k="snmp";	$optSNMP		= $options{$k} if (defined $options{$k});
+	$k="O";		$optOutdir		= $options{$k} if (defined $options{$k});
+	$k="vtab";	$main::verboseTable = $options{$k}	if (defined $options{$k});
+	    # ... the loop below is not realy necessary ...
+	foreach my $key (sort keys %options) {
+		#print "options: $key = $options{$key}\n";
+
+	        $optShowVersion = $options{$key}              	if ($key eq "V"			); 
+		$optHelp = $options{$key}	               	if ($key eq "h"			);
+		$optHost = $options{$key}                     	if ($key eq "H"			);
+		$optPort = $options{$key}                     	if ($key eq "P"		 	);
+		$optTransportType = $options{$key}            	if ($key eq "T"			);
+		$optCommunity = $options{$key}                  if ($key eq "C"		 	);
+		$optTimeout = $options{$key}                  	if ($key eq "t"			);
+		$main::verbose = $options{$key}               	if ($key eq "v"			); 
+		#$optInputFile = $options{$key}                	if ($key eq "I"			);
+		$optWarningLimit = $options{$key}               if ($key eq "w"			);
+		$optCriticalLimit = $options{$key}              if ($key eq "c"			);
+
+		$optChkUpTime = $options{$key}			if ($key eq "chkuptime"		);
+		$optSystemInfo = $options{$key}			if ($key eq "systeminfo"	);
+		$optPrimeQuest = $options{$key}			if ($key eq "pq"		);
+		$optPrimeQuest = $options{$key}			if ($key eq "primequest"	);
+		$optBlade = $options{$key}			if ($key eq "blade"		);
+		$optBladeContent = $options{$key}		if ($key eq "bladeinside"	);
+		$optBladeSrv = $options{$key}			if ($key eq "bladesrv"		);
+		$optBladeIO = $options{$key}			if ($key eq "bladeio"		);
+		$optBladeIO_Switch = $options{$key}		if ($key eq "bladeio-switch"	);
+		$optBladeIO_FCPT = $options{$key}		if ($key eq "bladeio-fcpt"	);
+		$optBladeIO_Phy = $options{$key}		if ($key eq "bladeio-phy"	);
+		$optBladeIO_FCSwitch = $options{$key}		if ($key eq "bladeio-fcswitch"	);
+		$optBladeIO_IBSwitch = $options{$key}		if ($key eq "bladeio-ibswitch"	);
+		$optBladeIO_SASSwitch = $options{$key}		if ($key eq "bladeio-sasswitch"	);
+		$optBladeIO_FSIOM = $options{$key}		if ($key eq "bladeio-fsiom"	);
+		$optBladeKVM = $options{$key}			if ($key eq "bladekvm"		);
+		$optBladeStore = $options{$key}			if ($key eq "bladestore"	);
+
+		$optChkSystem = $options{$key}			if ($key eq "chksystem"		);
+		$optChkEnvironment = $options{$key}		if ($key eq "chkenv"		);
+		$optChkEnv_Fan = $options{$key}			if ($key eq "chkenv-fan"	);
+		$optChkEnv_Temp = $options{$key}		if ($key eq "chkenv-temp"	);
+		$optChkPower = $options{$key}			if ($key eq "chkpower"		);
+		$optChkHardware = $options{$key}		if ($key eq "chkhardware"	);
+		$optChkCPU = $options{$key}			if ($key eq "chkcpu"		);
+		$optChkVoltage = $options{$key}			if ($key eq "chkvoltage"	);
+		$optChkMemMod = $options{$key}			if ($key eq "chkmemmodule"	);
+		$optChkDrvMonitor = $options{$key}		if ($key eq "chkdrvmonitor"	);
+		$optChkUpdate = $options{$key}			if ($key eq "chkupdate"		);
+		$optChkStorage = $options{$key}			if ($key eq "chkstorage"	);
+		$optChkCpuLoadPerformance = $options{$key}	if ($key eq "chkcpuload"	);
+		$optChkMemoryPerformance = $options{$key}	if ($key eq "chkmemperf"	);
+		$optChkFileSystemPerformance = $options{$key}	if ($key eq "chkfsperf"		);
+		$optChkNetworkPerformance = $options{$key}	if ($key eq "chknetperf"	);
+		$optChkFanPerformance = $options{$key}		if ($key eq "chkfanperf"	);
+	   	
+		$optUserName = $options{$key}                 	if ($key eq "u"		 	);
+		$optAuthKey = $options{$key}             	if ($key eq "authkey"	 	);
+		$optAuthPassword = $options{$key}             	if ($key eq "authpassword" 	);
+		$optAuthProt = $options{$key}             	if ($key eq "authprot"	 	);
+		$optPrivKey = $options{$key}             	if ($key eq "privkey"	 	);
+		$optPrivPassword = $options{$key}             	if ($key eq "privpassword" 	);
+		$optPrivProt = $options{$key}             	if ($key eq "privprot"	 	);
+		
+	}
+  } #setOptions
+
+  sub evaluateOptions { # script specific
+
+	# check command-line parameters
+	pod2usage({
+		-verbose => 2,
+		-exitval => 0,
+	}) if ((defined $optHelp) || !$argvCnt);
+
+	pod2usage({
+		-msg		=> "\n$0" . ' - version: ' . $version . "\n",
+		-verbose	=> 0,
+		-exitval	=> 0,
+	}) if (defined $optShowVersion);
+
+	pod2usage({
+		-msg		=> "\n" . 'Missing host address !' . "\n",
+		-verbose	=> 0,
+		-exitval	=> 3
+	}) if ((!$optHost or $optHost eq '') and (!$optAdminHost or $optAdminHost eq ''));
+	
+	if ($optHost =~ m/.*:.*:.*/ and !$optTransportType) {
+		$optTransportType = "udp6";
+	}
+
+	if (!defined $optUserName and !defined $optCommunity) {
+		$optCommunity = 'public'; # same default as other snmp nagios plugins
+	}
+	# 
+	if (!defined $optChkUpdate and ($optChkUpdDiffList or $optChkUpdInstList)) {
+		$optChkUpdate = 999;
+	}
+	# first checks of sub blade options
+	if (  (defined $optBladeIO_Switch)   || (defined $optBladeIO_FCPT)     || (defined $optBladeIO_Phy) 
+	   || (defined $optBladeIO_FCSwitch) || (defined $optBladeIO_IBSwitch) || (defined $optBladeIO_SASSwitch)
+	   || (defined $optBladeIO_FSIOM)
+	   ) 
+	{
+		$optBladeIO = 999;
+	}
+	if ((defined $optBladeSrv) || (defined $optBladeIO) || (defined $optBladeKVM) || (defined $optBladeStore)) {
+		$optBladeContent = 999 if (!defined $optBladeContent);
+	}
+	if (defined $optBladeContent and $optBladeContent != 999) { # all blades inside
+		$optBladeSrv = 999 if (!defined $optBladeSrv);
+		$optBladeIO = 888 if (!defined $optBladeIO); # ! not 999 !
+		$optBladeKVM = 999 if (!defined $optBladeKVM);
+		$optBladeStore = 999 if (!defined $optBladeStore);
+	}
+	# wrong combination tests
+	my $wrongCombination = undef;
+	if (defined $optPrimeQuest) {
+		$wrongCombination = "--pq --chkcpuload" if (defined $optChkCpuLoadPerformance);
+		$wrongCombination = "--pq --chkmemperf" if (defined $optChkMemoryPerformance
+		    and $main::verbose < 4);
+		$wrongCombination = "--pq --chkfsperf" if (defined $optChkFileSystemPerformance);
+		$wrongCombination = "--pq --chknetperf" if (defined $optChkNetworkPerformance);
+		$wrongCombination = "--pq --bladesrv" if (defined $optBladeSrv);
+		$wrongCombination = "--pq --bladeio" if (defined $optBladeIO);
+		$wrongCombination = "--pq --bladekvm" if (defined $optBladeKVM);
+		$wrongCombination = "--pq --bladestore" if (defined $optBladeStore);
+		$wrongCombination = "--pq --bladeinside" 
+			if (defined $optBladeContent and $optBladeContent != 999);
+		$wrongCombination = "--pq --chkstorage" if (defined $optChkStorage);
+		$wrongCombination = "--pq --chkdrvmonitor" if (defined $optChkDrvMonitor);
+		$wrongCombination = "--pq --chkupdate" if (defined $optChkUpdate);
+	} # primequest
+	if (defined $optRackCDU) {
+		$wrongCombination = "--rack --chkcpuload" if (defined $optChkCpuLoadPerformance);
+		$wrongCombination = "--rack --chkmemperf" if (defined $optChkMemoryPerformance
+		    and $main::verbose < 4);
+		$wrongCombination = "--rack --chkfsperf" if (defined $optChkFileSystemPerformance);
+		$wrongCombination = "--rack --chknetperf" if (defined $optChkNetworkPerformance);
+		$wrongCombination = "--rack --bladesrv" if (defined $optBladeSrv);
+		$wrongCombination = "--rack --bladeio" if (defined $optBladeIO);
+		$wrongCombination = "--rack --bladekvm" if (defined $optBladeKVM);
+		$wrongCombination = "--rack --bladestore" if (defined $optBladeStore);
+		$wrongCombination = "--rack --bladeinside" 
+			if (defined $optBladeContent and $optBladeContent != 999);
+		$wrongCombination = "--rack --chkstorage" if (defined $optChkStorage);
+		$wrongCombination = "--rack --chkdrvmonitor" if (defined $optChkDrvMonitor);
+		$wrongCombination = "--rack --chkupdate" if (defined $optChkUpdate);
+	} # rackCDU
+	if (defined $optBlade) {
+		$wrongCombination = "--blade --chkcpuload" if (defined $optChkCpuLoadPerformance);
+		$wrongCombination = "--blade --chkmemperf" if (defined $optChkMemoryPerformance);
+		$wrongCombination = "--blade --chkfsperf" if (defined $optChkFileSystemPerformance);
+		$wrongCombination = "--blade --chknetperf" if (defined $optChkNetworkPerformance);
+		$wrongCombination = "--blade --chkstorage" if (defined $optChkStorage);
+		$wrongCombination = "--blade --chkdrvmonitor" if (defined $optChkDrvMonitor);
+		$wrongCombination = "--blade --chkupdate" if (defined $optChkUpdate);
+	}
+	if (defined $optSNMP) {
+		$wrongCombination = "--snmp 3 ... and no SNMPv3 credentials (set user name)" 
+			if ($optSNMP and $optSNMP == 3 and !$optUserName);
+	}
+	pod2usage({
+		-msg     => "\n" . "Invalid argument combination \"$wrongCombination\"!" . "\n",
+		-verbose => 0,
+		-exitval => 3
+	}) if ($wrongCombination);
+	# after readin of options set defaults
+	if ((!defined $optChkSystem) 
+	and (!defined $optChkEnvironment) and (!defined $optChkPower)
+	and (!defined $optChkHardware) and (!defined $optChkStorage) 
+	and (!defined $optChkDrvMonitor)
+	and (!defined $optChkCpuLoadPerformance) and (!defined $optChkMemoryPerformance)
+	and (!defined $optChkEnv_Fan) and (!defined $optChkEnv_Temp) 
+	and (!defined $optChkCPU) and (!defined $optChkVoltage) and (!defined $optChkMemMod)
+	and (!defined $optChkUpdate)
+	) {
+		$optChkSystem = 999;
+		$optChkEnvironment = 999;
+		$optChkPower = 999;
+		$optChkHardware = 999 if ($optPrimeQuest);
+		# exotic values if somebody needs to see if an optchk was explizit set via argv or if this 
+		# is default
+		$setOverallStatus = 1;
+	}
+	if ((defined $optChkSystem) 
+	and (!defined $optChkEnvironment) and (!defined $optChkPower)
+	and (!defined $optChkHardware) and (!defined $optChkStorage) 
+	and (!defined $optChkDrvMonitor)
+	and (!defined $optChkCpuLoadPerformance) and (!defined $optChkMemoryPerformance)
+	and (!defined $optChkEnv_Fan) and (!defined $optChkEnv_Temp) 
+	and (!defined $optChkCPU) and (!defined $optChkVoltage) and (!defined $optChkMemMod)
+	and (!defined $optChkUpdate)
+	) {
+		$setOnlySystem = 1;
+	}
+	if ($optChkSystem) {
+		$optChkStorage = 999;
+	}
+	if ($main::verbose > 100) {
+		$main::verboseTable = $main::verbose;
+		$main::verbose = 0;
+	}
+	$useDegree = 1 if (defined $optUseDegree and $optUseDegree);
+  } #evaluateOptions
+
+  sub handleOptions {
+	# read all options and return prioritized
+	my %options = readOptions();
+
+	# assign to global variables
+	setOptions(\%options);
+
+	# evaluateOptions expects options set in global variables
+	evaluateOptions();
+  } #handleOptions
+###############################################################################
+# DIRECTORIES
+  sub checkDirectory {
+        my $dir = shift;
+	my $modesDir = 0;
+	$modesDir++ if ( -r $dir );
+	$modesDir++ if ( -w $dir );
+	$modesDir++ if ( -x $dir );
+	$modesDir++ if ( -d $dir );
+	if ($main::verbose >= 60) {
+	    print ">>> Check directory $dir [";
+	    print "r" if ( -r $dir );
+	    print "w" if ( -w $dir );
+	    print "x" if ( -x $dir );
+	    print "d" if ( -d $dir );
+	    print "] <<<\n";
+	}
+	return $modesDir;
+  } #checkDirectory
+
+  sub handleOutputDirectory {
+	return if (!$optOutdir);
+	my $modesOutDir = checkDirectory($optOutdir);
+	if (!$modesOutDir) {
+	    if (! mkdir $optOutdir, 0700) {
+	    addMessage("m", 
+		"ERROR - Can't create output directory $optOutdir");
+	    $exitCode = 2;
+	    return;
+	    }
+	} elsif ($modesOutDir < 4) {
+	    addMessage("m", 
+		"ERROR - output directory $optOutdir exists but has not enough access rights");
+	    $exitCode = 2;
+	    return;
+	}
+  } #handleOutputDirectory
+
+###############################################################################
+# FILE
+  sub writeTxtFile {
+	my $host = shift;
+	my $type = shift;
+	my $result = shift;
+	return if (!$optOutdir);
+
+	my $txt = undef;
+	my $txtFileName = $optOutdir . "/$host" . "_$type.txt";
+	open ($txt, ">", $txtFileName);
+	print $txt $result if ($result and $txt);
+	close $txt if ($txt);
+  } #writeTxtFile
+
+#################################################################################
+#----------- PRIMEQUEST PSA-COM functions
+our %psaStatusMap = (
+                     0x00000000		=> 3,                           
+                     0x10000000		=> 2,
+                     0x01000000		=> 6,
+                     0x00100000		=> 5,
+                     0x00040000		=> 4,
+                     0x00010000		=> 1,           
+);
+our @psaStatusText = (	undef,
+	"unknown", "not-present", "ok", "degraded", "warning", "error",
+);
+our $psaAvailable = 0;
+sub primequestPsaComManagementInfo {
+	my $partID = shift;
+	#--	partitionManagementInfo :	.1.3.6.1.4.1.211.1.31.1.2.100.7.5
+	my $snmpOidManagementInfoGroup = '.1.3.6.1.4.1.211.1.31.1.2.' . $partID . '.7.5.'; #partitionManagementInfo
+	my $snmpOidName		= $snmpOidManagementInfoGroup . '2.0'; #partitionName
+	my $snmpOidHostName	= $snmpOidManagementInfoGroup . '3.0'; #hostName
+	my $snmpOidManAddress2	= $snmpOidManagementInfoGroup . '10.0'; #partitionManagementAddress2
+
+	if ($main::verbose >= 1 and !$main::verboseTable) {
+		my $name = trySNMPget($snmpOidName, "partitionManagementInfo");
+		my $hostname = trySNMPget($snmpOidHostName, "partitionManagementInfo");
+		my $manAddress2 = trySNMPget($snmpOidManAddress2, "partitionManagementInfo");
+
+		if ($name or $hostname or $manAddress2) {
+			addTableHeader("v","Partition Management Info") if (!$psaAvailable);
+			addStatusTopic("v",undef, "Partition", $partID);
+			addKeyValue("v","Name", $name);
+			addHostName("v",$hostname);
+			addIP("v",$manAddress2);
+			$variableVerboseMessage .= "\n";
+			$psaAvailable = 1;
+		}
+	} #verbose
+} #primequestPsaComManagementInfo
+sub primequesPsaComPhysCompStatus {
+	my $partID = shift;
+	#--	physCompStatus :	.1.3.6.1.4.1.211.1.31.1.2.100.6.1
+	my $snmpOidPhysCompStatusGroup = '.1.3.6.1.4.1.211.1.31.1.2.' . $partID . '.6.1.'; #physCompStatus
+	my $snmpOidCpu		= $snmpOidPhysCompStatusGroup .	'1.0'; #cpuParTotalStatus
+	my $snmpOidMem		= $snmpOidPhysCompStatusGroup .	'2.0'; #memoryParTotalStatus
+	my $snmpOidPci		= $snmpOidPhysCompStatusGroup .	'3.0'; #pciFuncParTotalStatus
+	my $snmpOidSysBoard	= $snmpOidPhysCompStatusGroup .	'4.0'; #systemBoardParTotalStatus
+	my $snmpOidIoBoard	= $snmpOidPhysCompStatusGroup .	'5.0'; #ioBoardParTotalStatus
+	my $snmpOidScsi		= $snmpOidPhysCompStatusGroup .	'6.0'; #scsiDevParTotalStatus
+
+	# Remark: In tests only PCI and SCSI Status was printed
+
+	if ($main::verbose >= 1 and !$main::verboseTable) {
+		my $cpu = trySNMPget($snmpOidCpu, "partitionManagementInfo");
+		my $mem = trySNMPget($snmpOidMem, "partitionManagementInfo");
+		my $pci = trySNMPget($snmpOidPci, "partitionManagementInfo");
+		my $sysBoard = trySNMPget($snmpOidSysBoard, "partitionManagementInfo");
+		my $ioBoard = trySNMPget($snmpOidIoBoard, "partitionManagementInfo");
+		my $scsi = trySNMPget($snmpOidScsi, "partitionManagementInfo");
+		$sysBoard = undef if (defined $sysBoard and $sysBoard eq "NULL");
+		if (defined $cpu or defined $mem or defined $pci or defined $sysBoard 
+		or  defined $ioBoard or defined $scsi
+		) {
+			addStatusTopic("v",undef, "Partition", $partID);
+			addComponentStatus("v","CPU", $psaStatusText[$psaStatusMap{$cpu}]) 
+				if (defined $cpu);
+			addComponentStatus("v","Memory", $psaStatusText[$psaStatusMap{$mem}]) 
+				if (defined $mem);
+			addComponentStatus("v","PCI", $psaStatusText[$psaStatusMap{$pci}]) 
+				if (defined $pci);
+			addComponentStatus("v","SystemBoard", $psaStatusText[$psaStatusMap{$sysBoard}]) 
+				if (defined $sysBoard);
+			addComponentStatus("v","IO-Board", $psaStatusText[$psaStatusMap{$ioBoard}]) 
+				if (defined $ioBoard);
+			addComponentStatus("v","SCSI", $psaStatusText[$psaStatusMap{$scsi}]) 
+				if (defined $scsi);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primequesPsaComPhysCompStatus
+sub primequestPsaComPhysicalCpuTable {
+	my $partID = shift;
+	#--	physicalCpuTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.1.1	
+	my $snmpOidCpuTable = '.1.3.6.1.4.1.211.1.31.1.2.' . $partID . '.1.1.1.1.'; #physicalCpuTable (2 index)
+	my $snmpOidName		= $snmpOidCpuTable . '3'; #phCpuPhysicalID
+	my $snmpOidOldStatus	= $snmpOidCpuTable . '4'; #phCpuStatus - bits
+	my $snmpOidStatus	= $snmpOidCpuTable . '6'; #phCpuPresentStatus - bits
+		# ... in tests both status values were not present
+	my @tableChecks = ( $snmpOidName, $snmpOidOldStatus, $snmpOidStatus);
+
+	if ($main::verbose >= 2 and !$main::verboseTable) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidName, 2);
+		$variableVerboseMessage .= "  CPU Table:\n" if ($#snmpIDs > 0);
+		foreach my $snmpID (@snmpIDs) {
+			my $name = $entries->{$snmpOidName . '.' . $snmpID};
+			#my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			#my $oldstatus = $entries->{$snmpOidOldStatus . '.' . $snmpID};
+			#my $bitStatus = undef;
+			#$bitStatus = $oldstatus if (defined $oldstatus);
+			#$bitStatus = $status if (!defined $bitStatus);
+			#my $decimalstatus = undef;
+			#$decimalstatus = $psaStatusMap{$bitStatus} if (defined $bitStatus);
+
+			addStatusTopic("v",undef, "    CPU", $snmpID);
+			addName("v",$name);
+			#$variableVerboseMessage .= " Status=$psaStatusText[$decimalstatus]:" if (defined $decimalstatus);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primequestPsaComPhysicalCpuTable
+sub primequestPsaComSystemBoardTable {
+	my $partID = shift;
+	#--	systemBoardTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.6.1
+	my $snmpOidSystemBoardTable = '.1.3.6.1.4.1.211.1.31.1.2.' . $partID . '.1.6.1.1.'; #systemBoardTable (1 index)
+	my $snmpOidId		= $snmpOidSystemBoardTable . '2'; #sbPhysicalID
+	my $snmpOidModel	= $snmpOidSystemBoardTable . '10'; #sbModel
+	my $snmpOidSerialNo	= $snmpOidSystemBoardTable . '11'; #sbSerialNo
+	my @tableChecks = ( 
+		$snmpOidId, $snmpOidModel, $snmpOidSerialNo,
+	);
+	if ($main::verbose >= 2 and !$main::verboseTable) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidId, 1);
+		$variableVerboseMessage .= "  System Board Table:\n" if ($#snmpIDs >= 0);
+		foreach my $snmpID (@snmpIDs) {
+			my $id = $entries->{$snmpOidId . '.' . $snmpID};
+			my $model = $entries->{$snmpOidModel . '.' . $snmpID};
+			my $serial = $entries->{$snmpOidSerialNo . '.' . $snmpID};
+
+			addStatusTopic("v",undef, "    SystemBoard", $snmpID);
+			addSerialIDs("v",$serial, undef);
+			addName("v",$id);
+			addProductModel("v",undef, $model);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primequestPsaComSystemBoardTable
+sub primequestPSACOM {
+	#### Hint of ServerView OperationsManager: use partitionID 0-4 instead of '100'
+
+	#PSA-COM-MIB.mib
+	my $i = 0;
+	if ($optChkSystem and !$main::verboseTable) {
+		#addTableHeader("v","Partition Management Info");
+		for ($i=0;$i<4;$i++) {
+			primequestPsaComManagementInfo($i);
+		}
+		addMessage("v","* ATTENTION: No Partition Related Information available !\n")
+			if (!$psaAvailable);
+		if ($psaAvailable) {
+			if ($main::verbose >= 3) { # in tests only PCI and SCSI status was shown
+				addTableHeader("v","Partition Related Physical Component Status");
+				for ($i=0;$i<4;$i++) {
+					primequesPsaComPhysCompStatus($i);
+				}
+			}
+			addTableHeader("v","Partition Related Physical Component Tables");
+			for ($i=0;$i<4;$i++) {
+				addStatusTopic("v",undef, "Partition", $i);
+				$variableVerboseMessage .= "\n";
+				primequestPsaComSystemBoardTable($i);
+				primequestPsaComPhysicalCpuTable($i);
+				
+				#--	memoryModuleTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.2.1 id status ?	
+				#--	scsiDeviceTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.3.1 status ?
+				#--	diskSliceTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.3.2 perf ?
+				#--	nicTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.4.1 perf ?
+				#--	pciFunctionTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.5.1
+				#--	iobTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.7.1
+				#--	iobSlotTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.7.2
+				#--	sduTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.8.1
+				#--	sduControllerTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.8.2
+				#--	sduFanTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.8.3
+				#--	sduPsuTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.8.4
+				#--	pciboxTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.9.1	no status
+				#--	pciboxSlotTable :	.1.3.6.1.4.1.211.1.31.1.2.100.1.9.2	no real status
+				#--	gspbTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.9.3	no status
+				#--	sasuTable :		.1.3.6.1.4.1.211.1.31.1.2.100.1.9.4	no status
+			}
+		} #psaAvailable
+	} #System
+} #primequestPSACOM
+
+#----------- PRIMEQUEST MMB-COM functions
+our $pqTempStatus = undef;
+our $pqFanStatus = undef;
+our $pqPowerSupplyStatus = undef;
+our $pqVoltageStatus = undef;
+our $pqCPUStatus = undef;
+our $pqMemoryStatus = undef;
+
+# UnitIds
+# 1 - Chassis
+# 2-5 Partition
+# 18 free-pool,
+# 19-22 sb, 43-44 iou, 51-54 liou-div, 67-68 pci-box ,
+# 118-125 fan-tray, 136-137 mmb,
+# 143-144 gspb, 145-148 lgspb-dev, 149-152 sas-unit,
+# 153-156 psu, 157 dvdb, 158-161 lpci-box
+
+our @pqClassText = ( "none",
+	"chassis", "partition", "free-pool", "sb", undef,
+	undef, "iou", "iou-divided", "iou-nodivided", "pci-box",
+	undef, undef, undef, undef, undef,
+	undef, "fan-tray", undef, undef, "op-panel",
+	"mmb", undef, undef, undef, undef,
+	undef, undef, "gspb", "gspb-divided", "gspb-nodivided",
+	"sas-unit", "psu", "dvdb", "lpci-box", "fan", 
+	"du", "..unexpected..",
+);
+sub primequestStatusComponentTable {
+	my $snmpOidOverallStatusArea = '.1.3.6.1.4.1.211.1.31.1.1.1.8.'; #status
+	my %commonSystemCodeMap = (	1       =>      0,
+					2       =>      1,
+					3       =>      2,
+					4       =>      2,
+					5	=>	3,);
+	my $snmpOidStatusTable = $snmpOidOverallStatusArea . '2.1.';#statusComponentTable
+	my $snmpOidId			= $snmpOidStatusTable . '1'; #csUnitId
+	my $snmpOidType			= $snmpOidStatusTable . '2'; #csType
+	my $snmpOidValue		= $snmpOidStatusTable . '3'; #componentStatusValue
+	my @tableChecks = ( 
+		$snmpOidId, $snmpOidType, $snmpOidValue, 
+	);
+	my @cntCodes = ( -1, 0,0,0,0,0, );
+	my @overallStatusText = ( "none", 
+		"ok", "degraded", "error", "failed", "unknown", "..unexpected..",
+	);
+	my @typeText = ( "none", 
+		"system-boot", "power", "temperatures", "fans", "power-supplies",
+		"voltages", "cpus", "memory-modules", "total", "fan-redundancy", 
+		"power-supply-redundancy", "..unexpected..",
+	); 
+	my $getInfos = 0;
+	$getInfos = 1 if (($optChkSystem and !$main::verboseTable) or $main::verboseTable==821);
+	if (!$main::verboseTable or $main::verboseTable==821) { # Chassis:
+		#msg .= " - Chassis:" if ($optChkSystem and $optChkSystem == 999);
+		addTopicInLine("m", "Chassis") if ($optChkSystem and $optChkSystem == 999);
+		for (my $i=1;$i < 10 ;$i++) {
+			my $value = trySNMPget($snmpOidValue . '.1.' . $i ,"StatusComponentTable");
+			if (defined $value) {
+				$value = 0 if ($value < 0);
+				$value = 6 if ($value > 6);
+				addComponentStatus("m",$typeText[$i], $overallStatusText[$value])
+					if (($optChkSystem and $optChkSystem == 999)
+					or  ($optChkEnvironment and ($i == 3 or $i == 4))
+					or  ($optChkEnv_Fan and $i == 4)
+					or  ($optChkEnv_Temp and $i == 3)
+					or  ($optChkPower and ($i == 5))
+					or  ($optChkHardware and ($i == 6 or $i == 7 or $i == 8))
+					or  ($optChkVoltage and $i == 6)
+					or  ($optChkCPU and $i == 7)
+					or  ($optChkMemMod and $i == 8)
+					);
+				$pqTempStatus		= $commonSystemCodeMap{$value} if ($i == 3);
+				$pqFanStatus		= $commonSystemCodeMap{$value} if ($i == 4);
+				$pqPowerSupplyStatus	= $commonSystemCodeMap{$value} if ($i == 5);
+				$pqVoltageStatus	= $commonSystemCodeMap{$value} if ($i == 6);
+				$pqCPUStatus		= $commonSystemCodeMap{$value} if ($i == 7);
+				$pqMemoryStatus		= $commonSystemCodeMap{$value} if ($i == 8);
+			} # value
+		} # for
+	}
+	if ($getInfos) { # partitions
+		addTableHeader("v","StatusComponentTable - Partitions");
+		for (my $unitID=2; $unitID < 6 ; $unitID++) { 
+			my $nr = $unitID - 2;
+			my $gotPartition = undef;
+			for (my $i=1;$i < 10 ;$i++) { 
+				my $value = trySNMPget($snmpOidValue . '.' . $unitID . '.' . $i ,"StatusComponentTable");
+				if (defined $value and !defined $gotPartition) {
+					$gotPartition = 1;
+					addStatusTopic("v",undef, "Partition", $nr);
+				}
+				addComponentStatus("v",$typeText[$i], $overallStatusText[$value]) 
+					if (defined $value);
+				$cntCodes[$value]++ if (defined $value and $i == 9);
+			}
+			$variableVerboseMessage .= "\n" if $gotPartition;
+		}
+		addTopicInLine("m", "Partitions");
+ 		for (my $i=1;$i < 6;$i++) {
+			addStatusCount("m", $overallStatusText[$i], $cntCodes[$i]);
+  		}
+	}
+	if ($getInfos) { # system board
+		@cntCodes = ( -1, 0,0,0,0,0, );
+		addTableHeader("v","StatusComponentTable - SystemBoards");
+		for (my $unitID=19; $unitID <= 22 ; $unitID++) { 
+			my $nr = $unitID -19;
+			my $gotSB = undef;
+			
+			for (my $i=1;$i < 10 ;$i++) { 
+				my $value = trySNMPget($snmpOidValue . '.' . $unitID . '.' . $i ,"StatusComponentTable");
+				if (defined $value and !defined $gotSB) {
+					$gotSB = 1;
+					addStatusTopic("v",undef, "SystemBoard", $nr);
+				}
+				addComponentStatus("v",$typeText[$i], $overallStatusText[$value]) 
+					if (defined $value);
+				$cntCodes[$value]++ if (defined $value and $i == 9);
+			}
+			$variableVerboseMessage .= "\n" if ($gotSB);
+		}
+		#msg .= " - SystemBoard:";
+		addTopicInLine("m","SystemBoard");
+ 		for (my $i=1;$i < 6;$i++) {
+ 			#msg .= "-$overallStatusText[$i]($cntCodes[$i])"	
+ 			#	if ($cntCodes[$i]);
+ 			addStatusCount("m", $overallStatusText[$i], $cntCodes[$i]);
+		}
+	}	
+	if ($main::verboseTable==821) { # needs to much time:
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidType, 2);
+
+		addTableHeader("v","StatusComponentTable - Other Units");
+		foreach my $snmpID (@snmpIDs) {
+			my $unit = $entries->{$snmpOidId . '.' . $snmpID};
+			my $status = $entries->{$snmpOidValue . '.' . $snmpID};
+			my $type = $entries->{$snmpOidType . '.' . $snmpID};
+			$type = 0 if (!defined $type or $type < 0);
+			$type = 12 if ($type > 12);
+			if ($type and $status and ($unit == 18 or $unit > 22)) {
+				addComponentStatus("v","[$unit]-$typeText[$type]", 
+					$overallStatusText[$status]);
+			}
+		}
+		$variableVerboseMessage .= "\n";
+	}
+} #primequestStatusComponentTable
+sub primequestUnitParentTable {
+	my $snmpOidUnitParentTable = '.1.3.6.1.4.1.211.1.31.1.1.1.2.5.1.'; #unitParentTable
+	my $snmpOidUnitId	= $snmpOidUnitParentTable . '1'; #pUnitId
+	my $snmpOidParentNr	= $snmpOidUnitParentTable . '2'; #pParentNr
+	my $snmpOidPClass	= $snmpOidUnitParentTable . '4'; #parentUnitClass
+	my @tableChecks = (
+		$snmpOidUnitId, $snmpOidParentNr, $snmpOidPClass, 
+	);
+	if ($main::verboseTable == 251) { #UnitParentTable
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidUnitId, 2);
+
+		addTableHeader("v","Unit Parent Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $unit = $entries->{$snmpOidUnitId . '.' . $snmpID};
+			my $pnr = $entries->{$snmpOidParentNr . '.' . $snmpID};
+			my $pclass = $entries->{$snmpOidPClass . '.' . $snmpID};
+			$pclass = 0 if (!defined $pclass or $pclass <= 0);
+			$pclass = 37 if ($pclass > 37);
+
+			$variableVerboseMessage .= "$unit <--- $pnr";
+			addKeyValue("v","Class", $pqClassText[$pclass]);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primequestUnitParentTable
+sub primequestUnitChildTable {
+	my $snmpOidUnitChildTable = '.1.3.6.1.4.1.211.1.31.1.1.1.2.6.1.'; #unitChildTable
+	my $snmpOidUnitId	= $snmpOidUnitChildTable . '1'; #cUnitId
+	my $snmpOidChildNr	= $snmpOidUnitChildTable . '2'; #cChildNr
+	my $snmpOidCClass	= $snmpOidUnitChildTable . '4'; #childUnitClass
+	my @tableChecks = (
+		$snmpOidUnitId, $snmpOidChildNr, $snmpOidCClass, 
+	);
+	if ($main::verboseTable == 261) { #UnitChildTable
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidUnitId, 2);
+
+		addTableHeader("v","Unit Child Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $unit = $entries->{$snmpOidUnitId . '.' . $snmpID};
+			my $cnr = $entries->{$snmpOidChildNr . '.' . $snmpID};
+			my $cclass = $entries->{$snmpOidCClass . '.' . $snmpID};
+			$cclass = 0 if (!defined $cclass or $cclass <= 0);
+			$cclass = 37 if ($cclass > 37);
+
+			$variableVerboseMessage .= "$unit ---> $cnr";
+			addKeyValue("v","Class", $pqClassText[$cclass]);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primequestUnitChildTable
+sub primequestUnitTable {
+	my $snmpOidUnitTable = '.1.3.6.1.4.1.211.1.31.1.1.1.2.3.1.'; #mmb sysinfo unitInformation unitTable
+	my $snmpOidClass	= $snmpOidUnitTable .  '2'; #unitClass
+	my $snmpOidDesignation	= $snmpOidUnitTable .  '4'; #unitDesignation
+	my $snmpOidModel	= $snmpOidUnitTable .  '5'; #unitModelName
+	my $snmpOidSerial	= $snmpOidUnitTable .  '7'; #unitSerialNumber
+	my $snmpOidLocation	= $snmpOidUnitTable .  '8'; #unitLocation
+	my $snmpOidContact	= $snmpOidUnitTable .  '9'; #unitContact
+	my $snmpOidAdmURL	= $snmpOidUnitTable . '10'; #unitAdminURL
+	my @tableChecks = (
+		$snmpOidClass, $snmpOidDesignation, $snmpOidModel, $snmpOidSerial, 
+		$snmpOidLocation, $snmpOidContact, $snmpOidAdmURL,
+	);
+	if ($main::verboseTable == 231) { # UnitTable - needs a lot of time
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidClass, 1);
+
+		addTableHeader("v","Unit Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $class = $entries->{$snmpOidClass . '.' . $snmpID};
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $model = $entries->{$snmpOidModel . '.' . $snmpID};
+			my $serial = $entries->{$snmpOidSerial . '.' . $snmpID};
+			my $location = $entries->{$snmpOidLocation . '.' . $snmpID};
+			my $contact = $entries->{$snmpOidContact . '.' . $snmpID};
+			my $admURL = $entries->{$snmpOidAdmURL . '.' . $snmpID};
+			$class = 0 if (!defined $class or $class <= 0);
+			$class = 37 if ($class > 37);
+
+			addStatusTopic("v",undef, undef, $snmpID);
+			addSerialIDs("v",$serial, undef);
+			addKeyValue("v","Class", $pqClassText[$class]);
+			addName("v",$designation);
+			addLocationContact("v",$location, $contact);
+			addAdminURL("v",$admURL);
+			addProductModel("v",undef, $model);
+			$variableVerboseMessage .= "\n";
+		}
+	}
+} #primequestUnitTable
+sub primequestUnitTableChassisSerialNumber {
+	my $snmpOidUnitTable = '.1.3.6.1.4.1.211.1.31.1.1.1.2.3.1.'; #mmb sysinfo unitInformation unitTable
+	my $snmpOidSerial	= $snmpOidUnitTable .  '7'; #unitSerialNumber
+	{ 
+		my $serial = trySNMPget($snmpOidSerial . '.1' ,"unitSerialNumber-Chassis");
+		$msg .= "-" if (!$optSystemInfo);
+		addSerialIDs("m",$serial, undef) if ($optChkSystem and !$optSystemInfo);
+		addSerialIDs("n",$serial, undef);
+	}
+} #primequestUnitTableChassisSerialNumber
+sub primequestUnitTableChassis {
+	my $snmpOidUnitTable = '.1.3.6.1.4.1.211.1.31.1.1.1.2.3.1.'; #mmb sysinfo unitInformation unitTable
+	my $snmpOidDesignation	= $snmpOidUnitTable .  '4'; #unitDesignation
+	my $snmpOidModel	= $snmpOidUnitTable .  '5'; #unitModelName
+	my $snmpOidSerial	= $snmpOidUnitTable .  '7'; #unitSerialNumber
+	my $snmpOidLocation	= $snmpOidUnitTable .  '8'; #unitLocation
+	my $snmpOidContact	= $snmpOidUnitTable .  '9'; #unitContact
+	my $snmpOidAdmURL	= $snmpOidUnitTable . '10'; #unitAdminURL
+	{
+		my $getInfos = 0;
+		my $verbose = 0;
+		my $notify = 0;
+		$verbose = 1 if ($main::verbose >= 1);
+		$notify = 1 
+			if (!$main::verbose and !$main::verboseTable and $exitCode and $exitCode < 3);
+		$getInfos = 1 if ($verbose or $notify);
+		if ($getInfos) {
+			my $designation = trySNMPget($snmpOidDesignation . '.1' ,"unitDesignation-Chassis");
+			my $model = trySNMPget($snmpOidModel . '.1' ,"unitModelName-Chassis");
+			my $location = trySNMPget($snmpOidLocation . '.1' ,"unitLocation-Chassis");
+			my $contact = trySNMPget($snmpOidContact . '.1' ,"unitContact-Chassis");
+			my $admURL = trySNMPget($snmpOidAdmURL . '.1' ,"unitAdminURL-Chassis");
+			{
+				RFC1213sysinfoToLong();
+				addAdminURL("n",$admURL);
+				addProductModel("n",undef, $model);
+				addKeyValue("n","Designation",$designation);
+			}
+		}
+	} # opt System
+} #primequestUnitTableChassis
+sub primequestTemperatureSensorTable {
+	my $snmpOidTemperatureSensorTable = '.1.3.6.1.4.1.211.1.31.1.1.1.5.1.1.'; #temperatureSensorTable (2)
+	#my $snmpOidUnitId	= $snmpOidTemperatureSensorTable . '1'; #tempUnitId
+	#	... UnitId is SB SystemBoard number
+	my $snmpOidDesignation	= $snmpOidTemperatureSensorTable . '3'; #tempSensorDesignation
+	my $snmpOidIndentifier	= $snmpOidTemperatureSensorTable . '4'; #tempSensorIdentifier
+	my $snmpOidStatus	= $snmpOidTemperatureSensorTable . '5'; #tempSensorStatus
+	my $snmpOidCurrent	= $snmpOidTemperatureSensorTable . '6'; #tempCurrentTemperature
+	my $snmpOidWarning	= $snmpOidTemperatureSensorTable . '7'; #tempWarningLevel
+	my $snmpOidCritical	= $snmpOidTemperatureSensorTable . '8'; #tempCriticalLevel
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidIndentifier, 
+		$snmpOidStatus, $snmpOidCurrent, $snmpOidWarning, $snmpOidCritical, 
+	);
+	my @statusText = ( "none",
+		"unknown", "not-available", "ok", undef , "failed",
+		"temperature-warning", "temperature-critical", "..unexpected..",
+	);
+	if (($optChkEnvironment or $optChkEnv_Temp) and !$main::verboseTable) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Temperature Sensors");
+		my $saveUnitId = undef;
+		foreach my $snmpID (@snmpIDs) {
+			my $triggerLongMessage = 0;
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $identifier = $entries->{$snmpOidIndentifier . '.' . $snmpID};
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			my $current = $entries->{$snmpOidCurrent . '.' . $snmpID};
+			my $warning = $entries->{$snmpOidWarning . '.' . $snmpID};
+			my $critical = $entries->{$snmpOidCritical . '.' . $snmpID};
+			$designation =~ s/[ ,;=]/_/g;
+			$designation =~ s/_Temp\.//;
+			my $name = $designation;
+			$name = $identifier if ($identifier);
+			$status = 0 if (!defined $status or $status < 0); # seen for Chassis Unit
+			$status = 8 if ($status > 8 or $status == 4);
+
+			if (($main::verbose < 2) 
+			&&  ($pqTempStatus == 1 or $pqTempStatus == 2)
+			&&  ($status >= 5)
+			) { 
+				$triggerLongMessage = 1;
+			}
+			addTemperatureToPerfdata($name, $current, $warning, $critical) 
+				if (!$main::verboseTable);
+
+			if (!$main::verboseTable) {
+				addStatusTopic("v",$statusText[$status],
+					"Sensor", $snmpID);
+				addName("v",$name);
+				addCelsius("v",$current, $warning, $critical);
+				$variableVerboseMessage .= "\n";
+			}
+			if ($triggerLongMessage) { 
+				addStatusTopic("l",$statusText[$status],
+					"Sensor", $snmpID);
+				addName("l",$name);
+				addCelsius("l",$current, $warning, $critical);
+				$longMessage .= "\n";
+			}
+		} # each sensor
+	} # optChkEnvironment
+} #primequestTemperatureSensorTable
+sub primequestFanTable {
+	my $snmpOidFanTable = '.1.3.6.1.4.1.211.1.31.1.1.1.5.2.1.'; #fanTable (2)
+	my $snmpOidDesignation	= $snmpOidFanTable . '3'; #fanDesignation
+	my $snmpOidIdentifier	= $snmpOidFanTable . '4'; #fanIdentifier
+	my $snmpOidStatus	= $snmpOidFanTable . '5'; #fanStatus
+	my $snmpOidSpeed	= $snmpOidFanTable . '6'; #fanCurrentSpeed
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidIdentifier, 
+		$snmpOidStatus, $snmpOidSpeed, 
+	);
+	my @statusText = ( "none",
+		"unknown", "disabled", "ok", "failed", "prefailed-predicted",
+		"redundant-fan-failed", "not-manageable", "not-present", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (!$main::verbose and !$main::verboseTable and $pqFanStatus and $pqFanStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	$getInfos = 1 if ($optChkFanPerformance);
+	if (($optChkEnvironment or $optChkEnv_Fan) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Fans") if ($verbose);
+		foreach my $snmpID (@snmpIDs) {
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $identifier = $entries->{$snmpOidIdentifier . '.' . $snmpID};
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			my $speed = $entries->{$snmpOidSpeed . '.' . $snmpID};
+			$designation =~ s/[ ,;=]/_/g;
+			my $name = $designation;
+			$name = $identifier if ($identifier);
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 9 if ($status > 9);
+
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status], "Fan", $snmpID =~ m/(\d+)\.\d+/);
+				addName("v",$name); 
+				addKeyRpm("v","Speed", $speed);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify
+			and  ($status == 2 or $status == 4 or $status == 5 or $status == 6)
+			) { 
+				addStatusTopic("l",$statusText[$status], "Fan", $snmpID =~ m/(\d+)\.\d+/);
+				addName("l",$name);
+				addKeyRpm("l","Speed", $speed);
+				$longMessage .= "\n";
+			}
+			if ($optChkFanPerformance) {
+				addRpmToPerfdata($name, $speed, undef, undef);
+			}
+		} # each fan
+	} #optChkEnvironment and verbose or error
+} #primequestFanTable
+sub primequestPowerSupplyTable {
+	my $snmpOidPowerSupplyTable = '.1.3.6.1.4.1.211.1.31.1.1.1.6.2.1.'; #powerSupplyTable
+	my $snmpOidDesignation	= $snmpOidPowerSupplyTable . '3'; #powerSupplyDesignation
+	my $snmpOidIdentifier	= $snmpOidPowerSupplyTable . '4'; #powerSupplyIdentifier
+	my $snmpOidStatus	= $snmpOidPowerSupplyTable . '5'; #powerSupplyStatus
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidIdentifier, 
+		$snmpOidStatus,
+	);
+	my @statusText = ( "none",
+		"unknown", "not-present", "ok", "failed", "ac-fail", 
+		"dc-fail", "critical-temperature", "not-manageable", "predictive-fail", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (!$main::verbose and !$main::verboseTable 
+		and $pqPowerSupplyStatus and $pqPowerSupplyStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if ($optChkPower and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Power Supplies") if ($verbose);
+		foreach my $snmpID (@snmpIDs) {
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $identifier = $entries->{$snmpOidIdentifier . '.' . $snmpID};
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			$designation =~ s/[ ,;=]/_/g;
+			my $name = $designation;
+			$name = $identifier if ($identifier);
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 10 if ($status > 10);
+
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status], "PSU", $snmpID =~ m/\d+\.(\d+)/);
+				addName("v",$name);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify
+			and  ($status == 4 or $status == 5 or $status == 6 or $status == 7 or $status == 9)
+			) { 
+				addStatusTopic("l",$statusText[$status], "PSU", $snmpID =~ m/\d+\.(\d+)/);
+				addName("l",$name);
+				$longMessage .= "\n";
+			}
+		} # each power supply
+	} #optChkPower and verbose or error
+} #primequestPowerSupplyTable
+sub primequestPowerMonitoringTable {
+	my $snmpOidPowerMonitoringTable = '.1.3.6.1.4.1.211.1.31.1.1.1.4.5.1.'; #powerMonitoringTable
+	my $snmpOidMax		= $snmpOidPowerMonitoringTable . '4.1'; #pmNominalPowerConsumption
+	my $snmpOidCurrent	= $snmpOidPowerMonitoringTable . '5.1'; #pmCurrentPowerConsumption
+	my $snmpOidCtrl1	= $snmpOidPowerMonitoringTable . '6.1'; #pmCurrentPowerControl
+	# ... since Cassiopeia 2013
+	my $snmpOidStatus	= $snmpOidPowerMonitoringTable . '7.1'; #pmPowerLimitStatus
+	my $snmpOidMaxLimit	= $snmpOidPowerMonitoringTable . '8.1'; #pmPowerLimitThreshold
+	my $snmpOidWarning	= $snmpOidPowerMonitoringTable . '9.1'; #pmPowerLimitWarning
+	my $snmpOidCritical	= $snmpOidPowerMonitoringTable . '10.1'; #pmRedundancyCritLevel
+	my $snmpOidCtrl2	= $snmpOidPowerMonitoringTable . '11.1'; #pmPowerControlMode
+	my $snmpOidUnit		= $snmpOidPowerMonitoringTable . '12.1'; #pmPowerDisplayUnit
+		# ... unknown(1) watt(2) btu(3)
+	my @ctrlText = ( "none",
+        	"unknown", "disabled", "best-performance", "minimum-power", "automatic",	"scheduled", "limited", "low-noise", "..unexpected..",
+	);
+	my @statusText = ("none",
+		"unknown", "ok", "warning", "error", "disabled",
+		"..unexpected..",
+	);
+	if ($optChkPower and !$main::verboseTable) {
+		my $current	= trySNMPget($snmpOidCurrent);
+		my $max		= trySNMPget($snmpOidMax);
+		my $maxLimit	= trySNMPget($snmpOidMaxLimit);
+		my $ctrl1	= trySNMPget($snmpOidCtrl1);
+		my $ctrl2	= trySNMPget($snmpOidCtrl2);
+		my $status	= trySNMPget($snmpOidStatus);
+		my $warn	= trySNMPget($snmpOidWarning);
+		my $critical	= trySNMPget($snmpOidCritical);
+		my $unit	= trySNMPget($snmpOidUnit);
+		$ctrl1 = 9 if (defined $ctrl1 and $ctrl1 > 9);
+		$ctrl2 = 9 if (defined $ctrl2 and $ctrl2 > 9);
+		my $ctrl = $ctrl1;
+		$ctrl = $ctrl2 if (defined $ctrl2 and $ctrl2 > 0);
+		$ctrl = undef if (defined $ctrl and $ctrl < 0);
+		$status = undef if (defined $status and $status < 0);
+		$status = 6 if (defined $status and $status > 6);
+		my $statusText = undef;
+		$statusText = $statusText[$status] if ($status);
+		my $maxThreshold = $maxLimit;
+		$maxThreshold = $critical if (defined $critical and $critical > 0);
+
+		$PSConsumptionBTUH = 1 if (defined $unit and $unit == 3);
+
+		#### TODO - enable -w, -c for PRIMEQUEST PowerConsumption if $max is defined
+		# ... and newer parts are not available
+		if (defined $current and $current != -1 and !$main::verboseTable) {
+			addPowerConsumptionToPerfdata($current, 
+				$warn, $maxThreshold, undef,$max);
+		}
+		if ($main::verbose >= 2) {
+			addTableHeader("v","Power Consumption");
+			addStatusTopic("v",$statusText,"PowerConsumption",undef);
+			addKeyWatt("v","Current", $current,
+				$warn, $critical, undef, $max);
+			addKeyWatt("v","MaxLimit", $maxLimit,
+				undef,undef, undef, undef);
+			addKeyValue("v","Control", $ctrlText[$ctrl]) if ($ctrl);
+			$variableVerboseMessage .= "\n"
+		}
+	} #optChkPower
+} #primequestPowerMonitoringTable
+sub primequestVoltageTable {
+	# (1/100V)
+	my $snmpOidVoltageTable = '.1.3.6.1.4.1.211.1.31.1.1.1.6.3.1.'; #voltageTable
+	my $snmpOidDesignation	= $snmpOidVoltageTable . '3'; #voltageDesignation
+	my $snmpOidStatus	= $snmpOidVoltageTable . '4'; #voltageStatus
+	my $snmpOidCurrent	= $snmpOidVoltageTable . '5'; #voltageCurrentValue
+	my $snmpOidMin		= $snmpOidVoltageTable . '7'; #voltageMinimumLevel
+	my $snmpOidMax		= $snmpOidVoltageTable . '8'; #voltageMaximumLevel
+	my @tableChecks = (
+		$snmpOidDesignation, 
+		$snmpOidStatus, $snmpOidCurrent, $snmpOidMin, $snmpOidMax,
+	);
+	my @statusText = ( "none", 
+		"unknown", "not-available", "ok", "too-low", "too-high",
+		"sensor-failed", "low-warning", "high-warning", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verboseTable == 631); # PQ VoltageTable
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (!$main::verbose and !$main::verboseTable and $pqVoltageStatus and $pqVoltageStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkHardware or $optChkVoltage) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Voltages")	if ($verbose);
+		foreach my $snmpID (@snmpIDs) {
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			my $current = $entries->{$snmpOidCurrent . '.' . $snmpID};
+			my $min = $entries->{$snmpOidMin . '.' . $snmpID};
+			my $max = $entries->{$snmpOidMax . '.' . $snmpID};
+			$designation =~ s/[ ,;=]/_/g;
+			my $name = $designation;
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 9 if ($status > 9);
+
+			#### TODO/QUESTION PRIMEQUEST Voltage and Performance -w -c ?
+
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status], "Voltage", $snmpID);
+				addName("v",$name);
+				addmVolt("v",$current,undef,undef,$min,$max);
+				$variableVerboseMessage .= "\n";
+			} 
+			elsif ($notify and $status >= 4) { 
+				addStatusTopic("l",$statusText[$status], "Voltage", $snmpID);
+				addName("l",$name);
+				addmVolt("l",$current,undef,undef,$min,$max);
+				$longMessage .= "\n";
+			}
+		} # each power supply
+	} #optChkHardware - verbose or error
+} #primequestVoltageTable
+sub primequestCpuTable {
+	my $snmpOidCpuTable = '.1.3.6.1.4.1.211.1.31.1.1.1.6.4.1.'; #cpuTable
+	my $snmpOidDesignation	= $snmpOidCpuTable . '3'; #cpuDesignation
+	my $snmpOidStatus	= $snmpOidCpuTable . '4'; #cpuStatus
+	my $snmpOidModel	= $snmpOidCpuTable . '5'; #cpuModelName
+	my $snmpOidSpeed	= $snmpOidCpuTable . '8'; #cpuCurrentSpeed
+	my @tableChecks = (
+		$snmpOidDesignation, 
+		$snmpOidStatus, $snmpOidModel, $snmpOidSpeed,
+	);
+	my @statusText = ( "none",
+		"unknown", "not-present", "ok", "disabled", "error",
+		"failed", "missing-termination", "prefailed-warning", "..unexpected..",
+	);
+
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verboseTable == 641); # PQ CPUTable
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (!$main::verbose and !$main::verboseTable and $pqCPUStatus and $pqCPUStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkHardware or $optChkCPU) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","CPU Table") if ($verbose);
+		foreach my $snmpID (@snmpIDs) {
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			my $model = $entries->{$snmpOidModel . '.' . $snmpID};
+			my $speed = $entries->{$snmpOidSpeed . '.' . $snmpID};
+			$designation =~ s/[ ,;=]/_/g;
+			my $name = $designation;
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 9 if ($status > 9);
+
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status],"CPU",$snmpID);
+				addName("v",$name);
+				addProductModel("v",undef, $model); 
+				addKeyMHz("v","Speed", $speed);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify and $status >= 4) { 
+				addStatusTopic("l",$statusText[$status],"CPU",$snmpID);
+				addName("l",$name);
+				addProductModel("l",undef, $model);
+				addKeyMHz("l","Speed", $speed);
+				$longMessage .= "\n";
+			}
+		} # each
+	} # hardware 
+} #primequestCpuTable
+sub primequestMemoryModuleTable {
+	my $snmpOidMemoryModuleTable = '.1.3.6.1.4.1.211.1.31.1.1.1.6.5.1.'; #memoryModuleTable
+	my $snmpOidDesignation	= $snmpOidMemoryModuleTable . '3'; #memModuleDesignation
+	my $snmpOidStatus	= $snmpOidMemoryModuleTable . '4'; #memModuleStatus
+	my $snmpOidCapacity	= $snmpOidMemoryModuleTable . '6'; #memModuleCapacity MB
+	my $snmpOidConfig	= $snmpOidMemoryModuleTable . '13'; #memModuleConfiguration
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidStatus, 
+		$snmpOidCapacity, $snmpOidConfig,
+	);
+	my @statusText = ( "none",
+		"unknown", "not-present", "ok", "failed-disabled", "error",
+		"..unexpected..", "warning", "hot-spare", "configuration-error", "..unexpected..",
+	);
+	my @configText = ( "none",
+		"unknown", "normal", "disabled", "hotSpare", "mirror",
+		"raid", "notUsable", "..unexpected..",
+	); 
+	if ($main::verboseTable == 651) { # PQ - MemoryModuleTable - needs toooooo much time
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Memory Modules Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			my $capacity = $entries->{$snmpOidCapacity . '.' . $snmpID};
+			my $config = $entries->{$snmpOidConfig . '.' . $snmpID};
+			$designation =~ s/[ ,;=]/_/g;
+			my $name = $designation;
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 10 if ($status > 10);
+			$config = 0 if (!defined $config or $config < 0);
+			$config = 8 if ($config > 8);
+
+			if ($status != 2 or $main::verbose >= 3) { # not "not-present"
+				addStatusTopic("v",$statusText[$status],"MemMod", $snmpID);
+				addName("v",$name);
+				addKeyValue("v","Config", $configText[$config]) if ($config);
+				addKeyMB("v","Capacity", $capacity);
+				$variableVerboseMessage .= "\n";
+			}
+		} # each
+	} # hardware and this table
+} #primequestMemoryModuleTable
+sub primequestPerformanceTable {
+	# ATTENTION: in the tests there was no data inside
+	my $snmpOidPerformanceTable = '.1.3.6.1.4.1.211.1.31.1.1.1.4.3.1.'; #performanceTable (2)
+	my $snmpOidType		= $snmpOidPerformanceTable . '3'; #perfType
+	my $snmpOidValue	= $snmpOidPerformanceTable . '4'; #performanceValue
+	my $snmpOidName		= $snmpOidPerformanceTable . '5'; #performanceName
+	my @tableChecks = (
+		$snmpOidType, $snmpOidValue, $snmpOidName,  
+	);
+	my @typeText = ( "none",
+		"cpu", "cpu-overall", "pci-load", "pci-efficiency", "pci-transfer",
+		"memory-physical", "memory-total", "memory-percent", "..unexpected..",
+	);
+        #            cpu:             Load of a single CPU in percent
+        #            cpu-overall:     Overall CPU load in percent
+        #            pci-load:        PCI bus load in percent
+        #            pci-efficiency:  PCI bus efficiency in percent (100% is optimum)
+        #            pci-transfer:    PCI bus transfer rate in MBytes/sec.
+        #            memory-physical: Physical memory usage in MBytes
+        #            memory-total:    Total memory usage (physical + virtual) in MBytes
+        #            memory-percent:  Physical memory usage in percent"
+	my $getInfos = 0;
+	$getInfos = 1 if ($main::verbose >= 3 and $optChkHardware and !$main::verboseTable);
+	$getInfos = 1 if ($optChkCpuLoadPerformance);
+	$getInfos = 1 if ($optChkMemoryPerformance);
+	my $totalCPU = undef;
+	#my @cpu = (0,0,0,0,0, 0,0,0,0,0, -1,);
+	my $virtualMemMBytes = undef;
+	my $physMemPercent = undef;
+	my $physMemMBytes = undef;
+	if ($getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidType, 2);
+
+		addTableHeader("v","Hardware Performance Values")
+			if ($main::verbose >= 3);
+		my $maxInd = 0;
+		foreach my $id (@snmpIdx) {
+ 			my $type  = $entries->{$snmpOidType . '.' . $id};
+ 			my $name = $entries->{$snmpOidName . '.' . $id};
+			my $value = $entries->{$snmpOidValue . '.' . $id};
+			$type = 0 if (!defined $type or $type < 0);
+			$type = 9 if ($type > 9);
+			if ($main::verbose >= 3 and !$main::verboseTable) {
+				addStatusTopic("v",undef,$typeText[$type],undef);
+				addName("v",$name);
+				addKeyValue("v","Value", $value);
+				if ($type and $type >= 5 and $type <= 7) {
+					$variableVerboseMessage .= "MB";
+				} else {
+					$variableVerboseMessage .= "%";
+				}
+				$variableVerboseMessage .= "\n";
+			} 
+			if ($optChkCpuLoadPerformance and defined $value) {
+				$totalCPU = $value if ($type == 2);
+				#$cpu[$objNr]=$value if ($type == 1);
+				#$maxInd = $objNr if ($objNr > $maxInd);
+			}
+			if ($optChkMemoryPerformance and defined $value) {
+				$physMemMBytes = $value if ($type == 6);
+				$virtualMemMBytes = $value if ($type == 7 and ($name =~ m/virtual/));
+				$physMemPercent = $value if ($type == 8);
+			}
+		} # each
+		#if ($maxInd) {
+		#	$maxInd++;
+		#	$cpu[$maxInd] = -1;
+		#}
+	} #verbose
+	if ($optChkCpuLoadPerformance) {
+		#msg			.= "Total=$totalCPU" . "%" if ($totalCPU);
+		addKeyPercent("m", "Total", $totalCPU, undef,undef, undef,undef);
+		addPercentageToPerfdata("Total", $totalCPU, undef, undef) if (!$main::verboseTable);
+		#my $i = 0;
+		#for ($i=0; $cpu[$i] != -1;$i++) {
+		#	addPercentageToPerfdata("CPU[$i]", $cpu[$i], undef, undef);
+		#} #each
+		$exitCode = 0;
+	} #cpu load
+	if ($optChkMemoryPerformance) {
+		my $warn = ($optWarningLimit?$optWarningLimit:0);
+		my $crit = ($optCriticalLimit?$optCriticalLimit:0);
+		$warn = undef if ($warn == 0);
+		$crit = undef if ($crit == 0);
+		#msg .= "Physical-Memory=$physMemPercent" . "% " if ($physMemPercent);
+		addKeyPercent("m", "Physical-Memory", $physMemPercent, undef,undef, undef,undef);
+		#msg .= "Physical-Memory=$physMemMBytes" . "MB " if ($physMemMBytes);
+		addKeyMB("m","Physical-Memory", $physMemMBytes);
+		#msg .= "Virtual-Memory=$virtualMemMBytes" . "MB " if ($virtualMemMBytes);
+		addKeyMB("m","Virtual-Memory", $virtualMemMBytes);
+		addPercentageToPerfdata("Physical-Memory", $physMemPercent, $warn, $crit) 
+			if (!$main::verboseTable);
+		$exitCode = 0;
+		$exitCode = 1 if ($warn and $physMemPercent > $warn);
+		$exitCode = 2 if ($crit and $physMemPercent > $crit);
+	} #memory
+} #primequestPerformanceTable
+sub primequestManagementNodeTable {
+	my $snmpOidManagementNodeTable = '.1.3.6.1.4.1.211.1.31.1.1.1.3.1.1.'; #managementNodeTable
+	my $snmpOidAddress	= $snmpOidManagementNodeTable . '4'; #unitNodeAddress
+	my $snmpOidName		= $snmpOidManagementNodeTable . '7'; #unitNodeName
+	my $snmpOidClass	= $snmpOidManagementNodeTable . '8'; #unitNodeClass
+	my $snmpOidMAC		= $snmpOidManagementNodeTable . '9'; #unitNodeMacAddress
+	my @tableChecks = (
+		$snmpOidAddress, $snmpOidName, 
+		$snmpOidClass, $snmpOidMAC,
+	);
+	my @classText = ( "none",
+		"unknown", "primery", "secondary", "management-blade", "secondary-remote",
+		"secondary-remote-backup", "baseboard-controller", "secondary-management-blade", "..unknown..",
+	);
+	if ($main::verbose == 3 or $main::verboseTable == 311) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidAddress, 2);
+
+		addTableHeader("v","Management Node Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $address = $entries->{$snmpOidAddress . '.' . $snmpID};
+			my $name = $entries->{$snmpOidName . '.' . $snmpID};
+			my $class = $entries->{$snmpOidClass . '.' . $snmpID};
+			my $mac = $entries->{$snmpOidMAC . '.' . $snmpID};
+			$class = 0 if (!defined $class or $class < 0);
+			$class = 9 if ($class > 9);
+			{ 
+				addStatusTopic("v",undef, "Node", $snmpID);
+				addName("v",$name);
+				addKeyValue("v","Address", $address);
+				#addKeyValue("v","MAC", $mac);
+				addMAC("v", $mac);
+				addKeyValue("v","Class", $classText[$class]) if ($class);
+				$variableVerboseMessage .= "\n";
+			}
+		} # each
+	} # system and specific table
+} #primequestManagementNodeTable
+sub primequestServerTable {
+	my $snmpOidServerTable = '.1.3.6.1.4.1.211.1.31.1.1.1.4.1.1.'; #serverTable
+	my $snmpUnitID		= $snmpOidServerTable . '1'; #srvUnitId
+	my $snmpOidBootStatus	= $snmpOidServerTable . '4'; #srvCurrentBootStatus
+	my $snmpOidBootUUID	= $snmpOidServerTable . '7'; #srvUUID
+	my $snmpOidManIP	= $snmpOidServerTable . '10'; #srvManagementIP
+	my @tableChecks = (
+		$snmpUnitID, $snmpOidBootStatus, $snmpOidBootUUID, 
+		$snmpOidManIP,
+	);
+	my @bootText = ( "none",
+		"unknown", "off", "no-boot-cpu", "self-test", "setup",
+		"os-boot", "diagnostic-boot", "os-running", "diagnostic-running", "os-shutdown",
+		"diagnostic-shutdown", "reset", "panic", "check-stop", "dumping", 
+		"halt", "..unexpected..",
+	);
+	if ($main::verbose == 3 or $main::verboseTable == 411) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidBootStatus, 1);
+
+		addTableHeader("v","Server Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $unitid = $entries->{$snmpUnitID . '.' . $snmpID};
+			my $bstatus = $entries->{$snmpOidBootStatus . '.' . $snmpID};
+			my $uuid = $entries->{$snmpOidBootUUID . '.' . $snmpID};
+			my $mip = $entries->{$snmpOidManIP . '.' . $snmpID};
+			$bstatus = 0 if (!defined $bstatus or $bstatus < 0);
+			$bstatus = 17 if ($bstatus > 17);
+			{ 
+				addStatusTopic("v",undef, "Server", $snmpID);
+				addKeyIntValue("v","Partition",($unitid-2));
+				addKeyValue("v","BootStatus",$bootText[$bstatus]) if ($bstatus);
+				addKeyValue("v","ManagementIP",$mip);
+				addKeyValue("v","UUID",$uuid);
+				$variableVerboseMessage .= "\n";
+			}
+		} # each
+	}
+} #primequestServerTable
+sub primequest {
+	# MMB-COM-MIB.mib
+	my $snmpOidPrimeQuestMMBSysInfo = '.1.3.6.1.4.1.211.1.31.1.1.1.'; # primequest - mmb - sysinfo
+	my $snmpOidUnitInfo = $snmpOidPrimeQuestMMBSysInfo . '2.'; #unitInformation
+	my $snmpOidLocalID	= $snmpOidUnitInfo . '1.0'; #localServerUnitId
+	#my $snmpOidNumberUnits	= $snmpOidUnitInfo . '2.0'; #numberUnits
+
+	my $snmpOidOverallStatusArea = $snmpOidPrimeQuestMMBSysInfo . '8.'; #status
+	my $snmpOidStatus = $snmpOidOverallStatusArea . '1.0'; #agentStatus
+	my %commonSystemCodeMap = (	1       =>      0,
+					2       =>      1,
+					3       =>      2,
+					4       =>      2,
+					5	=>	3,);
+	my @overallStatusText = ( "none", "ok", "degraded", "error", "failed", "unknown",);
+
+	my $localID = mibTestSNMPget($snmpOidLocalID,"PRIMEQUEST");
+	my $allStatus = simpleSNMPget($snmpOidStatus,"agentStatus");
+	$allStatus = 0 if (!defined $allStatus or $allStatus < 0 or $allStatus > 5);
+	$exitCode = $commonSystemCodeMap{$allStatus};
+
+	primequestUnitTableChassisSerialNumber();
+	$msg .= " -" if ($optChkSystem);
+	addKeyValue("m","All",$overallStatusText[$allStatus]) if ($optChkSystem);
+	primequestStatusComponentTable();
+
+	$exitCode = $pqTempStatus if (defined $pqTempStatus and 
+		$optChkEnv_Temp and !defined $optChkEnv_Fan);
+	$exitCode = $pqFanStatus if (defined $pqFanStatus and 
+		$optChkEnv_Fan and !defined $optChkEnv_Temp);
+	addExitCode($pqFanStatus) if ($optChkEnv_Temp and $optChkEnv_Fan);
+	if ((defined $optChkEnvironment) && (!defined $optChkPower) && (!defined $optChkSystem)) {
+		$exitCode = 3 if (!defined $pqTempStatus);
+		$exitCode = $pqTempStatus if (defined $pqTempStatus);
+		addExitCode($pqFanStatus);
+	}
+	if ((defined $optChkPower) && (!defined $optChkEnvironment) && (!defined $optChkSystem)) { 
+		$exitCode = 3 if (!defined $pqPowerSupplyStatus);
+		$exitCode = $pqPowerSupplyStatus if (defined $pqPowerSupplyStatus);
+	}
+	$exitCode = $pqCPUStatus if (defined $pqCPUStatus and 
+		$optChkCPU and !defined $optChkVoltage and !defined $optChkMemMod);
+	$exitCode = $pqVoltageStatus if (defined $pqVoltageStatus and 
+		$optChkVoltage and !defined $optChkCPU and !defined $optChkMemMod);
+	$exitCode = $pqMemoryStatus if (defined $pqMemoryStatus and 
+		$optChkMemMod and !defined $optChkCPU and !defined $optChkVoltage);
+	addExitCode($pqVoltageStatus) if ($optChkCPU and $optChkVoltage);
+	addExitCode($pqMemoryStatus) if ($optChkMemMod and ($optChkCPU or $optChkVoltage));
+	if ((defined $optChkHardware) 
+	&& (!defined $optChkSystem) && (!defined $optChkEnvironment) && (!defined $optChkPower)) {
+		$exitCode = 3 if (!defined $pqVoltageStatus);
+		$exitCode = $pqVoltageStatus if (defined $pqVoltageStatus);
+		addExitCode($pqCPUStatus);
+		addExitCode($pqMemoryStatus);
+	}
+	if ((defined $optChkSystem) && (!defined $optChkEnvironment) && (!defined $optChkPower)) {
+		$exitCode = $commonSystemCodeMap{$allStatus};
+	}
+	if (defined $optChkSystem and $commonSystemCodeMap{$allStatus}
+	    and !$pqFanStatus and !$pqTempStatus and !$pqPowerSupplyStatus 
+	    and !$pqCPUStatus and !$pqVoltageStatus and !$pqMemoryStatus) 
+	{
+		$longMessage .= "- Hint: Please check the status on the system itself or via administrative url - ";
+	}
+
+	primequestUnitTableChassis(); # search System information like Contact ...
+	primequestUnitTable();
+	primequestUnitParentTable();
+	primequestUnitChildTable();
+	primequestManagementNodeTable();
+	primequestServerTable();
+	primequestPSACOM();
+
+	primequestTemperatureSensorTable();
+	primequestFanTable();
+
+	primequestPowerSupplyTable();
+	primequestPowerMonitoringTable();
+
+	primequestVoltageTable();
+	primequestCpuTable();
+	primequestMemoryModuleTable();
+	primequestPerformanceTable();
+} #primequest
+#----------- PRIMERGY Blade - management blade functions
+our $overallFan = 0;
+our $overallTemp = 0;
+our $overallPS = 0;
+our @s31OverallStatusText = ( "none",
+	"unknown", "ok", "degraded", "critical",
+);
+sub primergyManagementBladePowerSupply {
+	my %bladeErrorCodeMap = (	0 => 3,
+					1 => 3,
+					2 => 0,
+					3 => 1,
+					4 => 2);
+	my $snmpOidBladePSOverall	= '.1.3.6.1.4.1.7244.1.1.1.3.2.1.0'; #s31SysPowerSupplyStatus.0
+	my $snmpOidBladePSTable		= '.1.3.6.1.4.1.7244.1.1.1.3.2.4.1.';#s31SysPowerSupplyUnitTable
+	my $snmpOidStatus		= $snmpOidBladePSTable . '2'; #s31SysPowerSupplyUnitStatus
+	my $snmpOidProduct		= $snmpOidBladePSTable . '4'; #s31SysPowerSupplyUnitProductName
+	my $snmpOidModel		= $snmpOidBladePSTable . '5'; #s31SysPowerSupplyUnitModelName
+	my $snmpOidSerial		= $snmpOidBladePSTable . '7'; #s31SysPowerSupplyUnitSerialNumber
+	my @bladePSChecks = (
+		$snmpOidStatus,
+		$snmpOidProduct,
+		$snmpOidModel,
+		$snmpOidSerial,
+	);
+	my @bladePSStatusText = ( "none", 
+		"unknown", "ok", "not-present", "warning", "critical",
+		"off", "dummy", "fanmodule", "..unexpected..",
+	);	
+	if (defined $optChkPower) { 
+		my $oPS = simpleSNMPget($snmpOidBladePSOverall,"PowerSupplyOverall");
+		$oPS = 0 if (!defined $oPS or $oPS < 0 or $oPS > 4);
+		$overallPS = $bladeErrorCodeMap{$oPS};
+		#msg .= ' - PowerSupplies(' . $s31OverallStatusText[$oPS] . ')';
+		addComponentStatus("m", "PowerSupplies", $s31OverallStatusText[$oPS]);
+
+		if ((!defined $optChkEnvironment) && (!defined $optChkSystem)) {
+		    $exitCode = $overallPS;
+		}
+		my $getinfos = 0;
+		my $verbose = 0;
+		my $notify = 0;
+		$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+		$notify = 1 if (!$main::verbose and !$main::verboseTable and $overallPS and $overallPS < 3);
+		$getinfos = 1 if ($verbose or $notify);
+		if ($getinfos) {
+			my $entries = getSNMPtable(\@bladePSChecks);
+			my @snmpIDs = ();
+			@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 1);
+
+			addTableHeader("v","Power Supplies") if ($verbose);
+			foreach my $snmpID (@snmpIDs) {
+				my $psStatus = $entries->{$snmpOidStatus . '.' . $snmpID};
+				my $psSerial = $entries->{$snmpOidSerial . '.' . $snmpID};
+				my $psProduct = $entries->{$snmpOidProduct . '.' . $snmpID};
+				my $psModel = $entries->{$snmpOidModel . '.' . $snmpID};
+				$psStatus = 0 if (!defined $psStatus or $psStatus < 0);
+				$psStatus = 9 if ($psStatus > 9);
+				if ($verbose) {
+					addStatusTopic("v",$bladePSStatusText[$psStatus],
+						"PowerSupplyUnit", $snmpID);
+					addSerialIDs("v",$psSerial, undef);
+					addProductModel("v",$psProduct, $psModel);
+					endVariableVerboseMessageLine();
+				}
+				elsif ($notify and ($psStatus == 4) or ($psStatus == 5)) {
+					addStatusTopic("l",$bladePSStatusText[$psStatus],
+						"PowerSupplyUnit", $snmpID);
+					addSerialIDs("l",$psSerial, undef);
+					addProductModel("l",$psProduct, $psModel);
+					endLongMessageLine();
+				}
+			} # all ids
+		} # verbose or error
+	}
+	chomp($msg);
+} #primergyManagementBladePowerSupply
+sub primergyManagementBladeEnvironment {
+	my %bladeErrorCodeMap = (	0 => 3,
+					1 => 3,
+					2 => 0,
+					3 => 1,
+					4 => 2);
+	my $snmpOidBladeFanOverall = '.1.3.6.1.4.1.7244.1.1.1.3.3.4.0'; #s31SysFanOverallStatus.0
+	my $snmpOidBladeTempOverall = '.1.3.6.1.4.1.7244.1.1.1.3.4.2.0'; #s31SysTemperatureStatus.0
+
+	my $snmpOidBladeFanPrefix = '.1.3.6.1.4.1.7244.1.1.1.3.3.1.1.'; #s31SysFanTable
+	my $snmpOidBladeFanStatus = $snmpOidBladeFanPrefix . '2'; #s31SysFanStatus
+	my $snmpOidBladeFanDesc = $snmpOidBladeFanPrefix . '3'; #s31SysFanDesignation - verbose
+	my $snmpOidBladeFanSpeed = $snmpOidBladeFanPrefix . '4'; #s31SysFanCurrentSpeed
+	my $snmpOidBladeFanIdent = $snmpOidBladeFanPrefix . '8'; #s31SysFanIdentification
+        my @bladeFanChecks = (
+		$snmpOidBladeFanStatus,
+		$snmpOidBladeFanSpeed,
+		$snmpOidBladeFanDesc
+	);
+	my @bladeFanStatus = ( "none",
+		"unknown", "disabled", "ok", "fail", "prefailure-predicted",
+		"redundant-fan-failed", "not-manageable", "not-present", "not-available", "..unexpected..",
+	);
+
+	my $snmpOidBladeTempPrefix = '.1.3.6.1.4.1.7244.1.1.1.3.4.1.1.'; #s31SysTemperatureSensorTable
+	my $snmpOidBladeTempStatus = $snmpOidBladeTempPrefix . '2'; #s31SysTempSensorStatus
+	my $snmpOidBladeTempWarn = $snmpOidBladeTempPrefix . '4'; #s31SysTempUpperWarningLevel
+	my $snmpOidBladeTempCrit = $snmpOidBladeTempPrefix . '5'; #s31SysTempUpperCriticalLevel
+	my $snmpOidBladeTempValue = $snmpOidBladeTempPrefix . '6'; #s31SysTempCurrentValue
+	my $snmpOidBladeTempDesc = $snmpOidBladeTempPrefix . '3'; #s31SysTempSensorDesignation
+	my @bladeTempChecks = (
+		$snmpOidBladeTempStatus,
+		$snmpOidBladeTempValue,
+		$snmpOidBladeTempWarn,
+		$snmpOidBladeTempCrit,
+		$snmpOidBladeTempDesc
+	);
+	my @bladeTempStatus = ( "none",
+		"unknown", "disable", "ok", "failed", "warning", 
+		"critical", "not-available", "..unexpected..",
+	);
+	# get subsystem information
+	if (defined $optChkEnvironment or $optChkEnv_Fan or $optChkEnv_Temp) { 
+		if ($optChkEnvironment or $optChkEnv_Fan) {
+			my $oFan = simpleSNMPget($snmpOidBladeFanOverall,"FanOverall");
+			$oFan = 0 if (!defined $oFan or $oFan < 0 or $oFan > 4);
+			$overallFan = $bladeErrorCodeMap{$oFan};
+			#msg .= ' - Fans(' . $s31OverallStatusText[$oFan] . ')';
+			addComponentStatus("m", "Fans", $s31OverallStatusText[$oFan]);
+		}
+		if ($optChkEnvironment or $optChkEnv_Temp) {
+			my $oTemp = simpleSNMPget($snmpOidBladeTempOverall,"TemperaturOverall");
+			$oTemp = 0 if (!defined $oTemp or $oTemp < 0 or $oTemp > 4);
+			$overallTemp = $bladeErrorCodeMap{$oTemp};
+			#msg .= ' - Temperatures(' . $s31OverallStatusText[$oTemp] . ')';
+			addComponentStatus("m", "Temperatures", $s31OverallStatusText[$oTemp]);
+		}
+
+		if ($optChkEnvironment and (!defined $optChkPower) and (!defined $optChkSystem)) {
+		    $exitCode = 3;
+		    addExitCode($overallFan);
+		    addExitCode($overallTemp);
+		}
+		addExitCode($overallFan) if ($optChkEnv_Fan and (!defined $optChkSystem));
+		addExitCode($overallTemp) if ($optChkEnv_Temp and (!defined $optChkSystem));
+	}
+	chomp($msg);
+	# process fan information
+	my $getinfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (!$main::verbose and !$main::verboseTable and $overallFan and $overallFan < 3);
+	$getinfos = 1 if ($verbose or $notify);
+	$getinfos = 1 if ($optChkFanPerformance);
+	if ((defined $optChkEnvironment or $optChkEnv_Fan) and $getinfos) { 
+		my @snmpIDs = ();
+		my $entries = getSNMPtable(\@bladeFanChecks);
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidBladeFanStatus, 1);
+
+		addTableHeader("v","Fans") if ($verbose);
+		foreach my $fanID (@snmpIDs) {
+			my $fanStatus  = $entries->{$snmpOidBladeFanStatus . '.' . $fanID};
+			$fanStatus = 0 if (!defined $fanStatus or $fanStatus < 0);
+			$fanStatus = 10 if ($fanStatus > 10);
+			next if (($fanStatus eq '9' or $fanStatus eq '2' or $fanStatus eq '8' or $fanStatus eq '7') and $main::verbose < 3);
+			my $fanDesc = $entries->{$snmpOidBladeFanDesc . '.' . $fanID};
+			my $fanSpeed = $entries->{$snmpOidBladeFanSpeed . '.' . $fanID};
+			my $fanIdent = trySNMPget($snmpOidBladeFanIdent . '.' . $fanID ,
+				"FanIdentification");
+			$fanDesc =~ s/[ ,;=]/_/g;
+			if (! defined $fanIdent) {
+				$fanIdent = $fanDesc;
+			}
+			if ($verbose) {
+				addStatusTopic("v",$bladeFanStatus[$fanStatus], "Fan", $fanID);
+				addName("v",$fanIdent);
+				addKeyRpm("v","Speed", $fanSpeed);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify and $fanStatus >= 4 and $fanStatus <= 6) {
+				addStatusTopic("l",$bladeFanStatus[$fanStatus], "Fan", $fanID);
+				addName("l",$fanIdent);
+				addKeyRpm("l","Speed", $fanSpeed);
+				endLongMessageLine();
+			}
+			if ($optChkFanPerformance) {
+				addRpmToPerfdata($fanIdent, $fanSpeed, undef, undef);
+			}
+		} #each
+	} # fan
+
+	# process temperature information
+	$notify = 0;
+	$notify = 1 if (!$main::verbose and !$main::verboseTable and $overallTemp and $overallTemp < 3);
+	if (($optChkEnvironment or $optChkEnv_Temp) and !$main::verboseTable) { 
+		my @snmpIDs = ();
+		my $entries = getSNMPtable(\@bladeTempChecks);
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidBladeTempStatus, 1);
+
+		addTableHeader("v","Temperature Sensors");
+		foreach my $tempID (@snmpIDs) {	
+			my $tempStatus  = $entries->{$snmpOidBladeTempStatus . '.' . $tempID};
+				# ... TemperaturSensorStatus !
+			$tempStatus = 0 if (!defined $tempStatus or $tempStatus < 0);
+			$tempStatus = 8 if ($tempStatus > 8);
+			next if (($tempStatus eq '7' or $tempStatus eq '2') and $main::verbose < 3); 
+			# skip if disabled or not available
+			my $tempValue = $entries->{$snmpOidBladeTempValue . '.' . $tempID};
+			my $tempWarn = $entries->{$snmpOidBladeTempWarn . '.' . $tempID};
+			my $tempCrit = $entries->{$snmpOidBladeTempCrit . '.' . $tempID};
+			my $tempDesc = $entries->{$snmpOidBladeTempDesc . '.' . $tempID};
+			$tempDesc =~ s/[ ,;=]/_/g;
+			
+			addTemperatureToPerfdata($tempDesc, $tempValue, $tempWarn, $tempCrit)
+				if (!$main::verboseTable);
+
+			if ($verbose) {
+				addStatusTopic("v",$bladeTempStatus[$tempStatus], "Sensor", $tempID);
+				addName("v",$tempDesc);
+				addCelsius("v",$tempValue, $tempWarn, $tempCrit);
+				$variableVerboseMessage .= "\n";
+			}
+			if ($tempCrit > 0  and $tempValue >= $tempCrit) {
+				$exitCode = 2;
+			} elsif ($tempWarn > 0 and $tempValue >= $tempWarn) {
+				$exitCode = 1 if ($exitCode != 2);
+			} 
+			if ($notify and ($tempStatus >=4 and $tempStatus <=6)) {
+				addStatusTopic("l",$bladeTempStatus[$tempStatus], "Sensor", $tempID);
+				addName("l",$tempDesc);
+				addCelsius("l",$tempValue, $tempWarn, $tempCrit);
+				endLongMessageLine();
+			}
+		} #each temp
+	} # optChkEnvironment
+} #primergyManagementBladeEnvironment
+sub primergyManagementBladePowerConsumption {
+	# ATTENTION - There are three index part in this table - one is a timestamp !
+	my $snmpOidAgentDateTime	= '.1.3.6.1.4.1.7244.1.1.1.1.7.0'; #s31AgentDateTime
+	my $snmpOidBladePowerConsumptionTable = '.1.3.6.1.4.1.7244.1.1.1.15.1.1.'; #s31UtilizationHistoryTable
+	#my $snmpOidPowerUnitId		= $snmpOidBladePowerConsumptionTable . '1'; #s31uthUnitId
+	#my $snmpOidPowerEntity		= $snmpOidBladePowerConsumptionTable . '2'; #s31uthEntity
+	#my $snmpOidPowerTimeStamp	= $snmpOidBladePowerConsumptionTable . '3'; #s31uthTimeStamp
+	#my $snmpOidPowerHwUUID		= $snmpOidBladePowerConsumptionTable . '4'; #s31uthHardwareUUID
+	#	.1.3.6.1.4.1.7244.1.1.1.15.1.1.4.1.2.1110717600 --- XXXXXXXX
+	my $snmpOidPowerAverage		= $snmpOidBladePowerConsumptionTable . '5'; #s31uthAverageValue
+	my $snmpOidPowerMin		= $snmpOidBladePowerConsumptionTable . '6'; #s31uthMinValue
+	my $snmpOidPowerMax		= $snmpOidBladePowerConsumptionTable . '7'; #s31uthMaxValue
+	# Sample
+	# .1.3.6.1.4.1.7244.1.1.1.15.1.1.3.1.1.1111363200 --- 1111363200
+
+	# .1.3.6.1.4.1.7244.1.1.1.15.1.1.5.1.1.600 --- 1663 ???
+
+	my @bladePowerChecks = ( #verbose
+		$snmpOidPowerAverage,
+	); 
+	# get power consumption if enabled
+	if (defined $optChkPower) { 
+		my $chkAgentDateTime = trySNMPget($snmpOidAgentDateTime, "AgentDateTime");
+		my $timeStamp = 0;
+		my $nodeTimeStamp = 0;
+		my $localTimeStamp = time();
+		$timeStamp = $localTimeStamp;
+		if (defined $chkAgentDateTime) {
+			$chkAgentDateTime =~ m|(..)/(..)/(....) (..):(..):(..).*|;
+			my $tmon = $1; 
+			my $tday = $2; 
+			my $tyear = $3;
+			my $thour = $4; 
+			my $tmin = $5; 
+			my $tsec = $6;
+			#print "****** $chkAgentDateTime => $tsec,$tmin,$thour,$tday,$tmon,$tyear \n";
+			$nodeTimeStamp = timelocal($tsec,$tmin,$thour,$tday,$tmon-1,$tyear);
+			# about $tmon - 1 see timelocal / localtime  description
+			$timeStamp = $nodeTimeStamp;
+		}
+		#printf "local=$localTimeStamp, node=$nodeTimeStamp\n";
+		$timeStamp =~ m/(.*)([0-9]{3})/;
+		my $preSeconds = $1;
+		my $lastSeconds = $2;
+		my $chkSeconds = ($lastSeconds > 800?800
+			:	 ($lastSeconds > 600?600
+			:	 ($lastSeconds > 400?400
+			:	 ($lastSeconds > 200?200:'000') ) ) );
+		my $timeChk = "$preSeconds" . "$chkSeconds";
+		my @chkPowerKeys = ();
+
+		# In V1-V3.00 cout=10 for half an hour;
+		for (my $pCount=0;$pCount<25;$pCount++) { # 200 seconds frequency	
+			push(@chkPowerKeys, ($timeChk - ($pCount*200))) ;
+			#push(@chkPowerKeys, ($timeChk - ($pCount*200))) ; # ?
+			#push(@chkPowerKeys, ($timeChk - ($pCount*200))) ; # ?
+		}
+
+		if ($main::verbose > 98) { # for diagnostic only !!! this is slooooooooow
+			my $entries = getSNMPtable(\@bladePowerChecks);
+		}
+		foreach my $pKey (@chkPowerKeys) {
+			my $chkPowerAverage = undef;
+			my $chkPowerAverage1 = trySNMPget($snmpOidPowerAverage . '.1.1.' . $pKey ,
+				"PowerAverage");
+			    # ... should be available all 10 Minutes
+			my $chkPowerAverage2 = trySNMPget($snmpOidPowerAverage . '.1.2.' . $pKey ,
+				"PowerAverage");
+			    # ... should be available once per hour
+			my $chkPowerAverage3 = trySNMPget($snmpOidPowerAverage . '.1.3.' . $pKey ,
+				"PowerAverage");
+			    # ... should be available once per day
+			my $powerEntity = undef;
+			my $frequenzyString = undef;
+			if ((defined $chkPowerAverage1) && ($chkPowerAverage1 != 0)) {
+				$chkPowerAverage = $chkPowerAverage1 ;
+				$powerEntity = '.1.1.';
+				$frequenzyString = "10minutes";
+			}
+			if ((!defined $chkPowerAverage) 
+			&& (defined $chkPowerAverage2) && ($chkPowerAverage2 != 0)) 
+			{
+				$chkPowerAverage = $chkPowerAverage2;
+				$powerEntity = '.1.2.';
+				$frequenzyString = "hour";
+			}
+			if ((!defined $chkPowerAverage) 
+			&& (defined $chkPowerAverage3) && ($chkPowerAverage2 != 0)) {
+				$chkPowerAverage = $chkPowerAverage3;
+				$powerEntity = '.1.3.';	
+				$frequenzyString = "day";
+			}
+			if ((defined $chkPowerAverage) && ($chkPowerAverage != 0)) {
+				addPowerConsumptionToPerfdata($chkPowerAverage, undef,undef, undef,undef)
+					if (!$main::verboseTable);
+				if ($main::verbose >= 2) {
+					my $chkPowerMin 
+						= trySNMPget($snmpOidPowerMin . $powerEntity . $pKey ,
+						"PowerMin");
+					my $chkPowerMax 
+						= trySNMPget($snmpOidPowerMax . $powerEntity . $pKey ,
+						"PowerMax");
+					addTableHeader("v","Power Consumption");
+					addStatusTopic("v","ok", "PowerConsumption", undef);
+					addKeyValue("v","TimeStamp", $pKey);
+					addKeyWatt("v","Average", $chkPowerAverage,
+					    undef,undef, $chkPowerMin, $chkPowerMax);
+					addKeyValue("v","AverageFrequenzy", $frequenzyString);
+					$variableVerboseMessage .= "\n";
+				}
+				last;
+			} #found
+		} #try keys
+	} #optChkPower
+} #primergyManagementBladePowerConsumption
+sub primergyManagementBlade_MgmtBladeTable {
+	my $snmpOidMgmtBladeTable = '.1.3.6.1.4.1.7244.1.1.1.2.1.1.'; #s31MgmtBladeTable (1)
+	my $snmpOidStatus	= $snmpOidMgmtBladeTable .  '2'; #s31MgmtBladeStatus
+	my $snmpOidSerial	= $snmpOidMgmtBladeTable .  '5'; #s31MgmtBladeSerialNumber
+	my $snmpOidProduct	= $snmpOidMgmtBladeTable .  '6'; #s31MgmtBladeProductName
+	my $snmpOidModel	= $snmpOidMgmtBladeTable .  '7'; #s31MgmtBladeModelName
+	my $snmpOidFW		= $snmpOidMgmtBladeTable .  '9'; #s31MgmtBladeFirmwareVersion
+	my $snmpOidMAC		= $snmpOidMgmtBladeTable . '10'; #s31MgmtBladePhysicalAddress
+	my $snmpOidRunMode	= $snmpOidMgmtBladeTable . '11'; #s31MgmtBladeRunMode
+	my @tableChecks = (
+		$snmpOidStatus, $snmpOidSerial, $snmpOidProduct, $snmpOidModel, 
+		$snmpOidMAC, $snmpOidRunMode, $snmpOidFW
+	);
+	my @statusText = ("none",
+		"unknown", "ok", "not-present",	"error", "critical",
+		"standby", "..unexpected..",
+	);
+	my @modeText = ( "none",
+		"unknown", "master", "slave", "..unexpected..",
+	);
+	if ($main::verboseTable == 211 or $optAgentInfo) { # BLADE ManagementBlade
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidStatus, 1);
+		addTableHeader("v","Management Blade Table");
+		my $version = undef;
+		foreach my $snmpID (@snmpIDs) {
+			my $status = $entries->{$snmpOidStatus . '.' . $snmpID};
+			my $serial = $entries->{$snmpOidSerial . '.' . $snmpID};
+			my $product = $entries->{$snmpOidProduct . '.' . $snmpID};
+			my $model = $entries->{$snmpOidModel . '.' . $snmpID};
+			my $mac = $entries->{$snmpOidMAC . '.' . $snmpID};
+			my $runmode = $entries->{$snmpOidRunMode . '.' . $snmpID};
+			my $fw =  $entries->{$snmpOidFW . '.' . $snmpID};
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 7 if ($status > 7);
+			$runmode = 0 if (!defined $runmode or $runmode < 0);
+			$runmode = 4 if ($runmode > 4);
+			$version = $fw if ($runmode == 2);
+			{ 
+				addStatusTopic("v",$statusText[$status], "MMB", $snmpID);
+				addSerialIDs("v",$serial, undef);
+				addProductModel("v",$product,$model);
+				addKeyValue("v", "FWVersion", $fw);
+				addMAC("v", $mac);
+				addKeyValue("v","RunMode",$modeText[$runmode]) if (defined $runmode);
+				addMessage("v","\n");
+			}
+		} # each
+		if ($version and $optAgentInfo) {
+			addMessage("m", " -") if (!$msg);
+			addKeyValue("m","Version",$version) if ($version !~ m/\s/);
+			addKeyLongValue("m","Version",$version) if ($version =~ m/\s/);
+			$main::verbose = 2 if ($main::verbose <= 2);
+			addExitCode(0);
+		} #found something
+	}
+} #primergyManagementBlade_MgmtBladeTable
+sub primergyManagementBlade_ID {
+	my $snmpOidBladeID = '.1.3.6.1.4.1.7244.1.1.1.3.5.1.0'; #s31SysChassisSerialNumber.0
+
+	my $serverID = simpleSNMPget($snmpOidBladeID,"BladeID");
+	addSerialIDs("n", $serverID, undef);
+} #
+sub primergyManagementBlade_AdminURL {
+	my $snmpOidAgentInfo = '.1.3.6.1.4.1.7244.1.1.1.1.'; #s31AgentInfo
+	my $snmpOidBladeAdmURL	= $snmpOidAgentInfo . '5.0';#s31AgentAdministrativeUrl.0
+	
+	my $admURL = trySNMPget($snmpOidBladeAdmURL,"AgentAdminURL");
+	addAdminURL("n",$admURL);
+} #
+sub primergyManagementBlade_ID_AdminURL {
+	my $snmpOidBladeID = '.1.3.6.1.4.1.7244.1.1.1.3.5.1.0'; #s31SysChassisSerialNumber.0
+
+	my $snmpOidAgentInfo = '.1.3.6.1.4.1.7244.1.1.1.1.'; #s31AgentInfo
+	my $snmpOidBladeAdmURL	= $snmpOidAgentInfo . '5.0';#s31AgentAdministrativeUrl.0
+	
+	my $serverID = simpleSNMPget($snmpOidBladeID,"BladeID");
+	my $admURL = trySNMPget($snmpOidBladeAdmURL,"AgentAdminURL");
+	addSerialIDs("n", $serverID, undef);
+	addAdminURL("n",$admURL);
+} #primergyManagementBlade_ID_AdminURL
+sub primergyManagementBladeNotifyData {
+	primergyManagementBlade_ID();
+	RFC1213sysinfoToLong();
+	primergyManagementBlade_AdminURL();
+}
+sub primergyManagementBlade {
+	############# 
+	my %bladeErrorCodeMap = (	0 => 3,
+					1 => 3,
+					2 => 0,
+					3 => 1,
+					4 => 2);
+
+	my $snmpOidBladeStatus = '.1.3.6.1.4.1.7244.1.1.1.3.1.5.0'; #s31SysCtrlOverallStatus.0
+	my $snmpOidBladeID = '.1.3.6.1.4.1.7244.1.1.1.3.5.1.0'; #s31SysChassisSerialNumber.0
+	my $snmpOidS31Test = $snmpOidBladeID;
+
+	my $snmpOidBladeCtrlOverall = '.1.3.6.1.4.1.7244.1.1.1.3.1.5.0'; #s31SysCtrlOverallStatus.0
+	my $snmpOidAgentInfo = '.1.3.6.1.4.1.7244.1.1.1.1.'; #s31AgentInfo
+	my $snmpOidBladeAdmURL	= $snmpOidAgentInfo . '5.0';#s31AgentAdministrativeUrl.0
+	#my $snmpOidAgentName	= $snmpOidAgentInfo . '9.0';#s31AgentName.0 ... see RFC1213
+
+	#------------------------------------------------------
+	mibTestSNMPget($snmpOidS31Test,"PRIMERGY Blade");
+	# get overall status
+	my $bladestatus = simpleSNMPget($snmpOidBladeStatus,"BladeStatus");
+	$bladestatus = 0 if (!defined $bladestatus or $bladestatus < 0 or $bladestatus > 4);
+	$exitCode = $bladeErrorCodeMap{$bladestatus} if ($optChkSystem);
+
+	# get ServerID
+	{ 
+		$serverID = simpleSNMPget($snmpOidBladeID,"BladeID");
+		$msg .= " -";
+		#msg .= " - ID=" . $serverID;
+		addSerialIDs("m", $serverID, undef) if (defined $optChkSystem);
+		addSerialIDs("n", $serverID, undef);
+	}
+	#### TEXT LANGUAGE AWARENESS
+	# get subsystem information
+	$msg .= " -";
+
+	primergyManagementBladeEnvironment();
+
+	primergyManagementBladePowerSupply();
+
+	# get power consumption if enabled
+	primergyManagementBladePowerConsumption();
+	
+	if ($exitCode == 1 or $exitCode == 2 or $main::verbose >= 1) {
+		my $admURL = trySNMPget($snmpOidBladeAdmURL,"AgentAdminURL");
+		RFC1213sysinfoToLong();
+		addAdminURL("n",$admURL);
+	}
+	if (defined $optChkSystem) { 
+		if (($main::verbose >= 1)
+		||  (  (($exitCode == 1) || ($exitCode == 2)) 
+		    && ($overallFan < $exitCode) && ($overallTemp < $exitCode) && ($overallPS < $exitCode)
+		    )
+		) {
+			my $oCtrl = simpleSNMPget($snmpOidBladeCtrlOverall,"ControlOverall");
+			$oCtrl = 0 if (!defined $oCtrl or $oCtrl < 0 or $oCtrl > 4);
+			my $overallCtrl = $bladeErrorCodeMap{$oCtrl};
+			#msg .= ' - SystemControl(' . $s31OverallStatusText[$oCtrl] . ')';
+			addComponentStatus("m","SystemControl",$s31OverallStatusText[$oCtrl]);
+			$longMessage .= "- Hint: Please check the status on the system itself or via administrative url - "
+				if (($exitCode == 1 or $exitCode == 2)
+				and !$overallFan and !$overallTemp and !$overallPS);
+			#addKeyLongValue("l","\tHint","Please check status information via Administrative Url")
+			if ((($exitCode == 1) || ($exitCode == 2))
+			&& ($overallCtrl == 0)
+			) {
+				#msg .= ' - BladesInside(' . $state[$exitCode] . ')'; 
+				# never reached point
+				addComponentStatus("m","BladesInside",$state[$exitCode]);
+			}
+		} # verbose or search-not-ok
+	} #optChkSystem
+
+	primergyManagementBlade_MgmtBladeTable();
+} # end primergyManagementBlade
+
+#----------- PRIMERGY Blade - sub blade functions
+sub primergyFSIOMBlade {
+	my $snmpOidBladeFsiom		= '.1.3.6.1.4.1.7244.1.1.1.3.8.'; #s31SysFsiom
+	my $snmpOidState		= $snmpOidBladeFsiom . '1.0'; #s31SysFsiomStatus.0 
+	my $snmpOidProduct		= $snmpOidBladeFsiom . '3.0'; #s31SysFsiomProductName.0
+	my $snmpOidSerial		= $snmpOidBladeFsiom . '5.0'; #s31SysFsiomSerialNumber.0
+	my $snmpOidModel		= $snmpOidBladeFsiom . '9.0'; #s31SysFsiomModelName.0
+	# '7.0' s31SysFsiomConnectionStatus
+	# '8,0' s31SysFsiomConnectionTarget
+	# unknown(1), ok(2), not-present(3), error(4), critical(5)
+	my %bladeFsiomErrorCodeMap = (	0 => 3,
+					1 => 3,
+					2 => 0,
+					3 => 3,
+					4 => 1,
+					5 => 2);
+	my @statusText = ("none",
+		"unknown", "ok", "not-present", "error", "critical",
+		"..unexpected..",
+	);
+	my $overallFsiom = undef;
+	my $tmpOverallFsiom = trySNMPget($snmpOidState,"FsiomOverall");
+	$tmpOverallFsiom = 0 if (!defined $tmpOverallFsiom or $tmpOverallFsiom < 0 or $tmpOverallFsiom > 5);
+	if ($tmpOverallFsiom) {
+		$overallFsiom = $bladeFsiomErrorCodeMap{$tmpOverallFsiom};
+	}
+	if (($tmpOverallFsiom) && $overallFsiom != 3) { # not "not-present" or "unknown"
+		#msg .= ' FSIOM(' . $statusText[$tmpOverallFsiom] . ')';
+		addComponentStatus("m","FSIOM", $statusText[$tmpOverallFsiom]);
+	}
+	# return code
+	if (defined $overallFsiom ) {
+		my $serial = undef;
+		my $product = undef;
+		my $model = undef;
+		my $getinfos = 0;
+		my $verbose = 0;
+		my $notify = 0;
+		$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+		$notify = 1 if ($overallFsiom == 5 or $overallFsiom == 4);
+		$getinfos = 1 if ($verbose or $notify);
+		if ($getinfos) {
+			$serial = trySNMPget($snmpOidSerial,"FsiomSerialNumber");
+			$product = trySNMPget($snmpOidProduct,"FsiomProduct");
+			$model = trySNMPget($snmpOidModel,"FsiomModel");
+		}
+		if ($verbose) {
+			addStatusTopic("v",$statusText[$tmpOverallFsiom], "FSIOM", undef);
+			addSerialIDs("v",$serial, undef);
+			addProductModel("v",$product, $model);
+			endVariableVerboseMessageLine();
+		}
+		elsif ($notify) {
+			addStatusTopic("l",$statusText[$tmpOverallFsiom], "FSIOM", undef);
+			addSerialIDs("l",$serial, undef);
+			addProductModel("l",$product, $model);
+			endLongMessageLine();
+		}
+		# return codes
+		$exitCode = 0 if ($exitCode == 3);# reset default
+		if (($overallFsiom == 4) && ($exitCode < 1)) { #nagios warning 
+			$exitCode = 1;
+		}
+		if (($overallFsiom == 5) && ($exitCode < 2)) { #nagios critical 
+			$exitCode = 2;
+		}
+	}
+} #end primergyFSIOMBlade
+sub primergyServerBlades {
+	############# 
+	my $snmpOidSrvBlade	= '.1.3.6.1.4.1.7244.1.1.1.4.'; #s31ServerBlade
+
+	my $snmpOidSrvCtrlTable	= $snmpOidSrvBlade . '1.1.1.'; #s31SvrCtrlTable
+	my $snmpOidAdmURL	= $snmpOidSrvCtrlTable . '4'; #s31SvrCtrlAdministrativeUrl.<id>
+
+	my $snmpOidSrvBladeTable = $snmpOidSrvBlade . '2.1.1.'; #s31SvrBladeTable
+	my $snmpOidStatus		= $snmpOidSrvBladeTable . '2'; #s31SvrBladeStatus
+	my $snmpOidSerial		= $snmpOidSrvBladeTable . '5'; #s31SvrBladeSerialNumber
+	my $snmpOidProduct		= $snmpOidSrvBladeTable . '6'; #s31SvrBladeProductName
+	my $snmpOidModel		= $snmpOidSrvBladeTable . '7'; #s31SvrBladeModelName
+	my $snmpOidIDSerial		= $snmpOidSrvBladeTable . '17'; #s31SvrBladeIdentSerialNumber
+	my $snmpOidHostName		= $snmpOidSrvBladeTable . '21'; #s31SvrHostname
+	#s31SvrBladeCustomerProductName 22
+	my @bladeSrvBladeTableChecks = (
+		$snmpOidStatus,
+		$snmpOidSerial,
+		$snmpOidProduct,
+		$snmpOidModel,
+		$snmpOidIDSerial,
+		$snmpOidHostName,
+	);
+	my @cntSrvBladesCodes = ( -1, 0,0,0,0,0,0, 0 );
+	my @verboseSrvBladeStatusText = ( "none", 
+		"unknown","ok","not-present","error","critical",
+		"standby", "..unexpected..",
+	);
+
+	my $snmpOidSrvNicInfoTable = $snmpOidSrvBlade . '7.1.1.'; #s31SvrNicInfoTable
+	my $snmpOidNICPhyAddress	= $snmpOidSrvNicInfoTable . '3'; #s31SvrNicPhysicalAddress
+	my $snmpOidNICIP		= $snmpOidSrvNicInfoTable . '4'; #s31SvrNicIpAddress
+	my $snmpOidNICType		= $snmpOidSrvNicInfoTable . '6'; #s31SvrNicType
+	my @nicInfoTableChecks = (
+		$snmpOidNICPhyAddress, $snmpOidNICIP, $snmpOidNICType,
+	);
+	my @nicInfoTypeText = ( "none",
+		"unknown", "on-board-lan-controller", "daughter-card", "baseboard-management-controller", "..unexpected..",
+	);
+		
+	#------------------------------------------------------
+
+	my $srvBladesData = getSNMPtable(\@bladeSrvBladeTableChecks);
+
+	my $snmpKey = undef;
+	my @listOfErrorServer = ();
+
+	my $verbose = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	if (defined $srvBladesData) {
+		my @srvBladesEntries = ();
+		@srvBladesEntries = getSNMPTableIndex($srvBladesData, $snmpOidStatus, 1);
+
+		addTableHeader("v","Server Blades") if ($verbose);
+		foreach my $srvID (@srvBladesEntries) {
+			my $srvStatus  = $srvBladesData->{$snmpOidStatus . '.' . $srvID};
+			my $srvHostNm = $srvBladesData->{$snmpOidHostName . '.' . $srvID};
+			my $serial = $srvBladesData->{$snmpOidSerial . '.' . $srvID};
+			my $IDserial = $srvBladesData->{$snmpOidIDSerial . '.' . $srvID};
+			my $product = $srvBladesData->{$snmpOidProduct . '.' . $srvID};
+			my $model = $srvBladesData->{$snmpOidModel . '.' . $srvID};
+			$srvStatus = 0 if (!defined $srvStatus or $srvStatus < 0);
+			$srvStatus = 7 if ($srvStatus > 7);
+
+			my $admURL = trySNMPget($snmpOidAdmURL . '.' . $srvID,"SrvBlade-AdminURL");
+			if ((defined $admURL) && ($admURL !~ m/http/)) {
+			    $admURL = undef;
+			}
+			if ($verbose) {
+				addStatusTopic("v",$verboseSrvBladeStatusText[$srvStatus],"Server", $srvID);
+				addSerialIDs("v",$serial, $IDserial);
+				addHostName("v",$srvHostNm);
+				addAdminURL("v",$admURL);
+				addProductModel("v",$product, $model);
+				endVariableVerboseMessageLine();
+			}
+			$cntSrvBladesCodes[$srvStatus]++ if ($srvStatus and $srvStatus != 7);
+			if (($srvStatus == 4 or $srvStatus == 5) and !$verbose ) {
+				addStatusTopic("l",$verboseSrvBladeStatusText[$srvStatus], 
+					"Server", $srvID);
+				addSerialIDs("l",$serial, $IDserial);
+				addHostName("l",$srvHostNm);
+				addAdminURL("l",$admURL);
+				addProductModel("l",$product, $model);
+				endLongMessageLine();
+				push(@listOfErrorServer, $srvID);
+			}
+		}
+		# output
+		#msg .= " Server";
+		addTopicStatusCount("m", "Server");
+		for (my $i=1;$i < 7;$i++) {
+			#msg .= "-$verboseSrvBladeStatusText[$i]($cntSrvBladesCodes[$i])"	
+			#	if ($cntSrvBladesCodes[$i]);
+			addStatusCount("m", $verboseSrvBladeStatusText[$i], $cntSrvBladesCodes[$i]);
+		}
+		# return code
+		if (($exitCode == 3) 
+		&& (  $cntSrvBladesCodes[2] || $cntSrvBladesCodes[3] || $cntSrvBladesCodes[4]
+		   || $cntSrvBladesCodes[5] || $cntSrvBladesCodes[6])
+		) { # reset default
+		    $exitCode = 0;
+		}
+		if ($cntSrvBladesCodes[4] && $exitCode < 1) { #nagios warning 
+			$exitCode = 1;
+		}
+		if ($cntSrvBladesCodes[5] && $exitCode < 2) { #nagios critical 
+			$exitCode = 2;
+		}
+	} elsif (defined $optBladeSrv and $optBladeSrv != 999) {
+		$msg .= "-No ServerBlades- ";
+	}
+	# NIC
+	if (defined $srvBladesData and ($verbose or $#listOfErrorServer >= 0)) {
+		my $nicInfoEntries = getSNMPtable(\@nicInfoTableChecks);
+		my @snmpKeys = ();
+		@snmpKeys = getSNMPTableIndex($nicInfoEntries, $snmpOidNICIP, 2);
+		my $saveSrvId = 0;
+		my $foundSrvID = 0;
+		addTableHeader("v","Server Blade NIC Table") if ($verbose);
+		foreach my $snmpID (@snmpKeys) {
+			my $phyAddress  = $nicInfoEntries->{$snmpOidNICPhyAddress . '.' . $snmpID};
+			my $ip  = $nicInfoEntries->{$snmpOidNICIP . '.' . $snmpID};
+			my $type  = $nicInfoEntries->{$snmpOidNICType . '.' . $snmpID};
+			$ip = undef if ($ip and $ip =~ m/0\.0\.0\.0/);
+			$snmpID =~ m/(.*)\.(.*)/;
+			$type = 0 if (!defined $type or $type < 0);
+			$type = 5 if ($type > 5);
+			my $srvID = $1;
+			my $nicIndex = $2;
+			if ($saveSrvId != $srvID and $#listOfErrorServer >= 0) {
+				$foundSrvID = 0;
+				foreach my $chkid (@listOfErrorServer) {
+					$foundSrvID = 1 if ($chkid == $srvID);
+				}
+			}
+			if (defined $ip or $nicIndex == 1) {
+				addStatusTopic("v",undef,"ServerNicInfo", $snmpID);
+				#addKeyValue("v","PhysicalAddress", $phyAddress);
+				addMAC("v", $phyAddress);
+				addIP("v",$ip);
+				addKeyValue("v","Type",$nicInfoTypeText[$type]) if ($type);
+				$variableVerboseMessage .= "\n";
+			}
+			if (!$verbose and $foundSrvID and $ip) {
+				addStatusTopic("l",undef,"ServerNicInfo", $snmpID);
+				#addKeyValue("l","PhysicalAddress", $phyAddress);
+				addMAC("l", $phyAddress);
+				addIP("l",$ip);
+				addKeyValue("l","Type",$nicInfoTypeText[$type]) if ($type);
+				$longMessage .= "\n";
+			}
+			$saveSrvId = $srvID;
+		}
+	} #verbose
+	chomp($msg);
+} # end primergyServerBlades
+sub primergySwitchBlades {
+	############# 
+	my $snmpOidSwBladeTable = '.1.3.6.1.4.1.7244.1.1.1.5.1.1.'; #s31SwitchBladeTable
+	my $snmpOidStatus		= $snmpOidSwBladeTable . '2'; #s31SwitchBladeStatus
+	my $snmpOidSerial		= $snmpOidSwBladeTable . '5'; #s31SwitchBladeSerialNumber
+	my $snmpOidProduct		= $snmpOidSwBladeTable . '6'; #s31SwitchBladeProductName
+	my $snmpOidModel		= $snmpOidSwBladeTable . '7'; #s31SwitchBladeModelName
+	my $snmpOidIPAddr		= $snmpOidSwBladeTable . '10'; #s31SwitchBladeIpAddress
+	#my $snmpOidAdmURL		= $snmpOidSwBladeTable . '11'; #s31SwitchBladeAdministrativeUrl
+	# ... similar to IP
+	my $snmpOidAssignedName		= $snmpOidSwBladeTable . '28'; #s31SwitchBladeUserAssignedName
+	my $snmpOidIDSerial		= $snmpOidSwBladeTable . '29'; #s31SwitchBladeIdentSerialNumber
+		# ATTENTION - IdentSerialNumber might be not available !
+	my @bladeSwBladeTableChecks = (
+		$snmpOidStatus,
+		$snmpOidSerial,
+		$snmpOidProduct,
+		$snmpOidModel,
+		$snmpOidIPAddr,
+		$snmpOidAssignedName,
+	);
+	my @cntSwBladesCodes = ( -1, 0,0,0,0,0,0,0, 0,);
+	my @verboseSwBladeStatusText = ( "none", 
+		"unknown","ok","not-present","error","critical",
+		"standby","present", "..unexpected..",
+	);
+
+	#------------------------------------------------------
+
+	my $swBladesData = getSNMPtable(\@bladeSwBladeTableChecks);
+
+	if (defined $swBladesData) {
+		my @swBladesKeys = ();
+		@swBladesKeys = getSNMPTableIndex($swBladesData, $snmpOidStatus, 1);
+
+		my $verbose = 0;
+		$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+		addTableHeader("v","Switch Blades") if ($verbose);
+		foreach my $swID (@swBladesKeys) {
+			my $swStatus  = $swBladesData->{$snmpOidStatus . '.' . $swID};
+ 			my $swIP = $swBladesData->{$snmpOidIPAddr . '.' . $swID};
+ 			my $serial = $swBladesData->{$snmpOidSerial . '.' . $swID};
+ 			my $product = $swBladesData->{$snmpOidProduct . '.' . $swID};
+ 			my $model = $swBladesData->{$snmpOidModel . '.' . $swID};
+ 			my $swUserName = $swBladesData->{$snmpOidAssignedName . '.' . $swID};
+			my $IDserial = trySNMPget($snmpOidIDSerial . '.' . $swID,"IndentSerialNumber");
+			$swStatus = 0 if (!defined $swStatus or $swStatus < 0);
+			$swStatus = 8 if ($swStatus > 8);
+			if ($verbose) {
+				addStatusTopic("v",$verboseSwBladeStatusText[$swStatus], "Switch", $swID);
+				addSerialIDs("v",$serial, $IDserial);
+				addIP("v",$swIP);
+				addName("v",$swUserName);
+				addProductModel("v",$product, $model);
+				endVariableVerboseMessageLine();
+			}
+			$cntSwBladesCodes[$swStatus]++ if ($swStatus);
+			if ((($swStatus == 4) || ($swStatus == 5)) &&  !$verbose ) {
+				addStatusTopic("l",$verboseSwBladeStatusText[$swStatus], 
+					"Switch", $swID);
+				addSerialIDs("l",$serial, $IDserial);
+				addIP("l",$swIP);
+				addName("l",$swUserName);
+				addProductModel("l",$product, $model);
+				endLongMessageLine();
+			}
+		}
+		# output
+		#msg .= " Switch";
+		addTopicStatusCount("m", "Switch");
+		for (my $i=1;$i < 8;$i++) {
+			#msg .= "-$verboseSwBladeStatusText[$i]($cntSwBladesCodes[$i])"	
+			#	if ($cntSwBladesCodes[$i]);
+			addStatusCount("m", $verboseSwBladeStatusText[$i], $cntSwBladesCodes[$i]);
+		}
+		# return code
+		if (($exitCode == 3) 
+		&& (  $cntSwBladesCodes[2] || $cntSwBladesCodes[3] || $cntSwBladesCodes[4]
+		   || $cntSwBladesCodes[5] || $cntSwBladesCodes[6] || $cntSwBladesCodes[7])
+		) { # reset default
+		    $exitCode = 0;
+		}
+		if ($cntSwBladesCodes[4] && $exitCode < 1) { #nagios warning 
+			$exitCode = 1;
+		}
+		if ($cntSwBladesCodes[5] && $exitCode < 2) { #nagios critical 
+			$exitCode = 2;
+		}
+	} elsif (defined $optBladeIO_Switch) {
+		$msg .= "-No Switch Blades- ";
+	}
+
+	chomp($msg);
+} # end primergySwitchBlades
+sub primergyFiberChannelPassThroughBlades { # TODO - Blades with primergyFiberChannelPassThroughBlades
+	############# 
+	my $snmpOIDFcPTVoltageTable = '1.3.6.1.4.1.7244.1.1.1.8.1.1.1.'; #s31FcPassThroughBladeVoltageTable
+	#### QUESTION s31FcPassThroughBladeVoltageTable
+	my $snmpOIDFcPTPortsTable = '1.3.6.1.4.1.7244.1.1.1.8.1.3.1.'; #s31FcPassThroughBladePortsTable
+	#### QUESTION s31FcPassThroughBladePortsTable
+	my $snmpOIDFcPTInfoTable = '1.3.6.1.4.1.7244.1.1.1.8.1.2.1.'; #s31FcPassThroughBladeInfoTable
+	my $snmpOIDInfoStatus = $snmpOIDFcPTInfoTable . '2'; #s31FcPassThroughBladeInfoStatus
+	my $snmpOIDSerial	= $snmpOIDFcPTInfoTable . '5'; #s31FcPassThroughBladeInfoSerialNumber
+	my $snmpOIDFcPTInfoWwnn = $snmpOIDFcPTInfoTable . '9'; #s31FcPassThroughBladeActiveWwnn
+	my $snmpOIDFcPTInfoWwpn = $snmpOIDFcPTInfoTable . '10'; #s31FcPassThroughBladeActiveWwpn	
+	my $snmpOIDSlot		= $snmpOIDFcPTInfoTable . '14'; #s31FcPassThroughBladeSlotId	
+	my $snmpOIDIdSerial	= $snmpOIDFcPTInfoTable . '16'; #s31FcPassThroughBladeInfoIdentSerialNumber	
+	my @bladeFcPTInfoTableChecks = (
+		$snmpOIDInfoStatus,
+		$snmpOIDFcPTInfoWwnn,
+		$snmpOIDFcPTInfoWwpn,
+		$snmpOIDSerial,
+		$snmpOIDSlot,
+ 	);
+	#### TODO Which Information is relevant/interesting for the customer ?
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0, );
+	my @verboseStatusText = ( "none", 
+		"unknown","ok","not-present","error","critical",
+		"standby", "..unexpected..", 
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeFcPTInfoTableChecks);
+
+	if (defined $entries) {
+		#$msg .= "-FOUND FiberChannelPassThrough Blades-";
+		my @bladesKeys = ();
+		@bladesKeys = getSNMPTableIndex($entries, $snmpOIDInfoStatus, 1);
+
+		addTableHeader("v","Fiber Channel Pass Through Switch Blades");
+ 		foreach my $bladeID (@bladesKeys) {
+ 			my $status  = $entries->{$snmpOIDInfoStatus . '.' . $bladeID};
+			my $slotid = $entries->{$snmpOIDSlot . '.' . $bladeID};
+ 			my $serial = $entries->{$snmpOIDSerial . '.' . $bladeID};
+			my $IDserial = trySNMPget($snmpOIDIdSerial . '.' . $bladeID,"IdentSerialNumber");
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 7 if ($status > 7);
+			addStatusTopic("v",$verboseStatusText[$status], "FCPT", $bladeID);
+			addSerialIDs("v",$serial, $IDserial);
+			addSlotID("v",$slotid);
+			endVariableVerboseMessageLine();
+ 			$cntCodes[$status]++;
+ 			if ((($status == 4) || ($status == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$status], "FCPT", $bladeID);
+				addSerialIDs("l",$serial, $IDserial);
+				addSlotID("l",$slotid);
+				endLongMessageLine();
+ 			}
+ 		}
+		# output
+		addTopicStatusCount("m","Fiber Channel Pass Through Switch");
+ 		for (my $i=1;$i < 7;$i++) {
+			addStatusCount("m",$verboseStatusText[$i], $cntCodes[$i]);
+ 		}
+		# return code
+ 		if (($exitCode == 3) 
+ 		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+ 		   || $cntCodes[5] || $cntCodes[6])
+ 		) { # reset default
+ 		    $exitCode = 0;
+ 		}
+ 		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+ 			$exitCode = 1;
+ 		}
+ 		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+ 			$exitCode = 2;
+ 		}
+	} elsif (defined $optBladeIO_FCPT) {
+		$msg .= "-No FiberChannelPassThrough Blades- ";
+	}
+
+	chomp($msg);
+} # end primergyFiberChannelPassThroughBlades
+sub primergyPhyBlades {
+	############# Pass Through Blades
+	my $snmpOIDPhyBladeTable = '1.3.6.1.4.1.7244.1.1.1.10.1.1.'; #s31PhyBladeTable
+	my $snmpOIDSerial		= $snmpOIDPhyBladeTable . '4'; #s31PhyBladeSerialNumber
+	my $snmpOIDProduct		= $snmpOIDPhyBladeTable . '5'; #s31PhyBladeProductName
+	my $snmpOIDStatus		= $snmpOIDPhyBladeTable . '9'; #s31PhyBladeStatus
+	my $snmpOIDIdSerial		= $snmpOIDPhyBladeTable . '11'; #s31PhyBladeIdentSerialNumber
+	my @bladeTableChecks = (
+		$snmpOIDSerial,
+		$snmpOIDProduct,
+		$snmpOIDStatus,
+ 	);
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0,);
+	my @verboseStatusText = ( "none", 
+		"unknown","ok","not-present","error","critical",
+		"standby", "..unexpected..", 
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeTableChecks);
+
+	if (defined $entries) {
+ 		my @swBladesKeys = ();
+		@swBladesKeys = getSNMPTableIndex($entries, $snmpOIDStatus, 1);
+
+		addTableHeader("v","LAN Pass Through Blades");
+ 		foreach my $swID (@swBladesKeys) {
+ 			my $swStatus  = $entries->{$snmpOIDStatus . '.' . $swID};
+ 			my $product = $entries->{$snmpOIDProduct . '.' . $swID};
+ 			my $serial = $entries->{$snmpOIDSerial . '.' . $swID};
+ 			my $IDserial = trySNMPget($snmpOIDIdSerial . '.' . $swID,"IndentSerialNumber");
+			$swStatus = 0 if (!defined $swStatus or $swStatus < 0);
+			$swStatus = 7 if ($swStatus > 7);
+ 			addStatusTopic("v",$verboseStatusText[$swStatus], "LANPT", $swID, );
+			addSerialIDs("v",$serial, $IDserial);
+			addProductModel("v",$product, undef);
+			endVariableVerboseMessageLine();
+			$cntCodes[$swStatus]++;
+ 			if ((($swStatus == 4) || ($swStatus == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$swStatus], "LANPT", $swID);
+				addSerialIDs("l",$serial, $IDserial);
+				addProductModel("l",$product, undef);
+				endLongMessageLine();
+ 			}
+		}
+		# output
+ 		#msg .= " LAN Pass Through Blades";
+		addTopicStatusCount("m", "LAN Pass Through Blades");
+ 		for (my $i=1;$i < 8;$i++) {
+ 			#msg .= "-$verboseStatusText[$i]($cntCodes[$i])"	
+ 			#	if ($cntCodes[$i]);
+			addStatusCount("m", $verboseStatusText[$i], $cntCodes[$i]);
+ 		}
+		# return code
+ 		if (($exitCode == 3) 
+ 		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+ 		   || $cntCodes[5] || $cntCodes[6] )
+ 		) { # reset default
+ 		    $exitCode = 0;
+ 		}
+ 		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+ 			$exitCode = 1;
+ 		}
+ 		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+ 			$exitCode = 2;
+ 		}
+	} elsif (defined $optBladeIO_Phy) {
+		$msg .= "-No LAN Pass Through Blades- ";
+	}
+
+	chomp($msg);
+} # end primergyPhyBlades
+sub primergyFCSwitchBlades {
+	############# 
+	my $snmpOIDFCSwitchBladeTable = '1.3.6.1.4.1.7244.1.1.1.12.1.1.'; #s31FCSwitchBladeTable
+	my $snmpOIDSerial	= $snmpOIDFCSwitchBladeTable . '4'; #s31FCSwitchBladeSerialNumber
+	my $snmpOIDProduct	= $snmpOIDFCSwitchBladeTable . '5'; #s31FCSwitchBladeProductName
+	my $snmpOIDModel	= $snmpOIDFCSwitchBladeTable . '6'; #s31FCSwitchBladeModelName
+	my $snmpOIDIpAddress	= $snmpOIDFCSwitchBladeTable . '8'; #s31FCSwitchBladeIpAddress
+	#my $snmpOIDFcIpAddress	= $snmpOIDFCSwitchBladeTable . '11'; #s31FCSwitchBladeFcIpAddress
+	#my $snmpOIDFcName	= $snmpOIDFCSwitchBladeTable . '13'; #s31FCSwitchBladeFcSwitchName
+	my $snmpOIDSlotId	= $snmpOIDFCSwitchBladeTable . '15'; #s31FCSwitchBladeSlotId
+	my $snmpOIDStatus	= $snmpOIDFCSwitchBladeTable . '17'; #s31FCSwitchBladeStatus
+	#my $snmpOIDAdmURL	= $snmpOIDFCSwitchBladeTable . '18'; #s31FCSwitchBladeAdministrativeURL
+	# ... see ipaddr
+	my $snmpOIDIdSerial	= $snmpOIDFCSwitchBladeTable . '23'; #s31FCSwitchBladeIdentSerialNumber
+		# ATTENTION - IdentSerialNumber might be not available !
+	my @bladeTableChecks = (
+		$snmpOIDSerial,
+		$snmpOIDProduct,
+		$snmpOIDModel,
+		$snmpOIDIpAddress,
+	#	$snmpOIDFcIpAddress,
+	#	$snmpOIDFcName,
+		$snmpOIDSlotId,
+		$snmpOIDStatus,
+	);
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0, );
+	my @verboseStatusText = ( "none", 
+		"unkown","ok","not-present","error","critical",
+		"standby", "..unexpected..",
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeTableChecks);
+
+	if (defined $entries) {
+		my @bladesKeys = ();
+		@bladesKeys = getSNMPTableIndex($entries, $snmpOIDStatus, 1);
+
+		addTableHeader("v","Fiber Channel Switch Blades");
+ 		foreach my $bladeID (@bladesKeys) {
+ 			my $status  = $entries->{$snmpOIDStatus . '.' . $bladeID};
+ 			my $ipaddr = $entries->{$snmpOIDIpAddress . '.' . $bladeID};
+ 			my $product = $entries->{$snmpOIDProduct . '.' . $bladeID};
+ 			my $model = $entries->{$snmpOIDModel . '.' . $bladeID};
+			my $slotid = $entries->{$snmpOIDSlotId . '.' . $bladeID};
+ 			my $serial = $entries->{$snmpOIDSerial . '.' . $bladeID};
+			my $IDserial = trySNMPget($snmpOIDIdSerial . '.' . $bladeID,"IdentSerialNumber");
+ 			$status = 0 if (!defined $status or $status < 0);
+			$status = 7 if ($status > 7);
+			addStatusTopic("v",$verboseStatusText[$status], "FCSwitch", $bladeID);
+			addSerialIDs("v",$serial, $IDserial);
+			addSlotID("v",$slotid);
+			addIP("v",$ipaddr);
+			addProductModel("v",$product, $model);
+			endVariableVerboseMessageLine();
+ 			$cntCodes[$status]++;
+ 			if ((($status == 4) || ($status == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$status], "FCSwitch", $bladeID);
+				addSerialIDs("l",$serial, $IDserial);
+				addSlotID("l",$slotid);
+				addIP("l",$ipaddr);
+				addProductModel("l",$product, $model);
+				endLongMessageLine();
+ 			}
+ 		}
+		# output
+ 		#msg .= " Fiber Channel Switch";
+		addTopicStatusCount("m", "Fiber Channel Switch");
+ 		for (my $i=1;$i < 7;$i++) {
+ 			#msg .= "-$verboseStatusText[$i]($cntCodes[$i])"	
+ 			#	if ($cntCodes[$i]);
+			addStatusCount("m", $verboseStatusText[$i], $cntCodes[$i]);
+ 		}
+		# return code
+ 		if (($exitCode == 3) 
+ 		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+ 		   || $cntCodes[5] || $cntCodes[6])
+ 		) { # reset default
+ 		    $exitCode = 0;
+ 		}
+ 		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+ 			$exitCode = 1;
+ 		}
+ 		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+ 			$exitCode = 2;
+ 		}
+	} elsif (defined $optBladeIO_FCSwitch) {
+		$msg .= "-No Fiber Channel Switch Blades- ";
+	}
+
+	chomp($msg);
+} # end primergyFCSwitchBlades
+sub primergyIBSwitchBlades { #TODO - Blades with primergyIBSwitchBlades
+	############# Infiniband Switch Blades
+	my $snmpOIDIBSwitchBladeTable = '1.3.6.1.4.1.7244.1.1.1.16.1.1.'; #s31IBSwitchBladeTable
+	my $snmpOIDSerialNr	= $snmpOIDIBSwitchBladeTable . '4'; #s31IBSwitchBladeSerialNumber
+	my $snmpOIDProduct	= $snmpOIDIBSwitchBladeTable . '5'; #s31IBSwitchBladeProductName
+	my $snmpOIDModel	= $snmpOIDIBSwitchBladeTable . '6'; #s31IBSwitchBladeModelName
+	my $snmpOIDIpAddress	= $snmpOIDIBSwitchBladeTable . '8'; #s31IBSwitchBladeIpAddress
+	my $snmpOIDSlotId	= $snmpOIDIBSwitchBladeTable . '11'; #s31IBSwitchBladeSlotId
+	my $snmpOIDStatus	= $snmpOIDIBSwitchBladeTable . '13'; #s31IBSwitchBladeStatus
+	my $snmpOIDAdmURL	= $snmpOIDIBSwitchBladeTable . '14'; #s31IBSwitchBladeAdministrativeURL
+	my $snmpOIDIdSerial	= $snmpOIDIBSwitchBladeTable . '19'; #s31IBSwitchBladeIdentSerialNumber
+	my @bladeTableChecks = (
+		$snmpOIDSerialNr,
+		$snmpOIDProduct,
+		$snmpOIDModel,
+		$snmpOIDIpAddress,
+		$snmpOIDSlotId,
+		$snmpOIDStatus,
+		$snmpOIDAdmURL,
+	);
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0,);
+	my @verboseStatusText = ( "none", 
+		"unkown","ok","not-present","error","critical",
+		"standby", "..unexpected..", 
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeTableChecks);
+
+	if (defined $entries) {
+		#$msg .= "-FOUND Infiniband Switch Blades- ";
+		my @bladesKeys = ();
+		@bladesKeys = getSNMPTableIndex($entries, $snmpOIDStatus, 1);
+
+		addTableHeader("v","Infiniband Switch Blades");
+ 		foreach my $bladeID (@bladesKeys) {
+ 			my $status  = $entries->{$snmpOIDStatus . '.' . $bladeID};
+ 			my $ipaddr = $entries->{$snmpOIDIpAddress . '.' . $bladeID};
+ 			my $product = $entries->{$snmpOIDProduct . '.' . $bladeID};
+ 			my $model = $entries->{$snmpOIDModel . '.' . $bladeID};
+			my $slotid = $entries->{$snmpOIDSlotId . '.' . $bladeID};
+ 			my $serial = $entries->{$snmpOIDSerialNr . '.' . $bladeID};
+			my $admURL = $entries->{$snmpOIDAdmURL . '.' . $bladeID};
+			my $IDserial = trySNMPget($snmpOIDIdSerial . '.' . $bladeID,"IdentSerialNumber");
+ 			$status = 0 if (!defined $status or $status < 0);
+			$status = 7 if ($status > 7);
+ 			addStatusTopic("v",$verboseStatusText[$status], "IBSwitch", $bladeID);
+			addSerialIDs("v",$serial, $IDserial);
+			addSlotID("v",$slotid);
+			addIP("v",$ipaddr);
+			addAdminURL("v",$admURL);
+			addProductModel("v",$product, $model);
+			endVariableVerboseMessageLine();
+ 			$cntCodes[$status]++;
+ 			if ((($status == 4) || ($status == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$status], "IBSwitch", $bladeID);
+				addSerialIDs("l",$serial, $IDserial);
+				addSlotID("l",$slotid);
+				addIP("l",$ipaddr);
+				addAdminURL("l",$admURL);
+				addProductModel("l",$product, $model);
+				endLongMessageLine();
+ 			}
+ 		}
+		# output
+		addTopicStatusCount("m","Infiniband Switch");
+ 		for (my $i=1;$i < 7;$i++) {
+
+			addStatusCount("m", $verboseStatusText[$i], $cntCodes[$i]);
+ 		}
+		# return code
+ 		if (($exitCode == 3) 
+ 		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+ 		   || $cntCodes[5] || $cntCodes[6])
+ 		) { # reset default
+ 		    $exitCode = 0;
+ 		}
+ 		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+ 			$exitCode = 1;
+ 		}
+ 		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+ 			$exitCode = 2;
+ 		}
+	} elsif (defined $optBladeIO_IBSwitch) {
+		$msg .= "-No Infiniband Switch Blades- ";
+	}
+
+	chomp($msg);
+} # end primergyIBSwitchBlades
+sub primergySASSwitchBlades {
+	############# Serial attached SCSI Switch Blade
+	my $snmpOIDSASSwitchBladeTable = '1.3.6.1.4.1.7244.1.1.1.17.1.1.'; #s31SASSwitchBladeTable
+	my $snmpOIDSerial	= $snmpOIDSASSwitchBladeTable . '4'; #s31SASSwitchBladeSerialNumber
+	my $snmpOIDProduct	= $snmpOIDSASSwitchBladeTable . '5'; #s31SASSwitchBladeProductName
+	my $snmpOIDModel	= $snmpOIDSASSwitchBladeTable . '6'; #s31SASSwitchBladeModelName
+	my $snmpOIDIpAddress	= $snmpOIDSASSwitchBladeTable . '8'; #s31SASSwitchBladeIpAddress
+	my $snmpOIDSlotId	= $snmpOIDSASSwitchBladeTable . '11'; #s31SASSwitchBladeSlotId
+	my $snmpOIDStatus	= $snmpOIDSASSwitchBladeTable . '13'; #s31SASSwitchBladeStatus
+	#my $snmpOIDAdmURL	= $snmpOIDSASSwitchBladeTable . '14'; #s31SASSwitchBladeAdministrativeURL
+	my $snmpOIDIDSerial	= $snmpOIDSASSwitchBladeTable . '20'; #s31SASSwitchBladeIdentSerialNumber
+		# ATTENTION - IdentSerialNumber might be not available !
+	my @bladeTableChecks = (
+		$snmpOIDSerial,
+		$snmpOIDProduct,
+		$snmpOIDModel,
+		$snmpOIDIpAddress,
+		$snmpOIDSlotId,
+		$snmpOIDStatus,
+	);
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0,);
+	my @verboseStatusText = ( "none", 
+		"unkown","ok","not-present","error","critical",
+		"standby", "..unexpected..",
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeTableChecks);
+	if (defined $entries) {
+ 		my @bladesKeys = ();
+		@bladesKeys = getSNMPTableIndex($entries, $snmpOIDStatus, 1);
+
+		addTableHeader("v","Serial Attached SCSI Switch Blades");
+  		foreach my $bladeID (@bladesKeys) {
+ 			my $status  = $entries->{$snmpOIDStatus . '.' . $bladeID};
+ 			my $ipAddr = $entries->{$snmpOIDIpAddress . '.' . $bladeID};
+ 			my $slot = $entries->{$snmpOIDSlotId . '.' . $bladeID};
+ 			my $serial = $entries->{$snmpOIDSerial . '.' . $bladeID};
+ 			my $model = $entries->{$snmpOIDModel . '.' . $bladeID};
+			my $product = $entries->{$snmpOIDProduct . '.' . $bladeID};
+ 			my $IDserial = trySNMPget($snmpOIDIDSerial . '.' . $bladeID,"IndentSerialNumber");
+  			$status = 0 if (!defined $status or $status < 0);
+			$status = 7 if ($status > 7);
+			addStatusTopic("v",$verboseStatusText[$status], "SASSwitch", $bladeID);
+			addSerialIDs("v",$serial, $IDserial);
+			addSlotID("v",$slot);
+			addIP("v",$ipAddr);
+			addProductModel("v",$product, $model);
+			endVariableVerboseMessageLine();
+ 			$cntCodes[$status]++;
+ 			if ((($status == 4) || ($status == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$status], "SASSwitch", $bladeID);
+				addSerialIDs("l",$serial, $IDserial);
+				addSlotID("l",$slot);
+				addIP("l",$ipAddr);
+				addProductModel("l",$product, $model);
+				endLongMessageLine();
+ 			}
+ 		}
+		# output
+ 		#msg .= " Serial Attached SCSI Switch";
+		addTopicStatusCount("m", "Serial Attached SCSI Switch");
+ 		for (my $i=1;$i < 7;$i++) {
+ 			#msg .= "-$verboseStatusText[$i]($cntCodes[$i])"	
+ 			#	if ($cntCodes[$i]);
+			addStatusCount("m", $verboseStatusText[$i], $cntCodes[$i]);
+ 		}
+		# return code
+ 		if (($exitCode == 3) 
+ 		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+ 		   || $cntCodes[5] || $cntCodes[6])
+ 		) { # reset default
+ 		    $exitCode = 0;
+ 		}
+ 		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+ 			$exitCode = 1;
+ 		}
+ 		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+ 			$exitCode = 2;
+ 		}
+	} elsif (defined $optBladeIO_SASSwitch) {
+		$msg .= "-No Serial Attached SCSI Switch Blades- ";
+	}
+
+	chomp($msg);
+} # end primergySASSwitchBlades
+sub primergyIOConnectionBlades {
+	if ((defined $optBladeIO_FSIOM) || ($optBladeIO != 999)) {
+		primergyFSIOMBlade();
+	}
+	if ((defined $optBladeIO_Switch) || ($optBladeIO != 999)) {
+		primergySwitchBlades();
+	}
+	if ((defined $optBladeIO_FCPT) || ($optBladeIO != 999)) {
+		primergyFiberChannelPassThroughBlades();
+	}
+	if ((defined $optBladeIO_Phy) || ($optBladeIO != 999)) {
+		primergyPhyBlades();
+	}
+	if ((defined $optBladeIO_FCSwitch) || ($optBladeIO != 999)) {
+		primergyFCSwitchBlades();
+	}
+	if ((defined $optBladeIO_IBSwitch) || ($optBladeIO != 999)) {
+		primergyIBSwitchBlades();
+	}
+	if ((defined $optBladeIO_SASSwitch) || ($optBladeIO != 999)) {
+		primergySASSwitchBlades();
+	}
+} # end primergyIOConnectionBlades
+sub primergyKVMBlades {
+	############# PRIMERGY BLADE SERVERBLADE OIDs 
+	my $snmpOIDKvmBladeTable = '1.3.6.1.4.1.7244.1.1.1.11.1.1.'; #s31KvmBladeTable
+	my $snmpOIDSerial	= $snmpOIDKvmBladeTable . '4'; #s31KvmBladeSerialNumber
+	my $snmpOIDProduct	= $snmpOIDKvmBladeTable . '5'; #s31KvmBladeProductName
+	my $snmpOIDModel	= $snmpOIDKvmBladeTable . '6'; #s31KvmBladeModelName
+	my $snmpOIDIpAddress	= $snmpOIDKvmBladeTable . '9'; #s31KvmBladeIpAddress
+	my $snmpOIDStatus	= $snmpOIDKvmBladeTable . '18'; #s31KvmBladeStatus
+	#my $snmpOIDAdmURL	= $snmpOIDKvmBladeTable . '19'; #s31KvmBladeAdministrativeURL
+	my @bladeTableChecks = (
+		$snmpOIDSerial,
+		$snmpOIDProduct,
+		$snmpOIDModel,
+		$snmpOIDIpAddress,
+		$snmpOIDStatus,
+	);
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0,);
+	my @verboseStatusText = ( "none", 
+		"unkown","ok","not-present","error","critical",
+		"standby", "..unexpected..",
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeTableChecks);
+
+	if (defined $entries) {
+ 		my @bladesKeys = ();
+		@bladesKeys = getSNMPTableIndex($entries, $snmpOIDStatus, 1);
+
+		addTableHeader("v","Key-Video-Mouse Blades");
+ 		foreach my $kvmID (@bladesKeys) {
+ 			my $kvmStatus  = $entries->{$snmpOIDStatus . '.' . $kvmID};
+ 			my $kvmIP = $entries->{$snmpOIDIpAddress . '.' . $kvmID};
+			my $kvmProduct = $entries->{$snmpOIDProduct . '.' . $kvmID};
+			my $model = $entries->{$snmpOIDModel . '.' . $kvmID};
+			my $serial = $entries->{$snmpOIDSerial . '.' . $kvmID};
+  			$kvmStatus = 0 if (!defined $kvmStatus or $kvmStatus < 0);
+			$kvmStatus = 7 if ($kvmStatus > 7);
+			addStatusTopic("v",$verboseStatusText[$kvmStatus], "KVM", $kvmID, );
+			addSerialIDs("v",$serial, undef);
+			addIP("v",$kvmIP);
+			addProductModel("v",$kvmProduct, $model);
+			endVariableVerboseMessageLine();
+			$cntCodes[$kvmStatus]++;
+			if ((($kvmStatus == 4) || ($kvmStatus == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$kvmStatus], "KVM", $kvmID);
+				addSerialIDs("l",$serial, undef);
+				addIP("l",$kvmIP);
+				addProductModel("l",$kvmProduct, $model);
+				endLongMessageLine();
+			}
+ 		}
+		# output
+		#msg .= " KVM";
+		addTopicStatusCount("m","KVM");
+		for (my $i=1;$i < 7;$i++) {
+			#msg .= "-$verboseStatusText[$i]($cntCodes[$i])"	
+			#	if ($cntCodes[$i]);
+			addStatusCount("m", $verboseStatusText[$i], $cntCodes[$i]);
+		}
+		# return code
+		if (($exitCode == 3) 
+		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+		   || $cntCodes[5] || $cntCodes[6])
+		) { # reset default
+		    $exitCode = 0;
+		}
+		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+			$exitCode = 1;
+		}
+		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+			$exitCode = 2;
+		}
+	} elsif (defined $optBladeKVM and $optBladeKVM != 999) {
+		$msg .= "-No KVM Blades- ";
+	}
+
+	chomp($msg);
+} # end primergyKVMBlades
+sub primergyStorageBlades {
+	############# PRIMERGY BLADE SERVERBLADE OIDs 
+	my $snmpOIDStorageBladeTable = '1.3.6.1.4.1.7244.1.1.1.13.1.1.'; #s31StorageBladeTable
+	my $snmpOIDSerialNR	= $snmpOIDStorageBladeTable . '4'; #s31StorageBladeSerialNumber
+	my $snmpOIDProduct	= $snmpOIDStorageBladeTable . '5'; #s31StorageBladeProductName
+	my $snmpOIDModel	= $snmpOIDStorageBladeTable . '6'; #s31StorageBladeModelName
+	my $snmpOIDStatus	= $snmpOIDStorageBladeTable . '8'; #s31StorageBladeStatus
+	my $snmpOIDIdSerialNR	= $snmpOIDStorageBladeTable . '10'; #s31StorageBladeIdentSerialNumber
+	my $snmpOIDAdmURL	= $snmpOIDStorageBladeTable . '11'; #s31StorageBladeAdministrativeURL
+	my @bladeTableChecks = (
+		$snmpOIDSerialNR,
+		$snmpOIDProduct,
+		$snmpOIDModel,
+		$snmpOIDStatus,
+		$snmpOIDIdSerialNR,
+		$snmpOIDAdmURL,
+	);
+	my @cntCodes = ( -1, 0,0,0,0,0,0, 0,);
+	my @verboseStatusText = ( "none", 
+		"unkown","ok","not-present","error","critical",
+		"standby", "..unexpected..",
+	);
+
+	#------------------------------------------------------
+
+	my $entries = getSNMPtable(\@bladeTableChecks);
+
+	if (defined $entries) {
+  		my @bladesKeys = ();
+		@bladesKeys = getSNMPTableIndex($entries, $snmpOIDStatus, 1);
+
+		addTableHeader("v","Storage Blades");
+		foreach my $storeID (@bladesKeys) {
+ 			my $storeStatus  = $entries->{$snmpOIDStatus . '.' . $storeID};
+ 			my $storeSerial = $entries->{$snmpOIDSerialNR . '.' . $storeID};
+ 			my $storeIdSerial = $entries->{$snmpOIDIdSerialNR . '.' . $storeID};
+			my $storeAdmURL = $entries->{$snmpOIDAdmURL . '.' . $storeID};
+			my $product = $entries->{$snmpOIDProduct . '.' . $storeID};
+			my $model = $entries->{$snmpOIDModel . '.' . $storeID};
+   			$storeStatus = 0 if (!defined $storeStatus or $storeStatus < 0);
+			$storeStatus = 7 if ($storeStatus > 7);
+			addStatusTopic("v",$verboseStatusText[$storeStatus], "Storage", $storeID);
+			addSerialIDs("v",$storeSerial, $storeIdSerial);
+			addAdminURL("v",$storeAdmURL);
+			addProductModel("v",$product, $model);
+			endVariableVerboseMessageLine();
+			$cntCodes[$storeStatus]++;
+			if ((($storeStatus == 4) || ($storeStatus == 5)) &&  ($main::verbose < 2) ) {
+				addStatusTopic("l",$verboseStatusText[$storeStatus], 
+					"Storage", $storeID);
+				addSerialIDs("l",$storeSerial, $storeIdSerial);
+				addAdminURL("l",$storeAdmURL);
+				addProductModel("l",$product, $model);
+				endLongMessageLine();
+			}
+ 		}
+		# output
+		#msg .= " Storage Blades";
+		addTopicStatusCount("m","StorageBlades");
+		for (my $i=1;$i < 7;$i++) {
+			#msg .= "-$verboseStatusText[$i]($cntCodes[$i])"	
+			#	if ($cntCodes[$i]);
+			addStatusCount("m", $verboseStatusText[$i], $cntCodes[$i]);
+		}
+ 		# return code
+		if (($exitCode == 3) 
+		&& (  $cntCodes[2] || $cntCodes[3] || $cntCodes[4]
+		   || $cntCodes[5] || $cntCodes[6])
+		) { # reset default
+		    $exitCode = 0;
+		}
+		if ($cntCodes[4] && $exitCode < 1) { #nagios warning 
+			$exitCode = 1;
+		}
+		if ($cntCodes[5] && $exitCode < 2) { #nagios critical 
+			$exitCode = 2;
+		}
+	} elsif (defined $optBladeStore and $optBladeStore != 999) {
+		$msg .= "-No Storage Blades- ";
+	}
+
+	chomp($msg);
+} # end primergyStorageBlades
+
+#----------- PRIMERGY server functions - INVENT.mib
+sub inv_sniInventoryOSinformation {
+	my $snmpOidInventory = '.1.3.6.1.4.1.231.2.10.2.1.'; #sniInventory
+	my $snmpOidOS		= $snmpOidInventory . '4.0'; #sniInvHostOS
+	my $snmpOidName		= $snmpOidInventory . '8.0'; #sniInvHostName
+	my $snmpOidOSRevision	= $snmpOidInventory . '22.0'; #sniInvHostOSRevision
+	my $snmpOidFQDN		= $snmpOidInventory . '26.0'; #sniInvFullQualifiedName
+
+	my $testCode = 0;
+	my $os = trySNMPget($snmpOidOS,"sniInventory"); # check INVENT.mib existence
+	$testCode = 3 if (!defined $os);
+	if ($testCode==0) {
+		my $name = trySNMPget($snmpOidName,"sniInventory");
+		my $revision = trySNMPget($snmpOidOSRevision,"sniInventory");
+		my $fqdn = trySNMPget($snmpOidFQDN,"sniInventory");
+		addKeyLongValue("n","OS",$os);
+		addKeyLongValue("n","OS-Revision",$revision);
+		addKeyValue("n","Name",$name) if($main::verbose > 2);
+		if ($fqdn) {
+			$fqdn = undef if ($prgSystemName and ($prgSystemName eq $fqdn));
+			addKeyLongValue("n","FQDN",$fqdn);
+		}
+	}
+} #inv_sniInventoryOSinformation
+sub inv_sniFileSystemTable  {
+	my $snmpOidFileSystemTable = '.1.3.6.1.4.1.231.2.10.2.1.18.1.'; #sniFileSystemTable
+	my $snmpOidIsMounted	= $snmpOidFileSystemTable .  '6'; #sniIsMounted
+	my $snmpOidName		= $snmpOidFileSystemTable .  '7'; #sniFSName
+	my $snmpOidKBSize	= $snmpOidFileSystemTable .  '8'; #sniFSSize KB
+	my $snmpOidKBSpace	= $snmpOidFileSystemTable . '10'; #sniFSAvailableSpace
+	my $snmpOidUsage	= $snmpOidFileSystemTable . '11'; #sniFSUsage %
+	my $snmpOidType		= $snmpOidFileSystemTable . '12'; #sniFSTypeString
+	# try
+	my $snmpOidMBSize	= $snmpOidFileSystemTable . '13'; #sniFSSizeMb
+	my $snmpOidMBSpace	= $snmpOidFileSystemTable . '14'; #sniFSAvailableSpaceMb
+	my @tableChecks = (
+		$snmpOidIsMounted, $snmpOidName, $snmpOidKBSize, $snmpOidKBSpace,
+		$snmpOidUsage, $snmpOidType,
+	);
+	my $all_notify = 0;
+	{ # everytime
+		my $is_linux = 0;
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidName, 1);
+
+		addTableHeader("v","File System Table");
+		$exitCode = 0 if ($#snmpIDs >= 0);
+		my $notify = 0;
+		foreach my $snmpID (@snmpIDs) {
+			my $name = $entries->{$snmpOidName . '.' . $snmpID};
+			my $mounted = $entries->{$snmpOidIsMounted . '.' . $snmpID};
+			my $type = $entries->{$snmpOidType . '.' . $snmpID};
+			my $usage = $entries->{$snmpOidUsage . '.' . $snmpID};
+			#$name = "..undefined.." if (!defined $name);
+			#$name = "..N/A.." if (!$name);
+			#$type = "..undefined.." if (!defined $type);
+			#$type = "..N/A.." if (!$type);
+			my $mmode = '';
+			$mmode = "$mounted" if (defined $mounted);
+
+			next if (!$type and $main::verbose < 3);
+			$is_linux = 1 if ($name eq "/");
+
+			addStatusTopic("v",undef, "FS", $snmpID);
+			addName("v",$name);
+			addKeyLongValue("v","Type", $type);
+			addKeyIntValueUnit("v","Use",$usage,"%");
+
+			my $sizeUnit = undef;
+			my $spaceUnit = undef;
+			my $size = trySNMPget($snmpOidMBSize . '.' . $snmpID);
+			my $space = trySNMPget($snmpOidMBSpace . '.' . $snmpID);
+			$sizeUnit = "MB" if ($size);
+			$spaceUnit = "MB" if ($space);
+			if (!$size) {
+				$size = $entries->{$snmpOidKBSize . '.' . $snmpID};
+				$sizeUnit = "KB" if ($size);
+			}
+			if (!$space) {
+				$space = $entries->{$snmpOidKBSpace . '.' . $snmpID};
+				$spaceUnit = "KB" if ($space);
+			}
+			addKeyValueUnit("v","Size",$size,$sizeUnit) if ($sizeUnit);
+			addKeyValueUnit("v","Space",$space,$spaceUnit) if ($spaceUnit);
+			addKeyValue("v","MountMode",$mmode);
+			$variableVerboseMessage .= "\n";
+
+			if ($usage) {
+				$name = "FS_$snmpID" if (!$name);
+				$name =~ s/(.*) \((.)\:\)/$2_$1/ if ($name =~ m/\(.\:\)$/);
+					# ... above is for WINDOWS "name (x:)"
+				$name =~ s/[ ,;=]/_/g;
+				$name =~ s/[:()]//g;
+				if ($name =~ m/^([A-Z]_)/) {
+					my $lchar = $1;
+					if ($name =~ m/^$lchar$lchar/) {
+						# lchar was already part of name !
+						$name =~ s/^$lchar//;
+					}
+				}
+				if ($is_linux and $usage == 100) {
+					$usage = 0 if ($name =~ m/\/dev\/.*/);
+					$usage = 0 if ($name =~ m/\/system\/.*/);
+					$usage = 0 if ($name =~ m/\/sys\/.*/);
+					$usage = 0 if ($name =~ m/\/proc\/.*/);
+					$usage = 0 if ($name =~ m/\/media\/.*/);
+					$usage = 0 if ($name eq "/vol");  # found on solaris
+					$usage = 0 if ($name eq "/devices");  # found on solaris
+					$usage = 0 if ($type eq "proc");
+					$usage = 0 if ($type eq "sysfs");
+					$usage = 0 if ($type eq "mntfs");
+					$usage = 0 if ($type eq "rpc_pipefs");
+					$usage = 0 if ($type eq "autofs"); # found on solaris
+					$usage = 0 if ($type =~m/^iso9.*/);
+					$usage = 0 if ($type =~m/.*gvfs.*/);
+				}
+				if ($usage) {
+					my $perfname = $name;
+					$perfname = "ROOT" if ($perfname eq "/");
+					#$perfname =~ s/^\///;
+					addPercentageToPerfdata($perfname,$usage,
+						$optWarningLimit,$optCriticalLimit);
+				}
+				$notify = 0;
+				if ($usage and $optWarningLimit 
+					and $usage > $optWarningLimit) {
+					$exitCode = 1 if ($exitCode != 2);
+					$notify = 1;
+					$all_notify = 1;
+				}
+				if ($usage and $optCriticalLimit and $usage > $optCriticalLimit) {
+					$exitCode = 2;
+					$notify = 1;
+					$all_notify = 1;
+				}
+				$notify = 0 if ($main::verbose >= 2); # allready printed
+				if ($notify and $usage) {
+					addStatusTopic("l",undef, "FS", $snmpID);
+					addName("l",$name);
+					addKeyLongValue("l","Type", $type);
+					addKeyIntValueUnit("l","Use",$usage,"%");
+					$longMessage .= "\n";
+				}
+			} # usage performance data
+		} # for keys
+		$msg .= "- file system limit reached" if ($all_notify); 
+	}
+} #inv_sniFileSystemTable
+sub inv_sniNetworkInterfaceTable  {
+	my $snmpOidNetworkInterfaceTable = '.1.3.6.1.4.1.231.2.10.2.1.25.1.'; #sniNetworkInterfaceTable
+	my $snmpOidName		= $snmpOidNetworkInterfaceTable . '2'; #sniInterfaceDescription
+	my $snmpOidAdapter	= $snmpOidNetworkInterfaceTable . '3'; #sniInterfaceAdapter
+	my $snmpOidConnectionNm	= $snmpOidNetworkInterfaceTable . '4'; #sniInterfaceConnectionName
+	my $snmpOidUsage	= $snmpOidNetworkInterfaceTable . '5'; #sniInterfaceUsage %
+	my $snmpOidSpeed	= $snmpOidNetworkInterfaceTable . '6'; #sniInterfaceSpeed KB/sec
+	my $snmpOidBytesIO	= $snmpOidNetworkInterfaceTable . '9'; #sniInterfaceBytesInOut KB/sec
+	# ATTENTION: Usage was not set for current test servers
+	my @tableChecks = (
+		$snmpOidName, $snmpOidAdapter, $snmpOidConnectionNm, $snmpOidUsage,
+		$snmpOidSpeed, $snmpOidBytesIO,
+	);
+	my $all_notify = 0;
+	{
+		my $foundPerf = 0;
+		my $foundVirtEthernet = 0;
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidName, 1);
+
+		addTableHeader("v","Network Interface Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $name = $entries->{$snmpOidName . '.' . $snmpID};
+			my $adapter = $entries->{$snmpOidAdapter . '.' . $snmpID};
+			my $conn = $entries->{$snmpOidConnectionNm . '.' . $snmpID};
+			my $usage = $entries->{$snmpOidUsage . '.' . $snmpID};
+			my $speed = $entries->{$snmpOidSpeed . '.' . $snmpID};
+			my $iobytes = $entries->{$snmpOidBytesIO . '.' . $snmpID};
+			$conn = undef if ($conn and $name and $conn =~m/$name/);
+
+			$foundVirtEthernet = 1 if ($conn and $conn =~ m/vEthernet/ 
+					and $name and $name =~ m/Hyper-V/);
+
+			addStatusTopic("v", undef, "NetIF", $snmpID);
+			addKeyLongValue("v","Description",$name);
+			addKeyLongValue("v","Adapter", $adapter);
+			addKeyLongValue("v","Connection",$conn);
+			addKeyValueUnit("v","Usage",$usage,"%");
+			addKeyValueUnit("v","Speed",$speed,"KB/sec");
+			addKeyIntValueUnit("v","BytesInOut",$iobytes,"KB/sec");
+			$variableVerboseMessage .= "\n";
+			my $perfname = "NetIF[$snmpID]";
+			$perfname = "Loopback[$snmpID]" 
+				if (! $conn and $name and $name =~ m/Loopback/);
+			$perfname = "vEthernet[$snmpID]" 
+				if ($conn and $conn =~ m/vEthernet/);
+			$perfname = "LAN[$snmpID]" 
+				if ($conn and $conn =~ m/LAN/);
+			$perfname = "LocalAreaConnection[$snmpID]" 
+				if ($conn and $conn =~ m/Local Area Connection/);
+			if ($perfname eq "NetIF[$snmpID]") {
+				$perfname = "$conn" . "[$snmpID]" 
+					if ($conn and $conn !~ m/\s/ and $conn !~ m/^0x/);
+			}
+			if ($perfname eq "NetIF[$snmpID]") {
+				$perfname = "$name" . "[$snmpID]" 
+					if ($name and $name !~ m/\s/ and $name !~ m/^0x/);
+			}
+
+			addKBsecToPerfdata($perfname, $iobytes, 
+				$optWarningLimit, $optCriticalLimit)
+				if ($speed or $iobytes);
+			$foundPerf = 1 if ($speed or $iobytes);
+			my $notify = 0;
+			if ($iobytes and $optWarningLimit 
+				and $iobytes > $optWarningLimit) {
+				$exitCode = 1 if ($exitCode != 2);
+				$notify = 1;
+				$all_notify = 1;
+			}
+			if ($iobytes and $optCriticalLimit and $iobytes > $optCriticalLimit) {
+				$exitCode = 2;
+				$notify = 1;
+				$all_notify = 1;
+			}
+			$notify = 0 if ($main::verbose >= 2); # allready printed
+			if ($notify and $iobytes and $speed) {
+				addStatusTopic("l", undef, "NetIF", $snmpID);
+				addKeyLongValue("l","Description",$name);
+				addKeyLongValue("l","Adapter", $adapter);
+				addKeyLongValue("l","Connection",$conn);
+				addKeyValueUnit("l","Usage",$usage,"%");
+				addKeyValueUnit("l","Speed",$speed,"KB/sec");
+				addKeyIntValueUnit("l","BytesInOut",$iobytes,"KB/sec");
+				$longMessage .= "\n";
+			}
+		} # for keys
+		$msg .= "- network interface limit reached" if ($all_notify); 
+		$exitCode = 0 if ($#snmpIDs >= 0 and $foundPerf and $exitCode == 3);
+		$msg .= "- unable to monitor Hyper-V Virtual Ethernet on this system" if (!$foundPerf and $foundVirtEthernet);
+	}
+} #inv_sniNetworkInterfaceTable
+#----------- PRIMERGY server functions - OS.mib
+  sub svOsInfoTable {
+	my $isiRMC = shift;
+	my $snmpOID = '.1.3.6.1.4.1.231.2.10.2.5.5.2.2.1.'; #svOsInfoTable
+	my $snmpDesignation = $snmpOID . '2.1'; #svOsDesignation
+	my $snmpVersion	    = $snmpOID . '6.1'; #svOsVersionDesignation
+	my $snmpDomain	    = $snmpOID . '13.1'; #svOsDomainName
+
+	my $os		= trySNMPget($snmpDesignation, "svOsDesignation");
+	my $version	= trySNMPget($snmpVersion, "svOsVersionDesignation");
+	my $fqdn	= trySNMPget($snmpDomain, "svOsDomainName");
+	$os = undef		if ($os and $os =~ m/^n.a$/);
+	$version = undef	if ($version and $version =~ m/^n.a$/);
+	$fqdn = undef		if ($fqdn and $fqdn =~ m/^n.a$/);
+	if (!$isiRMC) {
+		addKeyLongValue("n","OS",$os);
+		addKeyLongValue("n","OS-Revision",$version);
+		if ($fqdn) {
+			$fqdn = undef if ($prgSystemName and ($prgSystemName eq $fqdn));
+			addKeyLongValue("n","FQDN",$fqdn) if (!$isiRMC);
+		}
+	} else {
+		addKeyLongValue("n","BaseServer-OS",$os);
+		addKeyLongValue("n","BaseServer-OS-Revision",$version);
+		if ($fqdn) {
+			$fqdn = undef if ($prgSystemName and ($prgSystemName eq $fqdn));
+			addKeyLongValue("n","BaseServer-FQDN",$fqdn);
+		}
+	}
+	return 1 if ($os);
+	return 0 if (!$os);
+  } #svOsInfoTable
+  sub svOsPropertyTable {
+	return 0 if (!$optChkCpuLoadPerformance);
+	my $snmpOID = '.1.3.6.1.4.1.231.2.10.2.5.5.2.3.1.'; #svOsPropertyTable
+	my $snmpCPUload  = $snmpOID . '6.1'; #svOsOverallCpuLoad
+
+	my $cpuload = trySNMPget($snmpCPUload,"svOsOverallCpuLoad");
+	if (defined $cpuload and $cpuload >= 0) {
+	    addKeyPercent("m", "Total", $cpuload, undef,undef, undef,undef);
+	    addPercentageToPerfdata("Total", $cpuload, undef, undef)
+		    if (!$main::verboseTable);
+	    return 1;
+	} else {
+	    return 0;
+	}
+  } #svOsPropertyTable
+#----------- PRIMERGY server functions - Status.mib
+our $resultEnv = 3;  
+our $resultPower = 0;  
+our $resultSystem = 0; 
+our $resultMassStorage = undef;
+our $resultDrvMonitor = undef;
+our $resultOverall = undef;
+sub sieStComponentTable {
+	# Status.mib
+	my $snmpOidStComponentTable = '.1.3.6.1.4.1.231.2.10.2.11.4.1.1.'; #sieStComponentTable
+	my $snmpOidFixName	= $snmpOidStComponentTable . '2'; #sieStComponentName
+	my $snmpOidStatus	= $snmpOidStComponentTable . '3'; #sieStComponentStatusValue
+	my $snmpOidLastMessage	= $snmpOidStComponentTable . '4'; #sieStComponentLastErrorMessage
+	my $snmpOidName		= $snmpOidStComponentTable . '5'; #sieStComponentDisplayName
+	my @tableChecks = (
+		$snmpOidFixName, $snmpOidStatus, $snmpOidLastMessage, $snmpOidName, 
+	);
+	my @statusText = ( "none",
+		"ok", "degraded", "error", "failed", "unknown",	
+		"notPresent", "notManageable", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $collectStorage = '';
+	$getInfos = 1 if ($main::verboseTable == 1411);
+	# $main::verbose = 100 if ($getInfos == 1);
+	if ($optChkStorage and defined $resultMassStorage and $main::verbose == 4) {
+		$getInfos = 1 if ($resultMassStorage);
+		$getInfos = 1 if ($main::verbose >= 2);
+	} #TO-BE_DISCUSSED
+	if ($getInfos) { #sieStComponentTable
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 1);
+
+		if ($main::verboseTable == 1411) {
+			addTableHeader("v","Status Component Table - Status.mib");
+			foreach my $id (@snmpIdx) {
+				my $name = $entries->{$snmpOidName . '.' . $id};
+				my $status = $entries->{$snmpOidStatus . '.' . $id};
+				my $message = $entries->{$snmpOidLastMessage . '.' . $id};
+				my $internalName = $entries->{$snmpOidFixName . '.' . $id};
+				$status = 0 if (!defined $status or $status < 0);
+				$status = 8 if ($status > 8);
+				next if ($status == 5);
+				{
+					addStatusTopic("v",$statusText[$status],"StatusComponent",$id);
+					addKeyLongValue("v","Name",$name);
+					addKeyLongValue("v","InternalName",$internalName);
+					$message = undef if ($message =~ m/<<not supported>>/);
+					addKeyLongValue("v","LastError",$message);
+					$variableVerboseMessage .= "\n";
+				} 
+			} # each
+		} # ALL
+		elsif ($optChkStorage and defined $resultMassStorage) {
+			addTableHeader("v","Status Component Table - MassStorage parts");
+			my $isSvRaid = 0;
+			foreach my $id (@snmpIdx) {
+				my $name = $entries->{$snmpOidName . '.' . $id};
+				my $status = $entries->{$snmpOidStatus . '.' . $id};
+				my $message = $entries->{$snmpOidLastMessage . '.' . $id};
+				my $internalName = $entries->{$snmpOidFixName . '.' . $id};
+				$status = 0 if (!defined $status or $status < 0);
+				$status = 8 if ($status > 8);
+				next if ($status == 5);
+				if (    $name =~ m/storage/i or $name =~ m/raid/i 
+				    or  $internalName =~ m/storage/i or $internalName =~ m/raid/i) 
+				{
+				    $isSvRaid = 1 if ($internalName =~ m/SvRaidAura/i);
+				    if ($main::verbose >= 2) {
+					addStatusTopic("v",$statusText[$status],"StatusComponent",$id);
+					addKeyLongValue("v","Name",$name);
+					addKeyLongValue("v","InternalName",$internalName)
+					    if ($main::verbose >= 33);
+					$message = undef if ($message =~ m/<<not supported>>/);
+					addKeyLongValue("v","LastError",$message);
+					$variableVerboseMessage .= "\n";
+				    } elsif ($resultMassStorage and $status >= 2 and $status <= 4) 
+				    {
+					# SVRAID -> SvRaidAura, SvRaidAdapters, SvRaidLogicalDrives, SvRaidPhysicalDisks
+					next if ($isSvRaid and
+					    (  $internalName =~ m/SvRaidAura/i
+					    or $internalName =~ m/SvRaidAdapters/i
+					    or $internalName =~ m/SvRaidLogicalDrives/i
+					    or $internalName =~ m/SvRaidPhysicalDisks/i) );
+					addStatusTopic("l",$statusText[$status],"StatusComponent",$id);
+					addKeyLongValue("l","Name",$name);
+					$message = undef if ($message =~ m/<<not supported>>/);
+					addKeyLongValue("l","LastError",$message);
+					$longMessage .= "\n";
+				    }
+				} # storage or raid match
+			} # each
+		} # Storage
+	} # table verbose
+} #sieStComponentTable
+sub sieStatusAgent {
+	# Status.mib
+	my $snmpOidPrefix = '1.3.6.1.4.1.231.2.10.2.11.'; #sieStatusAgent
+	my $snmpOidSysStat		= $snmpOidPrefix . '2.1.0'; #sieStSystemStatusValue.0
+	#my $snmpOidStSystemMessage	= $snmpOidPrefix . '2.2.0'; #sieStSystemLastErrorMessage.0
+	my $snmpOidSubSysCnt	= $snmpOidPrefix . '3.2.0'; #sieStNumberSubsystems.0
+	my $snmpOidSubSys	= $snmpOidPrefix . '3.1.1.'; #sieStSubsystemTable
+	my $snmpOidSubSysName		= $snmpOidSubSys . '2'; #sieStSubsystemName
+	my $snmpOidSubSysValue		= $snmpOidSubSys . '3'; #sieStSubsystemStatusValue
+	#my $snmpOidSubSysMessage	= $snmpOidSubSys . '4' ;#sieStSubsystemLastErrorMessag
+	#	... in tests LastErrorMessage was NOT set !
+	my @subSysStatusText = ( 'none', 
+		'ok', 'degraded', 'error', 'failed', 'unknown' );
+	#my @subSystemNameText = ( "none",
+	#	'Environment', 'PowerSupply', 'MassStorage', 'SystemBoard', 'Network',
+	#	'DrvMonitor',
+	#); # not always in this order !
+	my %commonSystemCodeMap = (	1       =>      0,
+					2       =>      1,
+					3       =>      2,
+					4       =>      2,
+					5	=>	3,);
+	my $srvSubSystem_cnt = undef;
+	my $srvCommonSystemStatus = undef; 
+	my $result = undef;
+	# fetch central system state
+	#$srvCommonSystemStatus = simpleSNMPget($snmpOidSysStat,"SystemStatus"); # not for iRMC
+	$srvCommonSystemStatus = trySNMPget($snmpOidSysStat,"SystemStatus");
+	if (!$srvCommonSystemStatus) { # iRMC S4 and version who does not support STATUS.mib
+	    $exitCode = 4;
+	    return;
+	}
+	# set exit value
+	$srvCommonSystemStatus = 5 if (!$srvCommonSystemStatus or $srvCommonSystemStatus > 5);
+	$resultOverall = $commonSystemCodeMap{$srvCommonSystemStatus}; 
+	# get subsystem information
+	$srvSubSystem_cnt = simpleSNMPget($snmpOidSubSysCnt,"SubSystemCount");
+	
+	for (my $x = 1; $x <= $srvSubSystem_cnt; $x++) {	
+		$result = simpleSNMPget($snmpOidSubSysValue . '.' . $x,"SubsystemStatusValue"); #sieStSubsystemStatusValue	
+		my $subSystemName = simpleSNMPget($snmpOidSubSysName . '.' . $x,"SubsystemName"); #sieStSubsystemName	
+		my $printAll = 0;
+		next if ($result >= 5 or !defined $result or !$result);
+
+		if ($x < 5) {
+		    if (((defined $optChkEnvironment) && ($x == 1))
+		    ||  ((defined $optChkPower) && ($x == 2)) 
+		    ||  ((defined $optChkSystem) && ($x > 2)) 
+		    ||  ((defined $optChkStorage) && ($x == 3)) 
+		    ) {  
+			addComponentStatus("m", $subSystemName, $subSysStatusText[$result]);
+			$result = 5 if ($result > 5);
+			if ($x == 1) {
+				$resultEnv = $commonSystemCodeMap{$result};
+			} elsif ($x == 2) {
+				$resultPower = $commonSystemCodeMap{$result};
+			} elsif ($x > 2) {
+				my $tmp_result = 0;
+				$tmp_result = $commonSystemCodeMap{$result};
+				$resultSystem = $tmp_result if ($resultSystem <= $tmp_result);
+				if ($x == 3) { # included in System
+					$resultMassStorage = $commonSystemCodeMap{$result};
+				}
+			}
+		    }
+		} # displayname
+		elsif ((($x > 4) && (defined $optChkSystem) && ($main::verbose >= 1))
+		|| ($optChkSystem and $result > 1 and $exitCode > 0 and ($subSystemName ne 'DrvMonitor'))
+		) {	# ... for verbose or on warning or error
+			addComponentStatus("m", $subSystemName, $subSysStatusText[$result]);
+			$printAll = 1;
+		}	
+		if ($x >= 6 and ($subSystemName eq 'DrvMonitor')) {
+			$resultDrvMonitor = $commonSystemCodeMap{$result};
+			if ($optChkDrvMonitor and !$printAll) {
+				addComponentStatus("m", $subSystemName, $subSysStatusText[$result]);
+			}
+		}
+		if ($result > $srvCommonSystemStatus and $result != 5) 
+		{
+			my $tmp_result = 0;
+			$tmp_result = $commonSystemCodeMap{$result};
+			$resultOverall = $tmp_result if ($resultOverall <= $tmp_result); 
+		}
+	} # for subsystems
+	# sieStComponentTable(); ... check later for Storage Parts
+} #sieStatusAgent
+
+
+#----------- PRIMERGY server functions - SC2.mib
+our $psHasMultiUnits = undef;
+sub primergyServerFanTable {
+	my $rcEnv = shift;
+
+	my $snmpOidEnvFanPrefix = '.1.3.6.1.4.1.231.2.10.2.2.10.5.2.1.'; #sc2FanTable
+	my $snmpOidEnvFanStatus		= $snmpOidEnvFanPrefix . '5'; #sc2fanStatus
+	my $snmpOidEnvFanSpeed		= $snmpOidEnvFanPrefix . '6'; #sc2fanCurrentSpeed
+	my $snmpOidEnvFanDesc		= $snmpOidEnvFanPrefix . '3'; #sc2fanDesignation
+	my $snmpOidEnvFanDeviceType	= $snmpOidEnvFanPrefix . '10'; #sc2fanCoolingDeviceType
+	    # 1 unknown, 2 fan, 3 liquid
+	    # sc2fanCoolingDeviceType - only SvAgent V7.10 knows this OID
+	my @envFanChecks = (
+		$snmpOidEnvFanStatus,
+		$snmpOidEnvFanSpeed,
+		$snmpOidEnvFanDesc
+	);
+
+	#### TEXT LANGUAGE AWARENESS
+	my @srvFanStatus = ( "none",
+		"unknown", "disabled", "ok", "fail", "prefailure-predicted",
+		"redundant-fan-failed", "not-manageable", "not-present", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if ($rcEnv and $rcEnv < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	$getInfos = 1 if ($optChkFanPerformance);
+	if (($optChkEnvironment or $optChkEnv_Fan) and $getInfos) {
+		my @snmpIDs = ();
+		my $entries = getSNMPtable(\@envFanChecks);
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidEnvFanStatus, 2);
+
+		addTableHeader("v","Cooling Devices") if ($verbose);
+		my $hasDeviceType = undef;
+		foreach my $fanID (@snmpIDs) {
+			my $fanStatus  = $entries->{$snmpOidEnvFanStatus . '.' . $fanID};
+			my $fanDesc = $entries->{$snmpOidEnvFanDesc . '.' . $fanID};
+			my $fanSpeed = $entries->{$snmpOidEnvFanSpeed . '.' . $fanID};
+			my $fanType = undef;
+			$fanType = trySNMPget($snmpOidEnvFanDeviceType, "FanDeviceType")
+			    if (!defined $hasDeviceType or $hasDeviceType);
+			$hasDeviceType = 1 if (!defined $hasDeviceType and $fanType and $fanType >= 1 and $fanType <=3);
+			$hasDeviceType = 0 if (!defined $hasDeviceType);
+			$fanDesc =~ s/[ ,;=]/_/g;
+			$fanDesc =~ s/_$//;
+			$fanStatus = 0 if (!defined $fanStatus or $fanStatus < 0);
+			$fanStatus = 9 if ($fanStatus > 9);
+			next if (($fanStatus eq '2' or $fanStatus eq '8') and $main::verbose < 3);
+			
+			my $printFanID = 0;
+			$printFanID = $1 if ($fanID =~ /\d+\.(\d+)/);
+			$printFanID = $fanID if ($psHasMultiUnits);
+			if ($verbose) {
+				addStatusTopic("v",$srvFanStatus[$fanStatus], "Fan", $printFanID)
+				    if (!$fanType or $fanType < 3);
+				addStatusTopic("v",$srvFanStatus[$fanStatus], "Liquid",	$printFanID)
+				    if ($fanType and $fanType == 3);
+				addName("v",$fanDesc);
+				addKeyRpm("v","Speed", $fanSpeed);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify
+			and   (($fanStatus == 2) || ($fanStatus == 4) || ($fanStatus == 5) ||($fanStatus == 6))
+			) {
+				addStatusTopic("l",$srvFanStatus[$fanStatus], "Fan", $printFanID);
+				addName("l",$fanDesc);
+				addKeyRpm("l","Speed", $fanSpeed);
+				$longMessage .= "\n";
+			}
+			if ($optChkFanPerformance) {
+				addRpmToPerfdata($fanDesc, $fanSpeed, undef, undef);
+			}
+		} #for
+	}
+} #primergyServerFanTable
+sub primergyServerTemperatureSensorTable {
+	my $rcEnv = shift;
+
+	my $snmpOidEnvTempPrefix = '1.3.6.1.4.1.231.2.10.2.2.10.5.1.1.'; #sc2TemperatureSensorTable
+	my $snmpOidEnvTempStatus	= $snmpOidEnvTempPrefix . '5'; #sc2tempSensorStatus
+	my $snmpOidEnvTempWarn		= $snmpOidEnvTempPrefix . '7'; #sc2tempWarningLevel
+	my $snmpOidEnvTempCrit		= $snmpOidEnvTempPrefix . '8'; #sc2tempCriticalLevel
+	my $snmpOidEnvTempValue		= $snmpOidEnvTempPrefix . '6'; #sc2tempCurrentTemperature
+	my $snmpOidEnvTempDesc		= $snmpOidEnvTempPrefix . '3'; #sc2tempSensorDesignation
+	my @envTempChecks = (
+		$snmpOidEnvTempStatus,
+		$snmpOidEnvTempValue,
+		$snmpOidEnvTempWarn,
+		$snmpOidEnvTempCrit,
+		$snmpOidEnvTempDesc
+	);
+	my @srvTempStatus = ( "none",
+		"unknown", "not-available", "ok", "sensor-failed", "failed", 
+		"temperature-warning-toohot", "temperature-critical-toohot", "ok", "temperature-warning", "..unexpected..",
+	); # 8 is "temperature-normal"
+	# now check the temperatures
+	my $getinfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 1 and !$main::verboseTable);
+	$notify = 1 if ($rcEnv and $rcEnv < 3);
+	$getinfos = 1; # get performance data always !
+	if (($optChkEnvironment or $optChkEnv_Temp) and $getinfos) {
+		my @snmpIDs = ();
+		my $entries = getSNMPtable(\@envTempChecks);
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidEnvTempStatus, 2);
+
+		addTableHeader("v","Temperature Sensors") if ($verbose);
+		my %chkDoubleNames = ();
+		foreach my $tempID (@snmpIDs) {	
+			my $tempStatus  = $entries->{$snmpOidEnvTempStatus . '.' . $tempID};
+			$tempStatus = 0 if (!defined $tempStatus or $tempStatus < 0);
+			$tempStatus = 10 if ($tempStatus > 10);
+			next if ($tempStatus eq '2' and $main::verbose < 3);
+
+			my $tempValue = $entries->{$snmpOidEnvTempValue . '.' . $tempID};
+			my $tempWarn = $entries->{$snmpOidEnvTempWarn . '.' . $tempID};
+			my $tempCrit = $entries->{$snmpOidEnvTempCrit . '.' . $tempID};
+			my $tempDesc = $entries->{$snmpOidEnvTempDesc . '.' . $tempID};
+			#next if ($tempValue == 0);
+
+			$tempDesc =~ s/[ ,;=]/_/g;
+			$tempDesc =~ s/_$//;
+
+			my $perfDesc = $tempDesc;
+			my $exist = 0;
+			$exist = 1 if (defined $chkDoubleNames{$perfDesc});
+			if ($psHasMultiUnits and $exist) {
+			    $perfDesc .= "_$tempID";
+			}
+			$chkDoubleNames{$perfDesc} = 1;
+			addTemperatureToPerfdata($perfDesc, $tempValue, $tempWarn, $tempCrit)
+				if (!$main::verboseTable);
+
+			my $printID = 0;
+			$printID = $1 if ($tempID =~ /\d+\.(\d+)/);
+			$printID = $tempID if ($psHasMultiUnits);
+			if ($verbose) {
+				addStatusTopic("v",$srvTempStatus[$tempStatus],"Sensor",$printID);
+				addName("v",$tempDesc);
+				addCelsius("v",$tempValue, $tempWarn,$tempCrit);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify
+			and   ($tempStatus>=4 and $tempStatus!=8) 
+			) {
+				addStatusTopic("l",$srvTempStatus[$tempStatus],"Sensor",$printID);
+				addName("l",$tempDesc);
+				addCelsius("l",$tempValue, $tempWarn,$tempCrit);
+				$longMessage .= "\n";
+			}
+		} #each sensor
+	} # optChkEnvironment
+} #primergyServerTemperatureSensorTable
+
+sub primergyServerPowerSupplyTable {
+	my $rcPower = shift;
+
+	my $snmpOidPowerSupplyTable = '1.3.6.1.4.1.231.2.10.2.2.10.6.2.1.'; #sc2PowerSupplyTable
+	#my $snmpOidSupplyNr	= $snmpOidPowerSupplyTable . '2'; #sc2psPowerSupplyNr
+	#my $snmpOidDesignation	= $snmpOidPowerSupplyTable . '3'; #sc2PowerSupplyDesignation
+	my $snmpOidIdentifier	= $snmpOidPowerSupplyTable . '4'; #sc2PowerSupplyIdentifier
+	my $snmpOidStatus	= $snmpOidPowerSupplyTable . '5'; #sc2PowerSupplyStatus
+	my $snmpOidLoad		= $snmpOidPowerSupplyTable . '6';#sc2psPowerSupplyLoad
+	my $snmpOidMax		= $snmpOidPowerSupplyTable . '7'; #sc2psPowerSupplyNominal
+	my @tableChecks = (
+		$snmpOidIdentifier,
+		$snmpOidStatus,
+		$snmpOidLoad,
+		$snmpOidMax,
+	);
+	my @statusText = ( "none", 
+	    "unknown", "not-present", "ok", "failed", "ac-fail", 
+	    "dc-fail", "critical-temperature", "not-manageable", "fan-failure-predicted", "fan-failure",
+	    "power-safe-mode","non-redundant-dc-fail", "non-redundant-ac-fail", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if ($rcPower and $rcPower < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if ($optChkPower and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Power Supplies") if ($verbose);
+		foreach my $id (@snmpIdx) {
+ 			my $pstatus  = $entries->{$snmpOidStatus . '.' . $id};
+ 			my $name = $entries->{$snmpOidIdentifier . '.' . $id};
+ 			my $load = $entries->{$snmpOidLoad . '.' . $id};
+ 			my $max = $entries->{$snmpOidMax . '.' . $id};
+			$pstatus = 0 if (!defined $pstatus or $pstatus < 0);
+			$pstatus = 14 if ($pstatus > 14);
+			next if ($pstatus == 2 and $main::verbose < 3);
+			my $printID = 0;
+			$printID = $1 if ($id =~ /\d+\.(\d+)/);
+			$printID = $id if ($psHasMultiUnits);
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$pstatus],"PSU",$printID);
+				addName("v",$name);
+				addKeyWatt("v","CurrentLoad", $load,
+					undef,undef, undef,$max);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify and $pstatus >=4) {
+				addStatusTopic("l",$statusText[$pstatus],"PSU",$printID);
+				addName("l",$name);
+				addKeyWatt("l","CurrentLoad", $load,
+					undef,undef, undef,$max);
+				$longMessage .= "\n";
+			}
+		} # each
+	}
+	#### TODO / QUESTION PRIMERGY -w -c and performance limits for power supplies (multiple PSUs !)
+} #primergyServerPowerSupplyTable
+sub primergyServerPowerConsumption {
+	my $powerConsumption = undef;
+	# Power consumption OID
+	my $snmpOidPowerMonitoringTable = '.1.3.6.1.4.1.231.2.10.2.2.10.4.5.1.'; #sc2PowerMonitoringTable
+	my $snmpOidPowerConsumption	= $snmpOidPowerMonitoringTable . '5.1'; #sc2pmCurrentPowerConsumption.1
+	my $snmpOidPowerStatus		= $snmpOidPowerMonitoringTable . '7.1'; #sc2pmPowerLimitStatus.1
+	my $snmpOidPowerLimit		= $snmpOidPowerMonitoringTable . '8.1'; #sc2pmPowerLimitThreshold.1
+	my $snmpOidPowerPercentWarning	= $snmpOidPowerMonitoringTable . '9.1'; #sc2pmPowerLimitWarning.1
+	my $snmpOidPowerCriticLevel	= $snmpOidPowerMonitoringTable . '10.1'; #sc2pmRedundancyCritLevel.1 
+	my @verboseText = ( "none", 
+		"unknown", "ok", "warning", "error", "disabled", 
+		"..unexpected..",
+	);
+
+	if (defined $optChkPower and !$main::verboseTable) { 
+		$powerConsumption = trySNMPget($snmpOidPowerConsumption,"PowerConsumption");
+		if (defined $powerConsumption) {
+			my $status = trySNMPget($snmpOidPowerStatus,"PowerLimitStatus");
+			my $limit = undef;
+			my $lWarning = undef;
+			my $lCritical = undef;
+			my $warn = undef;
+			my $notify = 0;
+			if ((defined $status) && ($status > 1) && ($status < 5) ) {
+				if ($status == 4) {
+					$exitCode = 2;
+					$notify = 1;
+				}
+				if ($status == 3) {
+					$exitCode = 1 if ($exitCode == 0 or $exitCode == 3);
+					$notify = 1;
+				}
+				$limit = trySNMPget($snmpOidPowerLimit,"PowerLimitThreshold");
+				$lWarning = trySNMPget($snmpOidPowerPercentWarning,"PowerLimitWarning");
+				$lCritical = trySNMPget($snmpOidPowerCriticLevel,"RedundancyCritLevel");
+				if (defined $limit and defined $lWarning and $limit > 0) {
+					$warn = ($limit / 100 ) * $lWarning;
+				}
+				if (defined $limit and defined $lCritical and ($lCritical <= 0)) {
+					$lCritical = undef;
+				}
+				if ($main::verbose >= 2) {
+					addTableHeader("v","Power Consumption");
+					addStatusTopic("v",$verboseText[$status],"PowerConsumption",undef);
+					addKeyWatt("v","Current", $powerConsumption,
+						$limit,$lCritical);
+					#addKeyPercent("v",undef,undef,
+					#	$lWarning,undef, undef,undef);
+					$variableVerboseMessage .= "\n"
+				} elsif ($notify) {
+					addStatusTopic("l",$verboseText[$status],"PowerConsumption",undef);
+					addKeyWatt("l","Current", $powerConsumption,
+						$limit,$lCritical);
+					#addKeyPercent("l",undef,undef,
+					#	$lWarning,undef, undef,undef);
+					$longMessage .= "\n"
+				}
+			}
+
+			addPowerConsumptionToPerfdata($powerConsumption, $limit,$lCritical, undef,undef)
+				if (!$main::verboseTable);
+		} # PowerConsumption available
+	} #optChkPower
+} #primergyServerPowerConsumption
+
+sub primergyServer_ParentMMB {
+	my $snmpOidTable = '.1.3.6.1.4.1.231.2.10.2.2.10.3.1.1.'; #sc2ManagementNodeTable
+	my $snmpOidAddress	= $snmpOidTable . '4'; #sc2UnitNodeAddress
+	my $snmpOidName		= $snmpOidTable . '7'; #sc2UnitNodeName
+ 	my $snmpOidClass	= $snmpOidTable . '8'; #sc2UnitNodeClass
+	my @tableChecks = (
+		$snmpOidAddress,
+		$snmpOidName,
+		$snmpOidClass,
+	);
+	#my @classText = ( "none",
+	#	 "unknown", "primary", "secondary", "management-blade",	"secondary-remote", #"secondary-remote-backup", "baseboard-controller", "..unexpected..",
+	#);
+	{ 
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidAddress, 2);
+		foreach my $id (@snmpIdx) {
+ 			my $address  = $entries->{$snmpOidAddress . '.' . $id};
+ 			my $name = $entries->{$snmpOidName . '.' . $id};
+ 			my $classid = $entries->{$snmpOidClass . '.' . $id};
+  			next if ($classid and $classid != 4);
+			addKeyValue("n","ParentMMB", $address);
+			addKeyValue("n","ParentMMBName", $name) if ($name and $address and $name ne $address);
+		}
+	}
+} #primergyServer_ParentMMB
+sub primergyServer_ManagementNodeTable {
+	my $snmpOidTable = '.1.3.6.1.4.1.231.2.10.2.2.10.3.1.1.'; #sc2ManagementNodeTable
+	my $snmpOidAddress	= $snmpOidTable . '4'; #sc2UnitNodeAddress
+	my $snmpOidName		= $snmpOidTable . '7'; #sc2UnitNodeName
+ 	my $snmpOidClass	= $snmpOidTable . '8'; #sc2UnitNodeClass
+ 	my $snmpOidMac		= $snmpOidTable . '9'; #sc2UnitNodeMacAddress
+	#	... this mac is a string with 0x....
+ 	my $snmpOidModel	= $snmpOidTable . '12'; #sc2UnitNodeControllerModel
+	my @tableChecks = (
+		$snmpOidAddress,
+		$snmpOidName,
+		$snmpOidClass,
+		$snmpOidMac,	
+		$snmpOidModel,
+	);
+	my @classText = ( "none",
+		 "unknown", "primary", "secondary", "management-blade",	"secondary-remote", "secondary-remote-backup", "baseboard-controller", "..unexpected..",
+	);
+	if (($optChkSystem and $main::verbose >=3) or $main::verboseTable == 311) { 
+		#### QUESTION: is this relevant for somebody ?
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidAddress, 2);
+
+		addTableHeader("v","Management Nodes");
+		foreach my $id (@snmpIdx) {
+ 			my $address  = $entries->{$snmpOidAddress . '.' . $id};
+ 			my $name = $entries->{$snmpOidName . '.' . $id};
+ 			my $classid = $entries->{$snmpOidClass . '.' . $id};
+  			my $mac = $entries->{$snmpOidMac . '.' . $id};
+			my $model = $entries->{$snmpOidModel . '.' . $id};
+			$classid = 0 if (!defined $classid or $classid < 0);
+			$classid = 8 if ($classid > 8);
+			
+			addStatusTopic("v",undef, "Node", $id=~m/\d+\.(\d+)/);
+			addIP("v",$address);
+			addName("v",$name) if ($name and !($name eq $address));
+			addKeyLongValue("v","ControllerType", $model);
+			addKeyValue("v","Class", $classText[$classid]) if ($classid > 2);
+			addMAC("v", $mac);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primergyServer_ManagementNodeTable
+sub primergyServer_ServerTable {
+	my $snmpOidTable = '.1.3.6.1.4.1.231.2.10.2.2.10.4.1.1.'; #sc2ServerTable
+ 	my $snmpOidMemory	= $snmpOidTable . '2'; #sc2srvPhysicalMemory
+	my $snmpOidBootStatus	= $snmpOidTable . '4'; #sc2srvCurrentBootStatus
+ 	my $snmpOidUuid		= $snmpOidTable . '7'; #sc2srvUUID
+	my @bootText = ( "none", 
+		"unknown", "off", "no-boot-cpu", "self-test", "setup",
+		"os-boot", "diagnostic-boot", "os-running", "diagnostic-running", "os-shutdown", 
+		"diagnostic-shutdown", "reset", "..unexpected..",
+	);
+	my @tableChecks = (
+		$snmpOidMemory,
+		$snmpOidBootStatus,
+		$snmpOidUuid,
+	);
+	if (($optChkSystem and $main::verbose >=3) or $main::verboseTable == 411) { 
+		#### QUESTION: is this relevant for somebody ?
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidUuid, 1);
+		addTableHeader("v","Server Table");
+		foreach my $id (@snmpIdx) {
+ 			my $memory  = $entries->{$snmpOidMemory . '.' . $id};
+ 			my $bstatus = $entries->{$snmpOidBootStatus . '.' . $id};
+ 			my $uuid = $entries->{$snmpOidUuid . '.' . $id};
+			$bstatus = 0 if (!defined $bstatus or $bstatus < 0);
+			$bstatus = 13 if ($bstatus > 13);
+
+			addStatusTopic("v",undef,"Server",$id);
+			addKeyValue("v","UUID", $uuid);
+			addKeyMB("v","Memory", $memory);
+			addKeyValue("v","BootStatus", $bootText[$bstatus]) if ($bstatus > 0);
+			$variableVerboseMessage .= "\n";
+		}
+	} #verbose
+} #primergyServer_ServerTable
+our $cxChassisSerial	= undef;
+our $cxChassisName	= undef;
+our $cxChassisModel	= undef;
+our $cxChassesLocation	= undef;
+our $cxChassisContact	= undef;
+sub primergyServerUnitTable {
+	my $genNotify = shift;
+	my $snmpOidUnitTable = '.1.3.6.1.4.1.231.2.10.2.2.10.2.3.1.'; #sc2UnitTable
+	my $snmpOidUnitId	= $snmpOidUnitTable .'1' ;#sc2uUnitId
+	my $snmpOidClass	= $snmpOidUnitTable .'2' ;#sc2UnitClass
+	my $snmpOidCabNr	= $snmpOidUnitTable .'3' ;#sc2UnitCabinetNr
+	my $snmpOidDesignation	= $snmpOidUnitTable .'4' ;#sc2UnitDesignation
+	my $snmpOidModel	= $snmpOidUnitTable .'5' ;#sc2UnitModelName
+	my $snmpOidSerial	= $snmpOidUnitTable .'7' ;#sc2UnitSerialNumber
+	my $snmpOidLocation	= $snmpOidUnitTable .'8' ;#sc2UnitLocation
+	my $snmpOidContact	= $snmpOidUnitTable .'9' ;#sc2UnitContact
+	my $snmpOidAdmURL	= $snmpOidUnitTable .'10' ;#sc2UnitAdminURL
+	my $snmpOidWWN		= $snmpOidUnitTable .'14' ;#sc2UnitWorldWideName
+	my $snmpOidManIP	= $snmpOidUnitTable .'18' ;#sc2ManagementIpAddress
+
+	# .1.3.6.1.4.1.231.2.10.2.2.10.2.3.1.4.1 Name of Server
+
+	my @tableChecks = (
+		$snmpOidUnitId, $snmpOidClass, $snmpOidCabNr, $snmpOidDesignation, $snmpOidModel,
+		$snmpOidSerial, $snmpOidLocation, $snmpOidContact, $snmpOidAdmURL, $snmpOidWWN,
+		$snmpOidManIP,
+	);
+	my @classText = ( "none",
+		"unknown", "standardServer", "storageExtension", "bladeServerChassis", "bladeServer",
+		"clusterNode", "multiCodeChassis", "multiNodeServer", "virtualServer", "virtualPartition",
+		"systemboardInPartition", "unexpected12", "unexpected13", "unexpected14", "unexpected15", 
+		"unexpected16", "unexpected17", "unexpected18", "unexpected19", "virtualServerVmware",
+		"virtualServerHyperV", "virtualServerXen", "virtualServerPan", "..unexpected..", 
+	);
+	{ # SC2 UnitTable 2.3 => 231
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidClass, 1);
+
+		addTableHeader("v","Unit Table") if ($main::verboseTable == 231 or ($psHasMultiUnits and $main::verbose>=3));
+		foreach my $snmpID (@snmpIDs) {
+			my $unitid = $entries->{$snmpOidUnitId . '.' . $snmpID};
+			my $class = $entries->{$snmpOidClass . '.' . $snmpID};
+			my $cabnr = $entries->{$snmpOidCabNr . '.' . $snmpID};
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $model = $entries->{$snmpOidModel . '.' . $snmpID};
+			my $serial = $entries->{$snmpOidSerial . '.' . $snmpID};
+			my $location = $entries->{$snmpOidLocation . '.' . $snmpID};
+			my $contact = $entries->{$snmpOidContact . '.' . $snmpID};
+			my $admURL = $entries->{$snmpOidAdmURL . '.' . $snmpID};
+			my $wwn = $entries->{$snmpOidWWN . '.' . $snmpID};
+			my $manIp = $entries->{$snmpOidManIP . '.' . $snmpID};
+			$class = 0 if (!defined $class or $class < 0);
+			$class = 24 if ($class > 24);
+			if ($class == 7 and $serial) { #multiCodeChassis
+				$cxChassisSerial	= $serial;
+				$cxChassisName		= $designation;
+				$cxChassisModel		= $model;
+				$cxChassesLocation	= $location;
+				$cxChassisContact	= $contact;
+			}
+			$psHasMultiUnits = 1 if ($cabnr and $cabnr > 10); # ignore CX400
+			if (!$genNotify and ($main::verboseTable == 231 or $psHasMultiUnits)) { 
+				addStatusTopic("v",undef, "Unit", $unitid);
+				addKeyIntValue("v","CabinetNr", $cabnr);
+				addSerialIDs("v",$serial, undef);
+				addKeyValue("v","Class",$classText[$class]) if ($class);
+				addName("v",$designation);
+				addProductModel("v",undef, $model);
+				addLocationContact("v",$location, $contact);
+				addAdminURL("v",$admURL);
+				addKeyValue("v","ManagementIP", $manIp);
+				addKeyValue("v","WWN", $wwn);
+				$variableVerboseMessage .= "\n";
+			}
+			if ($genNotify and $snmpID == 1) {
+				addAdminURL("n",$admURL);
+				addKeyLongValue("n","ManagementIP",$manIp);
+				addProductModel("n",undef, $model);
+				# ATTENTION - print MultiNodeInformation as last part
+			}
+		} # each
+	} #
+	# iRMC: Name seems to be the HousingType
+} #primergyServerUnitTable
+our $svAgentVersion = undef;
+sub primergyServerAgentInfo {
+	my $snmpOidAgentInfoGroup = '.1.3.6.1.4.1.231.2.10.2.2.10.1.'; #sc2AgentInfo
+	my $snmpOidAgtID	= $snmpOidAgentInfoGroup . '1.0'; #sc2AgentId
+	my $snmpOidCompany	= $snmpOidAgentInfoGroup . '2.0'; #sc2AgentCompany
+	my $snmpOidVersion	= $snmpOidAgentInfoGroup . '3.0'; #sc2AgentVersion
+	{ # for SSM check the agent version mmust be fetched
+		my $id = trySNMPget($snmpOidAgtID,"sc2AgentInfo");
+		my $company = trySNMPget($snmpOidCompany,"sc2AgentInfo");
+		my $version = trySNMPget($snmpOidVersion,"sc2AgentInfo");
+		$svAgentVersion = $version;
+		if ($main::verbose >= 3 and ($id || $company || $version)) {
+			addStatusTopic("v",undef,"AgentInfo", undef);
+			addKeyLongValue("v","Ident",$id);
+			addKeyValue("v","Version",$version) if ($version !~ m/\s/);
+			addKeyLongValue("v","Version",$version) if ($version =~ m/\s/);
+			addKeyLongValue("v","Company",$company);
+			addMessage("v","\n");
+		} #found something
+	} #verbose
+} #primergyServerAgentInfo
+sub primergyServerSystemInformation {
+	#my $serial = shift;
+	my $snmpOidUnitTable = '.1.3.6.1.4.1.231.2.10.2.2.10.2.3.1.'; #sc2UnitTable
+	my $snmpOidName		= $snmpOidUnitTable . '4.1'; #sc2UnitDesignation.1
+	my $snmpOidModel	= $snmpOidUnitTable . '5.1'; #sc2UnitModelName.1
+	my $snmpOidLocation	= $snmpOidUnitTable . '8.1'; #sc2UnitLocation.1
+	my $snmpOidContact	= $snmpOidUnitTable . '9.1'; #sc2UnitContact.1
+	my $snmpOidAdminUrl	= $snmpOidUnitTable . '10.1'; #sc2UnitAdminURL.1
+	my $snmpOidManIPAddress = $snmpOidUnitTable . '18.1'; #sc2ManagementIpAddress.1
+	RFC1213sysinfoToLong(); # Always for the detection of iRMC
+	{
+		if (($main::verbose) || ($exitCode==1) || ($exitCode==2)) {
+			my $name = trySNMPget($snmpOidName,"sc2UnitTable");
+			my $model = trySNMPget($snmpOidModel,"sc2UnitTable");
+			my $location = trySNMPget($snmpOidLocation,"sc2UnitTable");
+			my $contact = trySNMPget($snmpOidContact,"sc2UnitTable");
+			my $admURL = trySNMPget($snmpOidAdminUrl,"sc2UnitTable");
+			my $manageIP = trySNMPget($snmpOidManIPAddress,"sc2UnitTable");
+			if ($location or $contact or $admURL or $manageIP or $model) {
+				{
+					addAdminURL("n",$admURL);
+					addKeyLongValue("n","ManagementIP",$manageIP);
+					addProductModel("n",undef, $model);
+					if ($cxChassisName or $cxChassisModel) {
+						my $isiRMC = undef;
+						$isiRMC = 1 if ($notifyMessage =~ m/iRMC/);
+						my $hasOSmib = svOsInfoTable();
+						inv_sniInventoryOSinformation() if (!$hasOSmib);
+
+						$notifyMessage .= "\n";
+						addStatusTopic("n", undef,"Multi Node System", undef);
+						addSerialIDs("n", $cxChassisSerial, undef);
+						addName("n", $cxChassisName);
+						addLocationContact("n",$cxChassesLocation, $cxChassisContact);
+						addProductModel("n",undef, $cxChassisModel);
+					}
+				} # new notify
+			} # infos available
+		} # verbose or warning or error
+	} 
+} #primergyServerSystemInformation
+our $psVoltageStatus = undef;
+our $psCPUStatus = undef;
+our $psMemoryStatus = undef;
+our $psFanStatus = undef;
+our $psTempStatus = undef;
+our $psPowerStatus = undef;
+our @psStatusText = ( "ok", "warning", "error", "unknown", ); #sc2Status in NAGIOS return values
+sub primergyServerStatusComponentTable {
+	my $snmpOidStatusGroup = '.1.3.6.1.4.1.231.2.10.2.2.10.8.'; #sc2Status
+	my $snmpOidOverallStatus	= $snmpOidStatusGroup . '1.0'; #sc2AgentStatus
+	my @statusText = ( "none",
+		"ok", "warning", "error", undef, "unknown",
+		"..unexpected..",
+	);
+	my %codeMap = (			1       =>      0,
+					2       =>      1,
+					3       =>      2,
+					4       =>      2,
+					5	=>	3,);
+	my $snmpOidStatusComponentTable = $snmpOidStatusGroup . '2.1.'; #sc2StatusComponentTable
+	my $snmpOidBoot		= $snmpOidStatusComponentTable . '3'; #sc2csStatusBoot
+	my $snmpOidPower	= $snmpOidStatusComponentTable . '4'; #sc2csStatusPowerSupply
+	my $snmpOidTemp		= $snmpOidStatusComponentTable . '5'; #sc2csStatusTemperature
+	my $snmpOidFan		= $snmpOidStatusComponentTable . '6'; #sc2csStatusFans
+	my $snmpOidVolt		= $snmpOidStatusComponentTable . '7'; #sc2csStatusVoltages
+	my $snmpOidCpu		= $snmpOidStatusComponentTable . '8'; #sc2csStatusCpu
+	my $snmpOidMem		= $snmpOidStatusComponentTable . '9'; #sc2csStatusMemoryModule
+	my @tableChecks = (
+		$snmpOidBoot, $snmpOidPower, $snmpOidTemp,
+		$snmpOidFan, $snmpOidVolt, $snmpOidCpu, $snmpOidMem,
+	);
+	{
+		#my $overallStatus = trySNMPget($snmpOidOverallStatus, "sc2AgentStatus");
+		#$variableVerboseMessage .= "Overall: $statusText[$overallStatus]" if (defined $overallStatus);
+		#$variableVerboseMessage .= "\n" if (defined $overallStatus);
+
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidPower, 1);
+		addTableHeader("v","Status Component Table") 
+		    if (($main::verbose > 2 and $optChkSystem) or $main::verboseTable == 821);
+		foreach my $snmpID (@snmpIDs) {
+			my $boot = $entries->{$snmpOidBoot . '.' . $snmpID};
+			my $power = $entries->{$snmpOidPower . '.' . $snmpID};
+			my $temp = $entries->{$snmpOidTemp . '.' . $snmpID};
+			my $fan = $entries->{$snmpOidFan . '.' . $snmpID};
+			my $volt = $entries->{$snmpOidVolt . '.' . $snmpID};
+			my $cpu = $entries->{$snmpOidCpu . '.' . $snmpID};
+			my $mem = $entries->{$snmpOidMem . '.' . $snmpID};
+			#$psHasMultiUnits = 1 if ($snmpID > 1);
+			$boot = 0 if (!defined $boot or $boot < 0);
+			$boot = 6 if ($boot > 6);
+			if (($main::verbose > 2 and $optChkSystem) or $main::verboseTable == 821) { 
+				addStatusTopic("v",undef,"Unit", $snmpID);
+				addComponentStatus("v","Boot", $statusText[$boot]) if (defined $boot); 
+				addComponentStatus("v","PowerSupplies", $statusText[$power]) 
+					if (defined $power); 
+				addComponentStatus("v","Temperatures", $statusText[$temp]) 
+					if (defined $temp); 
+				addComponentStatus("v","Cooling", $statusText[$fan]) if (defined $fan); 
+				addComponentStatus("v","Voltages", $statusText[$volt]) if (defined $volt); 
+				addComponentStatus("v","CPUs", $statusText[$cpu]) if (defined $cpu); 
+				addComponentStatus("v","MemoryModules", $statusText[$mem]) 
+					if (defined $mem); 
+				$variableVerboseMessage .= "\n";
+			}
+			$volt = 5 if ($volt and $volt > 5);
+			$cpu = 5 if ($cpu and $cpu > 5);
+			$mem = 5 if ($mem and $mem > 5);
+			$fan = 5 if ($fan and $fan > 5);
+			$temp = 5 if ($temp and $temp > 5);
+			$psVoltageStatus = $codeMap{$volt} if ($volt and !defined $psVoltageStatus);
+			$psCPUStatus = $codeMap{$cpu} if ($cpu and !defined $psCPUStatus);
+			$psMemoryStatus = $codeMap{$mem} if ($mem and !defined $psMemoryStatus);
+			$psFanStatus = $codeMap{$fan} if ($fan and !defined $psFanStatus);
+			$psTempStatus = $codeMap{$temp} if ($temp and !defined $psTempStatus);
+			$psPowerStatus = $codeMap{$power} if ($power and !defined $psPowerStatus);
+
+			if ($snmpID == $snmpIDs[0]) {
+			    addComponentStatus("m", "Cooling", $statusText[$fan])
+				    if ($optChkEnv_Fan and defined $psFanStatus);
+			    addComponentStatus("m", "TemperatureSensors", $statusText[$temp])
+				    if ($optChkEnv_Temp and defined $psTempStatus);
+			}
+		} # each
+	}
+} #primergyServerStatusComponentTable
+
+sub primergyServerSystemBoardTable {
+	my $snmpOidSystemBoardTable = '.1.3.6.1.4.1.231.2.10.2.2.10.6.1.1.'; #sc2SystemBoardTable
+	my $snmpOidModel	= $snmpOidSystemBoardTable . '3'; #sc2SystemBoardModelName
+	my $snmpOidProduct	= $snmpOidSystemBoardTable . '4'; #sc2SystemBoardProductNumber
+	my $snmpOidSerial	= $snmpOidSystemBoardTable . '6'; #sc2SystemBoardSerialNumber
+	my $snmpOidDesignation	= $snmpOidSystemBoardTable . '7'; #sc2SystemBoardDesignation
+	my @tableChecks = (
+		$snmpOidModel, $snmpOidProduct, $snmpOidSerial, $snmpOidDesignation,
+	);
+	if ($main::verboseTable == 611) { #PS SystemBoardTable
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIDs = ();
+		@snmpIDs = getSNMPTableIndex($entries, $snmpOidSerial, 2);
+
+		addTableHeader("v","System Board Table");
+		foreach my $snmpID (@snmpIDs) {
+			my $designation = $entries->{$snmpOidDesignation . '.' . $snmpID};
+			my $model = $entries->{$snmpOidModel . '.' . $snmpID};
+			my $product = $entries->{$snmpOidProduct . '.' . $snmpID};
+			my $serial = $entries->{$snmpOidSerial . '.' . $snmpID};
+			{ 
+				addStatusTopic("v",undef,"SystemBoard", $snmpID);
+				addSerialIDs("v",$serial, undef);
+				addName("v",$designation);
+				addProductModel("v",$product, $model);
+				$variableVerboseMessage .= "\n";
+			}
+		} # each
+	}
+} #primergyServerSystemBoardTable
+sub primergyServerVoltageTable {
+	my $snmpOidVoltageTable = '.1.3.6.1.4.1.231.2.10.2.2.10.6.3.1.'; #sc2VoltageTable
+	my $snmpOidDesignation		= $snmpOidVoltageTable . '3'; #sc2VoltageDesignation
+	my $snmpOidStatus		= $snmpOidVoltageTable . '4'; #sc2VoltageStatus
+	my $snmpOidCurrent		= $snmpOidVoltageTable . '5'; #sc2VoltageCurrentValue mV
+	my $snmpOidMin			= $snmpOidVoltageTable . '7'; #sc2VoltageMinimumLevel
+	my $snmpOidMax			= $snmpOidVoltageTable . '8'; #sc2VoltageMaximumLevel
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidStatus, $snmpOidCurrent, $snmpOidMin, $snmpOidMax,
+	);
+	my @statusText = ( "none",
+		"unknown", "not-available", "ok", "too-low", "too-high",
+		"out-of-range",	"warning", "..unexpected..",
+	);
+	return if (!defined $psVoltageStatus);
+	if ($optChkHardware or $optChkVoltage) {
+		#msg .= " Voltages($psStatusText[$psVoltageStatus])";
+		addComponentStatus("m", "Voltages", $psStatusText[$psVoltageStatus]);
+	}
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if ($psVoltageStatus and $psVoltageStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if ( ($optChkSystem or $optChkHardware or $optChkVoltage) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Voltages") if ($verbose);
+		foreach my $id (@snmpIdx) {
+ 			my $status  = $entries->{$snmpOidStatus . '.' . $id};
+ 			my $name = $entries->{$snmpOidDesignation . '.' . $id};
+			my $current = $entries->{$snmpOidCurrent . '.' . $id};
+  			my $min = $entries->{$snmpOidMin . '.' . $id};
+ 			my $max = $entries->{$snmpOidMax . '.' . $id};
+			$name =~ s/[ ,;=]/_/g;
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 8 if ($status > 8);
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status],"Voltage",$id=~m/\d+\.(\d+)/);
+				addName("v",$name);
+				addmVolt("v",$current, undef,undef, $min,$max);
+				$variableVerboseMessage .= "\n";
+			} 
+			elsif ($notify and ($status >= 4)
+			) {
+				addStatusTopic("l",$statusText[$status],"Voltage",$id=~m/\d+\.(\d+)/);
+				addName("l",$name);
+				addmVolt("l",$current, undef,undef, $min,$max);
+				$longMessage .= "\n";
+			}
+		} #each
+	}
+} #primergyServerVoltageTable
+sub primergyServerCPUTable {
+	my $snmpOidCPUTable = '.1.3.6.1.4.1.231.2.10.2.2.10.6.4.1.'; #sc2CPUTable
+	my $snmpOidDesignation	= $snmpOidCPUTable . '3'; #sc2cpuDesignation
+	my $snmpOidStatus	= $snmpOidCPUTable . '4'; #sc2cpuStatus
+	my $snmpOidModel	= $snmpOidCPUTable . '3'; #sc2cpuModelName
+	my $snmpOidSpeed	= $snmpOidCPUTable . '8'; #sc2cpuCurrentSpeed MHz
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidStatus, $snmpOidModel, $snmpOidSpeed, 
+	);
+	my @statusText = ( "none",
+		"unknown", "not-present", "ok", "disabled", "error",
+		"failed", "missing-termination", "prefailure-warning", "..unexpected..",
+	);
+	return if (!defined $psCPUStatus);
+	if ($optChkHardware or $optChkCPU) {
+		#msg .= " CPUs($psStatusText[$psCPUStatus])";
+		addComponentStatus("m", "CPUs", $psStatusText[$psCPUStatus]);
+	}
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if ($psCPUStatus and $psCPUStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkHardware or $optChkSystem or $optChkCPU) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","CPU Table") if ($verbose);
+		foreach my $id (@snmpIdx) {
+ 			my $status  = $entries->{$snmpOidStatus . '.' . $id};
+ 			my $name = $entries->{$snmpOidDesignation . '.' . $id};
+			my $model = $entries->{$snmpOidModel . '.' . $id};
+			my $speed = $entries->{$snmpOidSpeed . '.' . $id};
+			$model = undef if ($model and $name and $model eq $name);
+ 			$name =~ s/[ ,;=]/_/g;
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 9 if ($status > 9);
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status],"CPU",$id=~m/\d+\.(\d+)/);
+				addName("v",$name);
+				addProductModel("v",undef, $model);
+				addKeyMHz("v","Speed", $speed);
+				$variableVerboseMessage .= "\n";
+			} 
+			elsif ($notify and ($status >= 5)
+			) {
+ 				addStatusTopic("l",$statusText[$status],"CPU",$id=~m/\d+\.(\d+)/);
+				addName("l",$name);
+				addProductModel("l",undef, $model);
+				addKeyMHz("l","Speed", $speed);
+				$longMessage .= "\n";
+			}
+		} #each
+	}
+} #primergyServerCPUTable
+sub primergyServerMemoryModuleTable {
+	my $snmpOidMemoryModuleTable = '.1.3.6.1.4.1.231.2.10.2.2.10.6.5.1.'; #sc2MemoryModuleTable
+	my $snmpOidDesignation	= $snmpOidMemoryModuleTable . '3'; #sc2memModuleDesignation
+	my $snmpOidStatus	= $snmpOidMemoryModuleTable . '4'; #sc2memModuleStatus
+	my $snmpOidCapacity	= $snmpOidMemoryModuleTable . '6'; #sc2memModuleCapacity MB
+	my $snmpOidType		= $snmpOidMemoryModuleTable . '9'; #sc2memModuleType
+	my $snmpOidFrequency	= $snmpOidMemoryModuleTable . '14'; #sc2memModuleFrequency MHz
+	my $snmpOidMaxFrequency	= $snmpOidMemoryModuleTable . '15'; #sc2memModuleMaxFrequency
+	my @tableChecks = (
+		$snmpOidDesignation, $snmpOidStatus, $snmpOidCapacity, $snmpOidType, 
+		$snmpOidFrequency, $snmpOidMaxFrequency, 
+	);
+	my @statusText = ( "none",
+		"unknown", "not-present", "ok", "disabled", "error",
+		"failed", "prefailure-predicted", "hot-spare", "mirror", "raid",
+		"hidden", "..unexpected..",
+	);
+	return if (!defined $psMemoryStatus);
+	if ($optChkHardware or $optChkMemMod) {
+		#msg .= " MemoryModules($psStatusText[$psMemoryStatus])";
+		addComponentStatus("m", "MemoryModules", $psStatusText[$psMemoryStatus]);
+	}
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if ($psMemoryStatus and $psMemoryStatus < 3);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkHardware or $optChkSystem or $optChkMemMod) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","Memory Modules Table") if ($verbose);
+		foreach my $id (@snmpIdx) {
+ 			my $status  = $entries->{$snmpOidStatus . '.' . $id};
+ 			my $name = $entries->{$snmpOidDesignation . '.' . $id};
+			my $capacity = $entries->{$snmpOidCapacity . '.' . $id};
+			my $type = $entries->{$snmpOidType . '.' . $id};
+			my $frequency = $entries->{$snmpOidFrequency . '.' . $id};
+			my $max = $entries->{$snmpOidMaxFrequency . '.' . $id};
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 12 if ($status > 12);
+ 			$name =~ s/[ ,;=]/_/g;
+			if ($verbose and $status != 2) {
+				addStatusTopic("v",$statusText[$status],"Memory",$id=~m/\d+\.(\d+)/);
+				addName("v",$name);
+				addKeyLongValue("v","Type", $type);
+				addKeyMB("v","Capacity", $capacity);
+				addKeyMHz("v","Frequency", $frequency);
+				addKeyMHz("v","Frequency-Max", $max);
+				$variableVerboseMessage .= "\n";
+			} 
+			elsif ($notify and ($status >= 5)
+			) {
+				addStatusTopic("l",$statusText[$status],"Memory",$id=~m/\d+\.(\d+)/);
+				addName("l",$name);
+				addKeyLongValue("l","Type", $type);
+				addKeyMB("l","Capacity", $capacity);
+				addKeyMHz("l","Frequency", $frequency);
+				addKeyMHz("l","Frequency-Max", $max);
+				$longMessage .= "\n";
+			}
+		} #each
+	}
+} #primergyServerMemoryModuleTable
+
+sub primergyServerPerformanceTable {
+	my $osmib = shift;
+	my $snmpOidPerformanceTable = '.1.3.6.1.4.1.231.2.10.2.2.10.4.3.1.'; #sc2PerformanceTable (2)
+	my $snmpOidType		= $snmpOidPerformanceTable . '3'; #sc2PerformanceType
+	my $snmpOidObjNr	= $snmpOidPerformanceTable . '4'; #sc2PerformanceObjectNr
+	my $snmpOidName		= $snmpOidPerformanceTable . '5'; #sc2PerformanceName
+	my $snmpOidValue	= $snmpOidPerformanceTable . '6'; #sc2PerformanceName
+	my @tableChecks = (
+		$snmpOidType, $snmpOidObjNr, $snmpOidName, $snmpOidValue, 
+	);
+	my @typeText = ( "none",
+		"cpu", "cpu-overall", "pci-load", "pci-efficiency", "pci-transfer",
+		"memory-physical", "memory-total", "memory-percent", "..unexpected..",
+	);
+        #            cpu:             Load of a single CPU in percent
+        #            cpu-overall:     Overall CPU load in percent
+        #            pci-load:        PCI bus load in percent
+        #            pci-efficiency:  PCI bus efficiency in percent (100% is optimum)
+        #            pci-transfer:    PCI bus transfer rate in MBytes/sec.
+        #            memory-physical: Physical memory usage in MBytes
+        #            memory-total:    Total memory usage (physical + virtual) in MBytes
+        #            memory-percent:  Physical memory usage in percent"
+	my $getInfos = 0;
+	$getInfos = 1 if ($main::verbose >= 3 and $optChkHardware and !$main::verboseTable);
+	$getInfos = 1 if ($optChkCpuLoadPerformance);
+	$getInfos = 1 if ($optChkMemoryPerformance);
+	my $totalCPU = undef;
+	my @cpu = (0,0,0,0,0, 0,0,0,0,0, -1,);
+	my $virtualMemMBytes = undef;
+	my $physMemPercent = undef;
+	my $physMemMBytes = undef;
+	if ($getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidType, 2);
+
+		addTableHeader("v","Hardware Performance Table") 
+			if ($entries and $main::verbose >= 3 and !$main::verboseTable);
+		my $maxInd = 0;
+		foreach my $id (@snmpIdx) {
+ 			my $type  = $entries->{$snmpOidType . '.' . $id};
+ 			my $name = $entries->{$snmpOidName . '.' . $id};
+			my $objNr = $entries->{$snmpOidObjNr . '.' . $id};
+			my $value = $entries->{$snmpOidValue . '.' . $id};
+			$type = 0 if (!defined $type or $type < 0);
+			$type = 9 if ($type > 9);
+			if ($main::verbose >= 3 and !$main::verboseTable) {
+				addStatusTopic("v",undef,$typeText[$type],undef);
+				addKeyLongValue("v","Data","$name" . "[$objNr]") if ($type and $type == 1);
+				addKeyLongValue("v","Data",$name) if ($type and $type != 1);
+				if ($type == 5) {
+					addKeyMB("v","Value", $value);
+					$variableVerboseMessage .= "/sec";
+				} elsif ($type and $type > 5 and $type <= 7) {
+					addKeyMB("v","Value", $value);
+				} else {
+					addKeyPercent("v","Value", $value);
+				}
+				$variableVerboseMessage .= "\n";
+			} 
+			if ($optChkCpuLoadPerformance and defined $value) {
+				$totalCPU = $value if ($type == 2);
+				$cpu[$objNr]=$value if ($type == 1);
+				$maxInd = $objNr if ($objNr > $maxInd);
+			}
+			if ($optChkMemoryPerformance and defined $value) {
+				$physMemMBytes = $value if ($type == 6);
+				$physMemMBytes = negativeValueCheck($physMemMBytes);
+				$virtualMemMBytes = $value if ($type == 7 and ($name =~ m/virtual/));
+				$virtualMemMBytes = negativeValueCheck($virtualMemMBytes);
+				$physMemPercent = $value if ($type == 8);
+				$physMemPercent = negativeValueCheck($physMemPercent);
+			}
+		} # each
+		if ($maxInd) {
+			$maxInd++;
+			$cpu[$maxInd] = -1;
+		}
+	} #verbose
+	if ($optChkCpuLoadPerformance) {
+		if (!$osmib) {
+		    addKeyPercent("m", "Total", $totalCPU, undef,undef, undef,undef);
+		    addPercentageToPerfdata("Total", $totalCPU, undef, undef)
+			    if (!$main::verboseTable);
+		}
+		if (defined $totalCPU) {
+		    my $i = 0;
+		    for ($i=0; $cpu[$i] != -1;$i++) {
+			    addPercentageToPerfdata("CPU[$i]", $cpu[$i], undef, undef)
+				    if (!$main::verboseTable);
+		    } #each
+		}
+		$exitCode = 0 if (defined $totalCPU);
+	} #cpu load
+	if ($optChkMemoryPerformance) {
+		my $warn = ($optWarningLimit?$optWarningLimit:0);
+		my $crit = ($optCriticalLimit?$optCriticalLimit:0);
+		$warn = undef if ($warn == 0);
+		$crit = undef if ($crit == 0);
+		addKeyPercent("m", "Physical-Memory", $physMemPercent, undef,undef, undef,undef);
+		addKeyMB("m","Physical-Memory", $physMemMBytes);
+		addKeyMB("m","Virtual-Memory", $virtualMemMBytes);
+		addPercentageToPerfdata("Physical-Memory", $physMemPercent, $warn, $crit)
+			if (!$main::verboseTable);
+		$exitCode = 0;
+		$exitCode = 1 if ($warn and $physMemPercent and $physMemPercent > $warn);
+		$exitCode = 2 if ($crit and $physMemPercent and $physMemPercent > $crit);
+		$exitCode = 3 if (!$physMemPercent and !$physMemMBytes and !$virtualMemMBytes);
+	} #memory
+} #primergyServerPerformanceTable
+sub primergyServerDriverMonitoring {
+	#--      sc2DriverMonitorComponentTable:	1.3.6.1.4.1.231.2.10.2.2.10.11.1
+	#--      sc2DriverMonitorMessageTable:		1.3.6.1.4.1.231.2.10.2.2.10.11.2
+	my $snmpOidDrvMonCompTable = '.1.3.6.1.4.1.231.2.10.2.2.10.11.1.1.'; #sc2DriverMonitorComponentTable(3)
+	my $snmpOidClass	= $snmpOidDrvMonCompTable . '1'; #sc2drvmonCompClass
+	my $snmpOidName		= $snmpOidDrvMonCompTable . '3'; #sc2drvmonCompName
+	my $snmpOidType		= $snmpOidDrvMonCompTable . '4'; #sc2drvmonCompType
+	my $snmpOidDrvName	= $snmpOidDrvMonCompTable . '5'; #sc2drvmonCompDriverName
+	my $snmpOidLocation	= $snmpOidDrvMonCompTable . '6'; #sc2drvmonCompLocationDesignation
+	my $snmpOidStatus	= $snmpOidDrvMonCompTable . '8'; #sc2drvmonCompStatus
+	my @tableChecks = (
+		$snmpOidClass, $snmpOidName, $snmpOidType, $snmpOidDrvName, $snmpOidLocation, 
+		$snmpOidStatus,
+	);
+	my @classText = ("none",
+		"other", "software", "network",	"storage", "..unexpected..",
+	);
+	my @typeText = ("none",
+		"other", "pci", "usb",  "..unexpected..",
+	);
+	my @statusText = ("none",
+		"ok", "warning", "error", undef, "unknown",
+		 "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verboseInfo = 0;
+	my $notokInfo = 0;
+	$verboseInfo = 1 
+		if ($main::verbose >= 2 or $main::verboseTable == 1111);
+	$notokInfo = 1
+		if (!$main::verboseTable and $resultDrvMonitor 
+		and ($resultDrvMonitor == 1 or $resultDrvMonitor == 2));
+	$getInfos = 1 if ($verboseInfo or $notokInfo);
+	if ($getInfos) { #sc2DriverMonitorComponentTable
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 3);
+
+		addTableHeader("v","Driver Monitor Component Table");
+		foreach my $id (@snmpIdx) {
+			my $name = $entries->{$snmpOidName . '.' . $id};
+			my $status = $entries->{$snmpOidStatus . '.' . $id};
+			my $class = $entries->{$snmpOidClass . '.' . $id};
+			my $type = $entries->{$snmpOidType . '.' . $id};
+			my $drvName = $entries->{$snmpOidDrvName . '.' . $id};
+			my $location = $entries->{$snmpOidLocation . '.' . $id};
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 6 if ($status > 6);
+			$class = 0 if (!defined $class or $class < 0);
+			$class = 5 if ($class > 5);
+			$type = 0 if (!defined $type or $type < 0);
+			$type = 4 if ($type > 4);
+			next if (($status == 4 or $status > 5) and $main::verbose < 3);
+			$id =~ m/(\d+\.)\d+\.(\d+)/;
+			my $shortid = $1 . $2;
+			if ($verboseInfo) {
+				addStatusTopic("v",$statusText[$status],"DrvMon",
+					$shortid);
+				addKeyLongValue("v","Name", $name);
+				addKeyValue("v","Class",$classText[$class]) if ($class);
+				addKeyValue("v","Type",$typeText[$type]) if ($type);
+				addKeyValue("v","Driver",$drvName);
+				addKeyLongValue("v","Location",$location);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notokInfo and ($status == 2 or $status == 3)) {
+				addStatusTopic("l",$statusText[$status],"DrvMon",
+					$shortid);
+				addKeyLongValue("l","Name", $name);
+				addKeyValue("l","Class",$classText[$class]) if ($class);
+				addKeyValue("l","Type",$typeText[$type]) if ($type);
+				addKeyValue("l","Driver",$drvName);
+				addKeyLongValue("l","Location",$location);
+				$longMessage .= "\n";
+			}
+		} # each
+	}
+} #primergyServerDriverMonitoring
+sub primergyServerTrustedPlatformModuleTable { # --> INVENTORY
+	my $snmpOidTpmTable = '.1.3.6.1.4.1.231.2.10.2.2.10.6.8.1.';
+	#sc2TrustedPlatformModuleTable - 1 index
+	my $snmpOidHardwareAvailable	= $snmpOidTpmTable . '2'; #sc2tpmHardwareAvailable
+	my $snmpOidBiosEnabled		= $snmpOidTpmTable . '3'; #sc2tpmBiosEnabled
+	my $snmpOidEnabled		= $snmpOidTpmTable . '4'; #sc2tpmEnabled
+	my $snmpOidActivated		= $snmpOidTpmTable . '5'; #sc2tpmActivated
+	my $snmpOidOwnership		= $snmpOidTpmTable . '6'; #sc2tpmOwnership
+	my @tableChecks = (
+		$snmpOidHardwareAvailable, $snmpOidBiosEnabled, $snmpOidEnabled, 
+		$snmpOidActivated, $snmpOidOwnership, 
+	);
+	my @UFTtext = ("none", 
+		"unknown", "false", "true", "..unexpected..",);
+	my $verboseInfo = 0;
+	$verboseInfo = 1 if ($main::verbose >= 2);
+	{
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidHardwareAvailable, 1);
+
+		addTableHeader("v","Trusted Platform Module Table");
+		my $tmpExitCode = 3;
+		foreach my $id (@snmpIdx) {
+			my $hwAvailable = $entries->{$snmpOidHardwareAvailable . '.' . $id};
+			my $biosEnabled = $entries->{$snmpOidBiosEnabled . '.' . $id};
+			my $enabled = $entries->{$snmpOidEnabled . '.' . $id};
+			my $activated = $entries->{$snmpOidActivated . '.' . $id};
+			my $ownership = $entries->{$snmpOidOwnership . '.' . $id};
+			$hwAvailable = 0 if (!defined $hwAvailable or $hwAvailable < 0);
+			$hwAvailable = 4 if ($hwAvailable > 3);
+			$biosEnabled = 0 if (!defined $biosEnabled or $biosEnabled < 0);
+			$biosEnabled = 4 if ($biosEnabled > 3);
+			$enabled = 0 if (!defined $enabled or $enabled < 0);
+			$enabled = 4 if ($enabled > 3);
+			$activated = 0 if (!defined $activated or $activated < 0);
+			$activated = 4 if ($activated > 3);
+			$ownership = 0 if (!defined $ownership or $ownership < 0);
+			$ownership = 4 if ($ownership > 3);
+		
+			if ($verboseInfo) {
+				addStatusTopic("v",$UFTtext[$enabled],"tpm", $id);
+				addKeyValue("v","HardwareAvailable", $UFTtext[$hwAvailable]);
+				addKeyValue("v","BiosEnabled", $UFTtext[$biosEnabled]);
+				addKeyValue("v","Activated", $UFTtext[$activated]);
+				addKeyValue("v","Qwnership", $UFTtext[$ownership]);
+				$variableVerboseMessage .= "\n";
+			} 
+			$tmpExitCode = addTmpExitCode(0, $tmpExitCode) if ($enabled == 3 and $activated == 3);
+			$tmpExitCode = addTmpExitCode(1, $tmpExitCode) if ($activated == 2);
+			$tmpExitCode = addTmpExitCode(2, $tmpExitCode) if ($enabled == 2 and $activated == 2);
+		} # each
+		addExitCode($tmpExitCode);
+		addComponentStatus("m","TrustedPlatformModule","unknown")
+			if ($tmpExitCode==3);
+		addComponentStatus("m","TrustedPlatformModule","disabled")
+			if ($tmpExitCode==2);
+		addComponentStatus("m","TrustedPlatformModule","deactivated")
+			if ($tmpExitCode==1);
+		addComponentStatus("m","TrustedPlatformModule","activated")
+			if ($tmpExitCode==0);
+	}
+} #primergyServerTrustedPlatformModuleTable
+sub primergyServerSerialID {	#... this function makes only a "try" to get infos
+	# Server identification (via serial number)
+	my $snmpOidServerID = '.1.3.6.1.4.1.231.2.10.2.2.10.2.3.1.7.1'; #sc2UnitSerialNumber.1
+	{	
+		my $serverID = trySNMPget($snmpOidServerID,"ServerID");
+		addSerialIDs("n", $serverID, undef);
+	}
+} # primergyServerSerialID
+sub primergyServer {
+	# Server identification (via serial number)
+	my $snmpOidServerID = '.1.3.6.1.4.1.231.2.10.2.2.10.2.3.1.7.1'; #sc2UnitSerialNumber.1
+	my $snmpOidSc2Test = $snmpOidServerID;
+
+	#--------------------------------------------
+	mibTestSNMPget($snmpOidSc2Test,"SV-Agent") 
+		if ($optChkSystem or $optChkEnvironment or $optChkPower or $optChkUpdate);
+	# fetch ServerID
+	primergyServerUnitTable(0); # for CX400 search $serverID
+	$msg = '';
+	$msg .= "-" if (defined $optChkSystem);
+	if (defined $optChkSystem and $cxChassisSerial) {
+		addKeyValue("m", "Chassis-ID", $cxChassisSerial);
+	}
+	#primergyServerSerialID(); .. this function makes only a "try" to get infos
+	{ 
+		$serverID = simpleSNMPget($snmpOidServerID,"ServerID");
+		if ($serverID) {
+			addSerialIDs("m", $serverID, undef) if (defined $optChkSystem);
+			addSerialIDs("n", $serverID, undef);
+		}
+	}
+	$msg .= " -" if (defined $optChkSystem);
+	primergyServerStatusComponentTable();
+	primergyServerUnitTable(0) if ($psHasMultiUnits);
+	# fetch central system state
+	sieStatusAgent();
+	if ($exitCode == 4) { # iRMC and no STATUS.mib
+	    $exitCode = 3;
+	    $resultOverall = 3;
+	    $resultEnv = 3;
+	    $resultPower = 3;
+	    $resultSystem = 3;
+
+	    $resultEnv = addTmpExitCode($psFanStatus, $resultEnv);
+	    $resultEnv = addTmpExitCode($psTempStatus, $resultEnv);
+	    $resultPower = addTmpExitCode($psPowerStatus, $resultPower);
+	    $resultSystem = addTmpExitCode($psMemoryStatus, $resultSystem);
+	    $resultSystem = addTmpExitCode($psCPUStatus, $resultSystem);
+	    $resultSystem = addTmpExitCode($psVoltageStatus, $resultSystem);
+	    $resultOverall = addTmpExitCode($resultEnv, $resultOverall);
+	    $resultOverall = addTmpExitCode($resultPower, $resultOverall);
+	    $resultOverall = addTmpExitCode($resultSystem, $resultOverall);
+
+	    addComponentStatus("m", "Environment", $psStatusText[$resultEnv])
+		if ($optChkEnvironment);
+	    addComponentStatus("m", "PowerSupplies", $psStatusText[$resultPower])
+		if ($optChkPower);
+	    addComponentStatus("m", "SystemBoard", $psStatusText[$resultSystem])
+		if ($optChkSystem);
+	}
+	if ($setOverallStatus) {
+		$exitCode = $resultOverall if (defined $resultOverall);
+	} else { # mixture of options
+		$exitCode = 3;
+		addExitCode($resultEnv) if (defined $optChkEnvironment and $optChkEnvironment==1);
+		addExitCode($resultPower) if (defined $optChkPower and $optChkPower==1);
+		addExitCode($resultSystem) if (defined $optChkSystem and $optChkSystem==1);
+		if (defined $optChkStorage and $optChkStorage) {
+			if (defined $resultMassStorage) {
+				addExitCode($resultMassStorage) if ($optChkStorage==1);
+			} elsif ($optChkStorage != 999) {
+				#$exitCode = 3;
+				$msg .= "- No MassStorage information - ";
+			}
+		}
+		if ((defined $optChkDrvMonitor) and $optChkDrvMonitor) {
+			if (defined $resultDrvMonitor) {
+				addExitCode($resultDrvMonitor) if ($optChkDrvMonitor==1);
+			} elsif ($optChkDrvMonitor != 999) {
+				#$exitCode = 3;
+				$msg .= "- No Driver Monitor information - ";
+			}
+		}
+		if ($optChkHardware and $optChkHardware==1) { # double if system was set
+			addExitCode($psCPUStatus);
+			addExitCode($psVoltageStatus);
+			addExitCode($psMemoryStatus);
+		}
+		addExitCode($psFanStatus) if ($optChkEnv_Fan and $optChkEnv_Fan==1);
+		addExitCode($psTempStatus) if ($optChkEnv_Temp and $optChkEnv_Temp==1);
+		addExitCode($psCPUStatus) if ($optChkCPU and $optChkCPU==1);
+		addExitCode($psVoltageStatus) if ($optChkVoltage and $optChkVoltage==1);
+		addExitCode($psMemoryStatus) if ($optChkMemMod and $optChkMemMod==1);
+	} # mixture
+
+	primergyServerSystemInformation();
+	primergyServerAgentInfo();
+	my $ssmURL = socket_getSSM_URL($svAgentVersion);
+	addKeyValue("n","MonitorURL", $ssmURL);
+	addKeyValue("n", "SpecifiedAddress", $optHost) 
+	    if ($optHost and $optAdminHost);
+	addKeyValue("n","AdminAddress", $optAdminHost) 
+	    if ($optHost and $optAdminHost);
+	primergyServer_ManagementNodeTable();
+	primergyServer_ServerTable();
+	
+	chomp($msg);
+	
+	# process fan information
+	primergyServerFanTable($resultEnv);
+	
+	# now check the temperatures
+	primergyServerTemperatureSensorTable($resultEnv);
+
+	# power supply
+	primergyServerPowerSupplyTable($resultPower);
+
+	# get Powerconsumption
+	primergyServerPowerConsumption();
+
+
+	#hardware ... part of SystemBoard status
+	primergyServerSystemBoardTable();
+	primergyServerVoltageTable();
+	primergyServerCPUTable();
+	primergyServerMemoryModuleTable();
+	
+	my $osmib = svOsPropertyTable();
+	primergyServerPerformanceTable($osmib);
+	sieStComponentTable();
+
+	my $isiRMC = undef;
+	$isiRMC = 1 if ($notifyMessage =~ m/iRMC/);
+	if (!$cxChassisName and !$cxChassisModel) {
+	    my $hasOSmib = svOsInfoTable($isiRMC);
+	    inv_sniInventoryOSinformation() if (!$hasOSmib);
+	}
+	primergyServer_ParentMMB();
+
+	#MassStorage -> RAID.mib
+	if (defined $resultMassStorage and !$isiRMC) { # component MassStorage exist
+		RAID();
+	} # MassStorage
+	if (defined $resultDrvMonitor and $optChkDrvMonitor) {
+		primergyServerDriverMonitoring();
+	}
+} # end primergyServer
+sub primergyServerNotifyData {
+	$notifyMessage = undef;
+	primergyServerSerialID();
+	RFC1213sysinfoToLong();
+	primergyServerAgentInfo();
+	my $ssmURL = socket_getSSM_URL($svAgentVersion);
+	addKeyValue("n","MonitorURL", $ssmURL);
+	primergyServerUnitTable(1);
+	addKeyValue("n", "SpecifiedAddress", $optHost) 
+	    if ($optHost and $optAdminHost);
+	addKeyValue("n","AdminAddress", $optAdminHost) 
+	    if ($optHost and $optAdminHost);
+	my $isiRMC = undef;
+	$isiRMC = 1 if ($notifyMessage and $notifyMessage =~ m/iRMC/);
+	my $hasOSmib = svOsInfoTable($isiRMC);
+	inv_sniInventoryOSinformation() if (!$hasOSmib);
+	primergyServer_ParentMMB();
+	if ($cxChassisName or $cxChassisModel) {
+		$notifyMessage .= "\n";
+		addStatusTopic("n", undef,"Multi Node System", undef);
+		addSerialIDs("n", $cxChassisSerial, undef);
+		addName("n", $cxChassisName);
+		addLocationContact("n",$cxChassesLocation, $cxChassisContact);
+		addProductModel("n",undef, $cxChassisModel);
+	}
+} # primergyServerNotifyData
+
+#----------- SVUpdate.mib
+  sub svupdComponentTable {
+	return if (!$optChkUpdDiffList and !$optChkUpdInstList);
+	my $save_exitCode = $exitCode;
+	my $snmpOidTable = '.1.3.6.1.4.1.231.2.10.2.12.1.2.2.1.'; #svupdComponentTable
+	    # ATTENTION - no double 1.1. at the end here !
+ 	my $snmpOidPath		= $snmpOidTable .  '2'; #svupdComponentPath
+ 	my $snmpOidCompVersion	= $snmpOidTable .  '5'; #svupdComponentVersion
+ 	my $snmpOidInstVersion	= $snmpOidTable .  '6'; #svupdComponentInstalledVersion
+ 	my $snmpOidRepos	= $snmpOidTable .  '8'; #svupdRepos2InstRanking
+ 	my $snmpOidMandatory	= $snmpOidTable .  '9'; #svupdIsMandatoryComponent
+ 	my $snmpOidSeverity	= $snmpOidTable . '11'; #svupdVendorSeverity
+ 	my $snmpOidReboot	= $snmpOidTable . '15'; #svupdRebootRequired
+ 	my $snmpOidDuration	= $snmpOidTable . '16'; #svupdInstallDuration; sec
+ 	my $snmpOidSize		= $snmpOidTable . '17'; #svupdDownloadSize; MB
+ 	my $snmpOidVendor	= $snmpOidTable . '20'; #svupdVendor
+ 	my $snmpOidInRepos	= $snmpOidTable . '22'; #svupdBinaryLoaded
+	my @yesnoText = ( "none", 
+	    "yes", "no", "..unexpected..",
+	);
+	my @rankText = ( "none", 
+	    "unknown", "repositoryNewest", "repositoryNewer", "equal", "highestDowngrade",
+	    "repositoryOlder", "..unexpected..",
+	);
+	my @severityText = ( "none", 
+	    "optional", "recommended", "mandatory", "..unexpected..",
+	);
+	my @rebootText = ( "none", 
+	    "no", "immediate", "asConfigured", "dynamic", "..unexpected..",
+	);
+	my @tableChecks = (
+		$snmpOidPath		,
+		$snmpOidCompVersion	,
+		$snmpOidInstVersion	,
+		$snmpOidRepos	,
+		$snmpOidMandatory,	
+		$snmpOidSeverity,	
+		$snmpOidReboot	,
+		$snmpOidDuration,	
+		$snmpOidSize	,	
+		$snmpOidVendor	,
+		$snmpOidInRepos	,
+	);
+	# the output directory
+	handleOutputDirectory() if ($optOutdir);
+	return if ($exitCode == 2);
+
+	my $fileHost = $optHost;
+	$fileHost =~ s/[^A-Z,a-z,.,\-,0-9]//g;
+	{
+		my $printLimit = 10;
+		my $printIndex = 0;
+		$printLimit = 0 if ($main::verbose >= 3);
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidPath, 1);
+		my $save_verboseMessage = $variableVerboseMessage;
+		$variableVerboseMessage = '';
+		foreach my $id (@snmpIdx) {
+ 			my $path	= $entries->{$snmpOidPath		. '.' . $id};
+			my $cvers	= $entries->{$snmpOidCompVersion	. '.' . $id};
+			my $ivers	= $entries->{$snmpOidInstVersion	. '.' . $id};
+			my $rank	= $entries->{$snmpOidRepos		. '.' . $id};
+			my $mandatory   = $entries->{$snmpOidMandatory		. '.' . $id};
+			my $severity	= $entries->{$snmpOidSeverity		. '.' . $id};
+			my $reboot	= $entries->{$snmpOidReboot		. '.' . $id};
+			my $duration	= $entries->{$snmpOidDuration		. '.' . $id};
+			my $size	= $entries->{$snmpOidSize		. '.' . $id};
+			my $vendor	= $entries->{$snmpOidVendor		. '.' . $id};
+			my $inRepos	= $entries->{$snmpOidInRepos		. '.' . $id};
+
+			$mandatory = 3 if (!defined $mandatory or $mandatory < 0 or $mandatory > 2);
+			$rank = 7 if (!defined $rank or $rank < 0 or $rank > 6);
+			$severity = 4 if (!defined $severity or $severity < 0 or $severity > 3);
+			$reboot  =5 if (!defined $reboot or $reboot < 0 or $reboot > 4);
+
+			my $uptodate = 0;
+			$uptodate = 1 if ($rank and ($rank < 2 or $rank > 3) and $optChkUpdInstList);
+
+			next if (!$cvers or !$ivers);
+			next if ($rank and ($rank < 2 or $rank > 3) and $main::verbose < 9 and $optChkUpdDiffList);
+
+			#my $sevExitCode = undef;
+			#$sevExitCode = $severity - 1 if ($severity > 0 and $severity <= 3);
+			#addExitCode($sevExitCode) if (defined $sevExitCode and $optChkUpdDiffList);
+
+			if (!$printLimit or $printIndex < $printLimit) {
+			    addStatusTopic("l",$severityText[$severity], "",undef) if (!$uptodate);
+			    addStatusTopic("l","uptodate", "",undef) if ($uptodate);
+				addKeyLongValue("l", "Path", $path);
+			    addMessage("l", "\n");
+			    addMessage("l", "#\t");
+				addKeyLongValue("l", "Installed", $ivers);
+			    addMessage("l", "\n");
+			    addMessage("l", "#\t");
+				addKeyLongValue("l", "Available", $cvers);
+			    addMessage("l", "\n");
+			    if ($main::verbose >= 2) {
+				addMessage("l", "#\t");
+				    addKeyLongValue("l", "Vendor", $vendor);
+				addMessage("l", "\n");
+				addMessage("l", "#\t");
+				    addKeyValue("l", "Rank", $rankText[$rank]) if ($main::verbose >= 9);
+				    addKeyValue("l", "Mandatory", $yesnoText[$mandatory]);
+				    addKeyIntValue("l", "Severity", $severityText[$severity]);
+				addMessage("l", "\n");
+				addMessage("l", "#\t");
+				    addKeyMB("l", "Size", $size);
+				    addKeyIntValueUnit("l", "Duration", $duration, "sec");
+				    addKeyIntValue("l", "RebootMode", $rebootText[$reboot]);
+				addMessage("l", "\n");
+			    }
+			    $printIndex++;
+			}
+			if ($optOutdir) { # file
+			    addMessage("v",$path);
+			    addMessage("v", "\n");
+			    addMessage("v", "#\t");
+				addKeyLongValue("v", "Installed", $ivers);
+			    addMessage("v", "\n");
+			    addMessage("v", "#\t");
+				addKeyLongValue("v", "Available", $cvers);
+			    addMessage("v", "\n");
+			    
+			    addMessage("v", "#\t");
+				addKeyLongValue("v", "Vendor", $vendor);
+			    addMessage("v", "\n");
+			    addMessage("v", "#\t");
+				addKeyValue("v", "Mandatory", $yesnoText[$mandatory]);
+				addKeyValue("v", "Severity", $severityText[$severity]);
+			    addMessage("v", "\n");
+			    addMessage("v", "#\t");
+				addKeyMB("v", "Size", $size);
+				addKeyValueUnit("v", "Duration", $duration, "sec");
+				addKeyValue("v", "RebootMode", $rebootText[$reboot]);
+			    addMessage("v", "\n");		
+			}
+		} # foreach
+		addMessage("l", "#...\n") if ($printLimit and $printLimit == $printIndex);
+		if ($optOutdir) {
+		    writeTxtFile($fileHost, "DIFF", $variableVerboseMessage);
+		}
+		$variableVerboseMessage = $save_verboseMessage;
+	} # get table
+  } #svupdComponentTable
+
+  sub primergyUpdateAgent {
+	my $snmpOidUpdServerStatus = '.1.3.6.1.4.1.231.2.10.2.12.1.3.1.0'; #svupdServerStatus
+	#	    1=OK, 2=Warn, 3=Crit, 4=Unknown
+	my @updStateText = ('none', 'ok', 'warning', 'critical', 'unknown', "..undefined..",);
+	return if (!$optChkUpdate);
+	my $updstate = undef;
+	{
+	    $updstate = mibTestSNMPget($snmpOidUpdServerStatus,"SV-UpdateAgent", 1); # skip internal RFC1213
+	    addStatusTopic("v", undef, "UpdateStatus", undef);
+	    $updstate = -1 if (!defined $updstate);
+	    addKeyIntValue("v", "NumericState", $updstate);
+	    $updstate = 4 if ($updstate < 1);
+	    $updstate = 4 if ($updstate > 4);
+	    addExitCode($updstate -1);
+	    addComponentStatus("m", "UpdateStatus", $updStateText[$updstate]);
+	} # status
+	if (($updstate and $updstate >= 2 and $updstate != 4 and $optChkUpdDiffList) 
+	or  ($updstate and $updstate >= 1 and $updstate != 4 and $optChkUpdInstList)) {
+	    svupdComponentTable();
+	}
+  } # primergyUpdateAgent
+#----------- RAID functions
+our $raidLDrive = undef;
+our $raidPDevice = undef;
+our $raidCtrl = undef;
+our @raidCompStatusText = ( "none",	"ok", "prefailure", "failure", "..unexpected..",);
+our @raidInterfaceText = ( "none",
+	"other", "scsi", "ide",	"ieee1394", "sata",
+	"sas", "fc", "..unexpected..",
+);
+sub RAIDoverallStatus {
+	my $snmpOidSrvStatusGroup = '.1.3.6.1.4.1.231.2.49.1.3.'; #svrStatus
+	my $snmpOidOverall	= $snmpOidSrvStatusGroup . '4.0'; #svrStatusOverall
+	my $overall = trySNMPget($snmpOidOverall, "svrStatus");
+	if (defined $overall) {
+		$overall = 0 if ($overall < 0);
+		$overall = 4 if ($overall > 4);
+		#$raidCompStatusText[$overall]
+		$exitCode = 0 if ($overall == 1);
+		$exitCode = 1 if ($overall == 2);
+		$exitCode = 2 if ($overall == 3);
+	}
+	$resultMassStorage = $exitCode;
+	if (!defined $resultOverall) { # Status.mib is not existing
+		#msg .= "MassStorage($raidCompStatusText[$overall])" 
+		addComponentStatus("m", "MassStorage", $raidCompStatusText[$overall])
+			if (defined $overall);
+		addKeyLongValue("l","Hint", "RAID Only Check - status is RAID status");
+	}
+} #RAIDoverallStatus
+sub RAIDsvrStatus {
+	my $snmpOidSrvStatusGroup = '.1.3.6.1.4.1.231.2.49.1.3.'; #svrStatus
+	my $snmpOidLogicDrive	= $snmpOidSrvStatusGroup . '1.0'; #svrStatusLogicalDrives
+	my $snmpOidPhysDevice	= $snmpOidSrvStatusGroup . '2.0'; #svrStatusPhysicalDevices
+	my $snmpOidController	= $snmpOidSrvStatusGroup . '3.0'; #svrStatusControllers
+	my $snmpOidOverall	= $snmpOidSrvStatusGroup . '4.0'; #svrStatusOverall
+	if ($main::verbose >=2 or $resultMassStorage != 0) {
+		my $logicDrive = trySNMPget($snmpOidLogicDrive, "svrStatus");
+		my $phyDevice = trySNMPget($snmpOidPhysDevice, "svrStatus");
+		my $controller = trySNMPget($snmpOidController, "svrStatus");
+		my $overall = trySNMPget($snmpOidOverall, "svrStatus");
+		my $found = 0;
+		if ($logicDrive or $phyDevice or $controller or $overall) {
+			$found = 1;
+			$raidLDrive = $logicDrive;
+			$raidPDevice = $phyDevice;
+			$raidCtrl = $controller;
+		}
+		if (defined $overall) {
+			$overall = 0 if ($overall < 0);
+			$overall = 4 if ($overall > 4);
+		}
+		if (defined $controller) {
+			$controller = 0 if ($controller < 0);
+			$controller = 4 if ($controller > 4);
+		}
+		if (defined $phyDevice) {
+			$phyDevice = 0 if ($phyDevice < 0);
+			$phyDevice = 4 if ($phyDevice > 4);
+		}
+		if (defined $logicDrive) {
+			$logicDrive = 0 if ($logicDrive < 0);
+			$logicDrive = 4 if ($logicDrive > 4);
+		}
+		addTableHeader("v","RAID Overview");
+		if ($found and $main::verbose >=2) {
+			$variableVerboseMessage .= "\n";
+			addStatusTopic("v",$raidCompStatusText[$overall],
+				"RAID -", undef);
+			addComponentStatus("v","Controller", $raidCompStatusText[$controller])
+				if (defined $controller);
+			addComponentStatus("v","PhysicalDevice", $raidCompStatusText[$phyDevice])
+				if (defined $phyDevice);
+			addComponentStatus("v","LogicalDrive", $raidCompStatusText[$logicDrive])
+				if (defined $logicDrive);
+			$variableVerboseMessage .= "\n";
+		} elsif ($found and $resultMassStorage != 0) {
+			addStatusTopic("l",$raidCompStatusText[$overall],
+				"RAID -", undef);
+			addComponentStatus("l","Controller", $raidCompStatusText[$controller])
+				if (defined $controller);
+			addComponentStatus("l","PhysicalDevice", $raidCompStatusText[$phyDevice])
+				if (defined $phyDevice);
+			addComponentStatus("l","LogicalDrive", $raidCompStatusText[$logicDrive])
+				if (defined $logicDrive);
+			$longMessage .= "\n";
+		}
+	}
+} #RAIDsvrStatus
+sub RAIDsvrCtrlTable {
+	#--		:		
+	my $snmpOidSvrCtrlTable = '.1.3.6.1.4.1.231.2.49.1.4.2.1.'; #svrCtrlTable (1)
+	my $snmpOidModel	= $snmpOidSvrCtrlTable .  '2'; #svrCtrlModelName
+	my $snmpOidDescription	= $snmpOidSvrCtrlTable .  '5'; #svrCtrlBusLocationText
+	my $snmpOidCache	= $snmpOidSvrCtrlTable . '13'; #svrCtrlCacheSize MB
+	my $snmpOidBbuStatus	= $snmpOidSvrCtrlTable . '14'; #svrCtrlBBUStatus
+	my $snmpOidStatus	= $snmpOidSvrCtrlTable . '15'; #svrCtrlStatus
+	my $snmpOidInterface	= $snmpOidSvrCtrlTable . '16'; #svrCtrlInterface
+	my $snmpOidSerial	= $snmpOidSvrCtrlTable . '21'; #svrCtrlSerialNo
+	my $snmpOidDriverName	= $snmpOidSvrCtrlTable . '22'; #svrCtrlDriverName
+	my $snmpOidDisplayName	= $snmpOidSvrCtrlTable . '25'; #svrCtrlDisplayName
+	my $snmpOidHostName	= $snmpOidSvrCtrlTable . '26'; #svrCtrlHostName
+	my @tableChecks = (
+		$snmpOidModel, $snmpOidDescription, $snmpOidCache, $snmpOidBbuStatus, $snmpOidStatus, 
+		$snmpOidInterface, $snmpOidSerial, $snmpOidDriverName, $snmpOidDisplayName, $snmpOidHostName, 
+	);
+	my @bbuStatusText = ( "none",
+		"notAvailable",	"onLine", "onBattery", "onBatteryLow", "charging",
+		"discharging", "failed", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (defined $raidCtrl and $raidCtrl > 1);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkSystem or $optChkStorage) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 1);
+		addTableHeader("v","RAID Controller") if ($verbose);
+		foreach my $id (@snmpIdx) {
+ 			my $model  = $entries->{$snmpOidModel . '.' . $id};
+ 			my $descr = $entries->{$snmpOidDescription . '.' . $id};
+			my $cache = $entries->{$snmpOidCache . '.' . $id};
+			my $bbuStatus = $entries->{$snmpOidBbuStatus . '.' . $id};
+			my $status = $entries->{$snmpOidStatus . '.' . $id};
+			my $interface  = $entries->{$snmpOidInterface . '.' . $id};
+ 			my $serial = $entries->{$snmpOidSerial . '.' . $id};
+			my $driver = $entries->{$snmpOidDriverName . '.' . $id};
+			my $display = $entries->{$snmpOidDisplayName . '.' . $id};
+			my $hostname = $entries->{$snmpOidHostName . '.' . $id};
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 4 if ($status > 4);
+			$interface = 0 if (!defined $interface or $interface < 0);
+			$interface = 8 if ($interface > 8);
+			$bbuStatus = 8 if ($bbuStatus and $bbuStatus > 8);
+
+			if ($verbose) {
+				addStatusTopic("v",$raidCompStatusText[$status],
+				"RAIDCtrl", $id);
+				addSerialIDs("v",$serial, undef);
+				addKeyLongValue("v","Name", $display);
+				addKeyLongValue("v","Description", $descr);
+				addHostName("v",$hostname);
+				addKeyMB("v","Cache", $cache);
+				addKeyValue("v","BBU", $bbuStatusText[$bbuStatus])
+					if (defined $bbuStatus and $bbuStatus > 1);
+				addKeyValue("v","Interface", $raidInterfaceText[$interface])
+					if (defined $interface);
+				addKeyValue("v","Driver", $driver);
+				addProductModel("v",undef, $model) if (!defined $display);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify and $status > 1) {
+				addStatusTopic("l",$raidCompStatusText[$status],
+				"RAIDCtrl", $id);
+				addSerialIDs("l",$serial, undef);
+				addKeyLongValue("l","Name", $display);
+				addKeyLongValue("l","Description", $descr);
+				addHostName("l",$hostname);
+				addKeyValue("l","BBU", $bbuStatusText[$bbuStatus])
+					if (defined $bbuStatus and $bbuStatus > 1);
+				addProductModel("l",undef, $model) if (!defined $display);
+				$longMessage .= "\n";
+			}
+		} # each
+	} #getInfos
+} #RAIDsvrCtrlTable
+sub RAIDsvrPhysicalDeviceTable {
+	my $snmpOidPhysicalDeviceTable = '.1.3.6.1.4.1.231.2.49.1.5.2.1.'; #svrPhysicalDeviceTable (4)
+	my $snmpOidNodel	= $snmpOidPhysicalDeviceTable .  '5'; #svrPhysicalDeviceModelName
+	my $snmpOidGB		= $snmpOidPhysicalDeviceTable .  '7'; #svrPhysicalDeviceCapacity GB
+	my $snmpOidType		= $snmpOidPhysicalDeviceTable .  '9'; #svrPhysicalDeviceType
+	my $snmpOidInterface	= $snmpOidPhysicalDeviceTable . '11'; #svrPhysicalDeviceInterface
+	my $snmpOidErrors	= $snmpOidPhysicalDeviceTable . '12'; #svrPhysicalDeviceErrors
+	my $snmpOidBadBlocks	= $snmpOidPhysicalDeviceTable . '13'; #svrPhysicalDeviceNrBadBlocks
+	my $snmpOidSmartStatus	= $snmpOidPhysicalDeviceTable . '14'; #svrPhysicalDeviceSmartStatus
+	my $snmpOidStatus	= $snmpOidPhysicalDeviceTable . '15'; #svrPhysicalDeviceStatus
+	my $snmpOidSerial	= $snmpOidPhysicalDeviceTable . '17'; #svrPhysicalDeviceSerialNumber
+	#my $snmpOidExStatus	= $snmpOidPhysicalDeviceTable . '20'; #svrPhysicalDeviceStatusEx
+	my $snmpOidMB		= $snmpOidPhysicalDeviceTable . '21'; #svrPhysicalDeviceCapacityMB MB
+	my $snmpOidEnclosure	= $snmpOidPhysicalDeviceTable . '22'; #svrPhysicalDeviceEnclosureNumber
+	my $snmpOidSlot		= $snmpOidPhysicalDeviceTable . '23'; #svrPhysicalDeviceSlot
+	my $snmpOidDisplay	= $snmpOidPhysicalDeviceTable . '24'; #svrPhysicalDeviceDisplayName
+	my $snmpOidPower	= $snmpOidPhysicalDeviceTable . '26'; #svrPhysicalDevicePowerStatus
+	my @tableChecks = (
+		$snmpOidNodel, $snmpOidGB, $snmpOidType, $snmpOidInterface, $snmpOidErrors, 
+		$snmpOidBadBlocks, $snmpOidSmartStatus, $snmpOidStatus, $snmpOidSerial, 
+		$snmpOidMB, $snmpOidEnclosure, $snmpOidSlot, $snmpOidDisplay, $snmpOidPower, 
+	);
+	my @typeText = ( "none",
+		"other", "disk", "tape", "printer", "processor",
+		"writeOnce", "cdRomDvd", "scanner", "optical", "jukebox",
+		"communicationDevice", undef, undef, undef, undef,
+		undef, undef, "host", "..unexpected..",
+	); # host(98) -> 18
+	my @smartStatusText = ( "none",
+		"ok", "failurePredicted", "smartNotAvailable", "smartMonitoringDisabled",
+		"..unexpected..",
+	);
+	my @statusText = ( "none",
+		"unknown", "noDisk", "online", "ready",	"failed",
+		"rebuilding", "hotspareGlobal",	"hotspareDedicated", "offline",	"unconfiguredFailed",
+		"formatting", "dead", "..unexpected..",
+	);
+	my @powerText = ( "none",
+		"active", "stopped", "transition", "..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (defined $raidPDevice and $raidPDevice > 1);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkSystem or $optChkStorage) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 4);
+
+		addTableHeader("v","RAID Physical Device")	if ($verbose);
+		foreach my $id (@snmpIdx) {
+			my $model  = $entries->{$snmpOidNodel . '.' . $id};
+ 			my $gb = $entries->{$snmpOidGB . '.' . $id};
+			my $type = $entries->{$snmpOidType . '.' . $id};
+			my $interface  = $entries->{$snmpOidInterface . '.' . $id};
+			my $errors = $entries->{$snmpOidErrors . '.' . $id};
+			my $badblocks = $entries->{$snmpOidBadBlocks . '.' . $id};
+			my $smart = $entries->{$snmpOidSmartStatus . '.' . $id};
+			my $status = $entries->{$snmpOidStatus . '.' . $id};
+ 			my $serial = $entries->{$snmpOidSerial . '.' . $id};
+			my $mb = $entries->{$snmpOidMB . '.' . $id};
+			my $enclosure = $entries->{$snmpOidEnclosure . '.' . $id};
+			my $slot = $entries->{$snmpOidSlot . '.' . $id};
+			my $display = $entries->{$snmpOidDisplay . '.' . $id};
+			my $power = $entries->{$snmpOidPower . '.' . $id};
+			$interface = 0 if (!defined $interface or $interface < 0);
+			$interface = 8 if ($interface > 8);
+
+			$type = 0 if (!defined $type or $type < 0);
+			$type = $type - 80 if ($type and $type > 90);
+			$type = 19 if (($type >= 12 and $type <= 17) or $type > 19);
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 13 if ($status > 13);
+			$power = 0 if (!defined $power or $power < 0);
+			$power = 4 if ($power > 4);
+
+			if ($verbose) {
+				my $ctrl = undef;
+				$ctrl = $1 if ($id =~ m/^([^\.]+)/);
+
+				if (defined $smart and ($smart == 1 or $smart == 2)) {
+					addStatusTopic("v",$smartStatusText[$smart], undef, undef);
+				}
+				addStatusTopic("v",$statusText[$status], "PhysicalDevice", '');
+				addKeyLongValue("v","Name", $display);
+				addSerialIDs("v",$serial, undef);
+				addKeyValue("v","CntErrors",$errors);
+				addKeyValue("v","CntBadBlocks",$badblocks);
+				addKeyValue("v","SmartStatus",$smartStatusText[$smart])
+					if ($smart and $smart > 2 and $smart < 6);
+				addKeyValue("v","PowerStatus",$powerText[$power]) if ($power);
+				addKeyUnsignedIntValue("v","EnclosureNr",$enclosure);
+				addKeyUnsignedIntValue("v","SlotNr",$slot);
+				addKeyUnsignedIntValue("v","Ctrl",$ctrl);
+				if ($gb) {
+					addKeyGB("v","Capacity", $gb);
+				} elsif ($mb) {
+					addKeyMB("v","Capacity", $mb);
+				}
+				addKeyValue("v","Interface",$raidInterfaceText[$interface]) if ($interface);
+				addKeyValue("v","Type",$typeText[$type]) if ($type);
+				addProductModel("v",undef, $model) if (!defined $display);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify
+			and (      (defined $smart and $smart == 2) 
+				or (defined $status and $status > 4 and (!defined $smart or $smart != 1)) )
+			) {
+				if (defined $smart and ($smart == 1 or $smart == 2)) {
+					addStatusTopic("l",$smartStatusText[$smart], undef, undef);
+				}
+				addStatusTopic("l",$statusText[$status], "PhysicalDevice", '');
+				addKeyLongValue("l","Name", $display);
+				addSerialIDs("l",$serial, undef);
+				addKeyValue("l","CntErrors",$errors);
+				addKeyValue("l","CntBadBlocks",$badblocks);
+				addKeyUnsignedIntValue("l","EnclosureNr",$enclosure);
+				addKeyUnsignedIntValue("l","SlotNr",$slot);
+				addKeyValue("l","Interface",$raidInterfaceText[$interface]) if ($interface);
+				addKeyValue("l","Type",$typeText[$type]) if ($type);
+				addProductModel("l",undef, $model) if (!defined $display);
+				$longMessage .= "\n";
+			}
+		} # each
+	} #getInfos
+} #RAIDsvrPhysicalDeviceTable
+sub RAIDsvrLogicalDriveTable {
+	my $snmpOidLogicalDriveTable = '.1.3.6.1.4.1.231.2.49.1.6.2.1.'; #svrLogicalDriveTable (2)
+	my $snmpOidSize		= $snmpOidLogicalDriveTable .  '4'; #svrLogicalDriveTotalSize GB
+	my $snmpOidLevel	= $snmpOidLogicalDriveTable .  '5'; #svrLogicalDriveRaidLevel
+	my $snmpOidStatus	= $snmpOidLogicalDriveTable . '10'; #svrLogicalDriveStatus
+	my $snmpOidName		= $snmpOidLogicalDriveTable . '11'; #svrLogicalDriveName
+	my $snmpOidOSDev	= $snmpOidLogicalDriveTable . '14'; #svrLogicalDriveOSDeviceName
+	my $snmpOidDisplay	= $snmpOidLogicalDriveTable . '20'; #svrLogicalDriveDisplayName (try)
+	my @tableChecks = (
+		$snmpOidSize, $snmpOidLevel, $snmpOidStatus, $snmpOidName, $snmpOidOSDev, 
+	);
+	my @levelText = ( "none",
+		"unknown", "raid0", "raid01", "raid1", "raid1e",
+		"raid10", "raid3", "raid4", "raid5", "raid50",
+		"raid5e", "raid5ee", "raid6", "concat",	"single",
+		"raid60", "raid1e0", "..unexpected..",		
+	);
+	my @statusText = ( "none",
+		"unknown", "online", "degraded", "offline", "rebuilding",
+		"verifying", "initializing", "morphing", "partialDegraded",
+		"..unexpected..",
+	);
+	my $getInfos = 0;
+	my $verbose = 0;
+	my $notify = 0;
+	$verbose = 1 if ($main::verbose >= 2 and !$main::verboseTable);
+	$notify = 1 if (defined $raidLDrive and $raidLDrive > 1);
+	$getInfos = 1 if ($verbose or $notify);
+	if (($optChkSystem or $optChkStorage) and $getInfos) {
+		my $entries = getSNMPtable(\@tableChecks);
+		my @snmpIdx = ();
+		@snmpIdx = getSNMPTableIndex($entries, $snmpOidStatus, 2);
+
+		addTableHeader("v","RAID Logical Drive") if ($verbose);
+		foreach my $id (@snmpIdx) {
+			my $status = $entries->{$snmpOidStatus . '.' . $id};
+			my $size = $entries->{$snmpOidSize . '.' . $id};
+			my $level = $entries->{$snmpOidLevel . '.' . $id};
+			my $name = $entries->{$snmpOidName . '.' . $id};
+			my $osdev = $entries->{$snmpOidOSDev . '.' . $id};
+			my $display = trySNMPget($snmpOidDisplay . '.' . $id,"svrLogicalDriveTable");
+			$level = 0 if (!defined $level or $level < 0);
+			$level = 18 if ($level > 18);
+			$status = 0 if (!defined $status or $status < 0);
+			$status = 11 if ($status > 11);
+
+			if ($verbose) {
+				addStatusTopic("v",$statusText[$status], 
+					"LogicalDrive", $id);
+				addKeyLongValue("v","Name", $display) if ($display);
+				addKeyLongValue("v","Name", $name) if ($name and !defined $display);
+				addKeyLongValue("v","OSDeviceName", $osdev);
+				addKeyValue("v","Level", $levelText[$level]) if ($level);
+				addKeyGB("v","TotalSize", $size);
+				$variableVerboseMessage .= "\n";
+			} elsif ($notify
+			and (defined $status and $status > 2)
+			) {
+				addStatusTopic("l",$statusText[$status], 
+					"LogicalDrive", $id);
+				addKeyLongValue("l","Name", $display) if ($display);
+				addKeyLongValue("l","Name", $name) if ($name and !defined $display);
+				addKeyLongValue("l","OSDeviceName", $osdev);
+				addKeyValue("l","Level", $levelText[$level]) if ($level);
+				addKeyGB("l","TotalSize", $size);
+				$longMessage .= "\n";
+			}
+		} # each
+	} #getInfos
+} #RAIDsvrLogicalDriveTable
+sub RAID {
+	# RAID.mib
+	#my $snmpOidRaidMib = '.1.3.6.1.4.1.231.2.49.'; #fscRAIDMIB
+	if ($optChkSystem or $optChkStorage) {
+		RAIDsvrStatus();
+		RAIDsvrCtrlTable();
+		RAIDsvrPhysicalDeviceTable();
+		RAIDsvrLogicalDriveTable();
+	} #optChkSystem
+} # RAID
+#------------ Storage ?
+  sub storageOverallStatus {
+	# Status.mib
+	my $snmpOidPrefix = '1.3.6.1.4.1.231.2.10.2.11.'; #sieStatusAgent
+	my $snmpOidSysStat		= $snmpOidPrefix . '2.1.0'; #sieStSystemStatusValue.0
+	my $srvCommonSystemStatus = trySNMPget($snmpOidSysStat,"SystemStatus");
+	if (defined $srvCommonSystemStatus) {
+		sieStatusAgent();
+	}
+	my $storeExitCode = $resultMassStorage;
+	$resultMassStorage = undef;
+	# RAID
+	RAIDoverallStatus();
+	if (!defined $storeExitCode and $exitCode == 3) {
+		$msg .= "- No RAID or other MassStorage - ";
+	}
+	addExitCode($storeExitCode);
+  } #storageOverallStatus
+#------------ ASETEK-RACKCDU-SMI-V1-MIB-V15.mib - HELPER
+  sub rack_handleTemperaturePerfdata {
+	my $topic   = shift;
+	my $current = shift;
+	my $searchErrors = shift;
+	my $wmin = shift;
+	my $wmax = shift;
+	my $amin = shift;
+	my $amax = shift;
+	return if (!defined $current);
+
+	# current measurement value is in 1/10 and threshold is 1/1
+	my $printCurrent = $current ? $current / 10 : 0;
+	my $warn = undef;
+	my $crit = undef;
+	$warn .= "$wmin:" if ($wmin);
+	$warn .= "$wmax" if ($wmax);
+	$crit .= "$amin:" if ($amin);
+	$crit .= "$amax" if ($amax);
+	#$useDegree = 1; #... QA says no-degree should be default
+
+	# monitoring print
+	my $status = 0;
+	$status = 1	    if ((defined $wmin and $printCurrent < $wmin)
+			    or  (defined $wmax and $printCurrent > $wmax));
+	$status = 2	    if ((defined $amin and $printCurrent < $amin)
+			    or  (defined $amax and $printCurrent > $amax));
+	$status = 3 if (!defined $wmin and !defined $wmax and !defined $amin and !defined $amax);
+	my $textStatus = "ok";
+	$textStatus = "warning" if ($status == 1);
+	$textStatus = "critical" if ($status == 2);
+	$textStatus = "none" if ($status == 3);
+	if ($main::verbose >= 2) {
+	    addStatusTopic("v",$textStatus,"Temperature","");
+	    addName("v",$topic);
+	    addCelsius("v",$printCurrent,$warn,$crit);
+	    addMessage("v","\n");
+	} elsif ($searchErrors and $status) {
+	    addStatusTopic("l",$textStatus,"Temperature","");
+	    addName("l",$topic);
+	    addCelsius("l",$printCurrent,$warn,$crit);
+	    addMessage("l","\n");
+	}
+
+	# performance print    
+	addTemperatureToPerfdata($topic,$printCurrent,$warn,$crit);    
+  } #rack_handleTemperaturePerfdata
+  sub rack_handlePressurePerfdata {
+	my $topic   = shift;
+	my $current = shift;
+	my $searchErrors = shift;
+	my $wmin = shift;
+	my $wmax = shift;
+	my $amin = shift;
+	my $amax = shift;
+	return if (!defined $current);
+
+	# current measurement and threshold are 1/1000 bar
+	my $printCurrent = $current ? $current / 1000 : 0;
+	my $printWmin = $wmin ? $wmin / 1000 : 0;
+	my $printWmax = $wmax ? $wmax / 1000 : 0;
+	my $printAmin = $amin ? $amin / 1000 : 0;
+	my $printAmax = $amax ? $amax / 1000 : 0;
+
+	my $warn = undef;
+	my $crit = undef;
+	$warn .= "$printWmin:" if ($printWmin);
+	$warn .= "$printWmax";
+	$crit .= "$printAmin:" if ($printAmin);
+	$crit .= "$printAmax";
+
+	# monitoring print
+	my $status = 0;
+	$status = 1	    if ((defined $wmin and $current < $wmin)
+			    or  (defined $wmax and $current > $wmax));
+	$status = 2	    if ((defined $amin and $current < $amin)
+			    or  (defined $amax and $current > $amax));
+	my $textStatus = "ok";
+	$textStatus = "warning" if ($status == 1);
+	$textStatus = "critical" if ($status == 2);
+	if ($main::verbose >= 2) {
+	    addStatusTopic("v",$textStatus,"Pressure","");
+	    addName("v",$topic);
+	    addPressure("v",$printCurrent,$warn,$crit);
+	    addMessage("v","\n");
+	} elsif ($searchErrors and $status) {
+	    addStatusTopic("l",$textStatus,"Pressure","");
+	    addName("l",$topic);
+	    addPressure("l",$printCurrent,$warn,$crit);
+	    addMessage("l","\n");
+	}
+
+	# performance print    
+	addPressureToPerfdata($topic,$printCurrent,$warn,$crit);    
+  } #rack_handlePressurePerfdata
+  sub rack_handleFlowPerfdata {
+	my $topic   = shift;
+	my $current = shift;
+	my $searchErrors = shift;
+	my $wmin = shift;
+	my $wmax = shift;
+	my $amin = shift;
+	my $amax = shift;
+	return if (!defined $current);
+
+	# current measurement might be ml/sec and threshold might be 1/1000 ml/sec 
+	my $compareWmin = $wmin ? $wmin / 1000 : 0;
+	my $compareWmax = $wmax ? $wmax / 1000 : 0;
+	my $compareAmin = $amin ? $amin / 1000 : 0;
+	my $compareAmax = $amax ? $amax / 1000 : 0;
+
+	my $floatCurrent = $current ? ($current / 1000) * 3600 : 0;
+	my $floatWmin = $wmin ? ($wmin / 1000 / 1000) * 3600 : 0;
+	my $floatWmax = $wmax ? ($wmax / 1000 / 1000) * 3600: 0;
+	my $floatAmin = $amin ? ($amin / 1000 / 1000) * 3600: 0;
+	my $floatAmax = $amax ? ($amax / 1000 / 1000) * 3600: 0;
+
+	my $printCurrent = sprintf ("%.2f", $floatCurrent);
+	my $printWmin = sprintf ("%.2f", $floatWmin);
+	my $printWmax = sprintf ("%.2f", $floatWmax);
+	my $printAmin = sprintf ("%.2f", $floatAmin);
+	my $printAmax = sprintf ("%.2f", $floatAmax);
+
+	my $warn = undef;
+	my $crit = undef;
+	$warn .= "$printWmin:" if ($printWmin);
+	$warn .= "$printWmax";
+	$crit .= "$printAmin:" if ($printAmin);
+	$crit .= "$printAmax";
+
+	# monitoring print
+	my $status = 0;
+	$status = 1	    if ((defined $compareWmin and $current < $compareWmin)
+			    or  (defined $compareWmax and $current > $compareWmax));
+	$status = 2	    if ((defined $compareAmin and $current < $compareAmin)
+			    or  (defined $compareAmax and $current > $compareAmax));
+	my $textStatus = "ok";
+	$textStatus = "warning" if ($status == 1);
+	$textStatus = "critical" if ($status == 2);
+	if ($main::verbose >= 2) {
+	    addStatusTopic("v",$textStatus,"Flow","");
+	    addName("v",$topic);
+	    addFlow("v",$printCurrent,$warn,$crit);
+	    addMessage("v","\n");
+	} elsif ($searchErrors and $status) {
+	    addStatusTopic("l",$textStatus,"Flow","");
+	    addName("l",$topic);
+	    addFlow("l",$printCurrent,$warn,$crit);
+	    addMessage("l","\n");
+	}
+
+	# performance print    
+	addKeyUnitToPerfdata("FlowFacility","l/h",$printCurrent,$warn,$crit) if (defined $printCurrent);
+  } #rack_handleFlowPerfdata
+#------------ ASETEK-RACKCDU-SMI-V1-MIB-V15.mib
+  sub rackSystemInfo {
+	my $baseOID = ".1.3.6.1.4.1.39829.1.1."; # product
+	my $snmpOIDName		= $baseOID . "1.0"; #name
+	my $snmpOIDRnumber	= $baseOID . "4.0"; #rackNumber
+	my $snmpOIDDescription	= $baseOID . "5.0"; #description
+
+	my $type = undef;
+	my $name = undef;
+	my $descr = undef;
+	$type	= trySNMPget($snmpOIDName,"rack product.name");
+	$name	= trySNMPget($snmpOIDRnumber,"rack product.rackNumber") if ($type);
+	$descr	= trySNMPget($snmpOIDDescription,"rack product.description") if ($type);
+
+	if ($main::verboseTable == 400 and !$type) {
+	    $type = "..type..";
+	    $name = "..name..";
+	    $descr = "..descr..";
+	}
+	addKeyLongValue("n","RackIdentifier",$name);
+	addKeyLongValue("n","RackType",$type);
+	addKeyLongValue("n","Description",$descr);
+  } #rackSystemInfo
+  sub rackAgentInfo {
+	my $baseOID = ".1.3.6.1.4.1.39829.1.1."; # product
+	my $snmpOIDVersion	= $baseOID . "2.0"; #version
+	my $snmpOIDDate		= $baseOID . "3.0"; #date
+
+	my $version	= trySNMPget($snmpOIDVersion,"rack product.version");
+	my $date	= trySNMPget($snmpOIDDate,"rack product.date");
+
+	if ($main::verboseTable == 400 and !$version) {
+	    $version = "\$version\$";
+	    $date = "\$date\$";
+	}
+
+	if ($version or $date) {
+	    addStatusTopic("v",undef,"AgentInfo", undef);
+	    addKeyLongValue("v","Version",$version);
+	    addKeyLongValue("v","RevisionDate",$date);
+	    addMessage("v", "\n");
+	}
+	$exitCode = 0 if ($optAgentInfo);
+  } #rackAgentInfo
+  sub rackTemperatures {
+	my $searchErrors = shift;
+	#### current values
+	    my $mBaseOID = ".1.3.6.1.4.1.39829.1.3."; # measurements
+	    # current values in 1/10 °C 
+	    my $snmpOidTFI	= $mBaseOID . "100.0"; #temperatureFacilityIn
+	    my $snmpOidTFO	= $mBaseOID . "101.0"; #temperatureFacilityOut
+	    my $snmpOidTSI	= $mBaseOID . "102.0"; #temperatureServerIn
+	    my $snmpOidTSO	= $mBaseOID . "103.0"; #temperatureServerOut
+	    my $snmpOidTA	= $mBaseOID . "104.0"; #temperatureAmbient
+	#### thresholds
+	    my $tBaseOID = ".1.3.6.1.4.1.39829.1.7."; # notifications
+	    # threshold values in °C 
+	    my $snmpOidFIWarnMin	= $tBaseOID . "154.0"; #warningMinFi
+	    my $snmpOidFIWarnMax	= $tBaseOID . "156.0"; #warningMaxFi
+	    my $snmpOidFIAlarmMin	= $tBaseOID . "158.0"; #alarmMinFi
+	    my $snmpOidFIAlarmMax	= $tBaseOID . "160.0"; #alarmMaxFi
+	    #
+	    my $snmpOidFOWarnMin	= $tBaseOID . "162.0"; #warningMinFo
+	    my $snmpOidFOWarnMax	= $tBaseOID . "164.0"; #warningMaxFo
+	    my $snmpOidFOAlarmMin	= $tBaseOID . "166.0"; #alarmMinFo
+	    my $snmpOidFOAlarmMax	= $tBaseOID . "168.0"; #alarmMaxFo
+	    #
+	    my $snmpOidSIWarnMin	= $tBaseOID . "170.0"; #warningMinSi
+	    my $snmpOidSIWarnMax	= $tBaseOID . "172.0"; #warningMaxFi
+	    my $snmpOidSIAlarmMin	= $tBaseOID . "174.0"; #warningMaxSi
+	    my $snmpOidSIAlarmMax	= $tBaseOID . "176.0"; #alarmMaxSi
+	    #
+	    my $snmpOidSOWarnMin	= $tBaseOID . "178.0"; #warningMinSo
+	    my $snmpOidSOWarnMax	= $tBaseOID . "180.0"; #warningMaxSo
+	    my $snmpOidSOAlarmMin	= $tBaseOID . "182.0"; #alarmMinSo
+	    my $snmpOidSOAlarmMax	= $tBaseOID . "184.0"; #alarmMaxSo
+	#### get values
+	my $current = undef;
+	my $wmin = undef;
+	my $wmax = undef;
+	my $amin = undef;
+	my $amax = undef;
+	{ # Facility In
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 189;
+		$wmin=0; $wmax=55; $amin=0; $amax=60;
+	    } else {
+	    $current = trySNMPget($snmpOidTFI,"rack measurements.temperatureFacilityIn");
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidFIWarnMin,"rack notifications.warningMinFi");
+		$wmax = trySNMPget($snmpOidFIWarnMax,"rack notifications.warningMaxFi");
+		$amin = trySNMPget($snmpOidFIAlarmMin,"rack notifications.alarmMinFi");
+		$amax = trySNMPget($snmpOidFIAlarmMax,"rack notifications.alarmMaxFi");
+	    }
+	    } # 400
+	    rack_handleTemperaturePerfdata("FacilityIn",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+	$current = undef;
+	{ # Facility Out
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 196;
+		$wmin=0; $wmax=55; $amin=0; $amax=60;
+	    } else {
+	    $current = trySNMPget($snmpOidTFO,"rack measurements.temperatureFacilityOut");
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidFOWarnMin,"rack notifications.warningMinFo");
+		$wmax = trySNMPget($snmpOidFOWarnMax,"rack notifications.warningMaxFo");
+		$amin = trySNMPget($snmpOidFOAlarmMin,"rack notifications.alarmMinFo");
+		$amax = trySNMPget($snmpOidFOAlarmMax,"rack notifications.alarmMaxFo");
+	    }
+	    } # 400
+	    rack_handleTemperaturePerfdata("FacilityOut",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+	$current = undef;
+ 	{ # Server In
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 196;
+		$wmin=0; $wmax=45; $amin=0; $amax=50;
+	    } else {
+	    $current = trySNMPget($snmpOidTSI,"rack measurements.temperatureServerIn");
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidSIWarnMin,"rack notifications.warningMinSi");
+		$wmax = trySNMPget($snmpOidSIWarnMax,"rack notifications.warningMaxSi");
+		$amin = trySNMPget($snmpOidSIAlarmMin,"rack notifications.alarmMinSi");
+		$amax = trySNMPget($snmpOidSIAlarmMax,"rack notifications.alarmMaxSi");
+	    }
+	    } # 400
+	    rack_handleTemperaturePerfdata("ServerIn",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+	$current = undef;
+	{ # Server Out
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 218;
+		$wmin=0; $wmax=20; $amin=0; $amax=30; # not identic with first test data
+	    } else {
+	    $current = trySNMPget($snmpOidTSO,"rack measurements.temperatureServerOut");
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidSOWarnMin,"rack notifications.warningMinSo");
+		$wmax = trySNMPget($snmpOidSOWarnMax,"rack notifications.warningMaxSo");
+		$amin = trySNMPget($snmpOidSOAlarmMin,"rack notifications.alarmMinSo");
+		$amax = trySNMPget($snmpOidSOAlarmMax,"rack notifications.alarmMaxSo");
+	    }
+	    } # 400
+	    rack_handleTemperaturePerfdata("ServerOut",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+ 	$current = undef;
+	{ # Ambient
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 352;
+	    } else {
+	    $current = trySNMPget($snmpOidTA,"rack measurements.temperatureServerOut");
+	    } # 400
+	    rack_handleTemperaturePerfdata("Ambient",$current);
+	}
+  } #rackTemperatures
+  sub rackPressures {
+	my $searchErrors = shift;
+	#### current values
+	    my $mBaseOID = ".1.3.6.1.4.1.39829.1.3."; # measurements
+	    # current values in 1/1000 bar
+	    my $snmpOidPS	= $mBaseOID . "105.0"; #pressureServer
+	    my $snmpOidPF	= $mBaseOID . "106.0"; #pressureFacility
+	#### thresholds
+	    my $tBaseOID = ".1.3.6.1.4.1.39829.1.7."; # notifications
+	    my $snmpOidPSWarnMin	= $tBaseOID . "194.0"; #warningMinPressureServer
+	    my $snmpOidPSWarnMax	= $tBaseOID . "196.0"; #warningMaxPressureServer
+	    my $snmpOidPSAlarmMin	= $tBaseOID . "198.0"; #alarmMinPressureServer
+	    my $snmpOidPSAlarmMax	= $tBaseOID . "200.0"; #alarmMaxPressureServer
+	    #
+	    my $snmpOidPFWarnMin	= $tBaseOID . "202.0"; #warningMinPressureFacility
+	    my $snmpOidPFWarnMax	= $tBaseOID . "204.0"; #warningMaxPressureFacility
+	    my $snmpOidPFAlarmMin	= $tBaseOID . "206.0"; #alarmMinPressureFacility
+	    my $snmpOidPFAlarmMax	= $tBaseOID . "208.0"; #alarmMaxPressureFacility
+	#### get values
+	my $current = undef;
+	my $wmin = undef;
+	my $wmax = undef;
+	my $amin = undef;
+	my $amax = undef;
+	{ # Server Pressure
+	    $current = trySNMPget($snmpOidPS,"rack measurements.pressureServer");
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 3;
+		$wmin=0; $wmax=200; $amin=0; $amax=300;
+	    } else {
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidPSWarnMin,"rack notifications.warningMinPressureServer");
+		$wmax = trySNMPget($snmpOidPSWarnMax,"rack notifications.warningMaxPressureServer");
+		$amin = trySNMPget($snmpOidPSAlarmMin,"rack notifications.alarmMinPressureServer");
+		$amax = trySNMPget($snmpOidPSAlarmMax,"rack notifications.alarmMaxPressureServer");
+	    }
+	    } # 400
+	    rack_handlePressurePerfdata("ServerPressure",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+	{ # Facility Pressure
+	    $current = trySNMPget($snmpOidPF,"rack measurements.pressureServer");
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 1995;
+		$wmin=0; $wmax=3000; $amin=0; $amax=3500;
+	    } else {
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidPFWarnMin,"rack notifications.warningMinPressureFacility");
+		$wmax = trySNMPget($snmpOidPFWarnMax,"rack notifications.warningMaxPressureFacility");
+		$amin = trySNMPget($snmpOidPFAlarmMin,"rack notifications.alarmMinPressureFacility");
+		$amax = trySNMPget($snmpOidPFAlarmMax,"rack notifications.alarmMaxPressureFacility");
+	    }
+	    } # 400
+	    rack_handlePressurePerfdata("FacilityPressure",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+  } #rackPressures
+  sub rackFlowCapacity {
+	my $searchErrors = shift;
+	#### current values
+	    my $mBaseOID = ".1.3.6.1.4.1.39829.1.3."; # measurements
+	    my $snmpOidFF	= $mBaseOID . "109.0"; #flowFacility ? ml/sec
+	#### thresholds ? 1/1000 ml/sec
+	    my $tBaseOID = ".1.3.6.1.4.1.39829.1.7."; # notifications
+	    my $snmpOidWarnMin	= $tBaseOID . "186.0"; #warningMinFlow
+	    my $snmpOidWarnMax	= $tBaseOID . "188.0"; #warningMaxFlow
+	    my $snmpOidAlarmMin	= $tBaseOID . "190.0"; #alarmMinFlow
+	    my $snmpOidAlarmMax	= $tBaseOID . "192.0"; #alarmMaxFlow
+	#### get values
+	my $current = undef;
+	my $wmin = undef;
+	my $wmax = undef;
+	my $amin = undef;
+	my $amax = undef;
+	{ # Flow Facility
+	    if ($main::verboseTable==400 and !defined $current) {
+		$current = 280;		
+		#GUI: 1011,11 ...
+		$wmin=27777; $wmax=944444; $amin=20833; $amax=972222;
+		#GUI: 100, 3400, 75, 3500
+	    } else {
+	    $current = trySNMPget($snmpOidFF,"rack measurements.flowFacility");
+	    if (defined $current) {
+		$wmin = trySNMPget($snmpOidWarnMin,"rack notifications.warningMinFlow");
+		$wmax = trySNMPget($snmpOidWarnMax,"rack notifications.warningMaxFlow");
+		$amin = trySNMPget($snmpOidAlarmMin,"rack notifications.alarmMinFlow");
+		$amax = trySNMPget($snmpOidAlarmMax,"rack notifications.alarmMaxFlow");
+	    }
+	    } # 400
+	    rack_handleFlowPerfdata("FlowFacility",$current,$searchErrors,$wmin,$wmax,$amin,$amax);
+	}
+  } #rackFlowCapacity
+  sub rackHeatLoad {
+	#### current values
+	    my $mBaseOID = ".1.3.6.1.4.1.39829.1.3."; # measurements
+	    my $snmpOidHL	= $mBaseOID . "110.0"; #heatload W	/??sec	- 987
+	#### unit
+	    my $uBaseOID = ".1.3.6.1.4.1.39829.1.6."; # units
+	    my $snmpOidFactor	= $mBaseOID . "71.0"; #heatAverageFactor sec
+	#### get values
+	{
+	    my $current = undef;
+	    my $sec = undef;
+	    if ($main::verboseTable==400) {
+		$current = 987;
+		$sec=60;
+	    } else {
+	    $current = trySNMPget($snmpOidHL,"rack measurements.heatload") if (!defined $current);
+	    $sec = trySNMPget($snmpOidFactor,"rack units.heatAverageFactor")
+		if (defined $current and $main::verbose >= 2);
+	    }
+	    # print
+	    if (defined $current and $main::verbose >= 2) {
+		addStatusTopic("v","none","HeatLoad","");
+		addKeyValueUnit("v","Current",$current,"Watt");		
+		addKeyValueUnit("v","HeatAverageFactor",$sec,"sec");
+		addMessage("v","\n");
+	    }
+	    addKeyUnitToPerfdata("HeatLoad","Watt",$current) if (defined $current);
+	}
+  } #rackHeatLoad
+  sub rackControllerOut {
+  	#### current values
+	    my $mBaseOID = ".1.3.6.1.4.1.39829.1.3."; # measurements
+	    my $snmpOidCO	= $mBaseOID . "111.0"; #controllerOut	1/10 %	- 350
+	#### get values
+	{
+	    my $current = undef;
+	    if ($main::verboseTable==400) {
+		$current = 350;
+	    } else {
+	    $current = trySNMPget($snmpOidCO,"rack measurements.controllerOut") if (!defined $current);
+	    }
+	    $current = $current ? $current / 10 : 0; 
+	    if (defined $current and $main::verbose >= 2) {
+		addStatusTopic("v","none","ControllerOut","");
+		addKeyValueUnit("v","Current",$current,"%");		
+		addMessage("v","\n");
+	    }
+	    addKeyUnitToPerfdata("ControllerOut","%",$current) if (defined $current);
+	}
+  } #rackControllerOut
+  sub rackData {
+	my $overallStatus = shift;
+
+	#### current values
+	    my $mBaseOID = ".1.3.6.1.4.1.39829.1.3."; # measurements
+	    # boolean
+	    my $snmpOidSLeak	= $mBaseOID . "107.0"; #serverLeak
+	    my $snmpOidSLevel	= $mBaseOID . "108.0"; #serverLevel (coolant)
+	    # exotic
+	    my $snmpOidHL	= $mBaseOID . "110.0"; #heatload W	/??sec	- 987
+	    my $snmpOidCO	= $mBaseOID . "111.0"; #controllerOut	1/10 %	- 350
+
+	#### thresholds
+	    my $tBaseOID = ".1.3.6.1.4.1.39829.1.7."; # notifications
+
+	my $getInfos = 0;
+	my $searchErrors = 0;
+	$searchErrors = 1 if ($overallStatus == 1 or $overallStatus == 2); # warning , errors
+	$getInfos = 1 if ($main::verbose >= 2 or $searchErrors);
+	#### various Status Values
+	if ($getInfos) {
+	    my $serverLeak  = undef;
+	    my $serverLevel = undef;
+	    if ($main::verboseTable == 400 and !$serverLeak) {
+		$serverLeak=2; $serverLevel=2;
+	    } else {
+	    $serverLeak = trySNMPget($snmpOidSLeak,"rack measurements.serverLeak");
+	    $serverLevel = trySNMPget($snmpOidSLevel,"rack measurements.serverLevel") if ($serverLeak);
+	    }
+	    $serverLeak = undef if ($serverLeak and $serverLeak < 0);
+	    $serverLeak = undef if ($serverLeak and $serverLeak > 2);
+	    $serverLevel = undef if ($serverLevel and $serverLevel < 0);
+	    $serverLevel = undef if ($serverLevel and $serverLevel > 2);
+
+	    if ($main::verbose >= 2) {
+		addStatusTopic("v",undef,"RackMeasurement", undef);
+		addKeyValue("v","Leak", "no")  if ($serverLeak and $serverLeak == 1);
+		addKeyValue("v","Leak", "yes") if ($serverLeak and $serverLeak == 2);
+		addKeyValue("v","Leak", "N/A") if (!$serverLeak);
+		addKeyValue("v","CoolantLevel", "ok") if ($serverLevel and $serverLevel == 1);
+		addKeyValue("v","CoolantLevel", "low") if ($serverLevel and $serverLevel == 2);
+		addKeyValue("v","CoolantLevel", "N/A") if (!$serverLevel);
+		addMessage("v","\n");
+	    } elsif (($serverLeak and $serverLeak == 2 ) 
+	      or     ($serverLevel and $serverLevel == 2)) 
+	    {
+		addStatusTopic("l",undef,"RackMeasurement", undef);
+		addKeyValue("l","Leak", "yes") if ($serverLeak and $serverLeak == 2);
+		addKeyValue("l","CoolantLevel", "low") if ($serverLevel and $serverLevel == 2);
+		addMessage("l","\n");
+	    }
+	}
+	#### performance
+	{
+	    rackTemperatures($searchErrors);
+	    rackPressures($searchErrors);
+	    rackFlowCapacity($searchErrors);
+	    rackHeatLoad();
+	    rackControllerOut();
+	}	  
+  } #rackData
+  sub forceRackCDUStatus {
+	my $OID = ".1.3.6.1.4.1.39829.1.1.6.0"; # status
+	#ok(1),                warning(2),                error(3),                unknown(5)
+	my @statusText = ("undefined",
+	    "ok", "warning", "error", "..unexpected..", "unknown", 
+	    "..unexpected..",
+	);
+	my $status = undef;
+	$status = mibTestSNMPget($OID,"RackCDU SNMP Agent") if (!$main::verbose or $main::verbose < 60);
+	if ($optChkSystem and defined $status) {
+	    $exitCode = 0 if ($status == 1);
+	    $exitCode = 1 if ($status == 2);
+	    $exitCode = 2 if ($status == 3);
+	    my $lstatus = $status;
+	    $lstatus = 6 if ($lstatus > 5);
+	    $lstatus = 0 if ($lstatus < 0);
+	    addMessage("m","- ");
+	    addComponentStatus("m","RackCDU", $statusText[$lstatus]);
+	}
+	$status = 6 if (!defined $status and $main::verbose and $main::verbose >= 60);
+	return $status;
+  } #forceRackCDUStatus
+  sub rackCDU {
+	my $status = undef;
+	
+	if ($main::verboseTable != 400) {
+	    $status = forceRackCDUStatus();
+	    return if (!defined $status);
+	} else {
+	    $status = 2;
+	}
+
+	if ($optSystemInfo) {
+	    rackSystemInfo();
+	} elsif (defined $optAgentInfo) {
+	    rackAgentInfo();
+	} else {
+	    rackData($status);
+	    rackSystemInfo() if ($main::verbose 
+		or $exitCode == 1 or  $exitCode == 2);
+	}
+  } #rackCDU
+#------------ 
+  sub processData {
+	if (defined $optChkUpTime) {
+		RFC1213sysinfoUpTime();
+	} elsif ($optSystemInfo) {
+		$main::verbose = 1 if (!$main::verbose);
+		if (!defined $optPrimeQuest and !defined $optRackCDU 
+		and !defined $optBlade and !defined $optBladeContent) 
+		{
+			primergyServerNotifyData();
+		} elsif (defined $optBlade or defined $optBladeContent) {
+			primergyManagementBladeNotifyData();
+		} elsif (defined $optPrimeQuest) {
+			primequestUnitTableChassisSerialNumber();
+			primequestUnitTableChassis();
+		} elsif (defined $optRackCDU) {
+			rackCDU();
+		}
+		if ($notifyMessage) {
+		    $exitCode = 0;
+		} else {
+		    $msg .= "- Unable to get SNMP information";
+		}
+	} elsif (defined $optAgentInfo) {
+		if (!defined $optPrimeQuest and !defined $optRackCDU 
+		and !defined $optBlade and !defined $optBladeContent) 
+		{
+			$main::verbose = 3 if ($main::verbose <3);
+			primergyServerAgentInfo();
+			if ($variableVerboseMessage) {
+			    $longMessage = $variableVerboseMessage;
+			    $variableVerboseMessage = undef;
+			    my $version = undef;
+			    if ($longMessage =~ m/Version=\"/) {
+				$longMessage =~ m/(Version=\"[^\"]*\")\s/;
+				$version = $1;
+			    } else {
+				$longMessage =~ m/(Version=[^\s]*)/;
+				$version = $1;
+			    }
+			    #$longMessage =~ m/(Version=.*) Company/;
+			    #$version = $1;
+			    addMessage("m", "- " . $version);
+			    $exitCode = 0;
+			}
+		} elsif (defined $optBlade or defined $optBladeContent) {
+			primergyManagementBlade_MgmtBladeTable();
+		} elsif (defined $optPrimeQuest) {
+			#primequestUnitTableChassisSerialNumber();
+			#primequestUnitTableChassis();
+		} elsif (defined $optRackCDU) {
+			rackCDU();
+		}
+	} elsif (defined $optPrimeQuest) {
+		primequest();
+	} elsif (defined $optBlade) {
+		primergyManagementBlade();
+	} elsif (defined $optBladeContent) {
+		{
+			addStatusTopic("n",undef,"MMB System Information", undef);
+			primergyManagementBladeNotifyData();
+		}
+		if (defined $optBladeSrv) {
+			primergyServerBlades();
+		}
+		if (defined $optBladeIO) {
+			primergyIOConnectionBlades();
+		}
+		if (defined $optBladeKVM) {
+			primergyKVMBlades();
+		}
+		if (defined $optBladeStore) {
+			primergyStorageBlades();
+		}
+	} elsif (defined $optRackCDU) {
+		rackCDU();
+	} 
+	elsif (	$optChkCpuLoadPerformance or $optChkMemoryPerformance
+	or	$optChkFileSystemPerformance or $optChkNetworkPerformance) 
+	{
+		my $snmpOidServerID = '.1.3.6.1.4.1.231.2.10.2.2.10.2.3.1.7.1'; #sc2UnitSerialNumber.1
+		my $snmpOidSc2Test = $snmpOidServerID;
+		mibTestSNMPget($snmpOidSc2Test,"SV-Agent");
+		if ($optChkCpuLoadPerformance or $optChkMemoryPerformance) {
+		    my $osmib = svOsPropertyTable();
+		    primergyServerPerformanceTable($osmib);
+		} elsif ($optChkFileSystemPerformance) {
+		    inv_sniFileSystemTable();
+		} elsif ($optChkNetworkPerformance) {
+		    inv_sniNetworkInterfaceTable();
+		}
+		if (($exitCode > 0) or $main::verbose) {
+			primergyServerNotifyData();
+		}
+	}
+	elsif ($optChkStorage and !$optChkSystem and !$optChkEnvironment and !$optChkPower 
+	and !$optChkHardware and !$optChkDrvMonitor)
+	{
+		#RAIDoverallStatus();
+		storageOverallStatus();
+		sieStComponentTable();
+		primergyServerNotifyData();
+		my $isiRMC = undef;
+		$isiRMC = 1 if ($notifyMessage =~ m/iRMC/);
+		RAID() if (!$isiRMC);
+	} else {
+		primergyServer();
+		if ($optChkUpdate) {
+			primergyServerNotifyData(); # reset
+			primergyUpdateAgent();
+		}
+	}
+  } #processData
+#------------ MAIN PART
+
+handleOptions();
+
+#$main::verbose = $optVerbose;
+#$main::verboseTable = $optVerboseTable;
+
+# set timeout
+local $SIG{ALRM} = sub {
+	#### TEXT LANGUAGE AWARENESS
+	print 'UNKNOWN: Timeout' . "\n";
+	exit(3);
+};
+alarm($optTimeout);
+
+# connect to SNMP host
+openSNMPsession();
+
+processData();
+
+# close SNMP session
+closeSNMPsession();
+chop($error);
+
+# output to nagios
+#$|++; # for unbuffered stdout print (due to Perl documentation)
+$msg =~ s/^\s*//gm if ($msg); # remove leading blanks
+if ($msg) {
+    $msg =~ s/\0//gm; # remove 0x00 of iRMC data
+}
+if ($notifyMessage) {
+    $notifyMessage =~ s/^\s+//gm; # remove leading blanks
+    $notifyMessage =~ s/\s*$//m; # remove last blanks
+    $notifyMessage =~ s/\0//gm; # remove 0x00 of iRMC data
+}
+$notifyMessage = undef if ($main::verbose < 1 and ($exitCode==0));
+if ($longMessage) {
+    $longMessage =~ s/^\s*//m; # remove leading blanks
+    $longMessage =~ s/\s*$//m; # remove last blanks
+    $longMessage =~ s/\0//gm; # remove 0x00 of iRMC data
+}
+if ($variableVerboseMessage) {
+    $variableVerboseMessage =~ s/^\s*//m; # remove leading blanks
+    $variableVerboseMessage =~ s/\n$//m; # remove last break
+    $variableVerboseMessage =~ s/\0//gm; # remove 0x00 of iRMC data
+}
+$variableVerboseMessage = undef if ($main::verbose < 2 and  !$main::verboseTable);
+$variableVerboseMessage = undef if ($variableVerboseMessage and $variableVerboseMessage =~ m/^\s*$/);
+
+finalize(
+	$exitCode, 
+	$state[$exitCode], 
+	$msg,
+	(! $notifyMessage ? '': "\n" . $notifyMessage),
+	($longMessage eq '' ? '' : "\n" . $longMessage),
+	($variableVerboseMessage) ? "\n" . $variableVerboseMessage: "",
+	($performanceData ? "\n |" . $performanceData : ""),
+);
+################ EOSCRIPT
diff --git a/sensu/files/checks/check_kvm.sh b/sensu/files/checks/check_kvm.sh
deleted file mode 100644
index f40fb50..0000000
--- a/sensu/files/checks/check_kvm.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/bash
-#
-# Key for libvirt-client: command="sudo /srv/sensu/checks/check_virsh_list.sh $SSH_ORIGINAL_COMMAND",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa ...
-#check_virsh_list.sh:
-#
-#!/bin/bash
-#case $1 in
-#    list) virsh list --all;;
-#    dumpxml) virsh dumpxml $2;;
-#    *) echo invalid option;exit 1;;
-#esac
-#
-#Usage:
-# check_kvm.sh -i instance_id -u user_name -p user_password -t tenant_name -w auth_url
-
-
-while getopts ":i:u:p:t:w:" opt; do
-    case $opt in
-        i)
-            inst_id=${OPTARG};;
-        u)
-            user=${OPTARG};;
-      	p)
-	          passwd=${OPTARG};;
-      	t)
-            tenant_name=${OPTARG};;
-	      w)
-            auth_url=${OPTARG};;
-        \?)
-            echo "Invalid option";exit 1;;
-        : ) echo "Option -"$OPTARG" requires an argument." >&2
-            exit 1;;
-    esac
-done
-#keystone:
-export OS_USERNAME=$user
-export OS_PASSWORD=$passwd
-export OS_TENANT_NAME=$tenant_name
-export OS_AUTH_URL=$auth_url
-
-#Clear getopts variables
-for ((i=1 ; i <= 9 ; i++))
-do
-      shift
-done
-
-#Get hypervisor name
-hypervisor=`nova show $inst_id | grep hypervisor_hostname | awk '{print $4}'`
-
-#Get kvm instance name
-inst_name=`ssh -i /opt/sensu/.ssh/id_rsa libvirt-client@$hypervisor "dumpxml $inst_id" | grep '<name>'`
-#inst_name=`ssh root@$hypervisor "virsh dumpxml $inst_id | grep '<name>'"`
-inst_name=`awk '{gsub("<name>", "");print}' <<< $inst_name`
-inst_name=`awk '{gsub("</name>", "");print}' <<< $inst_name`
-
-#Get state
-state=`ssh -i /opt/sensu/.ssh/id_rsa libvirt-client@$hypervisor "list" | sed '1,2d' | sed '/^$/d'| awk '{print $2" "$3}' | grep $inst_name `
-#state=`ssh root@$hypervisor "virsh list --all | sed '1,2d' | sed '/^$/d'| awk '{print $2" "$3}' | grep $inst_name "`
-state=$(echo $state | awk -F" " '{print $2}')
-
-OK=0
-WARN=0
-CRIT=0
-NUM=0
-
-  case "$state" in
-    running|blocked) OK=$(expr $OK + 1) ;;
-    paused) WARN=$(expr $WARN + 1) ;;
-    shutdown|shut*|crashed) CRIT=$(expr $CRIT + 1) ;;
-    *) CRIT=$(expr $CRIT + 1) ;;
-  esac
-
-if [ "$NUM" -eq "$OK" ]; then
-  EXITVAL=0 #Status 0 = OK (green)
-fi
-
-if [ "$WARN" -gt 0 ]; then
-  EXITVAL=1 #Status 1 = WARNING (yellow)
-fi
-
-if [ "$CRIT" -gt 0 ]; then
-  EXITVAL=2 #Status 2 = CRITICAL (red)
-fi
-
-echo hosts:$NUM OK:$OK WARN:$WARN CRIT:$CRIT - $LIST
-
-exit $EXITVAL
diff --git a/sensu/files/checks/check_log.sh b/sensu/files/checks/check_log.sh
deleted file mode 100644
index 193d724..0000000
--- a/sensu/files/checks/check_log.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash
-
-#check logs
-#usage: ./check_log.sh -p path_to_log -l check_for_last_x_minutes -r regular_expression_you_are_looking_for -c check_last_n_lines
-
-while getopts ":p:l:r:c:" opt; do
-    case $opt in
-        p)
-            LOGPATH=${OPTARG};;
-        l)
-            LAST=${OPTARG};;
-        r)
-            REGEXP=${OPTARG};;
-        c)
-            LINESCOUNT=${OPTARG};;
-       \?)
-            echo "Invalid option";exit 1;;
-        : ) echo "Option -"$OPTARG" requires an argument." >&2
-            exit 1;;
-    esac
-done
-
-NAME=$(echo "$LOGPATH" | sed "s/.*\///" | sed "s/\..*//")
-
-LASTCHANGED=$(expr `date +%s` - `stat -c %Y $LOGPATH`)
-
-LAST=$[LAST*60]
-
-if [[ $LASTCHANGED -gt $LAST ]]; then
-        echo No new lines in file.
-        exit 0
-fi
-
-tail -$LINESCOUNT $LOGPATH > LASTLINES_$NAME
-
-ERRCODE=0
-while read line; do
-        if [[ $line == *"$REGEXP"* ]]; then
-                EXITCODE=$[EXITCODE+1]
-        fi
-done < LASTLINES_$NAME
-
-rm -rf /etc/sensu/plugins/LASTLINES_$NAME
-
-if [[ $EXITCODE -gt 0 ]]; then
-        echo CRIT:$EXITCODE from last $LINESCOUNT lines.
-        exit 2
-else
-        echo OK:$EXITCODE
-        exit 1
-fi
\ No newline at end of file
diff --git a/sensu/files/checks/check_mongodb.py b/sensu/files/checks/check_mongodb.py
new file mode 100644
index 0000000..3b1afcb
--- /dev/null
+++ b/sensu/files/checks/check_mongodb.py
@@ -0,0 +1,1571 @@
+#!/usr/bin/env python
+
+#
+# A MongoDB Nagios check script
+#
+
+# Script idea taken from a Tag1 script I found and I modified it a lot
+#
+# Main Author
+#   - Mike Zupan <mike@zcentric.com>
+# Contributers
+#   - Frank Brandewiede <brande@travel-iq.com> <brande@bfiw.de> <brande@novolab.de>
+#   - Sam Perman <sam@brightcove.com>
+#   - Shlomo Priymak <shlomoid@gmail.com>
+#   - @jhoff909 on github
+#   - @jbraeuer on github
+#   - Dag Stockstad <dag.stockstad@gmail.com>
+#   - @Andor on github
+#   - Steven Richards - Captainkrtek on github
+#   - Max Vernimmen - @mvernimmen-CG / @mvernimmen on github
+#   - Kris Childress - @kris@nivenly.com github.com/kris-nova
+#
+# USAGE
+#
+# See the README.md
+#
+
+import sys
+import time
+import optparse
+import textwrap
+import re
+import os
+
+try:
+    import pymongo
+except ImportError, e:
+    print e
+    sys.exit(2)
+
+# As of pymongo v 1.9 the SON API is part of the BSON package, therefore attempt
+# to import from there and fall back to pymongo in cases of older pymongo
+if pymongo.version >= "1.9":
+    import bson.son as son
+else:
+    import pymongo.son as son
+
+
+#
+# thanks to http://stackoverflow.com/a/1229667/72987
+#
+def optional_arg(arg_default):
+    def func(option, opt_str, value, parser):
+        if parser.rargs and not parser.rargs[0].startswith('-'):
+            val = parser.rargs[0]
+            parser.rargs.pop(0)
+        else:
+            val = arg_default
+        setattr(parser.values, option.dest, val)
+    return func
+
+
+def performance_data(perf_data, params):
+    data = ''
+    if perf_data:
+        data = " |"
+        for p in params:
+            p += (None, None, None, None)
+            param, param_name, warning, critical = p[0:4]
+            data += "%s=%s" % (param_name, str(param))
+            if warning or critical:
+                warning = warning or 0
+                critical = critical or 0
+                data += ";%s;%s" % (warning, critical)
+
+            data += " "
+
+    return data
+
+
+def numeric_type(param):
+    if ((type(param) == float or type(param) == int or type(param) == long or param == None)):
+        return True
+    return False
+
+
+def check_levels(param, warning, critical, message, ok=[]):
+    if (numeric_type(critical) and numeric_type(warning)):
+        if param >= critical:
+            print "CRITICAL - " + message
+            sys.exit(2)
+        elif param >= warning:
+            print "WARNING - " + message
+            sys.exit(1)
+        else:
+            print "OK - " + message
+            sys.exit(0)
+    else:
+        if param in critical:
+            print "CRITICAL - " + message
+            sys.exit(2)
+
+        if param in warning:
+            print "WARNING - " + message
+            sys.exit(1)
+
+        if param in ok:
+            print "OK - " + message
+            sys.exit(0)
+
+        # unexpected param value
+        print "CRITICAL - Unexpected value : %d" % param + "; " + message
+        return 2
+
+
+def get_server_status(con):
+    try:
+        set_read_preference(con.admin)
+        data = con.admin.command(pymongo.son_manipulator.SON([('serverStatus', 1)]))
+    except:
+        data = con.admin.command(son.SON([('serverStatus', 1)]))
+    return data
+
+
+def main(argv):
+    p = optparse.OptionParser(conflict_handler="resolve", description="This Nagios plugin checks the health of mongodb.")
+
+    p.add_option('-H', '--host', action='store', type='string', dest='host', default='127.0.0.1', help='The hostname you want to connect to')
+    p.add_option('-P', '--port', action='store', type='int', dest='port', default=27017, help='The port mongodb is running on')
+    p.add_option('-u', '--user', action='store', type='string', dest='user', default=None, help='The username you want to login as')
+    p.add_option('-p', '--pass', action='store', type='string', dest='passwd', default=None, help='The password you want to use for that user')
+    p.add_option('-W', '--warning', action='store', dest='warning', default=None, help='The warning threshold you want to set')
+    p.add_option('-C', '--critical', action='store', dest='critical', default=None, help='The critical threshold you want to set')
+    p.add_option('-A', '--action', action='store', type='choice', dest='action', default='connect', help='The action you want to take',
+                 choices=['connect', 'connections', 'replication_lag', 'replication_lag_percent', 'replset_state', 'memory', 'memory_mapped', 'lock',
+                          'flushing', 'last_flush_time', 'index_miss_ratio', 'databases', 'collections', 'database_size', 'database_indexes', 'collection_indexes', 'collection_size',
+                          'collection_storageSize', 'queues', 'oplog', 'journal_commits_in_wl', 'write_data_files', 'journaled', 'opcounters', 'current_lock', 'replica_primary',
+                          'page_faults', 'asserts', 'queries_per_second', 'page_faults', 'chunks_balance', 'connect_primary', 'collection_state', 'row_count', 'replset_quorum'])
+    p.add_option('--max-lag', action='store_true', dest='max_lag', default=False, help='Get max replication lag (for replication_lag action only)')
+    p.add_option('--mapped-memory', action='store_true', dest='mapped_memory', default=False, help='Get mapped memory instead of resident (if resident memory can not be read)')
+    p.add_option('-D', '--perf-data', action='store_true', dest='perf_data', default=False, help='Enable output of Nagios performance data')
+    p.add_option('-d', '--database', action='store', dest='database', default='admin', help='Specify the database to check')
+    p.add_option('--all-databases', action='store_true', dest='all_databases', default=False, help='Check all databases (action database_size)')
+    p.add_option('-s', '--ssl', dest='ssl', default=False, action='callback', callback=optional_arg(True), help='Connect using SSL')
+    p.add_option('-r', '--replicaset', dest='replicaset', default=None, action='callback', callback=optional_arg(True), help='Connect to replicaset')
+    p.add_option('-q', '--querytype', action='store', dest='query_type', default='query', help='The query type to check [query|insert|update|delete|getmore|command] from queries_per_second')
+    p.add_option('-c', '--collection', action='store', dest='collection', default='admin', help='Specify the collection to check')
+    p.add_option('-T', '--time', action='store', type='int', dest='sample_time', default=1, help='Time used to sample number of pages faults')
+    p.add_option('-M', '--mongoversion', action='store', type='choice', dest='mongo_version', default='2', help='The MongoDB version you are talking with, either 2 or 3',
+      choices=['2','3'])
+    p.add_option('-a', '--authdb', action='store', type='string', dest='authdb', default='admin', help='The database you want to authenticate against')
+
+    options, arguments = p.parse_args()
+    host = options.host
+    port = options.port
+    user = options.user
+    passwd = options.passwd
+    authdb = options.authdb
+
+    query_type = options.query_type
+    collection = options.collection
+    sample_time = options.sample_time
+    if (options.action == 'replset_state'):
+        warning = str(options.warning or "")
+        critical = str(options.critical or "")
+    else:
+        warning = float(options.warning or 0)
+        critical = float(options.critical or 0)
+
+    action = options.action
+    perf_data = options.perf_data
+    max_lag = options.max_lag
+    mongo_version = options.mongo_version
+    database = options.database
+    ssl = options.ssl
+    replicaset = options.replicaset
+
+    if action == 'replica_primary' and replicaset is None:
+        return "replicaset must be passed in when using replica_primary check"
+    elif not action == 'replica_primary' and replicaset:
+        return "passing a replicaset while not checking replica_primary does not work"
+
+    #
+    # moving the login up here and passing in the connection
+    #
+    start = time.time()
+    err, con = mongo_connect(host, port, ssl, user, passwd, replicaset, authdb)
+
+    if err != 0:
+        return err
+
+    # Autodetect mongo-version and force pymongo to let us know if it can connect or not.
+    err, mongo_version = check_version(con)
+    if err != 0:
+        return err
+
+    conn_time = time.time() - start
+    conn_time = round(conn_time, 0)
+
+    if action == "connections":
+        return check_connections(con, warning, critical, perf_data)
+    elif action == "replication_lag":
+        return check_rep_lag(con, host, warning, critical, False, perf_data, max_lag, user, passwd)
+    elif action == "replication_lag_percent":
+        return check_rep_lag(con, host, warning, critical, True, perf_data, max_lag, user, passwd)
+    elif action == "replset_state":
+        return check_replset_state(con, perf_data, warning, critical)
+    elif action == "memory":
+        return check_memory(con, warning, critical, perf_data, options.mapped_memory, host)
+    elif action == "memory_mapped":
+        return check_memory_mapped(con, warning, critical, perf_data)
+    elif action == "queues":
+        return check_queues(con, warning, critical, perf_data)
+    elif action == "lock":
+        return check_lock(con, warning, critical, perf_data, mongo_version)
+    elif action == "current_lock":
+        return check_current_lock(con, host, port, warning, critical, perf_data)
+    elif action == "flushing":
+        return check_flushing(con, warning, critical, True, perf_data)
+    elif action == "last_flush_time":
+        return check_flushing(con, warning, critical, False, perf_data)
+    elif action == "index_miss_ratio":
+        index_miss_ratio(con, warning, critical, perf_data)
+    elif action == "databases":
+        return check_databases(con, warning, critical, perf_data)
+    elif action == "collections":
+        return check_collections(con, warning, critical, perf_data)
+    elif action == "oplog":
+        return check_oplog(con, warning, critical, perf_data)
+    elif action == "journal_commits_in_wl":
+        return check_journal_commits_in_wl(con, warning, critical, perf_data)
+    elif action == "database_size":
+        if options.all_databases:
+            return check_all_databases_size(con, warning, critical, perf_data)
+        else:
+            return check_database_size(con, database, warning, critical, perf_data)
+    elif action == "database_indexes":
+        return check_database_indexes(con, database, warning, critical, perf_data)
+    elif action == "collection_indexes":
+        return check_collection_indexes(con, database, collection, warning, critical, perf_data)
+    elif action == "collection_size":
+        return check_collection_size(con, database, collection, warning, critical, perf_data)
+    elif action == "collection_storageSize":
+        return check_collection_storageSize(con, database, collection, warning, critical, perf_data)
+    elif action == "journaled":
+        return check_journaled(con, warning, critical, perf_data)
+    elif action == "write_data_files":
+        return check_write_to_datafiles(con, warning, critical, perf_data)
+    elif action == "opcounters":
+        return check_opcounters(con, host, port, warning, critical, perf_data)
+    elif action == "asserts":
+        return check_asserts(con, host, port, warning, critical, perf_data)
+    elif action == "replica_primary":
+        return check_replica_primary(con, host, warning, critical, perf_data, replicaset, mongo_version)
+    elif action == "queries_per_second":
+        return check_queries_per_second(con, query_type, warning, critical, perf_data, mongo_version)
+    elif action == "page_faults":
+        check_page_faults(con, sample_time, warning, critical, perf_data)
+    elif action == "chunks_balance":
+        chunks_balance(con, database, collection, warning, critical)
+    elif action == "connect_primary":
+        return check_connect_primary(con, warning, critical, perf_data)
+    elif action == "collection_state":
+        return check_collection_state(con, database, collection)
+    elif action == "row_count":
+        return check_row_count(con, database, collection, warning, critical, perf_data)
+    elif action == "replset_quorum":
+        return check_replset_quorum(con, perf_data)
+    else:
+        return check_connect(host, port, warning, critical, perf_data, user, passwd, conn_time)
+
+
+def mongo_connect(host=None, port=None, ssl=False, user=None, passwd=None, replica=None, authdb="admin"):
+    from pymongo.errors import ConnectionFailure
+    from pymongo.errors import PyMongoError
+
+    try:
+        # ssl connection for pymongo > 2.3
+        if pymongo.version >= "2.3":
+            if replica is None:
+                con = pymongo.MongoClient(host, port)
+            else:
+                con = pymongo.MongoClient(host, port, read_preference=pymongo.ReadPreference.SECONDARY, ssl=ssl, replicaSet=replica)
+        else:
+            if replica is None:
+                con = pymongo.MongoClient(host, port, slave_okay=True)
+            else:
+                con = pymongo.MongoClient(host, port, slave_okay=True)
+                #con = pymongo.Connection(host, port, slave_okay=True, replicaSet=replica, network_timeout=10)
+
+        try:
+          result = con.admin.command("ismaster")
+        except ConnectionFailure:
+          print("CRITICAL - Connection to Mongo server on %s:%s has failed" % (host, port) )
+          sys.exit(2)
+
+        if 'arbiterOnly' in result and result['arbiterOnly'] == True:
+            print "OK - State: 7 (Arbiter on port %s)" % (port)
+            sys.exit(0)
+
+        if user and passwd:
+            db = con[authdb]
+            try:
+              db.authenticate(user, password=passwd)
+            except PyMongoError:
+                sys.exit("Username/Password incorrect")
+
+    except Exception, e:
+        if isinstance(e, pymongo.errors.AutoReconnect) and str(e).find(" is an arbiter") != -1:
+            # We got a pymongo AutoReconnect exception that tells us we connected to an Arbiter Server
+            # This means: Arbiter is reachable and can answer requests/votes - this is all we need to know from an arbiter
+            print "OK - State: 7 (Arbiter)"
+            sys.exit(0)
+        return exit_with_general_critical(e), None
+    return 0, con
+
+
+def exit_with_general_warning(e):
+    if isinstance(e, SystemExit):
+        return e
+    else:
+        print "WARNING - General MongoDB warning:", e
+    return 1
+
+
+def exit_with_general_critical(e):
+    if isinstance(e, SystemExit):
+        return e
+    else:
+        print "CRITICAL - General MongoDB Error:", e
+    return 2
+
+
+def set_read_preference(db):
+    if pymongo.version >= "2.2":
+        pymongo.read_preferences.Secondary
+    else:
+        db.read_preference = pymongo.ReadPreference.SECONDARY
+
+def check_version(con):
+    try:
+        server_info = con.server_info()
+    except Exception, e:
+        return exit_with_general_critical(e), None
+    return 0, int(server_info['version'].split('.')[0].strip())
+
+def check_connect(host, port, warning, critical, perf_data, user, passwd, conn_time):
+    warning = warning or 3
+    critical = critical or 6
+    message = "Connection took %i seconds" % conn_time
+    message += performance_data(perf_data, [(conn_time, "connection_time", warning, critical)])
+
+    return check_levels(conn_time, warning, critical, message)
+
+
+def check_connections(con, warning, critical, perf_data):
+    warning = warning or 80
+    critical = critical or 95
+    try:
+        data = get_server_status(con)
+
+        current = float(data['connections']['current'])
+        available = float(data['connections']['available'])
+
+        used_percent = int(float(current / (available + current)) * 100)
+        message = "%i percent (%i of %i connections) used" % (used_percent, current, current + available)
+        message += performance_data(perf_data, [(used_percent, "used_percent", warning, critical),
+                (current, "current_connections"),
+                (available, "available_connections")])
+        return check_levels(used_percent, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_rep_lag(con, host, warning, critical, percent, perf_data, max_lag, user, passwd):
+    # Get mongo to tell us replica set member name when connecting locally
+    if "127.0.0.1" == host:
+        if not "me" in con.admin.command("ismaster","1").keys():
+            print "OK - This is not replicated MongoDB"
+            sys.exit(3)
+
+        host = con.admin.command("ismaster","1")["me"].split(':')[0]
+
+    if percent:
+        warning = warning or 50
+        critical = critical or 75
+    else:
+        warning = warning or 600
+        critical = critical or 3600
+    rs_status = {}
+    slaveDelays = {}
+    try:
+        #set_read_preference(con.admin)
+
+        # Get replica set status
+        try:
+            rs_status = con.admin.command("replSetGetStatus")
+        except pymongo.errors.OperationFailure, e:
+            if ((e.code == None and str(e).find('failed: not running with --replSet"')) or (e.code == 76 and str(e).find('not running with --replSet"'))):
+                print "OK - Not running with replSet"
+                return 0
+
+        serverVersion = tuple(con.server_info()['version'].split('.'))
+        if serverVersion >= tuple("2.0.0".split(".")):
+            #
+            # check for version greater then 2.0
+            #
+            rs_conf = con.local.system.replset.find_one()
+            for member in rs_conf['members']:
+                if member.get('slaveDelay') is not None:
+                    slaveDelays[member['host']] = member.get('slaveDelay')
+                else:
+                    slaveDelays[member['host']] = 0
+
+            # Find the primary and/or the current node
+            primary_node = None
+            host_node = None
+
+            for member in rs_status["members"]:
+                if member["stateStr"] == "PRIMARY":
+                    primary_node = member
+                if member.get('self') == True:
+                    host_node = member
+
+            # Check if we're in the middle of an election and don't have a primary
+            if primary_node is None:
+                print "WARNING - No primary defined. In an election?"
+                return 1
+
+            # Check if we failed to find the current host
+            # below should never happen
+            if host_node is None:
+                print "CRITICAL - Unable to find host '" + host + "' in replica set."
+                return 2
+
+            # Is the specified host the primary?
+            if host_node["stateStr"] == "PRIMARY":
+                if max_lag == False:
+                    print "OK - This is the primary."
+                    return 0
+                else:
+                    #get the maximal replication lag
+                    data = ""
+                    maximal_lag = 0
+                    for member in rs_status['members']:
+                        if not member['stateStr'] == "ARBITER":
+                            lastSlaveOpTime = member['optimeDate']
+                            replicationLag = abs(primary_node["optimeDate"] - lastSlaveOpTime).seconds - slaveDelays[member['name']]
+                            data = data + member['name'] + " lag=%d;" % replicationLag
+                            maximal_lag = max(maximal_lag, replicationLag)
+                    if percent:
+                        err, con = mongo_connect(primary_node['name'].split(':')[0], int(primary_node['name'].split(':')[1]), False, user, passwd)
+                        if err != 0:
+                            return err
+                        primary_timediff = replication_get_time_diff(con)
+                        maximal_lag = int(float(maximal_lag) / float(primary_timediff) * 100)
+                        message = "Maximal lag is " + str(maximal_lag) + " percents"
+                        message += performance_data(perf_data, [(maximal_lag, "replication_lag_percent", warning, critical)])
+                    else:
+                        message = "Maximal lag is " + str(maximal_lag) + " seconds"
+                        message += performance_data(perf_data, [(maximal_lag, "replication_lag", warning, critical)])
+                    return check_levels(maximal_lag, warning, critical, message)
+            elif host_node["stateStr"] == "ARBITER":
+                print "OK - This is an arbiter"
+                return 0
+
+            # Find the difference in optime between current node and PRIMARY
+
+            optime_lag = abs(primary_node["optimeDate"] - host_node["optimeDate"])
+
+            if host_node['name'] in slaveDelays:
+                slave_delay = slaveDelays[host_node['name']]
+            elif host_node['name'].endswith(':27017') and host_node['name'][:-len(":27017")] in slaveDelays:
+                slave_delay = slaveDelays[host_node['name'][:-len(":27017")]]
+            else:
+                raise Exception("Unable to determine slave delay for {0}".format(host_node['name']))
+
+            try:  # work starting from python2.7
+                lag = optime_lag.total_seconds()
+            except:
+                lag = float(optime_lag.seconds + optime_lag.days * 24 * 3600)
+
+            if percent:
+                err, con = mongo_connect(primary_node['name'].split(':')[0], int(primary_node['name'].split(':')[1]), False, user, passwd)
+                if err != 0:
+                    return err
+                primary_timediff = replication_get_time_diff(con)
+                if primary_timediff != 0:
+                    lag = int(float(lag) / float(primary_timediff) * 100)
+                else:
+                    lag = 0
+                message = "Lag is " + str(lag) + " percents"
+                message += performance_data(perf_data, [(lag, "replication_lag_percent", warning, critical)])
+            else:
+                message = "Lag is " + str(lag) + " seconds"
+                message += performance_data(perf_data, [(lag, "replication_lag", warning, critical)])
+            return check_levels(lag, warning + slaveDelays[host_node['name']], critical + slaveDelays[host_node['name']], message)
+        else:
+            #
+            # less than 2.0 check
+            #
+            # Get replica set status
+            rs_status = con.admin.command("replSetGetStatus")
+
+            # Find the primary and/or the current node
+            primary_node = None
+            host_node = None
+            for member in rs_status["members"]:
+                if member["stateStr"] == "PRIMARY":
+                    primary_node = (member["name"], member["optimeDate"])
+                if member["name"].split(":")[0].startswith(host):
+                    host_node = member
+
+            # Check if we're in the middle of an election and don't have a primary
+            if primary_node is None:
+                print "WARNING - No primary defined. In an election?"
+                sys.exit(1)
+
+            # Is the specified host the primary?
+            if host_node["stateStr"] == "PRIMARY":
+                print "OK - This is the primary."
+                sys.exit(0)
+
+            # Find the difference in optime between current node and PRIMARY
+            optime_lag = abs(primary_node[1] - host_node["optimeDate"])
+            lag = optime_lag.seconds
+            if percent:
+                err, con = mongo_connect(primary_node['name'].split(':')[0], int(primary_node['name'].split(':')[1]))
+                if err != 0:
+                    return err
+                primary_timediff = replication_get_time_diff(con)
+                lag = int(float(lag) / float(primary_timediff) * 100)
+                message = "Lag is " + str(lag) + " percents"
+                message += performance_data(perf_data, [(lag, "replication_lag_percent", warning, critical)])
+            else:
+                message = "Lag is " + str(lag) + " seconds"
+                message += performance_data(perf_data, [(lag, "replication_lag", warning, critical)])
+            return check_levels(lag, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+#
+# Check the memory usage of mongo. Alerting on this may be hard to get right
+# because it'll try to get as much memory as it can. And that's probably
+# a good thing.
+#
+def check_memory(con, warning, critical, perf_data, mapped_memory, host):
+    # Get the total system memory of this system (This is totally bogus if you
+    # are running this command remotely) and calculate based on that how much
+    # memory used by Mongodb is ok or not.
+    meminfo = open('/proc/meminfo').read()
+    matched = re.search(r'^MemTotal:\s+(\d+)', meminfo)
+    if matched:
+        mem_total_kB = int(matched.groups()[0])
+
+    if host != "127.0.0.1" and not warning:
+      # Running remotely and value was not set by user, use hardcoded value
+      warning = 12
+    else:
+      # running locally or user provided value
+      warning = warning or (mem_total_kB * 0.8) / 1024.0 / 1024.0
+
+    if host != "127.0.0.1" and not critical:
+      critical = 16
+    else:
+      critical = critical or (mem_total_kB * 0.9) / 1024.0 / 1024.0
+
+    # debugging
+    #print "mem total: {0}kb, warn: {1}GB, crit: {2}GB".format(mem_total_kB,warning, critical)
+
+    try:
+        data = get_server_status(con)
+        if not data['mem']['supported'] and not mapped_memory:
+            print "OK - Platform not supported for memory info"
+            return 0
+        #
+        # convert to gigs
+        #
+        message = "Memory Usage:"
+        try:
+            mem_resident = float(data['mem']['resident']) / 1024.0
+            message += " %.2fGB resident," % (mem_resident)
+        except:
+            mem_resident = 0
+            message += " resident unsupported,"
+        try:
+            mem_virtual = float(data['mem']['virtual']) / 1024.0
+            message += " %.2fGB virtual," % mem_virtual
+        except:
+            mem_virtual = 0
+            message += " virtual unsupported,"
+        try:
+            mem_mapped = float(data['mem']['mapped']) / 1024.0
+            message += " %.2fGB mapped," % mem_mapped
+        except:
+            mem_mapped = 0
+            message += " mapped unsupported,"
+        try:
+            mem_mapped_journal = float(data['mem']['mappedWithJournal']) / 1024.0
+            message += " %.2fGB mappedWithJournal" % mem_mapped_journal
+        except:
+            mem_mapped_journal = 0
+        message += performance_data(perf_data, [("%.2f" % mem_resident, "memory_usage", warning, critical),
+                    ("%.2f" % mem_mapped, "memory_mapped"), ("%.2f" % mem_virtual, "memory_virtual"), ("%.2f" % mem_mapped_journal, "mappedWithJournal")])
+        #added for unsupported systems like Solaris
+        if mapped_memory and mem_resident == 0:
+            return check_levels(mem_mapped, warning, critical, message)
+        else:
+            return check_levels(mem_resident, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_memory_mapped(con, warning, critical, perf_data):
+    #
+    # These thresholds are basically meaningless, and must be customized to your application
+    #
+    warning = warning or 8
+    critical = critical or 16
+    try:
+        data = get_server_status(con)
+        if not data['mem']['supported']:
+            print "OK - Platform not supported for memory info"
+            return 0
+        #
+        # convert to gigs
+        #
+        message = "Memory Usage:"
+        try:
+            mem_mapped = float(data['mem']['mapped']) / 1024.0
+            message += " %.2fGB mapped," % mem_mapped
+        except:
+            mem_mapped = -1
+            message += " mapped unsupported,"
+        try:
+            mem_mapped_journal = float(data['mem']['mappedWithJournal']) / 1024.0
+            message += " %.2fGB mappedWithJournal" % mem_mapped_journal
+        except:
+            mem_mapped_journal = 0
+        message += performance_data(perf_data, [("%.2f" % mem_mapped, "memory_mapped", warning, critical), ("%.2f" % mem_mapped_journal, "mappedWithJournal")])
+
+        if not mem_mapped == -1:
+            return check_levels(mem_mapped, warning, critical, message)
+        else:
+            print "OK - Server does not provide mem.mapped info"
+            return 0
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+#
+# Return the percentage of the time there was a global Lock
+#
+def check_lock(con, warning, critical, perf_data, mongo_version):
+    warning = warning or 10
+    critical = critical or 30
+    if mongo_version == 2:
+        try:
+            data = get_server_status(con)
+            lockTime = data['globalLock']['lockTime']
+            totalTime = data['globalLock']['totalTime']
+            #
+            # calculate percentage
+            #
+            if lockTime > totalTime:
+                lock_percentage = 0.00
+            else:
+                lock_percentage = float(lockTime) / float(totalTime) * 100
+            message = "Lock Percentage: %.2f%%" % lock_percentage
+            message += performance_data(perf_data, [("%.2f" % lock_percentage, "lock_percentage", warning, critical)])
+            return check_levels(lock_percentage, warning, critical, message)
+        except Exception, e:
+            print "Couldn't get globalLock lockTime info from mongo, are you sure you're not using version 3? See the -M option."
+            return exit_with_general_critical(e)
+    else:
+        print "OK - MongoDB version 3 doesn't report on global locks"
+        return 0
+
+
+def check_flushing(con, warning, critical, avg, perf_data):
+    #
+    # These thresholds mean it's taking 5 seconds to perform a background flush to issue a warning
+    # and 10 seconds to issue a critical.
+    #
+    warning = warning or 5000
+    critical = critical or 15000
+    try:
+        data = get_server_status(con)
+        try:
+            data['backgroundFlushing']
+            if avg:
+                flush_time = float(data['backgroundFlushing']['average_ms'])
+                stat_type = "Average"
+            else:
+                flush_time = float(data['backgroundFlushing']['last_ms'])
+                stat_type = "Last"
+
+            message = "%s Flush Time: %.2fms" % (stat_type, flush_time)
+            message += performance_data(perf_data, [("%.2fms" % flush_time, "%s_flush_time" % stat_type.lower(), warning, critical)])
+
+            return check_levels(flush_time, warning, critical, message)
+        except Exception:
+            print "OK - flushing stats not available for this storage engine"
+            return 0
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def index_miss_ratio(con, warning, critical, perf_data):
+    warning = warning or 10
+    critical = critical or 30
+    try:
+        data = get_server_status(con)
+
+        try:
+            data['indexCounters']
+            serverVersion = tuple(con.server_info()['version'].split('.'))
+            if serverVersion >= tuple("2.4.0".split(".")):
+                miss_ratio = float(data['indexCounters']['missRatio'])
+            else:
+                miss_ratio = float(data['indexCounters']['btree']['missRatio'])
+        except KeyError:
+            not_supported_msg = "not supported on this platform"
+            try:
+                data['indexCounters']
+                if data['indexCounters'].has_key('note'):
+                    print "OK - MongoDB says: " + not_supported_msg
+                    return 0
+                else:
+                    print "WARNING - Can't get counter from MongoDB"
+                    return 1
+            except Exception:
+                print "OK - MongoDB says: " + not_supported_msg
+                return 0
+
+        message = "Miss Ratio: %.2f" % miss_ratio
+        message += performance_data(perf_data, [("%.2f" % miss_ratio, "index_miss_ratio", warning, critical)])
+
+        return check_levels(miss_ratio, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+def check_replset_quorum(con, perf_data):
+    db = con['admin']
+    warning = 1
+    critical = 2
+    primary = 0
+
+    try:
+        rs_members = db.command("replSetGetStatus")['members']
+
+        for member in rs_members:
+            if member['state'] == 1:
+                primary += 1
+
+        if primary == 1:
+            state = 0
+            message = "Cluster is quorate"
+        else:
+            state = 2
+            message = "Cluster is not quorate and cannot operate"
+
+        return check_levels(state, warning, critical, message)
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+
+def check_replset_state(con, perf_data, warning="", critical=""):
+    try:
+        warning = [int(x) for x in warning.split(",")]
+    except:
+        warning = [0, 3, 5]
+    try:
+        critical = [int(x) for x in critical.split(",")]
+    except:
+        critical = [8, 4, -1]
+
+    ok = range(-1, 8)  # should include the range of all posiible values
+    try:
+        try:
+            try:
+                set_read_preference(con.admin)
+                data = con.admin.command(pymongo.son_manipulator.SON([('replSetGetStatus', 1)]))
+            except:
+                data = con.admin.command(son.SON([('replSetGetStatus', 1)]))
+            state = int(data['myState'])
+        except pymongo.errors.OperationFailure, e:
+            if ((e.code == None and str(e).find('failed: not running with --replSet"')) or (e.code == 76 and str(e).find('not running with --replSet"'))):
+                state = -1
+
+        if state == 8:
+            message = "State: %i (Down)" % state
+        elif state == 4:
+            message = "State: %i (Fatal error)" % state
+        elif state == 0:
+            message = "State: %i (Starting up, phase1)" % state
+        elif state == 3:
+            message = "State: %i (Recovering)" % state
+        elif state == 5:
+            message = "State: %i (Starting up, phase2)" % state
+        elif state == 1:
+            message = "State: %i (Primary)" % state
+        elif state == 2:
+            message = "State: %i (Secondary)" % state
+        elif state == 7:
+            message = "State: %i (Arbiter)" % state
+        elif state == -1:
+            message = "Not running with replSet"
+        else:
+            message = "State: %i (Unknown state)" % state
+        message += performance_data(perf_data, [(state, "state")])
+        return check_levels(state, warning, critical, message, ok)
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_databases(con, warning, critical, perf_data=None):
+    try:
+        try:
+            set_read_preference(con.admin)
+            data = con.admin.command(pymongo.son_manipulator.SON([('listDatabases', 1)]))
+        except:
+            data = con.admin.command(son.SON([('listDatabases', 1)]))
+
+        count = len(data['databases'])
+        message = "Number of DBs: %.0f" % count
+        message += performance_data(perf_data, [(count, "databases", warning, critical, message)])
+        return check_levels(count, warning, critical, message)
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_collections(con, warning, critical, perf_data=None):
+    try:
+        try:
+            set_read_preference(con.admin)
+            data = con.admin.command(pymongo.son_manipulator.SON([('listDatabases', 1)]))
+        except:
+            data = con.admin.command(son.SON([('listDatabases', 1)]))
+
+        count = 0
+        for db in data['databases']:
+            dbase = con[db['name']]
+            set_read_preference(dbase)
+            count += len(dbase.collection_names())
+
+        message = "Number of collections: %.0f" % count
+        message += performance_data(perf_data, [(count, "collections", warning, critical, message)])
+        return check_levels(count, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_all_databases_size(con, warning, critical, perf_data):
+    warning = warning or 100
+    critical = critical or 1000
+    try:
+        set_read_preference(con.admin)
+        all_dbs_data = con.admin.command(pymongo.son_manipulator.SON([('listDatabases', 1)]))
+    except:
+        all_dbs_data = con.admin.command(son.SON([('listDatabases', 1)]))
+
+    total_storage_size = 0
+    message = ""
+    perf_data_param = [()]
+    for db in all_dbs_data['databases']:
+        database = db['name']
+        data = con[database].command('dbstats')
+        storage_size = round(data['storageSize'] / 1024 / 1024, 1)
+        message += "; Database %s size: %.0f MB" % (database, storage_size)
+        perf_data_param.append((storage_size, database + "_database_size"))
+        total_storage_size += storage_size
+
+    perf_data_param[0] = (total_storage_size, "total_size", warning, critical)
+    message += performance_data(perf_data, perf_data_param)
+    message = "Total size: %.0f MB" % total_storage_size + message
+    return check_levels(total_storage_size, warning, critical, message)
+
+
+def check_database_size(con, database, warning, critical, perf_data):
+    warning = warning or 100
+    critical = critical or 1000
+    perfdata = ""
+    try:
+        set_read_preference(con.admin)
+        data = con[database].command('dbstats')
+        storage_size = data['storageSize'] / 1024 / 1024
+        if perf_data:
+            perfdata += " | database_size=%i;%i;%i" % (storage_size, warning, critical)
+            #perfdata += " database=%s" %(database)
+
+        if storage_size >= critical:
+            print "CRITICAL - Database size: %.0f MB, Database: %s%s" % (storage_size, database, perfdata)
+            return 2
+        elif storage_size >= warning:
+            print "WARNING - Database size: %.0f MB, Database: %s%s" % (storage_size, database, perfdata)
+            return 1
+        else:
+            print "OK - Database size: %.0f MB, Database: %s%s" % (storage_size, database, perfdata)
+            return 0
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_database_indexes(con, database, warning, critical, perf_data):
+    #
+    # These thresholds are basically meaningless, and must be customized to your application
+    #
+    warning = warning or 100
+    critical = critical or 1000
+    perfdata = ""
+    try:
+        set_read_preference(con.admin)
+        data = con[database].command('dbstats')
+        index_size = data['indexSize'] / 1024 / 1024
+        if perf_data:
+            perfdata += " | database_indexes=%i;%i;%i" % (index_size, warning, critical)
+
+        if index_size >= critical:
+            print "CRITICAL - %s indexSize: %.0f MB %s" % (database, index_size, perfdata)
+            return 2
+        elif index_size >= warning:
+            print "WARNING - %s indexSize: %.0f MB %s" % (database, index_size, perfdata)
+            return 1
+        else:
+            print "OK - %s indexSize: %.0f MB %s" % (database, index_size, perfdata)
+            return 0
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_collection_indexes(con, database, collection, warning, critical, perf_data):
+    #
+    # These thresholds are basically meaningless, and must be customized to your application
+    #
+    warning = warning or 100
+    critical = critical or 1000
+    perfdata = ""
+    try:
+        set_read_preference(con.admin)
+        data = con[database].command('collstats', collection)
+        total_index_size = data['totalIndexSize'] / 1024 / 1024
+        if perf_data:
+            perfdata += " | collection_indexes=%i;%i;%i" % (total_index_size, warning, critical)
+
+        if total_index_size >= critical:
+            print "CRITICAL - %s.%s totalIndexSize: %.0f MB %s" % (database, collection, total_index_size, perfdata)
+            return 2
+        elif total_index_size >= warning:
+            print "WARNING - %s.%s totalIndexSize: %.0f MB %s" % (database, collection, total_index_size, perfdata)
+            return 1
+        else:
+            print "OK - %s.%s totalIndexSize: %.0f MB %s" % (database, collection, total_index_size, perfdata)
+            return 0
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_queues(con, warning, critical, perf_data):
+    warning = warning or 10
+    critical = critical or 30
+    try:
+        data = get_server_status(con)
+
+        total_queues = float(data['globalLock']['currentQueue']['total'])
+        readers_queues = float(data['globalLock']['currentQueue']['readers'])
+        writers_queues = float(data['globalLock']['currentQueue']['writers'])
+        message = "Current queue is : total = %d, readers = %d, writers = %d" % (total_queues, readers_queues, writers_queues)
+        message += performance_data(perf_data, [(total_queues, "total_queues", warning, critical), (readers_queues, "readers_queues"), (writers_queues, "writers_queues")])
+        return check_levels(total_queues, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+def check_collection_size(con, database, collection, warning, critical, perf_data):
+    warning = warning or 100
+    critical = critical or 1000
+    perfdata = ""
+    try:
+        set_read_preference(con.admin)
+        data = con[database].command('collstats', collection)
+        size = data['size'] / 1024 / 1024
+        if perf_data:
+            perfdata += " | collection_size=%i;%i;%i" % (size, warning, critical)
+
+        if size >= critical:
+            print "CRITICAL - %s.%s size: %.0f MB %s" % (database, collection, size, perfdata)
+            return 2
+        elif size >= warning:
+            print "WARNING - %s.%s size: %.0f MB %s" % (database, collection, size, perfdata)
+            return 1
+        else:
+            print "OK - %s.%s size: %.0f MB %s" % (database, collection, size, perfdata)
+            return 0
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_collection_storageSize(con, database, collection, warning, critical, perf_data):
+    warning = warning or 100
+    critical = critical or 1000
+    perfdata = ""
+    try:
+        set_read_preference(con.admin)
+        data = con[database].command('collstats', collection)
+        storageSize = data['storageSize'] / 1024 / 1024
+        if perf_data:
+            perfdata += " | collection_storageSize=%i;%i;%i" % (storageSize, warning, critical)
+
+        if storageSize >= critical:
+            print "CRITICAL - %s.%s storageSize: %.0f MB %s" % (database, collection, storageSize, perfdata)
+            return 2
+        elif storageSize >= warning:
+            print "WARNING - %s.%s storageSize: %.0f MB %s" % (database, collection, storageSize, perfdata)
+            return 1
+        else:
+            print "OK - %s.%s storageSize: %.0f MB %s" % (database, collection, storageSize, perfdata)
+            return 0
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_queries_per_second(con, query_type, warning, critical, perf_data, mongo_version):
+    warning = warning or 250
+    critical = critical or 500
+
+    if query_type not in ['insert', 'query', 'update', 'delete', 'getmore', 'command']:
+        return exit_with_general_critical("The query type of '%s' is not valid" % query_type)
+
+    try:
+        db = con.local
+        data = get_server_status(con)
+
+        # grab the count
+        num = int(data['opcounters'][query_type])
+
+        # do the math
+        last_count = db.nagios_check.find_one({'check': 'query_counts'})
+        try:
+            ts = int(time.time())
+            diff_query = num - last_count['data'][query_type]['count']
+            diff_ts = ts - last_count['data'][query_type]['ts']
+
+            if diff_ts == 0:
+                message = "diff_query = " + str(diff_query) + " diff_ts = " + str(diff_ts)
+                return check_levels(0, warning, critical, message)
+
+            query_per_sec = float(diff_query) / float(diff_ts)
+
+            # update the count now
+            if mongo_version == 2:
+                db.nagios_check.update({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
+            else:
+                db.nagios_check.update_one({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
+
+            message = "Queries / Sec: %f" % query_per_sec
+            message += performance_data(perf_data, [(query_per_sec, "%s_per_sec" % query_type, warning, critical, message)])
+        except KeyError:
+            #
+            # since it is the first run insert it
+            query_per_sec = 0
+            message = "First run of check.. no data"
+            if mongo_version == 2:
+                db.nagios_check.update({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
+            else:
+                db.nagios_check.update_one({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
+
+        except TypeError:
+            #
+            # since it is the first run insert it
+            query_per_sec = 0
+            message = "First run of check.. no data"
+            if mongo_version == 2:
+                db.nagios_check.insert({'check': 'query_counts', 'data': {query_type: {'count': num, 'ts': int(time.time())}}})
+            else:
+                db.nagios_check.insert_one({'check': 'query_counts', 'data': {query_type: {'count': num, 'ts': int(time.time())}}})
+
+        return check_levels(query_per_sec, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_oplog(con, warning, critical, perf_data):
+    """ Checking the oplog time - the time of the log currntly saved in the oplog collection
+    defaults:
+        critical 4 hours
+        warning 24 hours
+    those can be changed as usual with -C and -W parameters"""
+    warning = warning or 24
+    critical = critical or 4
+    try:
+        db = con.local
+        ol = db.system.namespaces.find_one({"name": "local.oplog.rs"})
+        if (db.system.namespaces.find_one({"name": "local.oplog.rs"}) != None):
+            oplog = "oplog.rs"
+        else:
+            ol = db.system.namespaces.find_one({"name": "local.oplog.$main"})
+            if (db.system.namespaces.find_one({"name": "local.oplog.$main"}) != None):
+                oplog = "oplog.$main"
+            else:
+                message = "neither master/slave nor replica set replication detected"
+                return check_levels(None, warning, critical, message)
+
+        try:
+                set_read_preference(con.admin)
+                data = con.local.command(pymongo.son_manipulator.SON([('collstats', oplog)]))
+        except:
+                data = con.admin.command(son.SON([('collstats', oplog)]))
+
+        ol_size = data['size']
+        ol_storage_size = data['storageSize']
+        ol_used_storage = int(float(ol_size) / ol_storage_size * 100 + 1)
+        ol = con.local[oplog]
+        firstc = ol.find().sort("$natural", pymongo.ASCENDING).limit(1)[0]['ts']
+        lastc = ol.find().sort("$natural", pymongo.DESCENDING).limit(1)[0]['ts']
+        time_in_oplog = (lastc.as_datetime() - firstc.as_datetime())
+        message = "Oplog saves " + str(time_in_oplog) + " %d%% used" % ol_used_storage
+        try:  # work starting from python2.7
+            hours_in_oplog = time_in_oplog.total_seconds() / 60 / 60
+        except:
+            hours_in_oplog = float(time_in_oplog.seconds + time_in_oplog.days * 24 * 3600) / 60 / 60
+        approx_level = hours_in_oplog * 100 / ol_used_storage
+        message += performance_data(perf_data, [("%.2f" % hours_in_oplog, 'oplog_time', warning, critical), ("%.2f " % approx_level, 'oplog_time_100_percent_used')])
+        return check_levels(-approx_level, -warning, -critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_journal_commits_in_wl(con, warning, critical, perf_data):
+    """  Checking the number of commits which occurred in the db's write lock.
+Most commits are performed outside of this lock; committed while in the write lock is undesirable.
+Under very high write situations it is normal for this value to be nonzero.  """
+
+    warning = warning or 10
+    critical = critical or 40
+    try:
+        data = get_server_status(con)
+        j_commits_in_wl = data['dur']['commitsInWriteLock']
+        message = "Journal commits in DB write lock : %d" % j_commits_in_wl
+        message += performance_data(perf_data, [(j_commits_in_wl, "j_commits_in_wl", warning, critical)])
+        return check_levels(j_commits_in_wl, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_journaled(con, warning, critical, perf_data):
+    """ Checking the average amount of data in megabytes written to the recovery log in the last four seconds"""
+
+    warning = warning or 20
+    critical = critical or 40
+    try:
+        data = get_server_status(con)
+        journaled = data['dur']['journaledMB']
+        message = "Journaled : %.2f MB" % journaled
+        message += performance_data(perf_data, [("%.2f" % journaled, "journaled", warning, critical)])
+        return check_levels(journaled, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_write_to_datafiles(con, warning, critical, perf_data):
+    """    Checking the average amount of data in megabytes written to the databases datafiles in the last four seconds.
+As these writes are already journaled, they can occur lazily, and thus the number indicated here may be lower
+than the amount physically written to disk."""
+    warning = warning or 20
+    critical = critical or 40
+    try:
+        data = get_server_status(con)
+        writes = data['dur']['writeToDataFilesMB']
+        message = "Write to data files : %.2f MB" % writes
+        message += performance_data(perf_data, [("%.2f" % writes, "write_to_data_files", warning, critical)])
+        return check_levels(writes, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def get_opcounters(data, opcounters_name, host, port):
+    try:
+        insert = data[opcounters_name]['insert']
+        query = data[opcounters_name]['query']
+        update = data[opcounters_name]['update']
+        delete = data[opcounters_name]['delete']
+        getmore = data[opcounters_name]['getmore']
+        command = data[opcounters_name]['command']
+    except KeyError, e:
+        return 0, [0] * 100
+    total_commands = insert + query + update + delete + getmore + command
+    new_vals = [total_commands, insert, query, update, delete, getmore, command]
+    return  maintain_delta(new_vals, host, port, opcounters_name)
+
+
+def check_opcounters(con, host, port, warning, critical, perf_data):
+    """ A function to get all opcounters delta per minute. In case of a replication - gets the opcounters+opcountersRepl"""
+    warning = warning or 10000
+    critical = critical or 15000
+
+    data = get_server_status(con)
+    err1, delta_opcounters = get_opcounters(data, 'opcounters', host, port)
+    err2, delta_opcounters_repl = get_opcounters(data, 'opcountersRepl', host, port)
+    if err1 == 0 and err2 == 0:
+        delta = [(x + y) for x, y in zip(delta_opcounters, delta_opcounters_repl)]
+        delta[0] = delta_opcounters[0]  # only the time delta shouldn't be summarized
+        per_minute_delta = [int(x / delta[0] * 60) for x in delta[1:]]
+        message = "Test succeeded , old values missing"
+        message = "Opcounters: total=%d,insert=%d,query=%d,update=%d,delete=%d,getmore=%d,command=%d" % tuple(per_minute_delta)
+        message += performance_data(perf_data, ([(per_minute_delta[0], "total", warning, critical), (per_minute_delta[1], "insert"),
+                    (per_minute_delta[2], "query"), (per_minute_delta[3], "update"), (per_minute_delta[4], "delete"),
+                    (per_minute_delta[5], "getmore"), (per_minute_delta[6], "command")]))
+        return check_levels(per_minute_delta[0], warning, critical, message)
+    else:
+        return exit_with_general_critical("problem reading data from temp file")
+
+
+def check_current_lock(con, host, port, warning, critical, perf_data):
+    """ A function to get current lock percentage and not a global one, as check_lock function does"""
+    warning = warning or 10
+    critical = critical or 30
+    data = get_server_status(con)
+
+    lockTime = float(data['globalLock']['lockTime'])
+    totalTime = float(data['globalLock']['totalTime'])
+
+    err, delta = maintain_delta([totalTime, lockTime], host, port, "locktime")
+    if err == 0:
+        lock_percentage = delta[2] / delta[1] * 100     # lockTime/totalTime*100
+        message = "Current Lock Percentage: %.2f%%" % lock_percentage
+        message += performance_data(perf_data, [("%.2f" % lock_percentage, "current_lock_percentage", warning, critical)])
+        return check_levels(lock_percentage, warning, critical, message)
+    else:
+        return exit_with_general_warning("problem reading data from temp file")
+
+
+def check_page_faults(con, host, port, warning, critical, perf_data):
+    """ A function to get page_faults per second from the system"""
+    warning = warning or 10
+    critical = critical or 30
+    data = get_server_status(con)
+
+    try:
+        page_faults = float(data['extra_info']['page_faults'])
+    except:
+        # page_faults unsupported on the underlaying system
+        return exit_with_general_critical("page_faults unsupported on the underlaying system")
+
+    err, delta = maintain_delta([page_faults], host, port, "page_faults")
+    if err == 0:
+        page_faults_ps = delta[1] / delta[0]
+        message = "Page faults : %.2f ps" % page_faults_ps
+        message += performance_data(perf_data, [("%.2f" % page_faults_ps, "page_faults_ps", warning, critical)])
+        return check_levels(page_faults_ps, warning, critical, message)
+    else:
+        return exit_with_general_warning("problem reading data from temp file")
+
+
+def check_asserts(con, host, port, warning, critical, perf_data):
+    """ A function to get asserts from the system"""
+    warning = warning or 1
+    critical = critical or 10
+    data = get_server_status(con)
+
+    asserts = data['asserts']
+
+    #{ "regular" : 0, "warning" : 6, "msg" : 0, "user" : 12, "rollovers" : 0 }
+    regular = asserts['regular']
+    warning_asserts = asserts['warning']
+    msg = asserts['msg']
+    user = asserts['user']
+    rollovers = asserts['rollovers']
+
+    err, delta = maintain_delta([regular, warning_asserts, msg, user, rollovers], host, port, "asserts")
+
+    if err == 0:
+        if delta[5] != 0:
+            #the number of rollovers were increased
+            warning = -1  # no matter the metrics this situation should raise a warning
+            # if this is normal rollover - the warning will not appear again, but if there will be a lot of asserts
+            # the warning will stay for a long period of time
+            # although this is not a usual situation
+
+        regular_ps = delta[1] / delta[0]
+        warning_ps = delta[2] / delta[0]
+        msg_ps = delta[3] / delta[0]
+        user_ps = delta[4] / delta[0]
+        rollovers_ps = delta[5] / delta[0]
+        total_ps = regular_ps + warning_ps + msg_ps + user_ps
+        message = "Total asserts : %.2f ps" % total_ps
+        message += performance_data(perf_data, [(total_ps, "asserts_ps", warning, critical), (regular_ps, "regular"),
+                    (warning_ps, "warning"), (msg_ps, "msg"), (user_ps, "user")])
+        return check_levels(total_ps, warning, critical, message)
+    else:
+        return exit_with_general_warning("problem reading data from temp file")
+
+
+def get_stored_primary_server_name(db):
+    """ get the stored primary server name from db. """
+    if "last_primary_server" in db.collection_names():
+        stored_primary_server = db.last_primary_server.find_one()["server"]
+    else:
+        stored_primary_server = None
+
+    return stored_primary_server
+
+
+def check_replica_primary(con, host, warning, critical, perf_data, replicaset, mongo_version):
+    """ A function to check if the primary server of a replica set has changed """
+    if warning is None and critical is None:
+        warning = 1
+    warning = warning or 2
+    critical = critical or 2
+
+    primary_status = 0
+    message = "Primary server has not changed"
+    db = con["nagios"]
+    data = get_server_status(con)
+    if replicaset != data['repl'].get('setName'):
+        message = "Replica set requested: %s differs from the one found: %s" % (replicaset, data['repl'].get('setName'))
+        primary_status = 2
+        return check_levels(primary_status, warning, critical, message)
+    current_primary = data['repl'].get('primary')
+    saved_primary = get_stored_primary_server_name(db)
+    if current_primary is None:
+        current_primary = "None"
+    if saved_primary is None:
+        saved_primary = "None"
+    if current_primary != saved_primary:
+        last_primary_server_record = {"server": current_primary}
+        if mongo_version == 2:
+            db.last_primary_server.update({"_id": "last_primary"}, {"$set": last_primary_server_record}, upsert=True)
+        else:
+            db.last_primary_server.update_one({"_id": "last_primary"}, {"$set": last_primary_server_record}, upsert=True)
+        message = "Primary server has changed from %s to %s" % (saved_primary, current_primary)
+        primary_status = 1
+    return check_levels(primary_status, warning, critical, message)
+
+
+def check_page_faults(con, sample_time, warning, critical, perf_data):
+    warning = warning or 10
+    critical = critical or 20
+    try:
+        try:
+            set_read_preference(con.admin)
+            data1 = con.admin.command(pymongo.son_manipulator.SON([('serverStatus', 1)]))
+            time.sleep(sample_time)
+            data2 = con.admin.command(pymongo.son_manipulator.SON([('serverStatus', 1)]))
+        except:
+            data1 = con.admin.command(son.SON([('serverStatus', 1)]))
+            time.sleep(sample_time)
+            data2 = con.admin.command(son.SON([('serverStatus', 1)]))
+
+        try:
+            #on linux servers only
+            page_faults = (int(data2['extra_info']['page_faults']) - int(data1['extra_info']['page_faults'])) / sample_time
+        except KeyError:
+            print "WARNING - Can't get extra_info.page_faults counter from MongoDB"
+            sys.exit(1)
+
+        message = "Page Faults: %i" % (page_faults)
+
+        message += performance_data(perf_data, [(page_faults, "page_faults", warning, critical)])
+        check_levels(page_faults, warning, critical, message)
+
+    except Exception, e:
+        exit_with_general_critical(e)
+
+
+def chunks_balance(con, database, collection, warning, critical):
+    warning = warning or 10
+    critical = critical or 20
+    nsfilter = database + "." + collection
+    try:
+        try:
+            set_read_preference(con.admin)
+            col = con.config.chunks
+            nscount = col.find({"ns": nsfilter}).count()
+            shards = col.distinct("shard")
+
+        except:
+            print "WARNING - Can't get chunks infos from MongoDB"
+            sys.exit(1)
+
+        if nscount == 0:
+            print "WARNING - Namespace %s is not sharded" % (nsfilter)
+            sys.exit(1)
+
+        avgchunksnb = nscount / len(shards)
+        warningnb = avgchunksnb * warning / 100
+        criticalnb = avgchunksnb * critical / 100
+
+        for shard in shards:
+            delta = abs(avgchunksnb - col.find({"ns": nsfilter, "shard": shard}).count())
+            message = "Namespace: %s, Shard name: %s, Chunk delta: %i" % (nsfilter, shard, delta)
+
+            if delta >= criticalnb and delta > 0:
+                print "CRITICAL - Chunks not well balanced " + message
+                sys.exit(2)
+            elif delta >= warningnb  and delta > 0:
+                print "WARNING - Chunks not well balanced  " + message
+                sys.exit(1)
+
+        print "OK - Chunks well balanced across shards"
+        sys.exit(0)
+
+    except Exception, e:
+        exit_with_general_critical(e)
+
+    print "OK - Chunks well balanced across shards"
+    sys.exit(0)
+
+
+def check_connect_primary(con, warning, critical, perf_data):
+    warning = warning or 3
+    critical = critical or 6
+
+    try:
+        try:
+            set_read_preference(con.admin)
+            data = con.admin.command(pymongo.son_manipulator.SON([('isMaster', 1)]))
+        except:
+            data = con.admin.command(son.SON([('isMaster', 1)]))
+
+        if data['ismaster'] == True:
+            print "OK - This server is primary"
+            return 0
+
+        phost = data['primary'].split(':')[0]
+        pport = int(data['primary'].split(':')[1])
+        start = time.time()
+
+        err, con = mongo_connect(phost, pport)
+        if err != 0:
+            return err
+
+        pconn_time = time.time() - start
+        pconn_time = round(pconn_time, 0)
+        message = "Connection to primary server " + data['primary'] + " took %i seconds" % pconn_time
+        message += performance_data(perf_data, [(pconn_time, "connection_time", warning, critical)])
+
+        return check_levels(pconn_time, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_collection_state(con, database, collection):
+    try:
+        con[database][collection].find_one()
+        print "OK - Collection %s.%s is reachable " % (database, collection)
+        return 0
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def check_row_count(con, database, collection, warning, critical, perf_data):
+    try:
+        count = con[database][collection].count()
+        message = "Row count: %i" % (count)
+        message += performance_data(perf_data, [(count, "row_count", warning, critical)])
+
+        return check_levels(count, warning, critical, message)
+
+    except Exception, e:
+        return exit_with_general_critical(e)
+
+
+def build_file_name(host, port, action):
+    #done this way so it will work when run independently and from shell
+    module_name = re.match('(.*//*)*(.*)\..*', __file__).group(2)
+
+    if (port == 27017):
+        return "/tmp/" + module_name + "_data/" + host + "-" + action + ".data"
+    else:
+        return "/tmp/" + module_name + "_data/" + host + "-" + str(port) + "-" + action + ".data"
+
+
+def ensure_dir(f):
+    d = os.path.dirname(f)
+    if not os.path.exists(d):
+        os.makedirs(d)
+
+
+def write_values(file_name, string):
+    f = None
+    try:
+        f = open(file_name, 'w')
+    except IOError, e:
+        #try creating
+        if (e.errno == 2):
+            ensure_dir(file_name)
+            f = open(file_name, 'w')
+        else:
+            raise IOError(e)
+    f.write(string)
+    f.close()
+    return 0
+
+
+def read_values(file_name):
+    data = None
+    try:
+        f = open(file_name, 'r')
+        data = f.read()
+        f.close()
+        return 0, data
+    except IOError, e:
+        if (e.errno == 2):
+            #no previous data
+            return 1, ''
+    except Exception, e:
+        return 2, None
+
+
+def calc_delta(old, new):
+    delta = []
+    if (len(old) != len(new)):
+        raise Exception("unequal number of parameters")
+    for i in range(0, len(old)):
+        val = float(new[i]) - float(old[i])
+        if val < 0:
+            val = new[i]
+        delta.append(val)
+    return 0, delta
+
+
+def maintain_delta(new_vals, host, port, action):
+    file_name = build_file_name(host, port, action)
+    err, data = read_values(file_name)
+    old_vals = data.split(';')
+    new_vals = [str(int(time.time()))] + new_vals
+    delta = None
+    try:
+        err, delta = calc_delta(old_vals, new_vals)
+    except:
+        err = 2
+    write_res = write_values(file_name, ";" . join(str(x) for x in new_vals))
+    return err + write_res, delta
+
+
+def replication_get_time_diff(con):
+    col = 'oplog.rs'
+    local = con.local
+    ol = local.system.namespaces.find_one({"name": "local.oplog.$main"})
+    if ol:
+        col = 'oplog.$main'
+    firstc = local[col].find().sort("$natural", 1).limit(1)
+    lastc = local[col].find().sort("$natural", -1).limit(1)
+    first = firstc.next()
+    last = lastc.next()
+    tfirst = first["ts"]
+    tlast = last["ts"]
+    delta = tlast.time - tfirst.time
+    return delta
+
+#
+# main app
+#
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
diff --git a/sensu/files/checks/check_storwize_v7000_err_finder.sh b/sensu/files/checks/check_storwize_v7000_err_finder.sh
deleted file mode 100755
index 56df328..0000000
--- a/sensu/files/checks/check_storwize_v7000_err_finder.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-#check IBM v7000
-#usage: ./check_storwize_v7000_err_finder.sh -p password -h host_ip -u user
-
-while getopts ":u:p:h:" opt; do
-    case $opt in
-        u)
-            USER=${OPTARG};;
-        p)
-            PASSWD=${OPTARG};;
-        h)
-            HOST=${OPTARG};;
-       \?)
-            echo "Invalid option";exit 1;;
-        : ) echo "Option -"$OPTARG" requires an argument." >&2
-            exit 1;;
-    esac
-done
-
-command -v sshpass >/dev/null 2>&1 || { echo "Missing program sshpass. Aborting." >&2; exit 1; }
-
-ERRCODE=`sshpass -p "$PASSWD" ssh $USER@$HOST -o StrictHostKeyChecking=no "svctask finderr" | cut -d "[" -f2 | cut -d "]" -f1`
-
-if [[ ${ERRCODE[@]}="There are no unfixed errors" ]]; then
-	exit 0
-else
-	CONDITION=`cat ./svc_error_database | grep $ERRCODE`
-	echo "Storwize V7000 $HOST $CONDITION"
-	exit 2
-fi
-
-
diff --git a/sensu/files/handlers/hipchat.json b/sensu/files/handlers/hipchat.json
new file mode 100644
index 0000000..4856c8d
--- /dev/null
+++ b/sensu/files/handlers/hipchat.json
@@ -0,0 +1,24 @@
+{%- set handler = pillar.sensu.server.handler[handler_name] %}
+{%- if handler_setting == "handler" %}
+{
+  "handlers": {
+    "hipchat": {
+      "type": "pipe",
+      "command": "/etc/sensu/handlers/hipchat.rb"
+    }
+  }
+}
+{%- endif %}
+{%- if handler_setting == "config" %}
+{
+  "hipchat": {
+    "apikey": "{{ handler.apikey }}",
+    "apiversion": "{{ handler.apiversion }}",
+    "room": "{{ handler.room }}",
+    "from": "{{ handler.from }}"{%- if handler.message_template is defined %},
+    "message_template": "optional message template erb file path - /some/path/to/template.erb",
+    "message_format": "html"
+    {%- endif %}
+  }
+}
+{%- endif %}
diff --git a/sensu/files/plugins/handlers/notification/hipchat.rb b/sensu/files/plugins/handlers/notification/hipchat.rb
new file mode 100644
index 0000000..49eebf2
--- /dev/null
+++ b/sensu/files/plugins/handlers/notification/hipchat.rb
@@ -0,0 +1,98 @@
+#!/usr/bin/env ruby
+#
+# Sensu Handler: hipchat
+#
+# This handler script is used to send notifications to Hipchat rooms.
+#
+# Input:
+#   @event - Event attributes.
+#      @event['action'] - Property to figure out the event type i.e. whether it is create or resolve.
+#      @event['check'] - Map of attributes from the check config which is calling this handler
+#      @event['client'] - Map of attributes from the client config for the clients from which this event is generated.
+#   option: json_config - By default, assumes the hipchat config parameters are in the "hipchat" top-level json key.
+#                         This command line option allows to specify a custom json key.
+#
+# Output:
+#    Green coloured notification on the Hipchat room if a resolve event is seen.
+#    Yellow coloured notification used to notify warning if a create event is seen with a status of 1
+#    Red coloured notification used to notify critical if a create event is seen with a status other than 1
+#
+# Note: The handler config is fetched and merged from all json config files. The "hipchat" json key is used by default which can
+#       be overridden with the "json_config" command line option. The hipchat room could also be configured on a per client basis
+#       by defining the "hipchat_room" attribute in the client config file. This will override the default hipchat room where the
+#       alerts are being routed to for that particular client.
+
+require 'sensu-handler'
+require 'hipchat'
+require 'timeout'
+require 'erubis'
+
+class HipChatNotif < Sensu::Handler
+  option :json_config,
+         description: 'JSON config key name',
+         short: '-j JsonKeyName',
+         long: '--json_config JsonKeyName',
+         required: false,
+         default: 'hipchat'
+
+  def event_name
+    @event['client']['name'] + '/' + @event['check']['name']
+  end
+
+  def handle
+    json_config = config[:json_config]
+    server_url = settings[json_config]['server_url'] || 'https://api.hipchat.com'
+    apiversion = settings[json_config]['apiversion'] || 'v1'
+    proxy_url = settings[json_config]['proxy_url']
+    hipchatmsg = HipChat::Client.new(settings[json_config]['apikey'], api_version: apiversion, http_proxy: proxy_url, server_url: server_url)
+    room = @event['client']['hipchat_room'] || @event['check']['hipchat_room'] || settings[json_config]['room']
+    from = settings[json_config]['from'] || 'Sensu'
+    message_template = settings[json_config]['message_template']
+    message_format = settings[json_config]['message_format'] || 'html'
+
+    # If the playbook attribute exists and is a URL, "[<a href='url'>playbook</a>]" will be output.
+    # To control the link name, set the playbook value to the HTML output you would like.
+    playbook = ''
+    if @event['check']['playbook']
+      begin
+        uri = URI.parse(@event['check']['playbook'])
+        playbook << if %w( http https ).include?(uri.scheme)
+                      "  [<a href='#{@event['check']['playbook']}'>Playbook</a>]"
+                    else
+                      "  Playbook:  #{@event['check']['playbook']}"
+                    end
+      rescue
+        playbook << "  Playbook:  #{@event['check']['playbook']}"
+      end
+    end
+
+    if message_template && File.readable?(message_template)
+      template = File.read(message_template)
+    else
+      template = '''<%=
+      [
+        @event["action"].eql?("resolve") ? "RESOLVED" : "ALERT",
+        " - [#{event_name}] - ",
+        @event["check"]["notification"] || @event["check"]["output"],
+        playbook,
+        "."
+      ].join
+      %>
+      '''
+    end
+    eruby = Erubis::Eruby.new(template)
+    message = eruby.result(binding)
+
+    begin
+      timeout(3) do
+        if @event['action'].eql?('resolve')
+          hipchatmsg[room].send(from, message, color: 'green', message_format: message_format)
+        else
+          hipchatmsg[room].send(from, message, color: @event['check']['status'] == 1 ? 'yellow' : 'red', notify: true, message_format: message_format)
+        end
+      end
+    rescue Timeout::Error
+      puts "hipchat -- timed out while attempting to message #{room}"
+    end
+  end
+end
diff --git a/sensu/server.sls b/sensu/server.sls
index 1cb6b53..4882acf 100644
--- a/sensu/server.sls
+++ b/sensu/server.sls
@@ -86,7 +86,7 @@
 
 {%- for handler_name, handler in server.get('handler', {}).iteritems() %}
 
-{%- if handler_name in ['default', 'flapjack', 'mail', 'sccd', 'stdout', 'statsd', 'slack', 'pipe', 'sfdc', 'pagerduty']  %}
+{%- if handler_name in ['default', 'flapjack', 'mail', 'sccd', 'stdout', 'statsd', 'slack', 'pipe', 'sfdc', 'pagerduty', 'hipchat']  %}
 
 {%- include "sensu/server/_handler_"+handler_name+".sls" %}
 
diff --git a/sensu/server/_handler_hipchat.sls b/sensu/server/_handler_hipchat.sls
new file mode 100644
index 0000000..e797eb3
--- /dev/null
+++ b/sensu/server/_handler_hipchat.sls
@@ -0,0 +1,35 @@
+
+/etc/sensu/conf.d/hipchat.json:
+  file.managed:
+  - source: salt://sensu/files/handlers/hipchat.json
+  - template: jinja
+  - defaults:
+    handler_name: "{{ handler_name }}"
+    handler_setting: "config"
+  - watch_in:
+    - service: service_sensu_server
+    - service: service_sensu_api
+  - require_in:
+    - file: sensu_conf_dir_clean
+
+/etc/sensu/conf.d/handler_hipchat.json:
+  file.managed:
+  - source: salt://sensu/files/handlers/hipchat.json
+  - template: jinja
+  - defaults:
+    handler_name: "{{ handler_name }}"
+    handler_setting: "handler"
+  - watch_in:
+    - service: service_sensu_server
+    - service: service_sensu_api
+  - require_in:
+    - file: sensu_conf_dir_clean
+
+/etc/sensu/handlers/hipchat.rb:
+  file.managed:
+  - source: salt://sensu/files/plugins/handlers/notification/hipchat.rb
+  - mode: 700
+  - user: sensu
+  - watch_in:
+    - service: service_sensu_server
+    - service: service_sensu_api
\ No newline at end of file