git.lirion.de

Of git, get, and gud

summaryrefslogtreecommitdiffstats
path: root/nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl
diff options
context:
space:
mode:
authorHarald Pfeiffer <coding _ lirion.de> 2019-04-17 19:07:19 +0200
committerHarald Pfeiffer <coding _ lirion.de> 2019-04-17 19:07:19 +0200
commit1e2387474a449452b78520b9ad96a8b4b5e99722 (patch)
tree836889471eec7d2aac177405068e2a8f1e2b1978 /nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl
downloadnagios-plugins-contrib-1e2387474a449452b78520b9ad96a8b4b5e99722.tar.bz2
initial commit of source fetch
Diffstat (limited to 'nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl')
-rw-r--r--nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl2744
1 files changed, 2744 insertions, 0 deletions
diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl b/nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl
new file mode 100644
index 0000000..2be3fc0
--- /dev/null
+++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_snmp_environment/check_snmp_environment.pl
@@ -0,0 +1,2744 @@
+#!/usr/bin/perl
+# ============================================================================
+# ============================== INFO ========================================
+# ============================================================================
+# Version : 0.7
+# Date : February 21 2011
+# Author : Michiel Timmers ( michiel.timmers AT gmx.net)
+# Based on : "check_snmp_env" plugin (version 1.3) from Patrick Proy
+# Licence : GPL - summary below
+#
+# ============================================================================
+# ============================== SUMMARY =====================================
+# ============================================================================
+# This plugin is an enhancement on the "check_snmp_env" plugin (version 1.3)
+# from Patrick Proy. The basic function of this script is to check various
+# hardware based information, like power supply's, fans, cards, modules etc.
+# Although some of the checks in this plugin are also in the "check_snmp_env"
+# I strongly suggest using this version as some of the checks in
+# "check_snmp_env" aren't efficient or don't give alarms.
+#
+# The default SNMP version has been changed from SNMPv1 to SNMPv2c because
+# of the use of SNMP Bulk option which is more efficient. SNMPv3 also
+# uses SNMP Bulk.
+#
+# This scrip supports IPv6. You can use the "-6" switch for this.
+#
+# ============================================================================
+# ============================== SUPPORTED CHECKS ============================
+# ============================================================================
+# The following check are supported:
+#
+# NOTE(!!): There are several Cisco checks, on many Cisco devices multiple
+# Cisco checks will functions.
+#
+# cisco __________: Cisco Systems : Fan, power-supply, voltage, temperature
+# ciscoSW ________: Cisco Systems : Card and module status check
+# ciscoNEW _______: Cisco Systems : Sensor check for devices that have
+# the CISCO-ENTITY-SENSOR-MIB
+# nokia __________: Nokia IP : Fan, power-supply
+# bc _____________: Blue Coat Systems : Fan, power-supply, voltage, disk
+# iron ___________: IronPort : Fan, power-supply, temperature
+# foundry ________: Foundry Network : power supply, temperature
+# linux __________: lm-sensors : Fan, voltage, temperature, misc
+# extremeSW ______: Extreme Networks : Slot, power-supply, fan, temperature
+# juniper ________: Juniper Networks : Component status check
+# procurve _______: HP ProCurve : Fan, power-supply, temperature
+# netscreen ______: NetScreen : Slot, fan, power-supply
+# citrix _________: Citrix NetScaler : Fan, , voltage, temperture,
+# HA state, SSL engine
+# transmode ______: Transmode Systems : Check alarm table that is
+# not deactivated and not acknowledged
+#
+# Check the http://exchange.nagios.org website for new versions.
+# For comments, questions, problems and patches send me an
+# e-mail (michiel.timmmers AT gmx.net).
+#
+# ============================================================================
+# ============================== TODO ========================================
+# ============================================================================
+# - cisco / ciscoSW and ciscoNEW needs to be checked regarding OID's
+# - Make use of "set_status" subroutine for all checks
+# - "linux" check does nothing (need all possible values of lm-sensors
+# to implement). Perhaps IPMI support, currently lacks general MIB
+# - "cisco","nokia","ironport","foundry","linux" needs clean up, need
+# snmpwalks for this
+# - Make more use of verbose output
+# - utils.pm will become deprecated. Replacement with Nagios::Plugin?
+# What are the effects of switching to Nagios::Plugin?
+#
+# ============================================================================
+# ============================== VERSIONS ====================================
+# ============================================================================
+# version 0.2 : - juniper: Ignores a "Unknown" PCMCIA card
+# - Juniper: Standby(7) wasn't defined correctly
+# - juniper: Instance id's longer than 7 characters were failing
+# version 0.3 : - ciscoSW: Corrected the modules OID for Cisco
+# - ciscoSW: Standby cards don't generate critical status anymore
+# version 0.4 : - extreme: Added support for devices from Extreme Networks
+# version 0.5 : - juniper: J series routers now supported
+# version 0.6 : - general: Added support for IPv6 communication
+# version 0.7 : - ciscoNEW: Support for Cisco with CISCO-ENTITY-SENSOR-MIB
+# - procurve: Support for HP ProCurve
+# - netscreen: Support for Netscreen
+# - citrix: Support for Citrix Netscaler
+# - transmode: Support for Transmode
+# - extreme: Added checks for power-supply, fans and temperature
+# - juniper:
+# - bc: Blue Coat check wasn't working properly
+# - general: Default SNMP version is now SNMPv2c
+# - general: Switch default SNMPv3 from md5/des to sha/aes
+# - general: Lots of small fixes
+#
+# ============================================================================
+# ============================== LICENCE =====================================
+# ============================================================================
+# 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/>
+#
+# ============================================================================
+# ============================== HELP ========================================
+# ============================================================================
+# Help : ./check_snmp_environment.pl --help
+#
+# ============================================================================
+
+use warnings;
+use strict;
+use Net::SNMP;
+use Getopt::Long;
+#use lib "/usr/local/nagios/libexec";
+#use utils qw(%ERRORS $TIMEOUT);
+
+
+# ============================================================================
+# ============================== NAGIOS VARIABLES ============================
+# ============================================================================
+
+my $TIMEOUT = 15; # This is the global script timeout, not the SNMP timeout
+my %ERRORS = ('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
+my @Nagios_state = ("UNKNOWN","OK","WARNING","CRITICAL"); # Nagios states coding
+
+
+# ============================================================================
+# ============================== OID VARIABLES ===============================
+# ============================================================================
+
+# System description
+my $sysdescr = "1.3.6.1.2.1.1.1.0"; # Global system description
+
+# CISCO-ENVMON-MIB
+my $ciscoEnvMonMIB = "1.3.6.1.4.1.9.9.13"; # Cisco env base table
+my %CiscoEnvMonState = (1,"normal",2,"warning",3,"critical",4,"shutdown",5,"notPresent",6,"notFunctioning"); # Cisco states
+my %CiscoEnvMonNagios = (1,1 ,2,2 ,3,3 ,4,3 ,5,0, 6,3); # Nagios states returned for CIsco states (coded see @Nagios_state).
+my $ciscoVoltageTable = $ciscoEnvMonMIB.".1.2.1"; # Cisco voltage table
+my $ciscoVoltageTableIndex = $ciscoVoltageTable.".1"; #Index table
+my $ciscoVoltageTableDesc = $ciscoVoltageTable.".2"; #Description
+my $ciscoVoltageTableValue = $ciscoVoltageTable.".3"; #Value
+my $ciscoVoltageTableState = $ciscoVoltageTable.".7"; #Status
+
+my $ciscoTempTable = $ciscoEnvMonMIB.".1.3.1"; # Cisco temprature table
+my $ciscoTempTableIndex = $ciscoTempTable.".1"; #Index table
+my $ciscoTempTableDesc = $ciscoTempTable.".2"; #Description
+my $ciscoTempTableValue = $ciscoTempTable.".3"; #Value
+my $ciscoTempTableState = $ciscoTempTable.".6"; #Status
+
+my $ciscoFanTable = $ciscoEnvMonMIB.".1.4.1"; # Cisco fan table
+my $ciscoFanTableIndex = $ciscoFanTable.".1"; #Index table
+my $ciscoFanTableDesc = $ciscoFanTable.".2"; #Description
+my $ciscoFanTableState = $ciscoFanTable.".3"; #Status
+
+my $ciscoPSTable = $ciscoEnvMonMIB.".1.5.1"; # Cisco power supply table
+my $ciscoPSTableIndex = $ciscoPSTable.".1"; #Index table
+my $ciscoPSTableDesc = $ciscoPSTable.".2"; #Description
+my $ciscoPSTableState = $ciscoPSTable.".3"; #Status
+
+# Nokia env mib
+my $nokia_temp_tbl = "1.3.6.1.4.1.94.1.21.1.1.5";
+my $nokia_temp = "1.3.6.1.4.1.94.1.21.1.1.5.0";
+my $nokia_fan_table = "1.3.6.1.4.1.94.1.21.1.2";
+my $nokia_fan_status = "1.3.6.1.4.1.94.1.21.1.2.1.1.2";
+my $nokia_ps_table = "1.3.6.1.4.1.94.1.21.1.3";
+my $nokia_ps_temp = "1.3.6.1.4.1.94.1.21.1.3.1.1.2";
+my $nokia_ps_status = "1.3.6.1.4.1.94.1.21.1.3.1.1.3";
+
+# Bluecoat env mib
+my @bc_SensorCode = ("","ok","unknown","not-installed","voltage-low-warning","voltage-low-critical",
+ "no-power","voltage-high-warning","voltage-high-critical","voltage-high-severe",
+ "temperature-high-warning","temperature-high-critical","temperature-high-severe",
+ "fan-slow-warning","fan-slow-critical","fan-stopped"); # BC element status returned by MIB
+my @bc_status_code = (3,0,3,3,1,2,2,1,2,2,1,2,2,1,2,2); # nagios status equivallent to BC status
+my @bc_SensorStatus = ("","ok","unavailable","nonoperational"); # ok(1),unavailable(2),nonoperational(3)
+my @bc_status_sensor = (3,0,1,2); # nagios status equivallent to BC status
+my @bc_mesure = ("","","","Enum","volts","celsius","rpm");
+my $bc_sensor_table = "1.3.6.1.4.1.3417.2.1.1.1.1.1"; # sensor table
+my $bc_sensor_Units = "1.3.6.1.4.1.3417.2.1.1.1.1.1.3"; # cf bc_mesure
+my $bc_sensor_Scale = "1.3.6.1.4.1.3417.2.1.1.1.1.1.4"; # * 10^value
+my $bc_sensor_Value = "1.3.6.1.4.1.3417.2.1.1.1.1.1.5"; # value
+my $bc_sensor_Code = "1.3.6.1.4.1.3417.2.1.1.1.1.1.6"; # bc_SensorCode
+my $bc_sensor_Status = "1.3.6.1.4.1.3417.2.1.1.1.1.1.7"; # bc_SensorStatus
+my $bc_sensor_Name = "1.3.6.1.4.1.3417.2.1.1.1.1.1.9"; # name
+my $bc_dsk_table = "1.3.6.1.4.1.3417.2.2.1.1.1.1"; # disk table
+my $bc_dsk_status = "1.3.6.1.4.1.3417.2.2.1.1.1.1.3"; # bc_DiskStatus - present(1), initializing(2), inserted(3), offline(4), removed(5), not-present(6), empty(7), bad(8), unknown(9
+my $bc_dsk_vendor = "1.3.6.1.4.1.3417.2.2.1.1.1.1.5"; # bc_DiskStatus
+my $bc_dsk_product = "1.3.6.1.4.1.3417.2.2.1.1.1.1.6"; # bc_DiskStatus
+my $bc_dsk_serial = "1.3.6.1.4.1.3417.2.2.1.1.1.1.8"; # bc_DiskStatus
+my @bc_DiskStatus = ("","present","initializing","inserted","offline","removed","not-present","empty","bad","unknown");
+my @bc_dsk_status_nagios = (3,0,1,1,1,1,0,0,2,3);
+
+# Iron Port env mib
+my $iron_ps_table = "1.3.6.1.4.1.15497.1.1.1.8"; # power-supply table
+my $iron_ps_status = "1.3.6.1.4.1.15497.1.1.1.8.1.2"; #powerSupplyNotInstalled(1), powerSupplyHealthy(2), powerSupplyNoAC(3), powerSupplyFaulty(4)
+my @iron_ps_status_name = ("","powerSupplyNotInstalled","powerSupplyHealthy","powerSupplyNoAC","powerSupplyFaulty");
+my @iron_ps_status_nagios = (3,3,0,2,2);
+my $iron_ps_ha = "1.3.6.1.4.1.15497.1.1.1.8.1.3"; # ps redundancy status- powerSupplyRedundancyOK(1), powerSupplyRedundancyLost(2)
+my @iron_ps_ha_name = ("","powerSupplyRedundancyOK","powerSupplyRedundancyLost");
+my @iron_ps_ha_nagios = (3,0,1);
+my $iron_ps_name = "1.3.6.1.4.1.15497.1.1.1.8.1.4"; # ps name
+my $iron_tmp_table = "1.3.6.1.4.1.15497.1.1.1.9"; # temp table
+my $iron_tmp_celcius = "1.3.6.1.4.1.15497.1.1.1.9.1.2"; # temp in celcius
+my $iron_tmp_name = "1.3.6.1.4.1.15497.1.1.1.9.1.3"; # name
+my $iron_fan_table = "1.3.6.1.4.1.15497.1.1.1.10"; # fan table
+my $iron_fan_rpm = "1.3.6.1.4.1.15497.1.1.1.10.1.2"; # fan speed in RPM
+my $iron_fan_name = "1.3.6.1.4.1.15497.1.1.1.10.1.3"; # fan name
+
+# Foundry BigIron Router Switch (FOUNDRY-SN-AGENT-MIB)
+my $foundry_temp = "1.3.6.1.4.1.1991.1.1.1.1.18.0"; # Chassis temperature in Deg C *2
+my $foundry_temp_warn = "1.3.6.1.4.1.1991.1.1.1.1.19.0"; # Chassis warn temperature in Deg C *2
+my $foundry_temp_crit = "1.3.6.1.4.1.1991.1.1.1.1.20.0"; # Chassis warn temperature in Deg C *2
+my $foundry_ps_table = "1.3.6.1.4.1.1991.1.1.1.2.1"; # PS table
+my $foundry_ps_desc = "1.3.6.1.4.1.1991.1.1.1.2.1.1.2"; # PS desc
+my $foundry_ps_status = "1.3.6.1.4.1.1991.1.1.1.2.1.1.3"; # PS status
+my $foundry_fan_table = "1.3.6.1.4.1.1991.1.1.1.3.1"; # FAN table
+my $foundry_fan_desc = "1.3.6.1.4.1.1991.1.1.1.3.1.1.2"; # FAN desc
+my $foundry_fan_status = "1.3.6.1.4.1.1991.1.1.1.3.1.1.3"; # FAN status
+my @foundry_status = (3,0,2); # oper status : 1:other, 2: Normal, 3: Failure
+
+# lm-sensors
+my $linux_env_table = "1.3.6.1.4.1.2021.13.16"; # Global env table
+my $linux_temp = "1.3.6.1.4.1.2021.13.16.2.1"; # temperature table
+my $linux_temp_descr = "1.3.6.1.4.1.2021.13.16.2.1.2"; # temperature entry description
+my $linux_temp_value = "1.3.6.1.4.1.2021.13.16.2.1.3"; # temperature entry value (mC)
+my $linux_fan = "1.3.6.1.4.1.2021.13.16.3.1"; # fan table
+my $linux_fan_descr = "1.3.6.1.4.1.2021.13.16.3.1.2"; # fan entry description
+my $linux_fan_value = "1.3.6.1.4.1.2021.13.16.3.1.3"; # fan entry value (RPM)
+my $linux_volt = "1.3.6.1.4.1.2021.13.16.4.1"; # voltage table
+my $linux_volt_descr = "1.3.6.1.4.1.2021.13.16.4.1.2"; # voltage entry description
+my $linux_volt_value = "1.3.6.1.4.1.2021.13.16.4.1.3"; # voltage entry value (mV)
+my $linux_misc = "1.3.6.1.4.1.2021.13.16.5.1"; # misc table
+my $linux_misc_descr = "1.3.6.1.4.1.2021.13.16.5.1.2"; # misc entry description
+my $linux_misc_value = "1.3.6.1.4.1.2021.13.16.5.1.3"; # misc entry value
+
+# Cisco switches (catalys & IOS)
+my $cisco_chassis_card_descr = "1.3.6.1.4.1.9.3.6.11.1.3"; # Chassis card description
+my $cisco_chassis_card_slot = "1.3.6.1.4.1.9.3.6.11.1.7"; # Chassis card slot number
+my $cisco_chassis_card_state = "1.3.6.1.4.1.9.3.6.11.1.9"; # operating status of card - 1 : Not specified, 2 : Up, 3: Down, 4 : standby
+my @cisco_chassis_card_status_text = ("Unknown","Not specified","Up","Down","Standby");
+my @cisco_chassis_card_status = (2,2,0,2,0);
+my $cisco_module_descr = "1.3.6.1.2.1.47.1.1.1.1.13"; # Chassis card description
+my $cisco_module_slot = "1.3.6.1.4.1.9.5.1.3.1.1.25"; # Chassis card slot number
+my $cisco_module_state = "1.3.6.1.4.1.9.9.117.1.2.1.1.2"; # operating status of card - 1:unknown, 2:ok, 3:disabled, 4:okButDiagFailed, 5:boot, 6:selfTest, 7:failed, 8:missing, 9:mismatchWithParent,
+ # 10:mismatchConfig, 11:diagFailed, 12:dormant, 13:outOfServiceAdmin, 14:outOfServiceEnvTemp, 15:poweredDown, 16:poweredUp,
+ # 17:powerDenied, 18:powerCycled, 19:okButPowerOverWarning, 20:okButPowerOverCritical, 21:syncInProgress
+my @cisco_module_status_text =("Unknown", "unknown", "OK", "Disabled", "OkButDiagFailed", "Boot",
+ "SelfTest", "Failed", "Missing", "MismatchWithParent", "MismatchConfig",
+ "DiagFailed", "Dormant", "OutOfServiceAdmin", "OutOfServiceEnvTemp", "PoweredDown",
+ "PoweredUp", "PowerDenied", "PowerCycled", "OkButPowerOverWarning",
+ "OkButPowerOverCritical", "SyncInProgress");
+my @cisco_module_status = (3,3,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2);
+
+# Juniper routers (JUNOS)
+my $juniper_operating_descr = "1.3.6.1.4.1.2636.3.1.13.1.5"; # Component description
+my $juniper_operating_state = "1.3.6.1.4.1.2636.3.1.13.1.6"; # Operating status of component- Unknown(1), Running(2), Ready(3), Reset(4), RunningAtFullSpeed(5), Down(6), Standby(7)
+my @juniper_operating_status_text = ("--Invalid--","Unknown","Running","Ready","Reset","RunningAtFullSpeed","Down","Standby");
+my @juniper_operating_status = (3,3,0,0,1,0,2,0);
+
+# Extreme switches
+my $extreme_slot_table = "1.3.6.1.4.1.1916.1.1.2.2.1";
+my $extreme_slot_name = "1.3.6.1.4.1.1916.1.1.2.2.1.2"; # Component description
+my $extreme_slot_state = "1.3.6.1.4.1.1916.1.1.2.2.1.5"; # Operating status of component - NotPresent(1), testing(2), mismatch(3), failed(4), operational(5), powerdown(6), unknown(7)
+my $extreme_slot_serialnumber = "1.3.6.1.4.1.1916.1.1.2.2.1.6";
+my @extreme_slot_state_text = ("--Invalid--","NotPresent","Testing","Mismatch","Failed","Operational","Powerdown","Unknown");
+my @extreme_slot_nagios = (3,0,2,2,2,0,2,3);
+my $extreme_ps_table = "1.3.6.1.4.1.1916.1.1.1.27.1";
+my $extreme_ps_status = "1.3.6.1.4.1.1916.1.1.1.27.1.2";
+my @extreme_ps_status_text = ("--Invalid--","notPresent","presentOK","presentNotOK");
+my @extreme_ps_nagios = (3,1,0,2);
+my $extreme_fan_table = "1.3.6.1.4.1.1916.1.1.1.9.1";
+my $extreme_fan_number = "1.3.6.1.4.1.1916.1.1.1.9.1.1";
+my $extreme_fan_operational = "1.3.6.1.4.1.1916.1.1.1.9.1.2";
+my @extreme_fan_operational_text = ("--Invalid--","Operational","Not operational");
+my @extreme_fan_nagios = (3,0,2);
+my $extreme_temperature_alarm = "1.3.6.1.4.1.1916.1.1.1.7.0";
+my @extreme_temperature_alarm_text = ("--Invalid--","OverTemperature","OK");
+my @extreme_temperature_nagios = (3,2,0);
+my $extreme_temperature_current = "1.3.6.1.4.1.1916.1.1.1.8.0";
+
+
+# HP ProCurve switches
+my $procurve_operating_descr = "1.3.6.1.4.1.11.2.14.11.1.2.6.1.7"; # Component description
+my $procurve_operating_state = "1.3.6.1.4.1.11.2.14.11.1.2.6.1.4"; # Operating status of component - Unknown(1), Bad(2), Warning(3), Good(4), NotPresent(5)
+my @procurve_operating_status_text = ("--Invalid--","Unknown","Bad","Warning","Good","NotPresent");
+my @procurve_operating_status = (3,3,2,1,0,4);
+
+# Netscreen
+my $netscreen_slot_operating_descr = "1.3.6.1.4.1.3224.21.5.1.2"; # Component description
+my $netscreen_slot_operating_state = "1.3.6.1.4.1.3224.21.5.1.3"; # Operating status of component - Fail?(0), Good(1)
+my @netscreen_slot_operating_status_text = ("Fail","Good");
+my @netscreen_slot_operating_status = (2,0);
+my $netscreen_power_operating_descr = "1.3.6.1.4.1.3224.21.1.1.3"; # Component description
+my $netscreen_power_operating_state = "1.3.6.1.4.1.3224.21.1.1.2"; # Operating status of component - Fail(0), Good(1)
+my @netscreen_power_operating_status_text = ("Fail","Good");
+my @netscreen_power_operating_status = (2,0);
+my $netscreen_fan_operating_descr = "1.3.6.1.4.1.3224.21.2.1.3"; # Component description
+my $netscreen_fan_operating_state = "1.3.6.1.4.1.3224.21.2.1.2"; # Operating status of component - Fail(0), Good(1), Not Installed(2)
+my @netscreen_fan_operating_status_text = ("Fail","Good","Not Installed");
+my @netscreen_fan_operating_status = (2,0,4);
+
+# Cisco CISCO-ENTITY-SENSOR-MIB
+my $cisco_ios_xe_physicaldescr = "1.3.6.1.2.1.47.1.1.1.1.7";
+my $cisco_ios_xe_type = "1.3.6.1.4.1.9.9.91.1.1.1.1.1";
+my @cisco_ios_xe_type_text = ("not_specified","other","unknown","voltsAC","voltsDC","amperes","watts","hertz","celsius","percent","rpm","cmm","truthvalue","specialEnum","dBm");
+my $cisco_ios_xe_scale = "1.3.6.1.4.1.9.9.91.1.1.1.1.2";
+my @cisco_ios_xe_scale_power = ("0","-24","-21","-18","-15","12","e-9","e-6","e-3","e0","e3","e6","9","12","15","18","21","24");
+my $cisco_ios_xe_precision = "1.3.6.1.4.1.9.9.91.1.1.1.1.3";
+my $cisco_ios_xe_value = "1.3.6.1.4.1.9.9.91.1.1.1.1.4";
+my $cisco_ios_xe_status = "1.3.6.1.4.1.9.9.91.1.1.1.1.5";
+my @cisco_ios_xe_operating_text = ("--Invalid--","ok","unavailable","nonoperational");
+my @cisco_ios_xe_operating_status = (0,1,2,3);
+my $cisco_ios_xe_threshold_severity = "1.3.6.1.4.1.9.9.91.1.2.1.1.2";
+my $cisco_ios_xe_threshold_value = "1.3.6.1.4.1.9.9.91.1.2.1.1.4";
+
+# Citrix NetScaler
+my $citrix_desc = "1.3.6.1.4.1.5951.4.1.1.41.7.1.1";
+my $citrix_value = "1.3.6.1.4.1.5951.4.1.1.41.7.1.2";
+my $citrix_high_availability_state = "1.3.6.1.4.1.5951.4.1.1.23.24.0";
+my @citrix_high_availability_state_text = ("unknown","init","down","up","partialFail","monitorFail","monitorOk","completeFail","dumb","disabled","partialFailSsl","routemonitorFail");
+my $citrix_ssl_engine_state = "1.3.6.1.4.1.5951.4.1.1.47.2.0";
+my @citrix_ssl_engine_state_text = ("down","up");
+
+# Transmode WDM MIB/OID
+my $transmode_table = "1.3.6.1.4.1.11857.1.1.3.2.1"; # Alarm Active Entry table
+my $transmode_alarm_rack = "1.3.6.1.4.1.11857.1.1.3.2.1.2"; # Non Acked Alarm rack
+my $transmode_alarm_slot = "1.3.6.1.4.1.11857.1.1.3.2.1.3"; # Non Acked Alarm slot
+my $transmode_alarm_descr = "1.3.6.1.4.1.11857.1.1.3.2.1.4"; # Non Acked Alarm description
+my $transmode_alarm_sev = "1.3.6.1.4.1.11857.1.1.3.2.1.5"; # Non Acked Alarm severity
+my $transmode_alarm_unit = "1.3.6.1.4.1.11857.1.1.3.2.1.6"; # Non Acked Alarm unit
+my $transmode_alarm_serial = "1.3.6.1.4.1.11857.1.1.3.2.1.7"; # Non Acked Alarm serial
+my $transmode_alarm_time_start = "1.3.6.1.4.1.11857.1.1.3.2.1.8"; # Time of Alarm Start
+my $transmode_alarm_time_end = "1.3.6.1.4.1.11857.1.1.3.2.1.9"; # Time of Alarm End
+my @transmode_alarm_status_text = ("Indeterminate","Critical","Major","Minor","Warning");
+my @transmode_alarm_status = (1,2,2,1,1);
+
+
+# ============================================================================
+# ============================== GLOBAL VARIABLES ============================
+# ============================================================================
+
+my $Version = '0.7'; # Version number of this script
+my $o_host = undef; # Hostname
+my $o_community = undef; # Community
+my $o_port = 161; # Port
+my $o_help = undef; # Want some help ?
+my $o_verb = undef; # Verbose mode
+my $o_version = undef; # Print version
+my $o_timeout = undef; # Timeout (Default 5)
+my $o_perf = undef; # Output performance data
+my $o_version1 = undef; # Use SNMPv1
+my $o_version2 = undef; # Use SNMPv2c
+my $o_domain = undef; # Use IPv6
+my $o_check_type = "cisco"; # Default check is "cisco"
+my @valid_types = ("cisco","nokia","bc","iron","foundry","linux","ciscoSW","extremeSW","juniper","procurve","netscreen","ciscoNEW","citrix","transmode");
+my $o_temp = undef; # Max temp
+my $o_fan = undef; # Min fan speed
+my $o_login = undef; # Login for SNMPv3
+my $o_passwd = undef; # Pass for SNMPv3
+my $v3protocols = undef; # V3 protocol list.
+my $o_authproto = 'sha'; # Auth protocol
+my $o_privproto = 'aes'; # Priv protocol
+my $o_privpass = undef; # priv password
+
+
+# ============================================================================
+# ============================== SUBROUTINES (FUNCTIONS) =====================
+# ============================================================================
+
+# Subroutine: Print version
+sub p_version {
+ print "check_snmp_environment version : $Version\n";
+}
+
+# Subroutine: Print Usage
+sub print_usage {
+ print "Usage: $0 [-v] -H <host> [-6] -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -T (cisco|ciscoSW|ciscoNEW|nokia|bc|iron|foundry|linux|extremeSW|juniper|procurve|netscreen|citrix|transmode) [-F <rpm>] [-c <celcius>] [-f] [-t <timeout>] [-V]\n";
+}
+
+# Subroutine: Check number
+sub isnnum { # Return true if arg is not a number
+ my $num = shift;
+ if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
+ return 1;
+}
+
+# Subroutine: Set final status
+sub set_status { # Return worst status with this order : OK, unknown, warning, critical
+ my $new_status = shift;
+ my $cur_status = shift;
+ if ($new_status == 1 && $cur_status != 2) {$cur_status = $new_status;}
+ if ($new_status == 2) {$cur_status = $new_status;}
+ if ($new_status == 3 && $cur_status == 0) {$cur_status = $new_status;}
+ return $cur_status;
+}
+
+# Subroutine: Check if SNMP table could be retrieved, otherwise give error
+sub check_snmp_result {
+ my $snmp_table = shift;
+ my $snmp_error_mesg = shift;
+
+ # Check if table is defined and does not contain specified error message.
+ # Had to do string compare it will not work with a status code
+ if (!defined($snmp_table) && $snmp_error_mesg !~ /table is empty or does not exist/) {
+ printf("ERROR: ". $snmp_error_mesg . " : UNKNOWN\n");
+ exit $ERRORS{"UNKNOWN"};
+ }
+}
+
+# Subroutine: Print complete help
+sub help {
+ print "\nSNMP environmental plugin for Nagios\nVersion: ",$Version,"\n\n";
+ print_usage();
+ print <<EOT;
+
+Options:
+-v, --verbose
+ Print extra debugging information
+-h, --help
+ Print this help message
+-H, --hostname=HOST
+ Hostname or IPv4/IPv6 address of host to check
+-6, --use-ipv6
+ Use IPv6 connection
+-C, --community=COMMUNITY NAME
+ Community name for the host's SNMP agent
+-1, --v1
+ Use SNMPv1
+-2, --v2c
+ Use SNMPv2c (default)
+-l, --login=LOGIN ; -x, --passwd=PASSWD
+ Login and auth password for SNMPv3 authentication
+ If no priv password exists, implies AuthNoPriv
+-X, --privpass=PASSWD
+ Priv password for SNMPv3 (AuthPriv protocol)
+-L, --protocols=<authproto>,<privproto>
+ <authproto> : Authentication protocol (md5|sha : default sha)
+ <privproto> : Priv protocole (des|aes : default aes)
+-P, --port=PORT
+ SNMP port (Default 161)
+-T, --type=cisco|ciscoSW|ciscoNEW|nokia|bc|iron|foundry|linux|extremeSW|juniper|procurve|netscreen|citrix|transmode
+ Environmental check :
+ cisco __________: Cisco Systems : Fan, power-supply, voltage, temperature
+ ciscoSW ________: Cisco Systems : Card and module status check
+ ciscoNEW _______: Cisco Systems : Sensor check for devices that have the CISCO-ENTITY-SENSOR-MIB
+ nokia __________: Nokia IP : Fan, power-supply
+ bc _____________: Blue Coat Systems : Fan, power-supply, voltage, disk
+ iron ___________: IronPort : Fan, power-supply, temperature
+ foundry ________: Foundry Network : power supply, temperature
+ linux __________: lm-sensors : Fan, voltage, temperature, misc
+ extremeSW ______: Extreme Networks : Slot, power-supply, fan, temperature
+ juniper ________: Juniper Networks : Component status check
+ procurve _______: HP ProCurve : Fan, power-supply, temperature
+ netscreen ______: NetScreen : Slot, fan, power-supply (ScreenOS 6.1 and newer)
+ citrix _________: Citrix NetScaler : Fan, , voltage, temperture (thresholds are hardcoded), HA state, SSL engine
+ transmode ______: Transmode Systems : Check alarm table that is not deactivated and not acknowledged
+-F, --fan=<rpm>
+ Minimum fan rpm value (only needed for 'iron' & 'linux')
+-c, --celcius=<celcius>
+ Maximum temp in degree celcius (only needed for 'iron' & 'linux')
+-f, --perfparse
+ Perfparse compatible output
+-t, --timeout=INTEGER
+ Timeout for SNMP in seconds (Default: 5)
+-V, --version
+ Prints version number
+
+Notes:
+- Check the http://exchange.nagios.org website for new versions.
+- For questions, problems and patches send me an e-mail (michiel.timmmers AT gmx.net).
+
+EOT
+}
+
+# Subroutine: Verbose output
+sub verb {
+ my $t=shift;
+ print $t,"\n" if defined($o_verb);
+}
+
+# Subroutine: Verbose output
+sub check_options {
+ Getopt::Long::Configure ("bundling");
+ GetOptions(
+ 'v' => \$o_verb, 'verbose' => \$o_verb,
+ 'h' => \$o_help, 'help' => \$o_help,
+ 'H:s' => \$o_host, 'hostname:s' => \$o_host,
+ 'p:i' => \$o_port, 'port:i' => \$o_port,
+ 'C:s' => \$o_community, 'community:s' => \$o_community,
+ 'l:s' => \$o_login, 'login:s' => \$o_login,
+ 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
+ 'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
+ 'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
+ 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
+ 'V' => \$o_version, 'version' => \$o_version,
+ '6' => \$o_domain, 'use-ipv6' => \$o_domain,
+ '1' => \$o_version1, 'v1' => \$o_version1,
+ '2' => \$o_version2, 'v2c' => \$o_version2,
+ 'f' => \$o_perf, 'perfparse' => \$o_perf,
+ 'T:s' => \$o_check_type, 'type:s' => \$o_check_type,
+ 'F:i' => \$o_fan, 'fan:i' => \$o_fan,
+ 'c:i' => \$o_temp, 'celcius:i' => \$o_temp
+ );
+
+ # Check the -T option
+ my $T_option_valid=0;
+ foreach (@valid_types) {
+ if ($_ eq $o_check_type) {
+ $T_option_valid=1;
+ }
+ }
+ if ( $T_option_valid == 0 ) {
+ print "Invalid check type (-T)!\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # Basic checks
+ if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60))) {
+ print "Timeout must be >1 and <60 !\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+ if (!defined($o_timeout)) {
+ $o_timeout=5;
+ }
+ if (defined ($o_help) ) {
+ help();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if (defined($o_version)) {
+ p_version();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # check host and filter
+ if ( ! defined($o_host) ) {
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # Check IPv6
+ if (defined ($o_domain)) {
+ $o_domain="udp/ipv6";
+ } else {
+ $o_domain="udp/ipv4";
+ }
+
+ # Check SNMP information
+ if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) ){
+ print "Put SNMP login info!\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+ if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) ){
+ print "Can't mix SNMP v1,v2c,v3 protocols!\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # Check SNMPv3 information
+ if (defined ($v3protocols)) {
+ if (!defined($o_login)) {
+ print "Put SNMP V3 login info with protocols!\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+ my @v3proto=split(/,/,$v3protocols);
+ if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {
+ $o_authproto=$v3proto[0];
+ }
+ if (defined ($v3proto[1])) {
+ $o_privproto=$v3proto[1];
+ }
+ if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
+ print "Put SNMP v3 priv login info with priv protocols!\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+ }
+ }
+}
+
+
+# ============================================================================
+# ============================== MAIN ========================================
+# ============================================================================
+
+check_options();
+
+# Check gobal timeout if SNMP screws up
+if (defined($TIMEOUT)) {
+ verb("Alarm at ".$TIMEOUT." + ".$o_timeout);
+ alarm($TIMEOUT+$o_timeout);
+} else {
+ verb("no global timeout defined : ".$o_timeout." + 15");
+ alarm ($o_timeout+15);
+}
+
+# Report when the script gets "stuck" in a loop or takes to long
+$SIG{'ALRM'} = sub {
+ print "UNKNOWN: Script timed out\n";
+ exit $ERRORS{"UNKNOWN"};
+};
+
+# Connect to host
+my ($session,$error);
+if (defined($o_login) && defined($o_passwd)) {
+ # SNMPv3 login
+ verb("SNMPv3 login");
+ if (!defined ($o_privpass)) {
+ # SNMPv3 login (Without encryption)
+ verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
+ ($session, $error) = Net::SNMP->session(
+ -domain => $o_domain,
+ -hostname => $o_host,
+ -version => 3,
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -timeout => $o_timeout
+ );
+ } else {
+ # SNMPv3 login (With encryption)
+ verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
+ ($session, $error) = Net::SNMP->session(
+ -domain => $o_domain,
+ -hostname => $o_host,
+ -version => 3,
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -privpassword => $o_privpass,
+ -privprotocol => $o_privproto,
+ -timeout => $o_timeout
+ );
+ }
+} else {
+ if ((defined ($o_version2)) || (!defined ($o_version1))) {
+ # SNMPv2 login
+ verb("SNMP v2c login");
+ ($session, $error) = Net::SNMP->session(
+ -domain => $o_domain,
+ -hostname => $o_host,
+ -version => 2,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ } else {
+ # SNMPv1 login
+ verb("SNMP v1 login");
+ ($session, $error) = Net::SNMP->session(
+ -domain => $o_domain,
+ -hostname => $o_host,
+ -version => 1,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ }
+}
+
+# Check if there are any problems with the session
+if (!defined($session)) {
+ printf("ERROR opening session: %s.\n", $error);
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my $exit_val=undef;
+
+
+# ============================================================================
+# ============================== CISCO =======================================
+# ============================================================================
+
+if ($o_check_type eq "cisco") {
+
+verb("Checking cisco env");
+
+# Get load table
+my $resultat = $session->get_table(Baseoid => $ciscoEnvMonMIB);
+&check_snmp_result($resultat,$session->error);
+
+# Get env data index
+my (@voltindex,@tempindex,@fanindex,@psindex)=(undef,undef,undef,undef);
+my ($voltexist,$tempexist,$fanexist,$psexist)=(0,0,0,0);
+my @oid=undef;
+foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$ciscoVoltageTableDesc/ ) {
+ @oid=split (/\./,$key);
+ $voltindex[$voltexist++] = pop(@oid);
+ }
+ if ( $key =~ /$ciscoTempTableDesc/ ) {
+ @oid=split (/\./,$key);
+ $tempindex[$tempexist++] = pop(@oid);
+ }
+ if ( $key =~ /$ciscoFanTableDesc/ ) {
+ @oid=split (/\./,$key);
+ $fanindex[$fanexist++] = pop(@oid);
+ }
+ if ( $key =~ /$ciscoPSTableDesc/ ) {
+ @oid=split (/\./,$key);
+ $psindex[$psexist++] = pop(@oid);
+ }
+}
+
+if ( ($voltexist ==0) && ($tempexist ==0) && ($fanexist ==0) && ($psexist ==0) ) {
+ print "No Environemental data found : UNKNOWN \n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my $perf_output="";
+# Get the data
+my ($i,$cur_status)=(undef,undef);
+
+my $volt_global=0;
+my %volt_status;
+if ($fanexist !=0) {
+ for ($i=0;$i < $voltexist; $i++) {
+ $cur_status=$$resultat{$ciscoVoltageTableState. "." . $voltindex[$i]};
+ verb ($$resultat{$ciscoVoltageTableDesc .".".$voltindex[$i]});
+ verb ($cur_status);
+ if (!defined ($cur_status)) { ### Error TODO
+ $volt_global=1;
+ }
+ if (defined($$resultat{$ciscoVoltageTableValue."." . $voltindex[$i]})) {
+ $perf_output.=" '".$$resultat{$ciscoVoltageTableDesc .".".$voltindex[$i]}."'=" ;
+ $perf_output.=$$resultat{$ciscoVoltageTableValue."." . $voltindex[$i]};
+ }
+ if ($Nagios_state[$CiscoEnvMonNagios{$cur_status}] ne "OK") {
+ $volt_global= 1;
+ $volt_status{$$resultat{$ciscoVoltageTableDesc .".".$voltindex[$i]}}=$cur_status;
+ }
+ }
+}
+
+
+my $temp_global=0;
+my %temp_status;
+if ($tempexist !=0) {
+ for ($i=0;$i < $tempexist; $i++) {
+ $cur_status=$$resultat{$ciscoTempTableState . "." . $tempindex[$i]};
+ verb ($$resultat{$ciscoTempTableDesc .".".$tempindex[$i]});
+ verb ($cur_status);
+ if (!defined ($cur_status)) { ### Error TODO
+ $temp_global=1;
+ }
+ if (defined($$resultat{$ciscoTempTableValue."." . $tempindex[$i]})) {
+ $perf_output.=" '".$$resultat{$ciscoTempTableDesc .".".$tempindex[$i]}."'=" ;
+ $perf_output.=$$resultat{$ciscoTempTableValue."." . $tempindex[$i]};
+ }
+ if ($Nagios_state[$CiscoEnvMonNagios{$cur_status}] ne "OK") {
+ $temp_global= 1;
+ $temp_status{$$resultat{$ciscoTempTableDesc .".".$tempindex[$i]}}=$cur_status;
+ }
+ }
+}
+
+
+my $fan_global=0;
+my %fan_status;
+if ($fanexist !=0) {
+ for ($i=0;$i < $fanexist; $i++) {
+ $cur_status=$$resultat{$ciscoFanTableState . "." . $fanindex[$i]};
+ verb ($$resultat{$ciscoFanTableDesc .".".$fanindex[$i]});
+ verb ($cur_status);
+ if (!defined ($cur_status)) { ### Error TODO
+ $fan_global=1;
+ }
+ if ($Nagios_state[$CiscoEnvMonNagios{$cur_status}] ne "OK") {
+ $fan_global= 1;
+ $fan_status{$$resultat{$ciscoFanTableDesc .".".$fanindex[$i]}}=$cur_status;
+ }
+ }
+}
+
+my $ps_global=0;
+my %ps_status;
+if ($psexist !=0) {
+ for ($i=0;$i < $psexist; $i++) {
+ $cur_status=$$resultat{$ciscoPSTableState . "." . $psindex[$i]};
+ if (!defined ($cur_status)) { ### Error TODO
+ $fan_global=1;
+ }
+ if ($Nagios_state[$CiscoEnvMonNagios{$cur_status}] ne "OK") {
+ $ps_global= 1;
+ $ps_status{$$resultat{$ciscoPSTableDesc .".".$psindex[$i]}}=$cur_status;
+ }
+ }
+}
+
+my $global_state=0;
+my $output="";
+
+if ($fanexist !=0) {
+ if ($fan_global ==0) {
+ $output .= $fanexist." Fan OK";
+ $global_state=1 if ($global_state==0);
+ } else {
+ foreach (keys %fan_status) {
+ $output .= "Fan " . $_ . ":" . $CiscoEnvMonState {$fan_status{$_}} ." ";
+ if ($global_state < $CiscoEnvMonNagios{$fan_status{$_}} ) {
+ $global_state = $CiscoEnvMonNagios{$fan_status{$_}} ;
+ }
+ }
+ }
+}
+
+if ($psexist !=0) {
+ $output .= ", " if ($output ne "");
+ if ($ps_global ==0) {
+ $output .= $psexist." ps OK";
+ $global_state=1 if ($global_state==0);
+ } else {
+ foreach (keys %ps_status) {
+ $output .= "ps " . $_ . ":" . $CiscoEnvMonState {$ps_status{$_}} ." ";
+ if ($global_state < $CiscoEnvMonNagios{$ps_status{$_}} ) {
+ $global_state = $CiscoEnvMonNagios{$ps_status{$_}} ;
+ }
+ }
+ }
+}
+
+if ($voltexist !=0) {
+ $output .= ", " if ($output ne "");
+ if ($volt_global ==0) {
+ $output .= $voltexist." volt OK";
+ $global_state=1 if ($global_state==0);
+ } else {
+ foreach (keys %volt_status) {
+ $output .= "volt " . $_ . ":" . $CiscoEnvMonState {$volt_status{$_}} ." ";
+ if ($global_state < $CiscoEnvMonNagios{$volt_status{$_}} ) {
+ $global_state = $CiscoEnvMonNagios{$volt_status{$_}} ;
+ }
+ }
+ }
+}
+
+if ($tempexist !=0) {
+ $output .= ", " if ($output ne "");
+ if ($temp_global ==0) {
+ $output .= $tempexist." temp OK";
+ $global_state=1 if ($global_state==0);
+ } else {
+ foreach (keys %temp_status) {
+ $output .= "temp " . $_ . ":" . $CiscoEnvMonState {$temp_status{$_}} ." ";
+ if ($global_state < $CiscoEnvMonNagios{$temp_status{$_}} ) {
+ $global_state = $CiscoEnvMonNagios{$temp_status{$_}} ;
+ }
+ }
+ }
+}
+
+# Clear the SNMP Transport Domain and any errors associated with the object.
+$session->close;
+
+#print $output," : ",$Nagios_state[$global_state]," | ",$perf_output,"\n";
+print $output," : ",$Nagios_state[$global_state],"\n";
+$exit_val=$ERRORS{$Nagios_state[$global_state]};
+
+exit $exit_val;
+
+}
+
+
+# ============================================================================
+# ============================== NOKIA =======================================
+# ============================================================================
+
+if ($o_check_type eq "nokia") {
+
+verb("Checking nokia env");
+
+# Define variables
+my $resultat;
+my ($fan_status,$ps_status,$temp_status)=(0,0,0);
+my ($fan_exist,$ps_exist,$temp_exist)=(0,0,0);
+my ($num_fan,$num_ps)=(0,0);
+my ($num_fan_nok,$num_ps_nok)=(0,0);
+my $global_status=0;
+my $output="";
+
+# get temp
+$resultat = $session->get_table(Baseoid => $nokia_temp_tbl);
+
+if (defined($resultat)) {
+ verb ("temp found");
+ $temp_exist=1;
+ if ($$resultat{$nokia_temp} != 1) {
+ $temp_status=2;$global_status=1;
+ $output="Temp CRITICAL ";
+ } else {
+ $output="Temp OK ";
+ }
+}
+
+# Get fan table
+$resultat = $session->get_table(Baseoid => $nokia_fan_table);
+
+if (defined($resultat)) {
+ $fan_exist=1;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$nokia_fan_status/ ) {
+ if ($$resultat{$key} != 1) { $fan_status=1; $num_fan_nok++}
+ $num_fan++;
+ }
+ }
+ if ($fan_status==0) {
+ $output.= ", ".$num_fan." fan OK";
+ } else {
+ $output.= ", ".$num_fan_nok."/".$num_fan." fan CRITICAL";
+ $global_status=2;
+ }
+}
+
+# Get ps table
+$resultat = $session->get_table(Baseoid => $nokia_ps_table);
+
+if (defined($resultat)) {
+ $ps_exist=1;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$nokia_ps_status/ ) {
+ if ($$resultat{$key} != 1) { $ps_status=1; $num_ps_nok++;}
+ $num_ps++;
+ }
+ if ( $key =~ /$nokia_ps_temp/ ) {
+ if ($$resultat{$key} != 1) { if ($ps_status==0) {$ps_status=2;$num_ps_nok++;} }
+ }
+ }
+ if ($ps_status==0) {
+ $output.= ", ".$num_ps." ps OK";
+ } elsif ($ps_status==2) {
+ $output.= ", ".$num_ps_nok."/".$num_ps." ps WARNING (temp)";
+ if ($global_status != 2) {$global_status=1;}
+ } else {
+ $output.= ", ".$num_ps_nok."/".$num_ps." ps CRITICAL";
+ $global_status=2;
+ }
+}
+
+# Clear the SNMP Transport Domain and any errors associated with the object.
+$session->close;
+
+verb ("status : $global_status");
+
+if ( ($fan_exist+$ps_exist+$temp_exist) == 0) {
+ print "No environemental informations found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+if ($global_status==0) {
+ print $output." : all OK\n";
+ exit $ERRORS{"OK"};
+}
+
+if ($global_status==1) {
+ print $output." : WARNING\n";
+ exit $ERRORS{"WARNING"};
+}
+
+if ($global_status==2) {
+ print $output." : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+}
+}
+
+
+# ============================================================================
+# ============================== BLUECOAT ====================================
+# ============================================================================
+
+if ($o_check_type eq "bc") {
+
+ verb("Checking bluecoat env");
+
+ # Define variables
+ my $final_status = 0;
+ my $output = "";
+ my $output_perf = "";
+ my $tmp_status_sensor;
+ my $tmp_status_code;
+ my ($num_fan,$num_other,$num_volt,$num_temp,$num_disk)=(0,0,0,0,0);
+ my ($num_fan_ok,$num_other_ok,$num_volt_ok,$num_temp_ok,$num_disk_ok)=(0,0,0,0,0);
+ my ($sens_name,$sens_status,$sens_scale,$sens_value,$sens_code,$sens_unit)=(undef,undef,undef,undef,undef,undef);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_sensor = $session->get_table(Baseoid => $bc_sensor_table);
+ &check_snmp_result($resultat_sensor,$session->error);
+ my $resultat_disk = $session->get_table(Baseoid => $bc_dsk_table);
+ &check_snmp_result($resultat_disk,$session->error);
+
+ # Check the sensor table
+ if (defined($resultat_sensor)) {
+ verb ("sensor table found");
+ foreach my $key ( keys %$resultat_sensor) {
+ if ($key =~ /$bc_sensor_Name/) {
+ $sens_name = $$resultat_sensor{$key};
+ $key =~ s/$bc_sensor_Name//;
+
+ $sens_status = $$resultat_sensor{$bc_sensor_Status.$key};
+ $sens_scale = $$resultat_sensor{$bc_sensor_Scale.$key};
+ $sens_value = $$resultat_sensor{$bc_sensor_Value.$key} * 10 ** $sens_scale;
+ $sens_code = $$resultat_sensor{$bc_sensor_Code.$key};
+ $sens_unit = $$resultat_sensor{$bc_sensor_Units.$key};
+ $sens_scale = $$resultat_sensor{$bc_sensor_Scale.$key};
+
+ if ($sens_status != 1 || $sens_code != 1) { # check is there is something wrong with either the status or code
+ if ($output ne "") { $output.=", ";}
+ if ($sens_status != 1 && $sens_code != 1) { # If both the status and code are not reporting "ok" use the following output
+ $output .= $sens_name ." sensor ".$bc_SensorStatus[$sens_status].", reports ".$sens_value." ".$bc_mesure[$sens_unit]." (".$bc_SensorCode[$sens_code].")";
+ }
+ if ($sens_status != 1 && $sens_code == 1) { # If only the status is not reporting "ok"
+ $output .= $sens_name ." sensor ".$bc_SensorStatus[$sens_status];
+ }
+ if ($sens_status == 1 && $sens_code != 1) { # If only the code is not reporting "ok"
+ $output .= $sens_name ." reports ".$sens_value." ".$bc_mesure[$sens_unit]." (".$bc_SensorCode[$sens_code].")";
+ }
+
+ # Set the status
+ $tmp_status_sensor = $bc_status_sensor[$sens_status];
+ $tmp_status_code = $bc_status_code[$sens_code];
+ $final_status = &set_status($tmp_status_sensor,$final_status);
+ $final_status = &set_status($tmp_status_code,$final_status);
+ }
+
+ # If performance data is enabled then output name with value
+ if (defined($o_perf)) {
+ if ($output_perf ne "") { $output_perf .=" ";}
+ $output_perf .= "'".$sens_name."'=";
+ my $perf_value = $sens_value;
+ $output_perf .= $perf_value;
+ }
+
+ # Count fans sensors
+ if ($bc_mesure[$sens_unit] eq "rpm") {
+ $num_fan++;
+ if ($sens_status == 1 && $sens_code == 1) { $num_fan_ok++; }
+ }
+
+ # Count temperature sensors
+ if ($bc_mesure[$sens_unit] eq "celsius") {
+ $num_temp++;
+ if ($sens_status == 1 && $sens_code == 1) { $num_temp_ok++; }
+ }
+
+ # Count voltage sensors
+ if ($bc_mesure[$sens_unit] eq "volts") {
+ $num_volt++;
+ if ($sens_status == 1 && $sens_code == 1) { $num_volt_ok++; }
+ }
+ if (!$bc_mesure[$sens_unit] =~ /rpm|celsius|volts/) {
+ $num_other++;
+ if ($sens_status == 1 && $sens_code == 1) { $num_other_ok++;}
+ }
+ }
+ }
+ }
+
+ # Check the disk table
+ if (defined($resultat_disk )) {
+ foreach my $key ( keys %$resultat_disk ) {
+ my ($dsk_name,$dsk_status)=(undef,undef);
+ if ( $key =~ /$bc_dsk_status/ ) {
+ $num_disk++;
+ $dsk_status=$bc_dsk_status_nagios[$$resultat_disk{$key}];
+ $key =~ s/$bc_dsk_status//;
+
+ if ( $dsk_status != 0) {
+ if ($output ne "") { $output.=", ";}
+ $output .= $$resultat_disk{$bc_dsk_vendor.$key} . "(S/N:".$$resultat_disk{$bc_dsk_serial.$key} ." MODEL:". $$resultat_disk{$bc_dsk_product.$key} . ") - ". $bc_DiskStatus[$$resultat_disk {$bc_dsk_status.$key}];
+ $final_status = &set_status($dsk_status,$final_status);
+ } else {
+ $num_disk_ok++;
+ }
+ if($$resultat_disk{$bc_dsk_status.$key} == 6){
+ $num_disk--;
+ $num_disk_ok--;
+ }
+
+ }
+ }
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_fan+$num_other+$num_volt+$num_temp+$num_disk == 0) {
+ print "No information found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($output ne "") {$output.=" : ";}
+
+ if ($num_fan!=0) {
+ if ($num_fan == $num_fan_ok) {
+ $output.= $num_fan . " fan OK, ";
+ } else {
+ $output.= $num_fan_ok . "/" . $num_fan ." fan OK, ";
+ }
+ }
+
+ if ($num_temp!=0) {
+ if ($num_temp == $num_temp_ok) {
+ $output.= $num_temp . " temp OK, ";
+ } else {
+ $output.= $num_temp_ok . "/" . $num_temp ." temp OK, ";
+ }
+ }
+
+ if ($num_volt!=0) {
+ if ($num_volt == $num_volt_ok) {
+ $output.= $num_volt . " volt OK, ";
+ } else {
+ $output.= $num_volt_ok . "/" . $num_volt ." volt OK, ";
+ }
+ }
+
+ if ($num_other!=0) {
+ if ($num_other == $num_other_ok) {
+ $output.= $num_other . " other OK, ";
+ } else {
+ $output.= $num_other_ok . "/" . $num_other ." other OK, ";
+ }
+ }
+
+ if ($num_disk!=0) {
+ if ($num_disk == $num_disk_ok) {
+ $output.= $num_disk . " disk OK";
+ } else {
+ $output.= $num_disk_ok . "/" . $num_disk ." disk OK";
+ }
+ }
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== IRONPORT ====================================
+# ============================================================================
+
+if ($o_check_type eq "iron") {
+
+verb("Checking Ironport env");
+
+my $resultat;
+# status : 0=ok, 1=warn, 2=crit
+my ($fan_status,$ps_status,$temp_status)=(0,0,0);
+my ($fan_exist,$ps_exist,$temp_exist)=(0,0,0);
+my ($num_fan,$num_ps,$num_temp)=(0,0,0);
+my ($num_fan_nok,$num_ps_nok,$num_temp_nok)=(0,0,0);
+my $global_status=0;
+my $output="";
+# get temp if $o_temp is defined
+if (defined($o_temp)) {
+ verb("Checking temp < $o_temp");
+ $resultat = $session->get_table(Baseoid => $iron_tmp_table);
+
+ if (defined($resultat)) {
+ verb ("temp found");
+ $temp_exist=1;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$iron_tmp_celcius/ ) {
+ verb("Status : $$resultat{$key}");
+ if ($$resultat{$key} > $o_temp) {
+ my @index_oid=split(/\./,$key);
+ my $index_oid_key=pop(@index_oid);
+ $output .= ",Temp : ". $$resultat{ $iron_tmp_name.".".$index_oid_key}." : ".$$resultat{$key}." C";
+ $temp_status=2;
+ $num_temp_nok++;
+ }
+ $num_temp++;
+ }
+ }
+ if ($temp_status==0) {
+ $output.= ", ".$num_temp." temp < ".$o_temp." OK";
+ } else {
+ $output.= ", ".$num_temp_nok."/".$num_temp." temp probes CRITICAL";
+ $global_status=2;
+ }
+ }
+}
+
+# Get fan status if $o_fan is defined
+if (defined($o_fan)) {
+ verb("Checking fan > $o_fan");
+ $resultat = $session->get_table(Baseoid => $iron_fan_table);
+
+ if (defined($resultat)) {
+ verb ("fan found");
+ $fan_exist=1;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$iron_fan_rpm/ ) {
+ verb("Status : $$resultat{$key}");
+ if ($$resultat{$key} < $o_fan) {
+ my @index_oid=split(/\./,$key);
+ my $index_oid_key=pop(@index_oid);
+ $output .= ",Fan ". $$resultat{ $iron_fan_name.".".$index_oid_key}." : ".$$resultat{$key}." RPM";
+ $fan_status=2;
+ $num_fan_nok++;
+ }
+ $num_fan++;
+ }
+ }
+ if ($fan_status==0) {
+ $output.= ", ".$num_fan." fan > ".$o_fan." OK";
+ } else {
+ $output.= ", ".$num_fan_nok."/".$num_fan." fans CRITICAL";
+ $global_status=2;
+ }
+ }
+}
+
+# Get power supply status
+ verb("Checking PS");
+ $resultat = $session->get_table(Baseoid => $iron_ps_table);
+
+ if (defined($resultat)) {
+ verb ("ps found");
+ $ps_exist=1;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$iron_ps_status/ ) {
+ verb("Status : $iron_ps_status_name[$$resultat{$key}]");
+ if ($iron_ps_status_nagios[$$resultat{$key}] != 0) {
+ my @index_oid=split(/\./,$key);
+ my $index_oid_key=pop(@index_oid);
+ $output .= ",PS ". $$resultat{$iron_ps_name.".".$index_oid_key}." : ".$iron_ps_status_name[$$resultat{$key}];
+ $ps_status=2;
+ $num_ps_nok++;
+ }
+ $num_ps++;
+ }
+ }
+ if ($ps_status==0) {
+ $output.= ", ".$num_ps." ps OK";
+ } else {
+ $output.= ", ".$num_ps_nok."/".$num_ps." ps CRITICAL";
+ $global_status=2;
+ }
+ }
+
+# Clear the SNMP Transport Domain and any errors associated with the object.
+$session->close;
+
+verb ("status : $global_status");
+
+if ( ($fan_exist+$ps_exist+$temp_exist) == 0) {
+ print "No environemental informations found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$output =~ s/^,//;
+
+if ($global_status==0) {
+ print $output." : all OK\n";
+ exit $ERRORS{"OK"};
+}
+
+if ($global_status==1) {
+ print $output." : WARNING\n";
+ exit $ERRORS{"WARNING"};
+}
+
+if ($global_status==2) {
+ print $output." : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+}
+}
+
+
+# ============================================================================
+# ============================== FOUNDRY =====================================
+# ============================================================================
+
+if ($o_check_type eq "foundry") {
+
+verb("Checking foundry env");
+
+# Define variables
+my $global_status = 0;
+my $output = "";
+my @foundry_temp_oid=($foundry_temp,$foundry_temp_warn,$foundry_temp_crit);
+
+# Get SNMP table(s) and check the result
+my $result_temp = $session->get_request(Varbindlist => \@foundry_temp_oid);
+
+my $temp_found=0;
+if (defined($result_temp)) {
+ $temp_found=1;
+ #Temp found
+ $output = "Temp : " . $$result_temp{$foundry_temp} / 2;
+ if ($$result_temp{$foundry_temp} > $$result_temp{$foundry_temp_crit}) { # Temp above critical
+ $output.= " > ". $$result_temp{$foundry_temp_crit} / 2 . " : CRITICAL";
+ $global_status=3;
+ } elsif ( $$result_temp{$foundry_temp} > $$result_temp{$foundry_temp_warn}) { # Temp above warning
+ $output.= " > ". $$result_temp{$foundry_temp_warn} / 2 . " : WARNING";
+ $global_status=2;
+ } else {
+ $output.= " < ". $$result_temp{$foundry_temp_warn} / 2 . " : OK";
+ $global_status=1;
+ }
+}
+
+# Get PS table (TODO : Bug in FAN table, see with Foundry).
+
+my $result_ps = $session->get_table(Baseoid => $foundry_ps_table);
+&check_snmp_result($result_ps,$session->error);
+
+my $ps_num=0;
+if (defined($result_ps)) {
+ $output .=", " if defined($output);
+ foreach my $key ( keys %$result_ps) {
+ verb("OID : $key, Desc : $$result_ps{$key}");
+ if ($$result_ps{$key} =~ /$foundry_ps_desc/) {
+ $ps_num++;
+ my @oid_list = split (/\./,$key);
+ my $index_ps = pop (@oid_list);
+ $index_ps= $foundry_ps_status . "." . $index_ps;
+ if (defined ($$result_ps{$index_ps})) {
+ if ($$result_ps{$index_ps} == 3) {
+ $output.="PS ".$$result_ps{$key}." : FAILURE";
+ $global_status=3;
+ } elsif ($$result_ps{$index_ps} == 2) {
+ $global_status=1 if ($global_status==0);
+ } else {
+ $output.= "ps ".$$result_ps{$key}." : OTHER";
+ }
+ } else {
+ $output.= "ps ".$$result_ps{$key}." : UNDEFINED STATUS";
+ }
+ }
+ }
+}
+
+
+# Clear the SNMP Transport Domain and any errors associated with the object.
+$session->close;
+
+if (($ps_num+$temp_found) == 0) {
+ print "No data found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+if ($global_status==1) {
+ print $output." : all OK\n";
+ exit $ERRORS{"OK"};
+}
+
+if ($global_status==2) {
+ print $output." : WARNING\n";
+ exit $ERRORS{"WARNING"};
+}
+
+if ($global_status==3) {
+ print $output." : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+}
+
+print $output." : UNKNOWN\n";
+exit $ERRORS{"UNKNOWN"};
+
+}
+
+
+# ============================================================================
+# ============================== LINUX LM-SENSORS ============================
+# ============================================================================
+
+if ($o_check_type eq "linux") {
+
+ verb("Checking linux env");
+
+ # Define variables
+ my $output = "";
+ my $index;
+ my ($sens_name,$sens_status,$sens_value,$sens_unit)=(undef,undef,undef,undef);
+
+ # Get SNMP table(s) and check the result
+ my $resultat = $session->get_table(Baseoid => $linux_env_table);
+ &check_snmp_result($resultat,$session->error);
+
+ foreach my $key ( keys %$resultat) {
+ if ($key =~ /$linux_temp_descr/) {
+ $sens_name=$$resultat{$key};
+ $index=(split /\./,$key)[-1];
+ $sens_value=$$resultat{$linux_temp_value.".".$index}/1000;
+ printf("TSensor %s : %.0f\n",$sens_name,$sens_value);
+ }
+ if ($key =~ /$linux_fan_descr/) {
+ $sens_name=$$resultat{$key};
+ $index=(split /\./,$key)[-1];
+ $sens_value=$$resultat{$linux_fan_value.".".$index};
+ printf("FSensor %s : %.0f\n",$sens_name,$sens_value);
+ }
+ if ($key =~ /$linux_volt_descr/) {
+ $sens_name=$$resultat{$key};
+ $index=(split /\./,$key)[-1];
+ $sens_value=$$resultat{$linux_volt_value.".".$index}/1000;
+ printf("VSensor %s : %.2f\n",$sens_name,$sens_value);
+ }
+ if ($key =~ /$linux_misc_descr/) {
+ $sens_name=$$resultat{$key};
+ $index=(split /\./,$key)[-1];
+ $sens_value=$$resultat{$linux_misc_value.".".$index};
+ printf("MSensor %s : %.2f\n",$sens_name,$sens_value);
+ }
+ }
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ print "Not implemented yet : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+
+# ============================================================================
+# ============================== CISCO CARD/MODULE ===========================
+# ============================================================================
+
+if ($o_check_type eq "ciscoSW") {
+
+ verb("Checking ciscoSW env");
+
+ # Define variables
+ my $output ="";
+ my $final_status =0;
+ my $card_output ="";
+ my $modules_output ="";
+ my $tmp_status;
+ my $result_t;
+ my $index;
+ my @temp_oid;
+ my ($num_cards,$num_cards_ok,$num_modules,$num_modules_ok)=(0,0,0,0);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_c = $session->get_table(Baseoid => $cisco_chassis_card_state);
+ &check_snmp_result($resultat_c,$session->error);
+ my $resultat_m = $session->get_table(Baseoid => $cisco_module_state);
+ &check_snmp_result($resultat_m,$session->error);
+
+ # Check cards
+ if (defined($resultat_c)) {
+ foreach my $key ( keys %$resultat_c) {
+ if ($key =~ /$cisco_chassis_card_state/) {
+ $num_cards++;
+ $tmp_status=$cisco_chassis_card_status[$$resultat_c{$key}];
+ if ($tmp_status == 0) {
+ $num_cards_ok++;
+ } else {
+ $final_status=2;
+ $index=(split /\./,$key)[-1];
+ @temp_oid=($cisco_chassis_card_descr.".".$index,$cisco_chassis_card_slot.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+ if (!defined($result_t)) { $card_output.="Invalid card(UNKNOWN)";}
+ else {
+ if ($card_output ne "") {$card_output.=", ";}
+ $card_output.= "Card slot " . $$result_t{$cisco_chassis_card_slot.".".$index};
+ $card_output.= "(" .$$result_t{$cisco_chassis_card_descr.".".$index} ."): ";
+ $card_output.= "status " . $cisco_chassis_card_status_text[$$resultat_c{$key}];
+ }
+ }
+ }
+ }
+ if ($card_output ne "") {$card_output.=", ";}
+ }
+
+ # Check modules
+ if (defined($resultat_m)) {
+ foreach my $key ( keys %$resultat_m) {
+ if ($key =~ /$cisco_module_state/) {
+ $num_modules++;
+ $tmp_status=$cisco_module_status[$$resultat_m{$key}];
+ if ($tmp_status == 0) {
+ $num_modules_ok++;
+ } else {
+ my $module_slot_present=0;
+ $index=(split /\./,$key)[-1];
+ @temp_oid=($cisco_module_slot.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+ if (defined($result_t)) {
+ if ($modules_output ne "") {$modules_output.=", ";}
+ $modules_output.= "Module slot " . $$result_t{$cisco_module_slot.".".$index};
+ $module_slot_present=1;
+ }
+ @temp_oid=($cisco_module_descr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+ if (defined($result_t)) {
+ if ($module_slot_present == 1) {
+ $modules_output.= "(" .$$result_t{$cisco_module_descr.".".$index} ."): ";
+ } else {
+ if ($modules_output ne "") {$modules_output.=", ";}
+ $modules_output.= "Module (" .$$result_t{$cisco_module_descr.".".$index} ."): ";
+ }
+ $modules_output.= "status " . $cisco_module_status_text[$$resultat_m{$key}];
+ $module_slot_present=1;
+ }
+ if ($module_slot_present == 0) {
+ $modules_output.="Invalid module(UNKNOWN) : status " . $cisco_module_status_text[$$resultat_m{$key}];
+ }
+ if ($tmp_status == 1 && $final_status==0) {
+ $final_status=1;
+ } else {
+ $final_status=2;
+ }
+ }
+ }
+ }
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_cards==0 && $num_modules==0) {
+ print "No cards/modules found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+ $output=$card_output . $modules_output;
+ if ($output ne "") {$output.=" : ";}
+ if ($num_cards!=0) {
+ if ($num_cards == $num_cards_ok) {
+ $output.= $num_cards . " cards OK, ";
+ } else {
+ $output.= $num_cards_ok . "/" . $num_cards ." cards OK, ";
+ $final_status=2;
+ }
+ }
+
+ if ($num_modules!=0) {
+ if ($num_modules == $num_modules_ok) {
+ $output.= $num_modules . " modules OK ";
+ } else {
+ $output.= $num_modules_ok . "/" . $num_modules ." modules OK ";
+ $final_status=2;
+ }
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== JUNIPER =====================================
+# ============================================================================
+
+if ($o_check_type eq "juniper") {
+
+ verb("Checking juniper env");
+
+ # Define variables
+ my $output = "";
+ my $final_status = 0;
+ my $card_output = "";
+ my $ignore = ": Ignored: ";
+ my $tmp_status;
+ my $result_t;
+ my $index;
+ my @temp_oid;
+ my ($num_cards,$num_cards_ok)=(0,0);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_c = $session->get_table(Baseoid => $juniper_operating_state);
+ &check_snmp_result($resultat_c,$session->error);
+
+ if (defined($resultat_c)) {
+ foreach my $key ( keys %$resultat_c) {
+ if ($key =~ /$juniper_operating_state/) {
+ $num_cards++;
+ $tmp_status=$juniper_operating_status[$$resultat_c{$key}];
+ if ($tmp_status == 0) {
+ $num_cards_ok++;
+ } else {
+ $index = $key;
+ $index =~ s/^$juniper_operating_state.//;
+ @temp_oid=($juniper_operating_descr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+ if ($$result_t{$juniper_operating_descr.".".$index} =~ /PCMCIA|USB|Flash|Fan Tray [0-9]$/ && $tmp_status == 3) {
+ $ignore.= "(" .$$result_t{$juniper_operating_descr.".".$index} ."),";
+ }
+
+ else {
+ $final_status = &set_status($tmp_status,$final_status);
+ if (!defined($result_t)) {
+ $card_output.="Invalid component(UNKNOWN)";
+ }
+ else {
+ if ($card_output ne "") {$card_output.=", ";}
+ $card_output.= "(" .$$result_t{$juniper_operating_descr.".".$index} ."): ";
+ $card_output.= "status " . $juniper_operating_status_text[$$resultat_c{$key}];
+ }
+ }
+ }
+ }
+ }
+ if ($card_output ne "") {$card_output.=", ";}
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_cards==0) {
+ print "No components found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+ $output=$card_output;
+ if ($output ne "") {$output.=" : ";}
+ if ($num_cards!=0) {
+ if ($num_cards == $num_cards_ok) {
+ $output.= $num_cards . " components OK";
+ } else {
+ $output.= $num_cards_ok . "/" . $num_cards ." components OK" .$ignore;
+ }
+ }
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== EXTREME =====================================
+# ============================================================================
+
+if ($o_check_type eq "extremeSW") {
+
+ verb("Checking extreme env");
+
+ # Define variables
+ my $tmp_status;
+ my $index;
+ my $output = "";
+ my $final_status = 0;
+ my $slot_output = "";
+ my $ps_output = "";
+ my $fan_output = "";
+ my $temperature_output = "";
+ my ($num_slot,$num_slot_ok) = (0,0);
+ my ($num_ps,$num_ps_ok) = (0,0);
+ my ($num_fan,$num_fan_ok) = (0,0);
+ my ($slot_name,$slot_state,$slot_serialnumber,$slot_state_text) = (undef,undef,undef,undef);
+ my ($ps_status,$ps_status_text) = (undef,undef);
+ my ($fan_number,$fan_operational,$fan_operational_text) = (undef,undef,undef);
+ my ($temperature_state,$temperature_state_text,$temperature_current) = (undef,undef,undef);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_slot = $session->get_table(Baseoid => $extreme_slot_table);
+ &check_snmp_result($resultat_slot,$session->error);
+ my $resultat_ps = $session->get_table(Baseoid => $extreme_ps_table);
+ &check_snmp_result($resultat_ps,$session->error);
+ my $resultat_fan = $session->get_table(Baseoid => $extreme_fan_table);
+ &check_snmp_result($resultat_fan,$session->error);
+ my @extreme_temp_alarm_oid =($extreme_temperature_alarm);
+ my $resultat_temp_alarm = $session->get_request( Varbindlist => \@extreme_temp_alarm_oid );
+ my @extreme_temp_current_oid =($extreme_temperature_current);
+ my $resultat_temp_current = $session->get_request( Varbindlist => \@extreme_temp_current_oid );
+
+ # Check slot
+ if (defined($resultat_slot)) {
+ foreach my $key ( keys %$resultat_slot) {
+ if ($key =~ /$extreme_slot_name/) {
+ $key =~ s/$extreme_slot_name//;
+
+ # Set the slot variables
+ $slot_name = $$resultat_slot{$extreme_slot_name.$key};
+ $slot_state = $$resultat_slot{$extreme_slot_state.$key};
+ $slot_state_text = $extreme_slot_state_text[$slot_state];
+ $slot_serialnumber = $$resultat_slot{$extreme_slot_serialnumber.$key};
+ $tmp_status = $extreme_slot_nagios[$slot_state];
+ $final_status = &set_status($tmp_status,$final_status);
+
+ if ($slot_state != 1){
+ $num_slot++;
+ if ($tmp_status == 0) {
+ $num_slot_ok++;
+ }
+
+ else {
+ if ($slot_output ne "") {$slot_output.=", ";}
+ $slot_output.= "(Slot: " . $slot_name;
+ $slot_output.= " Status: " . $slot_state_text;
+ $slot_output.= " S/N: " . $slot_serialnumber . ")";
+ }
+ }
+ }
+ }
+ if ($slot_output ne "") {$slot_output.=", ";}
+ }
+
+ # Check power-supply
+ if (defined($resultat_ps)) {
+ foreach my $key ( keys %$resultat_ps) {
+ if ($key =~ /$extreme_ps_status/) {
+ $num_ps++;
+ $key =~ s/$extreme_ps_status//;
+
+ # Set the slot variables
+ $ps_status = $$resultat_ps{$extreme_ps_status.$key};
+ $ps_status_text = $extreme_ps_status_text[$ps_status];
+ $tmp_status = $extreme_ps_nagios[$ps_status];
+ $final_status = &set_status($tmp_status,$final_status);
+
+ if ($tmp_status == 0) {
+ $num_ps_ok++;
+ }
+
+ else {
+ if ($ps_output ne "") {$ps_output.=", ";}
+ $ps_output.= "(Power-supply status: " . $ps_status_text . ")";
+ }
+ }
+ }
+ if ($ps_output ne "") {$ps_output.=", ";}
+ }
+
+ # Check fan
+ if (defined($resultat_fan)) {
+ foreach my $key ( keys %$resultat_fan) {
+ if ($key =~ /$extreme_fan_number/) {
+ $num_fan++;
+ $key =~ s/$extreme_fan_number//;
+
+ # Set the slot variables
+ $fan_number = $$resultat_fan{$extreme_fan_number.$key};
+ $fan_operational = $$resultat_fan{$extreme_fan_operational.$key};
+ $fan_operational_text = $extreme_fan_operational_text[$fan_operational];
+ $tmp_status = $extreme_fan_nagios[$fan_operational];
+ $final_status = &set_status($tmp_status,$final_status);
+
+ if ($tmp_status == 0) {
+ $num_fan_ok++;
+ }
+
+ else {
+ if ($fan_output ne "") {$fan_output.=", ";}
+ $fan_output.= "(Fan: " . $fan_number;
+ $fan_output.= " Status: " . $fan_operational_text . ")";
+ }
+ }
+ }
+ if ($fan_output ne "") {$fan_output.=", ";}
+ }
+
+ # Check temperature
+ if (defined($resultat_temp_alarm) && defined($resultat_temp_current)){
+ $temperature_state = $$resultat_temp_alarm{$extreme_temperature_alarm};
+ $temperature_state_text = $extreme_temperature_alarm_text[$temperature_state];
+ $temperature_current = $$resultat_temp_current{$extreme_temperature_current};
+
+ $tmp_status = $extreme_temperature_nagios[$temperature_state];
+ $final_status = &set_status($tmp_status,$final_status);
+
+ $temperature_output.= "Temp: " . $temperature_state_text;
+ $temperature_output.= " (" . $temperature_current . " celcius)";
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_slot == 0 && $num_ps == 0 && $num_fan == 0) {
+ print "No slot/power-supply/fan found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ $output=$slot_output . $ps_output . $fan_output;
+
+ if ($output ne "") {$output.=": ";}
+
+ if ($num_slot != 0) {
+ if ($num_slot == $num_slot_ok) {
+ $output.= $num_slot . " slots OK, ";
+ } else {
+ $output.= $num_slot_ok . "/" . $num_slot ." slots OK, ";
+ }
+ }
+
+ if ($num_ps != 0) {
+ if ($num_ps == $num_ps_ok) {
+ $output.= $num_ps . " power-supply OK, ";
+ } else {
+ $output.= $num_ps_ok . "/" . $num_ps ." power-supply OK, ";
+ }
+ }
+
+ if ($num_fan != 0) {
+ if ($num_fan == $num_fan_ok) {
+ $output.= $num_fan . " fans OK, ";
+ } else {
+ $output.= $num_fan_ok . "/" . $num_fan ." fans OK, ";
+ }
+ }
+
+ $output.= $temperature_output;
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== HP PROCURVE =================================
+# ============================================================================
+
+if ($o_check_type eq "procurve") {
+
+ verb("Checking procurve env");
+
+ # Define variables
+ my $output = "";
+ my $final_status = 0;
+ my $power_output = "";
+ my $fan_output = "";
+ my $temp_output = "";
+ my $tmp_status;
+ my $index;
+ my @temp_oid;
+ my ($num_power,$num_power_ok,$num_fan,$num_fan_ok,$num_temp,$num_temp_ok)=(0,0,0,0,0,0);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_state = $session->get_table(Baseoid => $procurve_operating_state);
+ &check_snmp_result($resultat_state,$session->error);
+ my $resultat_descr = $session->get_table(Baseoid => $procurve_operating_descr);
+ &check_snmp_result($resultat_descr,$session->error);
+
+ if (defined($resultat_state)) {
+ foreach my $key ( keys %$resultat_state) {
+ if ($key =~ /$procurve_operating_state/) {
+
+ $tmp_status=$procurve_operating_status[$$resultat_state{$key}];
+
+ $index = $key;
+ $index =~ s/^$procurve_operating_state.//;
+
+ my $description = $$resultat_descr{$procurve_operating_descr.".".$index};
+
+ if ($description =~ /Power/ ) {$num_power++;}
+ if ($description =~ /Fan/ ) {$num_fan++;}
+ if ($description =~ /temperature/ ) {$num_temp++;}
+
+ if ($description =~ /Power/ && $tmp_status == 0) {$num_power_ok++;}
+ if ($description =~ /Fan/ && $tmp_status == 0) {$num_fan_ok++;}
+ if ($description =~ /temperature/ && $tmp_status == 0) {$num_temp_ok++;}
+
+ if ($tmp_status != 0) {
+ if ($description =~ /Power/ && $tmp_status == 4) {$num_power--;}
+ if ($description =~ /Fan/ && $tmp_status == 4) {$num_fan--;}
+ if ($description =~ /temperature/ && $tmp_status == 4) {$num_temp--;}
+
+ if ($tmp_status != 4) {
+ if ($tmp_status == 1 && $final_status != 2) {$final_status=$tmp_status;}
+ if ($tmp_status == 2) {$final_status=$tmp_status;}
+ if ($tmp_status == 3 && $final_status == 0) {$final_status=$tmp_status;}
+
+ if ($description =~ /Power/ ) {
+ if (!defined($description)) {$power_output.="Invalid power(UNKNOWN)";}
+ else {
+ if ($power_output ne "") {$power_output.=", ";}
+ $power_output.= "(".$description."): ";
+ $power_output.= "status " . $procurve_operating_status_text[$$resultat_state{$key}];
+ }
+ }
+
+ if ($description =~ /Fan/ ) {
+ if (!defined($description)) {$fan_output.="Invalid fan(UNKNOWN)";}
+ else {
+ if ($fan_output ne "") {$fan_output.=", ";}
+ $fan_output.= "(".$description."): ";
+ $fan_output.= "status " . $procurve_operating_status_text[$$resultat_state{$key}];
+ }
+ }
+
+ if ($description =~ /temperature/ ) {
+ if (!defined($description)) {$power_output.="Invalid temp(UNKNOWN)";}
+ else {
+ if ($temp_output ne "") {$temp_output.=", ";}
+ $temp_output.= "(".$description."): ";
+ $temp_output.= "status " . $procurve_operating_status_text[$$resultat_state{$key}];
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($power_output ne "") {$power_output.=", ";}
+ if ($fan_output ne "") {$fan_output.=", ";}
+ if ($temp_output ne "") {$temp_output.=", ";}
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_power==0 && $num_fan==0 && $num_temp==0) {
+ print "No power/fan/temp found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ $output=$power_output . $fan_output . $temp_output;
+ if ($output ne "") {$output.=" : ";}
+
+ if ($num_power!=0) {
+ if ($num_power == $num_power_ok) {
+ $output.= $num_power . " power OK, ";
+ } else {
+ $output.= $num_power_ok . "/" . $num_power ." power OK, ";
+ }
+ }
+
+ if ($num_fan!=0) {
+ if ($num_fan == $num_fan_ok) {
+ $output.= $num_fan . " fan OK, ";
+ } else {
+ $output.= $num_fan_ok . "/" . $num_fan ." fan OK, ";
+ }
+ }
+
+ if ($num_temp!=0) {
+ if ($num_temp == $num_temp_ok) {
+ $output.= $num_temp . " temp OK";
+ } else {
+ $output.= $num_temp_ok . "/" . $num_temp ." temp OK";
+ }
+ }
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== NETSCREEN ===================================
+# ============================================================================
+
+if ($o_check_type eq "netscreen") {
+
+ verb("Checking netscreen env");
+
+ # Define variables
+ my $output = "";
+ my $final_status = 0;
+ my $slot_output = "";
+ my $power_output = "";
+ my $fan_output = "";
+ my $tmp_status;
+ my $result_t;
+ my $index;
+ my @temp_oid;
+ my ($num_slot,$num_slot_ok,$num_power,$num_power_ok,$num_fan,$num_fan_ok)=(0,0,0,0,0,0);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_s = $session->get_table(Baseoid => $netscreen_slot_operating_state);
+ &check_snmp_result($resultat_s,$session->error);
+ my $resultat_p = $session->get_table(Baseoid => $netscreen_power_operating_state);
+ &check_snmp_result($resultat_p,$session->error);
+ my $resultat_f = $session->get_table(Baseoid => $netscreen_fan_operating_state);
+ &check_snmp_result($resultat_f,$session->error);
+
+ # Check if the ScreenOS version is not below 6.1 or 5GT, these are not supported
+ my @netscreen_os_oid = ($sysdescr);
+ my $netscreen_version = $session->get_request(Varbindlist => \@netscreen_os_oid);
+ if( ($$netscreen_version{$sysdescr} !~ /version 6.[1-9]/) || ($$netscreen_version{$sysdescr} =~ /5GT/) )
+ {
+ print "Not checked, ScreenOS version below 6.1 and/or 5GT: OK\n";
+ exit $ERRORS{"OK"};
+ }
+
+ # Check slots
+ if (defined($resultat_s)) {
+ foreach my $key ( keys %$resultat_s) {
+ if ($key =~ /$netscreen_slot_operating_state/) {
+ $num_slot++;
+ $tmp_status = $netscreen_slot_operating_status[$$resultat_s{$key}];
+ $final_status = &set_status($tmp_status,$final_status);
+
+ if ($tmp_status == 0) {
+ $num_slot_ok++;
+ } else {
+ $index = $key;
+ $index =~ s/^$netscreen_slot_operating_state.//;
+ @temp_oid=($netscreen_slot_operating_descr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+
+ if (!defined($result_t)) {$slot_output.="Invalid slot(UNKNOWN)";}
+
+ else {
+ if ($slot_output ne "") {$slot_output.=", ";}
+ $slot_output.= "(" .$$result_t{$netscreen_slot_operating_descr.".".$index} ."): ";
+ $slot_output.= "status " . $netscreen_slot_operating_status_text[$$resultat_s{$key}];
+ }
+ }
+ }
+ }
+ if ($slot_output ne "") {$slot_output.=", ";}
+ }
+
+ # Check power
+ if (defined($resultat_p)) {
+ foreach my $key ( keys %$resultat_p) {
+ if ($key =~ /$netscreen_power_operating_state/) {
+ $num_power++;
+ $tmp_status = $netscreen_power_operating_status[$$resultat_p{$key}];
+ $final_status = &set_status($tmp_status,$final_status);
+
+ if ($tmp_status == 0) {
+ $num_power_ok++;
+ } else {
+ $index = $key;
+ $index =~ s/^$netscreen_power_operating_state.//;
+ @temp_oid=($netscreen_power_operating_descr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+
+ if (!defined($result_t)) {$slot_output.="Invalid power(UNKNOWN)";}
+
+ else {
+ if ($power_output ne "") {$power_output.=", ";}
+ $power_output.= "(" .$$result_t{$netscreen_power_operating_descr.".".$index} ."): ";
+ $power_output.= "status " . $netscreen_power_operating_status_text[$$resultat_p{$key}];
+ }
+ }
+ }
+ }
+ if ($power_output ne "") {$power_output.=", ";}
+ }
+
+ # Check fans
+ if (defined($resultat_f)) {
+ foreach my $key ( keys %$resultat_f) {
+ if ($key =~ /$netscreen_fan_operating_state/) {
+ $num_fan++;
+ $tmp_status = $netscreen_fan_operating_status[$$resultat_f{$key}];
+ $final_status = &set_status($tmp_status,$final_status);
+ if ($tmp_status == 0) {
+ $num_fan_ok++;
+ } else {
+ if($tmp_status == 4) {
+ $num_fan--;
+ } else {
+ $index = $key;
+ $index =~ s/^$netscreen_fan_operating_state.//;
+ @temp_oid=($netscreen_fan_operating_descr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+
+ if (!defined($result_t)) {$fan_output.="Invalid fan(UNKNOWN)";}
+
+ else {
+ if ($fan_output ne "") {$fan_output.=", ";}
+ $fan_output.= "(" .$$result_t{$netscreen_fan_operating_descr.".".$index} ."): ";
+ $fan_output.= "status " . $netscreen_fan_operating_status_text[$$resultat_f{$key}];
+ }
+ }
+ }
+ }
+ }
+ if ($fan_output ne "") {$fan_output.=", ";}
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_slot==0 && $num_power==0 && $num_fan==0) {
+ print "No slot/power/fan found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ $output=$slot_output . $power_output . $fan_output;
+ if ($output ne "") {$output.=" : ";}
+
+ if ($num_slot!=0) {
+ if ($num_slot == $num_slot_ok) {
+ $output.= $num_slot . " slots OK, ";
+ } else {
+ $output.= $num_slot_ok . "/" . $num_slot ." slots OK, ";
+ }
+ }
+
+ if ($num_power!=0) {
+ if ($num_power == $num_power_ok) {
+ $output.= $num_power . " power OK, ";
+ } else {
+ $output.= $num_power_ok . "/" . $num_power ." power OK ";
+ }
+ }
+
+ if ($num_fan!=0) {
+ if ($num_fan == $num_fan_ok) {
+ $output.= $num_fan . " fans OK";
+ } else {
+ $output.= $num_fan_ok . "/" . $num_fan ." fans OK";
+ }
+ }
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== CISCO (CISCO-ENTITY-SENSOR-MIB) =============
+# ============================================================================
+
+if ($o_check_type eq "ciscoNEW") {
+
+ verb("Checking Cisco CISCO-ENTITY-SENSOR-MIB env");
+
+ # Define variables
+ my $output = "";
+ my $final_status = 0;
+ my $sensor_output = "";
+ my $tmp_status;
+ my $result_t;
+ my $index;
+ my @temp_oid;
+ my ($num_sensors,$num_sensors_ok,$num_thresholds,$num_thresholds_ok) = (0,0,0,0);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_status = $session->get_table(Baseoid => $cisco_ios_xe_status);
+ &check_snmp_result($resultat_status,$session->error);
+ my $resultat_type = $session->get_table(Baseoid => $cisco_ios_xe_type);
+ &check_snmp_result($resultat_type,$session->error);
+ my $resultat_precision = $session->get_table(Baseoid => $cisco_ios_xe_precision);
+ &check_snmp_result($resultat_precision,$session->error);
+ my $resultat_value = $session->get_table(Baseoid => $cisco_ios_xe_value);
+ &check_snmp_result($resultat_value,$session->error);
+ my $resultat_threshold_value = $session->get_table(Baseoid => $cisco_ios_xe_threshold_value);
+ &check_snmp_result($resultat_threshold_value,$session->error);
+ my $resultat_threshold_severity = $session->get_table(Baseoid => $cisco_ios_xe_threshold_severity);
+ &check_snmp_result($resultat_threshold_severity,$session->error);
+
+ if (defined($resultat_status)) {
+ foreach my $key ( keys %$resultat_status) {
+ if ($key =~ /$cisco_ios_xe_status/) {
+ $num_sensors++;
+
+ $tmp_status=$cisco_ios_xe_operating_status[$$resultat_status{$key}];
+
+ $index = $key;
+ $index =~ s/^$cisco_ios_xe_status.//;
+
+ if ($tmp_status == 1) {
+ $num_sensors_ok++;
+
+ # Get sensor TYPE
+ my $CiscoType = $$resultat_type{$cisco_ios_xe_type.".".$index};
+
+ if ($CiscoType == 8) {
+
+ # Get sensor PRECISION
+ my $CiscoPrecision = $$resultat_precision{$cisco_ios_xe_precision.".".$index};
+
+ if ($CiscoPrecision == 0){
+
+ # Get sensor THRESHOLD VALUE 1
+ my $CiscoThreshold_value1 = $$resultat_threshold_value{$cisco_ios_xe_threshold_value.".".$index.".1"};
+
+ if (defined($CiscoThreshold_value1)){
+
+ # Get sensor VALUE
+ my $CiscoValue = $$resultat_value{$cisco_ios_xe_value.".".$index};
+
+ # Get sensor THRESHOLD SEVERITY 2
+ my $CiscoThreshold_severity2 = $$resultat_threshold_severity{$cisco_ios_xe_threshold_severity.".".$index.".2"};
+
+ if ($CiscoThreshold_severity2 ne "noSuchInstance") {
+ $num_thresholds++;
+
+ if (($CiscoValue < $CiscoThreshold_value1) || ($CiscoThreshold_severity2 == 10)){
+ $num_thresholds_ok++;
+ } else {
+ $final_status=2;
+
+ # Get sensor DESCRIPTION
+ @temp_oid=($cisco_ios_xe_physicaldescr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+
+ if ($output ne "") {$output.=", ";}
+ $output.= "(" .$$result_t{$cisco_ios_xe_physicaldescr.".".$index}.": ".$CiscoValue." Celsius)";
+ }
+ }
+ }
+ }
+ }
+
+ } else {
+ $final_status=2;
+
+ # Get sensor DESCRIPTION
+ @temp_oid=($cisco_ios_xe_physicaldescr.".".$index);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+
+ if ($tmp_status == 2){
+ if ($output ne "") {$output.=", ";}
+ $output.= "(" .$$result_t{$cisco_ios_xe_physicaldescr.".".$index}.": sensor unavailable)";
+ }
+ if ($tmp_status == 3){
+ if ($output ne "") {$output.=", ";}
+ $output.= "(" .$$result_t{$cisco_ios_xe_physicaldescr.".".$index}.": sensor nonoperational)";
+ }
+ }
+ }
+ }
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_sensors==0) {
+ print "No components found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($output ne "") {$output.=" : ";}
+ if ($num_sensors!=0) {
+ if (($num_sensors == $num_sensors_ok) && ($num_thresholds == $num_thresholds_ok)){
+ $output.= $num_sensors . " sensors reported OK (".$num_thresholds." thresholds reported OK)";
+ } else {
+ $output.= $num_sensors_ok . "/" . $num_sensors ." sensors reported OK (".$num_thresholds." sensors using thresholds)";
+ }
+ }
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== CITRIX NETSCALER ============================
+# ============================================================================
+
+if ($o_check_type eq "citrix") {
+
+ verb("Checking citrix");
+
+ # Define variables
+ my $output = "";
+ my $final_status = 0;
+ my $voltage_output = "";
+ my $powersupply_output = "";
+ my $fan_output = "";
+ my $temp_output = "";
+ my $ha_state_output = "";
+ my $ssl_engine_output = "";
+ my $ha_state_and_ssl_engine = "";
+ my $result_t;
+ my $index;
+ my @temp_oid;
+ my $using_voltage_threshold;
+ my ($num_voltage,$num_voltage_ok,$num_powersupply,$num_powersupply_ok,$num_fan,$num_fan_ok,$num_temp,$num_temp_ok)=(0,0,0,0,0,0);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_status = $session->get_table(Baseoid => $citrix_desc);
+ &check_snmp_result($resultat_status,$session->error);
+ my $resultat_value = $session->get_table(Baseoid => $citrix_value);
+ &check_snmp_result($resultat_value,$session->error);
+
+ if (defined($resultat_status)) {
+ foreach my $key ( keys %$resultat_status) {
+ if ($key =~ /$citrix_desc/) {
+ my $reported_counter_name = $$resultat_status{$key};
+ $using_voltage_threshold = 0;
+
+ $index = $key;
+ $index =~ s/^$citrix_desc.//;
+
+ my $reported_counter_value = $$resultat_value{$citrix_value.".".$index};
+
+ # Thresholds are hardcoded and are based on the "Citrix NetScaler SNMP OID Reference - Release 9.2" document.
+ # If a threshold for a specific component is not available in this document then a logical threshold has been picked.
+
+ if ($reported_counter_name =~ /Voltage/ ) {
+ $num_voltage++; my $ha_state_and_ssl_engine ="";
+
+ # Measures the +5V power supply in millivolt
+ if ($reported_counter_name =~ /\+5.0VSupplyVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > 4500 ) && ($reported_counter_value < 5500)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+
+ # Measures the +12V power supply in millivolt
+ if ($reported_counter_name =~ /\+12.0VSupplyVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > 10800 ) && ($reported_counter_value < 13200)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+
+ # Measures the -5V power supply in millivolt
+ if ($reported_counter_name =~ /\-5.0VSupplyVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > -5500 ) && ($reported_counter_value < -4500)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+
+ # Measures the -12V power supply in millivolt
+ if ($reported_counter_name =~ /\-12.0VSupplyVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > -13200 ) && ($reported_counter_value < -10800)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+
+ # Measures the +3.3V main and standby power supply in millivolt
+ if ($reported_counter_name =~ /3.3VSupplyVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > 2970 ) && ($reported_counter_value < 3630)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+
+
+ }
+
+ # Measures the +5V standby power supply in millivolt
+ if ($reported_counter_name =~ /PowerSupply5vStandbyVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > 4500 ) && ($reported_counter_value < 5500)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+
+ # Measures the processor core voltage in millivolt
+ if ($reported_counter_name =~ /CPU0CoreVoltage|CPU1CoreVoltage/ ){
+ $using_voltage_threshold = 1;
+ if (($reported_counter_value > 1080 ) && ($reported_counter_value < 1650)) {
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+
+ # If no defined voltage description is found, uses the following thresholds
+ if ($using_voltage_threshold == 0){
+ if (($reported_counter_value > 1000 ) && ($reported_counter_value < 6000)){
+ $num_voltage_ok++;
+ } else {
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ $voltage_output.= "(" .$reported_counter_name.": ";
+ $voltage_output.= $reported_counter_value." mV)";
+ $final_status = 2;
+ }
+ }
+ }
+
+ # Power Supply check. No documentation available about possible values. "3" appears to be "OK", so anything other then that will be reported
+ if ($reported_counter_name =~ /PowerSupply1FailureStatus|PowerSupply2FailureStatus/ ) {
+ $num_powersupply++;
+ if ($reported_counter_value == 3 ){
+ $num_powersupply_ok++;
+ } else {
+ if ($powersupply_output ne "") {$powersupply_output.=", ";}
+ $powersupply_output.= "(" .$reported_counter_name.": ";
+ $powersupply_output.= $reported_counter_value." Failure)";
+ $final_status = 2;
+ }
+ }
+
+ # Fan speed threshold in RPM. Documentation is not clear about the thresholds
+ if ($reported_counter_name =~ /Fan/ ) {
+ $num_fan++;
+ if (($reported_counter_value > 5000 ) && ($reported_counter_value < 15000)){
+ $num_fan_ok++;
+ } else {
+ if ($fan_output ne "") {$fan_output.=", ";}
+ $fan_output.= "(" .$reported_counter_name.": ";
+ $fan_output.= $reported_counter_value." RPM)";
+ $final_status = 2;
+ }
+ }
+
+ # It looks like Citrix NetScaler devices are based on Intel XEON processors. Most of them appear to have a maximum operation temperature of 75 degrees Celsius.
+ if ($reported_counter_name =~ /CPU0Temperature|CPU1Temperature/ ) {
+ $num_temp++;
+ if (($reported_counter_value > 50 ) && ($reported_counter_value < 72)){
+ $num_temp_ok++;
+ } else {
+ if ($temp_output ne "") {$temp_output.=", ";}
+ $temp_output.= "(" .$reported_counter_name.": ";
+ $temp_output.= $reported_counter_value." Celsius)";
+ $final_status = 2;
+ }
+ }
+
+ # Internal temperature in degrees Celsius. No defined threshold in documentation.
+ if ($reported_counter_name =~ /InternalTemperature/ ) {
+ $num_temp++;
+ if (($reported_counter_value > 20 ) && ($reported_counter_value < 40)){
+ $num_temp_ok++;
+ } else {
+ if ($temp_output ne "") {$temp_output.=", ";}
+ $temp_output.= "(" .$reported_counter_name.": ";
+ $temp_output.= $reported_counter_value." Celsius)";
+ $final_status = 2;
+ }
+ }
+ }
+ }
+
+ # Get High Availability State
+ @temp_oid=($citrix_high_availability_state);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+ my $ha_cur_state = $$result_t{$citrix_high_availability_state};
+ if (defined($ha_cur_state)){
+ $ha_state_output.= "HA State " . $citrix_high_availability_state_text[$ha_cur_state];
+ if ($ha_cur_state != 3){
+ $final_status = 2;
+ }
+ }
+
+ # Get High Availability State
+ @temp_oid=($citrix_ssl_engine_state);
+ $result_t = $session->get_request( Varbindlist => \@temp_oid);
+ my $ssl_engine_state = $$result_t{$citrix_ssl_engine_state};
+ if (defined($ssl_engine_state)){
+ $ssl_engine_output.= "SSL Engine " . $citrix_ssl_engine_state_text[$ssl_engine_state];
+ if ($ssl_engine_state != 1){
+ $final_status = 2;
+ }
+ }
+
+ if ((defined($ha_cur_state)) && (defined($ssl_engine_state))){$ha_state_and_ssl_engine = " (".$ha_state_output.", ".$ssl_engine_output.")"};
+ if ((defined($ha_cur_state)) && (!defined($ssl_engine_state))){$ha_state_and_ssl_engine = " - (".$ha_state_output.")"};
+ if ((!defined($ha_cur_state)) && (defined($ssl_engine_state))){$ha_state_and_ssl_engine = " - (".$ssl_engine_output.")"};
+
+ if ($voltage_output ne "") {$voltage_output.=", ";}
+ if ($powersupply_output ne "") {$powersupply_output.=", ";}
+ if ($fan_output ne "") {$fan_output.=", ";}
+ if ($temp_output ne "") {$temp_output.=", ";}
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_voltage==0 && $num_fan==0 && $num_temp==0) {
+ print "No power/fan/temp found : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ $output=$voltage_output . $fan_output . $temp_output ;
+
+ if ($output ne "") {$output.=" : ";}
+
+ if ($num_powersupply!=0) {
+ if ($num_powersupply == $num_powersupply_ok) {
+ $output.= $num_powersupply . " powersupply OK, ";
+ } else {
+ $output.= $num_powersupply_ok . "/" . $num_powersupply ." powersupply OK, ";
+ }
+ }
+
+ if ($num_voltage!=0) {
+ if ($num_voltage == $num_voltage_ok) {
+ $output.= $num_voltage . " voltage OK, ";
+ } else {
+ $output.= $num_voltage_ok . "/" . $num_voltage ." voltage OK, ";
+ }
+ }
+
+ if ($num_fan!=0) {
+ if ($num_fan == $num_fan_ok) {
+ $output.= $num_fan . " fan OK, ";
+ } else {
+ $output.= $num_fan_ok . "/" . $num_fan ." fan OK, ";
+ }
+ }
+
+ if ($num_temp!=0) {
+ if ($num_temp == $num_temp_ok) {
+ $output.= $num_temp . " temp OK";
+ } else {
+ $output.= $num_temp_ok . "/" . $num_temp ." temp OK";
+ }
+ }
+
+
+ $output.= $ha_state_and_ssl_engine;
+
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+
+}
+
+
+# ============================================================================
+# ============================== TRANSMODE ===================================
+# ============================================================================
+
+if ($o_check_type eq "transmode") {
+
+ verb("Checking transmode env");
+
+ # Define variables
+ my $final_status = 0;
+ my $tmp_status = undef;
+ my $num_alarms = 0;
+ my $num_ignored = 0;
+ my $alarm_output = "";
+ my $output = "";
+ my ($alarm_serv,$alarm_serv_txt,$alarm_descr,$alarm_time_start,$alarm_time_end,$alarm_rack,$alarm_slot,$alarm_unit)=(undef,undef,undef,undef,undef,undef,undef,undef);
+
+ # Get SNMP table(s) and check the result
+ my $resultat_c = $session->get_table(Baseoid => $transmode_table);
+ &check_snmp_result($resultat_c,$session->error);
+
+ if (defined($resultat_c)) {
+ foreach my $key ( keys %$resultat_c) {
+ if ($key =~ /$transmode_alarm_sev/) {
+ $alarm_serv = $$resultat_c{$key};
+ $key =~ s/$transmode_alarm_sev//;
+
+ # Set the alarm variables
+ $alarm_descr = $$resultat_c{$transmode_alarm_descr.$key};
+ $alarm_time_start = $$resultat_c{$transmode_alarm_time_start.$key};
+ $alarm_time_end = $$resultat_c{$transmode_alarm_time_end.$key};
+ $alarm_rack = $$resultat_c{$transmode_alarm_rack.$key};
+ $alarm_slot = $$resultat_c{$transmode_alarm_slot.$key};
+ $alarm_unit = $$resultat_c{$transmode_alarm_unit.$key};
+ $alarm_serv_txt = $transmode_alarm_status_text[$alarm_serv];
+ $tmp_status = $transmode_alarm_status[$alarm_serv];
+
+ # Ignore client related alarms or alarms that are deactivated
+ if (($alarm_descr =~ /client|Client/ ) || ($alarm_time_end =~ /[0-9]{4}[-][0-9]{2}[-][0-9]{2}/)) {
+ $num_ignored++;
+ }
+
+ # Print reported alarms that are not ignored
+ else {
+ $final_status = &set_status($tmp_status,$final_status);
+ $num_alarms++;
+ $alarm_output .= "Rack:" . $alarm_rack;
+ $alarm_output .= " Slot:" . $alarm_slot;
+ $alarm_output .= " Unit:" . $alarm_unit;
+ $alarm_output .= " Desc:" . $alarm_descr;
+ $alarm_output .= " Time:" . $alarm_time_start;
+ $alarm_output .= " Sev:" . $alarm_serv_txt .",";
+ }
+ }
+ }
+ }
+
+ # Clear the SNMP Transport Domain and any errors associated with the object.
+ $session->close;
+
+ if ($num_alarms == 0) {
+ print "No alarms found : OK\n";
+ exit $ERRORS{"OK"};
+ }
+
+ $output=$alarm_output;
+
+ if ($output ne "") {$output.=" : ";}
+
+ if ($num_alarms != 0) {
+ $output .= $num_alarms . " Active alarm(s) found, ".$num_ignored." ignored";
+ }
+
+ if ($final_status == 3) {
+ print $output," : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ if ($final_status == 2) {
+ print $output," : CRITICAL\n";
+ exit $ERRORS{"CRITICAL"};
+ }
+
+ if ($final_status == 1) {
+ print $output," : WARNING\n";
+ exit $ERRORS{"WARNING"};
+ }
+
+ print $output," : OK\n";
+ exit $ERRORS{"OK"};
+}
+
+
+# ============================================================================
+# ============================== NO CHECK DEFINED ============================
+# ============================================================================
+
+print "Unknown check type : UNKNOWN\n";
+exit $ERRORS{"UNKNOWN"};
+