Update check_nwc_health to 3.4.2.2
This commit is contained in:
		
							parent
							
								
									17038528de
								
							
						
					
					
						commit
						b964123fd1
					
				
					 194 changed files with 2149 additions and 266 deletions
				
			
		| 
						 | 
				
			
			@ -1,63 +0,0 @@
 | 
			
		|||
package Classes::Cisco::NXOS;
 | 
			
		||||
our @ISA = qw(Classes::Cisco);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  if ($self->mode =~ /device::hardware::health/) {
 | 
			
		||||
    $self->analyze_and_check_environmental_subsystem("Classes::Cisco::NXOS::Component::EnvironmentalSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::cisco::fex::watch/) {
 | 
			
		||||
    $self->analyze_fex_subsystem();
 | 
			
		||||
    $self->check_fex_subsystem();
 | 
			
		||||
  } elsif ($self->mode =~ /device::hardware::load/) {
 | 
			
		||||
    $self->analyze_and_check_cpu_subsystem("Classes::Cisco::NXOS::Component::CpuSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::hardware::memory/) {
 | 
			
		||||
    $self->analyze_and_check_mem_subsystem("Classes::Cisco::NXOS::Component::MemSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::hsrp/) {
 | 
			
		||||
    $self->analyze_and_check_hsrp_subsystem("Classes::HSRP::Component::HSRPSubsystem");
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->no_such_mode();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub analyze_fex_subsystem {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->{components}->{fex_subsystem} = Classes::Cisco::CISCOENTITYSENSORMIB::Component::SensorSubsystem->new();
 | 
			
		||||
  @{$self->{fexes}} = grep {
 | 
			
		||||
      $_->{entPhysicalName} =~ /^fex.*chassis$/i;
 | 
			
		||||
  } map {
 | 
			
		||||
      $_->{entPhysicalName} ||= $_->{entPhysicalDescr}; $_;
 | 
			
		||||
  } grep { 
 | 
			
		||||
      $_->{entPhysicalClass} eq "chassis"
 | 
			
		||||
  } @{$self->{components}->{fex_subsystem}->{entities}};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check_fex_subsystem {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->add_info('counting fexes');
 | 
			
		||||
  $self->{numOfFexes} = scalar (@{$self->{fexes}});
 | 
			
		||||
  $self->{fexNameList} = [map { $_->{entPhysicalName} } @{$self->{fexes}}];
 | 
			
		||||
  if (scalar (@{$self->{fexes}}) == 0) {
 | 
			
		||||
    $self->add_unknown('no FEXes found');
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->opts->override_opt('lookback', 1800) if ! $self->opts->lookback;
 | 
			
		||||
    $self->valdiff({name => $self->{name}, lastarray => 1},
 | 
			
		||||
        qw(fexNameList numOfFexes));
 | 
			
		||||
    if (scalar(@{$self->{delta_found_fexNameList}}) > 0) {
 | 
			
		||||
      $self->add_warning(sprintf '%d new FEX(es) (%s)',
 | 
			
		||||
          scalar(@{$self->{delta_found_fexNameList}}),
 | 
			
		||||
          join(", ", @{$self->{delta_found_fexNameList}}));
 | 
			
		||||
    }
 | 
			
		||||
    if (scalar(@{$self->{delta_lost_fexNameList}}) > 0) {
 | 
			
		||||
      $self->add_critical(sprintf '%d FEXes missing (%s)',
 | 
			
		||||
          scalar(@{$self->{delta_lost_fexNameList}}),
 | 
			
		||||
          join(", ", @{$self->{delta_lost_fexNameList}}));
 | 
			
		||||
    }
 | 
			
		||||
    $self->add_ok(sprintf 'found %d FEXes', scalar (@{$self->{fexes}}));
 | 
			
		||||
    $self->add_perfdata(
 | 
			
		||||
        label => 'num_fexes',
 | 
			
		||||
        value => $self->{numOfFexes},
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,79 +0,0 @@
 | 
			
		|||
package Classes::Cisco::NXOS::Component::CpuSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  my $type = 0;
 | 
			
		||||
  foreach ($self->get_snmp_table_objects(
 | 
			
		||||
      'CISCO-PROCESS-MIB', 'cpmCPUTotalTable')) {
 | 
			
		||||
    $_->{cpmCPUTotalIndex} ||= $type++;
 | 
			
		||||
    push(@{$self->{cpus}},
 | 
			
		||||
        Classes::Cisco::NXOS::Component::CpuSubsystem::Cpu->new(%{$_}));
 | 
			
		||||
  }
 | 
			
		||||
  if (scalar(@{$self->{cpus}}) == 0) {
 | 
			
		||||
    # maybe too old. i fake a cpu. be careful. this is a really bad hack
 | 
			
		||||
    my $response = $self->get_request(
 | 
			
		||||
        -varbindlist => [
 | 
			
		||||
            $Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1},
 | 
			
		||||
            $Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy5},
 | 
			
		||||
            $Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{busyPer},
 | 
			
		||||
        ]
 | 
			
		||||
    );
 | 
			
		||||
    if (exists $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}}) {
 | 
			
		||||
      push(@{$self->{cpus}},
 | 
			
		||||
          Classes::Cisco::NXOS::Component::CpuSubsystem::Cpu->new(
 | 
			
		||||
              cpmCPUTotalPhysicalIndex => 0, #fake
 | 
			
		||||
              cpmCPUTotalIndex => 0, #fake
 | 
			
		||||
              cpmCPUTotal5sec => 0, #fake
 | 
			
		||||
              cpmCPUTotal5secRev => 0, #fake
 | 
			
		||||
              cpmCPUTotal1min => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}},
 | 
			
		||||
              cpmCPUTotal1minRev => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}},
 | 
			
		||||
              cpmCPUTotal5min => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy5}},
 | 
			
		||||
              cpmCPUTotal5minRev => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy5}},
 | 
			
		||||
              cpmCPUMonInterval => 0, #fake
 | 
			
		||||
              cpmCPUTotalMonIntervalValue => 0, #fake
 | 
			
		||||
              cpmCPUInterruptMonIntervalValue => 0, #fake
 | 
			
		||||
      ));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
package Classes::Cisco::NXOS::Component::CpuSubsystem::Cpu;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub new {
 | 
			
		||||
  my $class = shift;
 | 
			
		||||
  my %params = @_;
 | 
			
		||||
  my $self = {};
 | 
			
		||||
  foreach (keys %params) {
 | 
			
		||||
    $self->{$_} = $params{$_};
 | 
			
		||||
  }
 | 
			
		||||
  bless $self, $class;
 | 
			
		||||
  $self->{usage} = $params{cpmCPUTotal5minRev};
 | 
			
		||||
  if ($self->{cpmCPUTotalPhysicalIndex}) {
 | 
			
		||||
    my $entPhysicalName = '1.3.6.1.2.1.47.1.1.1.1.7';
 | 
			
		||||
    $self->{entPhysicalName} = $self->get_request(
 | 
			
		||||
        -varbindlist => [$entPhysicalName.'.'.$self->{cpmCPUTotalPhysicalIndex}]
 | 
			
		||||
    );
 | 
			
		||||
    $self->{entPhysicalName} = $self->{entPhysicalName}->{$entPhysicalName.'.'.$self->{cpmCPUTotalPhysicalIndex}};
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->{entPhysicalName} = $self->{cpmCPUTotalIndex};
 | 
			
		||||
  }
 | 
			
		||||
  return $self;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->add_info(sprintf 'cpu %s usage (5 min avg.) is %.2f%%',
 | 
			
		||||
      $self->{entPhysicalName}, $self->{usage});
 | 
			
		||||
  $self->set_thresholds(warning => 80, critical => 90);
 | 
			
		||||
  $self->add_message($self->check_thresholds($self->{usage}));
 | 
			
		||||
  $self->add_perfdata(
 | 
			
		||||
      label => 'cpu_'.$self->{entPhysicalName}.'_usage',
 | 
			
		||||
      value => $self->{usage},
 | 
			
		||||
      uom => '%',
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,42 +0,0 @@
 | 
			
		|||
package Classes::SGOS::Component::SensorSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->get_snmp_tables('SENSOR-MIB', [
 | 
			
		||||
      ['sensors', 'deviceSensorValueTable', 'Classes::SGOS::Component::SensorSubsystem::Sensor'],
 | 
			
		||||
  ]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
package Classes::SGOS::Component::SensorSubsystem::Sensor;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  if ($self->{deviceSensorScale}) {
 | 
			
		||||
    $self->{deviceSensorValue} *= 10 ** $self->{deviceSensorScale};
 | 
			
		||||
  }
 | 
			
		||||
  $self->add_info(sprintf 'sensor %s (%s %s) is %s',
 | 
			
		||||
      $self->{deviceSensorName},
 | 
			
		||||
      $self->{deviceSensorValue},
 | 
			
		||||
      $self->{deviceSensorUnits},
 | 
			
		||||
      $self->{deviceSensorCode});
 | 
			
		||||
  if ($self->{deviceSensorCode} eq "not-installed") {
 | 
			
		||||
  } elsif ($self->{deviceSensorCode} eq "unknown") {
 | 
			
		||||
  } else {
 | 
			
		||||
    if ($self->{deviceSensorCode} ne "ok") {
 | 
			
		||||
      if ($self->{deviceSensorCode} =~ /warning/) {
 | 
			
		||||
        $self->add_warning();
 | 
			
		||||
      } else {
 | 
			
		||||
        $self->add_critical();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    $self->add_perfdata(
 | 
			
		||||
        label => sprintf('sensor_%s', $self->{deviceSensorName}),
 | 
			
		||||
        value => $self->{deviceSensorValue},
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,45 @@
 | 
			
		|||
# Changelog of the check_nwc_health plugin #
 | 
			
		||||
############################################
 | 
			
		||||
 | 
			
		||||
2014-01-02 3.4.2.2
 | 
			
		||||
- fix lsmpi_io for cisco asr1000 (Thanks Andreas Schulz)
 | 
			
		||||
- fix Fritz!Box upnp control url (Thanks Bernd)
 | 
			
		||||
 | 
			
		||||
2014-12-23 3.4.2.1
 | 
			
		||||
- use fallbacks to find fexes (cefexConfigTable may not be populated)
 | 
			
		||||
 | 
			
		||||
2014-12-16 3.4.2
 | 
			
		||||
- use cefexConfigTable for mode watch-fexes
 | 
			
		||||
- bugfix in cisco nexus sensors (had undef perl warnings)
 | 
			
		||||
 | 
			
		||||
2014-12-12 3.4.1
 | 
			
		||||
- bugfix in bluecoat hardware (skip perfdata of missing psus)
 | 
			
		||||
 | 
			
		||||
2014-12-11 3.4
 | 
			
		||||
- add vpn-status for cisco asa
 | 
			
		||||
 | 
			
		||||
2014-12-08 3.3
 | 
			
		||||
- add windowslocal
 | 
			
		||||
 | 
			
		||||
2014-12-06 3.2.2
 | 
			
		||||
- unique names for cisco cpus pointing to the same physical entity
 | 
			
		||||
 | 
			
		||||
2014-11-29 3.2.1
 | 
			
		||||
- remove unnecessary use statement
 | 
			
		||||
- finalize paloalto ha
 | 
			
		||||
- make list-interfaces and update-cache faster
 | 
			
		||||
 | 
			
		||||
2014-11-18 3.2.0.1
 | 
			
		||||
- hide some debug printfs
 | 
			
		||||
 | 
			
		||||
2014-11-10 3.2
 | 
			
		||||
- add palo alto hardware, sensors, ha
 | 
			
		||||
- make nexus cpu names unique
 | 
			
		||||
 | 
			
		||||
2014-11-02 3.1.1
 | 
			
		||||
- bugfix my-modes
 | 
			
		||||
- add paloaltomib
 | 
			
		||||
 | 
			
		||||
2014-09-26 3.1
 | 
			
		||||
- add Clavister Firewall (Thanks Dirk Goetz)
 | 
			
		||||
- fix GLPluginSNMP, all timeout-like errors are UNKNOWN
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
#! /bin/sh
 | 
			
		||||
# From configure.ac .
 | 
			
		||||
# Guess values for system-dependent variables and create Makefiles.
 | 
			
		||||
# Generated by GNU Autoconf 2.69 for check_nwc_health 3.1.
 | 
			
		||||
# Generated by GNU Autoconf 2.69 for check_nwc_health 3.4.2.2.
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 | 
			
		||||
| 
						 | 
				
			
			@ -577,8 +577,8 @@ MAKEFLAGS=
 | 
			
		|||
# Identity of this package.
 | 
			
		||||
PACKAGE_NAME='check_nwc_health'
 | 
			
		||||
PACKAGE_TARNAME='check_nwc_health'
 | 
			
		||||
PACKAGE_VERSION='3.1'
 | 
			
		||||
PACKAGE_STRING='check_nwc_health 3.1'
 | 
			
		||||
PACKAGE_VERSION='3.4.2.2'
 | 
			
		||||
PACKAGE_STRING='check_nwc_health 3.4.2.2'
 | 
			
		||||
PACKAGE_BUGREPORT=''
 | 
			
		||||
PACKAGE_URL=''
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,7 +1228,7 @@ if test "$ac_init_help" = "long"; then
 | 
			
		|||
  # Omit some internal or obsolete options to make the list less imposing.
 | 
			
		||||
  # This message is too long to be a string in the A/UX 3.1 sh.
 | 
			
		||||
  cat <<_ACEOF
 | 
			
		||||
\`configure' configures check_nwc_health 3.1 to adapt to many kinds of systems.
 | 
			
		||||
\`configure' configures check_nwc_health 3.4.2.2 to adapt to many kinds of systems.
 | 
			
		||||
 | 
			
		||||
Usage: $0 [OPTION]... [VAR=VALUE]...
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1299,7 +1299,7 @@ fi
 | 
			
		|||
 | 
			
		||||
if test -n "$ac_init_help"; then
 | 
			
		||||
  case $ac_init_help in
 | 
			
		||||
     short | recursive ) echo "Configuration of check_nwc_health 3.1:";;
 | 
			
		||||
     short | recursive ) echo "Configuration of check_nwc_health 3.4.2.2:";;
 | 
			
		||||
   esac
 | 
			
		||||
  cat <<\_ACEOF
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1385,7 +1385,7 @@ fi
 | 
			
		|||
test -n "$ac_init_help" && exit $ac_status
 | 
			
		||||
if $ac_init_version; then
 | 
			
		||||
  cat <<\_ACEOF
 | 
			
		||||
check_nwc_health configure 3.1
 | 
			
		||||
check_nwc_health configure 3.4.2.2
 | 
			
		||||
generated by GNU Autoconf 2.69
 | 
			
		||||
 | 
			
		||||
Copyright (C) 2012 Free Software Foundation, Inc.
 | 
			
		||||
| 
						 | 
				
			
			@ -1402,7 +1402,7 @@ cat >config.log <<_ACEOF
 | 
			
		|||
This file contains any messages produced by compilers while
 | 
			
		||||
running configure, to aid debugging if configure makes a mistake.
 | 
			
		||||
 | 
			
		||||
It was created by check_nwc_health $as_me 3.1, which was
 | 
			
		||||
It was created by check_nwc_health $as_me 3.4.2.2, which was
 | 
			
		||||
generated by GNU Autoconf 2.69.  Invocation command line was
 | 
			
		||||
 | 
			
		||||
  $ $0 $@
 | 
			
		||||
| 
						 | 
				
			
			@ -2265,7 +2265,7 @@ fi
 | 
			
		|||
 | 
			
		||||
# Define the identity of the package.
 | 
			
		||||
 PACKAGE='check_nwc_health'
 | 
			
		||||
 VERSION='3.1'
 | 
			
		||||
 VERSION='3.4.2.2'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cat >>confdefs.h <<_ACEOF
 | 
			
		||||
| 
						 | 
				
			
			@ -3351,7 +3351,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 | 
			
		|||
# report actual input values of CONFIG_FILES etc. instead of their
 | 
			
		||||
# values after options handling.
 | 
			
		||||
ac_log="
 | 
			
		||||
This file was extended by check_nwc_health $as_me 3.1, which was
 | 
			
		||||
This file was extended by check_nwc_health $as_me 3.4.2.2, which was
 | 
			
		||||
generated by GNU Autoconf 2.69.  Invocation command line was
 | 
			
		||||
 | 
			
		||||
  CONFIG_FILES    = $CONFIG_FILES
 | 
			
		||||
| 
						 | 
				
			
			@ -3404,7 +3404,7 @@ _ACEOF
 | 
			
		|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 | 
			
		||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 | 
			
		||||
ac_cs_version="\\
 | 
			
		||||
check_nwc_health config.status 3.1
 | 
			
		||||
check_nwc_health config.status 3.4.2.2
 | 
			
		||||
configured by $0, generated by GNU Autoconf 2.69,
 | 
			
		||||
  with options \\"\$ac_cs_config\\"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
dnl Process this file with autoconf to produce a configure script.
 | 
			
		||||
AC_REVISION ($Revision: 1.150 $)
 | 
			
		||||
AC_PREREQ(2.58)
 | 
			
		||||
AC_INIT(check_nwc_health,3.1)
 | 
			
		||||
AC_INIT(check_nwc_health,3.4.2.2)
 | 
			
		||||
AM_INIT_AUTOMAKE([1.9 tar-pax])
 | 
			
		||||
AC_CANONICAL_HOST
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,6 +20,8 @@ sub init {
 | 
			
		|||
    $self->analyze_and_check_config_subsystem("Classes::Cisco::IOS::Component::NatSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::interfaces::nat::rejects/) {
 | 
			
		||||
    $self->analyze_and_check_config_subsystem("Classes::Cisco::IOS::Component::NatSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::vpn::status/) {
 | 
			
		||||
    $self->analyze_and_check_config_subsystem("Classes::Cisco::CISCOIPSECFLOWMONITOR::Component::VpnSubsystem");
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->no_such_mode();
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ sub check {
 | 
			
		|||
        $self->check_thresholds(metric => $label, value => $self->{entSensorValue}) == CRITICAL) ||
 | 
			
		||||
       (defined($warningx) && 
 | 
			
		||||
        $self->check_thresholds(metric => $label, value => $self->{entSensorValue}) == WARNING) ||
 | 
			
		||||
       $self->{entSensorThresholdEvaluation} eq "true") {
 | 
			
		||||
       ($self->{entSensorThresholdEvaluation} && $self->{entSensorThresholdEvaluation} eq "true")) {
 | 
			
		||||
    }
 | 
			
		||||
    if (defined($criticalx) &&
 | 
			
		||||
        $self->check_thresholds(metric => $label, value => $self->{entSensorValue}) == CRITICAL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -148,7 +148,7 @@ sub check {
 | 
			
		|||
          critical => $criticalx,
 | 
			
		||||
          warning => $warningx,
 | 
			
		||||
      );
 | 
			
		||||
    } elsif ($self->{entSensorThresholdEvaluation} eq "true") {
 | 
			
		||||
    } elsif ($self->{entSensorThresholdEvaluation} && $self->{entSensorThresholdEvaluation} eq "true") {
 | 
			
		||||
      $self->add_warning(sprintf "%s sensor %s threshold evaluation is true (value: %s)",
 | 
			
		||||
          $self->{entSensorType},
 | 
			
		||||
          $self->{entPhysicalIndex},
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
package Classes::Cisco::CISCOIPSECFLOWMONITOR::Component::VpnSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->get_snmp_tables('CISCO-IPSEC-FLOW-MONITOR-MIB', [
 | 
			
		||||
      ['ciketunnels', 'cikeTunnelTable', 'Classes::Cisco::CISCOIPSECFLOWMONITOR::Component::VpnSubsystem::CikeTunnel',  sub { my $o = shift; $o->{parent} = $self; $self->filter_name($o->{cikeTunRemoteValue})}],
 | 
			
		||||
  ]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  if (! @{$self->{ciketunnels}}) {
 | 
			
		||||
    $self->add_critical(sprintf 'tunnel to %s does not exist',
 | 
			
		||||
        $self->opts->name);
 | 
			
		||||
  } else {
 | 
			
		||||
    foreach (@{$self->{ciketunnels}}) {
 | 
			
		||||
      $_->check();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package Classes::Cisco::CISCOIPSECFLOWMONITOR::Component::VpnSubsystem::CikeTunnel;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
# cikeTunRemoteValue per --name angegeben, muss active sein
 | 
			
		||||
# ansonsten watch-vpns, delta tunnels ueberwachen
 | 
			
		||||
  $self->add_info(sprintf 'tunnel to %s is %s',
 | 
			
		||||
      $self->{cikeTunRemoteValue}, $self->{cikeTunStatus});
 | 
			
		||||
  if ($self->{cikeTunStatus} ne 'active') {
 | 
			
		||||
    $self->add_critical();
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->add_ok();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,112 @@
 | 
			
		|||
package Classes::Cisco::IOS::Component::CpuSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
use constant PHYS_NAME => 1;
 | 
			
		||||
use constant PHYS_ASSET => 2;
 | 
			
		||||
use constant PHYS_DESCR => 4;
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  our $cpmCPUTotalIndex = 0;
 | 
			
		||||
  our $uniquify = PHYS_NAME;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->get_snmp_tables('CISCO-PROCESS-MIB', [
 | 
			
		||||
      ['cpus', 'cpmCPUTotalTable', 'Classes::Cisco::IOS::Component::CpuSubsystem::Cpu' ],
 | 
			
		||||
  ]);
 | 
			
		||||
  if (scalar(@{$self->{cpus}}) == 0) {
 | 
			
		||||
    # maybe too old. i fake a cpu. be careful. this is a really bad hack
 | 
			
		||||
    my $response = $self->get_request(
 | 
			
		||||
        -varbindlist => [
 | 
			
		||||
            $Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1},
 | 
			
		||||
            $Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy5},
 | 
			
		||||
            $Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{busyPer},
 | 
			
		||||
        ]
 | 
			
		||||
    );
 | 
			
		||||
    if (exists $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}}) {
 | 
			
		||||
      push(@{$self->{cpus}},
 | 
			
		||||
          Classes::Cisco::IOS::Component::CpuSubsystem::Cpu->new(
 | 
			
		||||
              cpmCPUTotalPhysicalIndex => 0, #fake
 | 
			
		||||
              cpmCPUTotalIndex => 0, #fake
 | 
			
		||||
              cpmCPUTotal5sec => 0, #fake
 | 
			
		||||
              cpmCPUTotal5secRev => 0, #fake
 | 
			
		||||
              cpmCPUTotal1min => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}},
 | 
			
		||||
              cpmCPUTotal1minRev => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}},
 | 
			
		||||
              cpmCPUTotal5min => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy5}},
 | 
			
		||||
              cpmCPUTotal5minRev => $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy5}},
 | 
			
		||||
              cpmCPUMonInterval => 0, #fake
 | 
			
		||||
              cpmCPUTotalMonIntervalValue => 0, #fake
 | 
			
		||||
              cpmCPUInterruptMonIntervalValue => 0, #fake
 | 
			
		||||
      ));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  # same cpmCPUTotalPhysicalIndex found in multiple table rows
 | 
			
		||||
  if (scalar(@{$self->{cpus}}) > 1) {
 | 
			
		||||
    my %names = ();
 | 
			
		||||
    foreach my $cpu (@{$self->{cpus}}) {
 | 
			
		||||
      $names{$cpu->{name}}++;
 | 
			
		||||
    }
 | 
			
		||||
    foreach my $cpu (@{$self->{cpus}}) {
 | 
			
		||||
      if ($names{$cpu->{name}} > 1) {
 | 
			
		||||
        # more than one cpu points to the same physical entity
 | 
			
		||||
        $cpu->{name} .= '.'.$cpu->{flat_indices};
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
package Classes::Cisco::IOS::Component::CpuSubsystem::Cpu;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub finish {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->{cpmCPUTotalIndex} = $self->{flat_indices};
 | 
			
		||||
  $self->{cpmCPUTotalPhysicalIndex} = exists $self->{cpmCPUTotalPhysicalIndex} ?
 | 
			
		||||
      $self->{cpmCPUTotalPhysicalIndex} : 0;
 | 
			
		||||
  if (exists $self->{cpmCPUTotal5minRev}) {
 | 
			
		||||
    $self->{usage} = $self->{cpmCPUTotal5minRev};
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->{usage} = $self->{cpmCPUTotal5min};
 | 
			
		||||
  }
 | 
			
		||||
  $self->protect_value($self->{cpmCPUTotalIndex}.$self->{cpmCPUTotalPhysicalIndex}, 'usage', 'percent');
 | 
			
		||||
  if ($self->{cpmCPUTotalPhysicalIndex}) {
 | 
			
		||||
    $self->{entPhysicalName} = $self->get_snmp_object('ENTITY-MIB', 'entPhysicalName', $self->{cpmCPUTotalPhysicalIndex});
 | 
			
		||||
    # wichtig fuer gestacktes zeugs, bei dem entPhysicalName doppelt und mehr vorkommen kann
 | 
			
		||||
    # This object is a user-assigned asset tracking identifier for the physical entity
 | 
			
		||||
    # as specified by a network manager, and provides non-volatile storage of this
 | 
			
		||||
    # information. On the first instantiation of an physical entity, the value of
 | 
			
		||||
    # entPhysicalAssetID associated with that entity is set to the zero-length string.
 | 
			
		||||
    # ...
 | 
			
		||||
    # If write access is implemented for an instance of entPhysicalAssetID, and a value
 | 
			
		||||
    # is written into the instance, the agent must retain the supplied value in the
 | 
			
		||||
    # entPhysicalAssetID instance associated with the same physical entity for as long
 | 
			
		||||
    # as that entity remains instantiated. This includes instantiations across all
 | 
			
		||||
    # re-initializations/reboots of the network management system, including those
 | 
			
		||||
    # which result in a change of the physical entity's entPhysicalIndex value.
 | 
			
		||||
    $self->{entPhysicalAssetID} = $self->get_snmp_object('ENTITY-MIB', 'entPhysicalAssetID', $self->{cpmCPUTotalPhysicalIndex});
 | 
			
		||||
    $self->{entPhysicalDescr} = $self->get_snmp_object('ENTITY-MIB', 'entPhysicalDescr', $self->{cpmCPUTotalPhysicalIndex});
 | 
			
		||||
    $self->{name} = $self->{entPhysicalName} || $self->{entPhysicalDescr};
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->{name} = $self->{cpmCPUTotalIndex};
 | 
			
		||||
    # waere besser, aber dann zerlegts wohl zu viele rrdfiles
 | 
			
		||||
    #$self->{name} = 'central processor';
 | 
			
		||||
  }
 | 
			
		||||
  return $self;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->{label} = $self->{name};
 | 
			
		||||
  $self->add_info(sprintf 'cpu %s usage (5 min avg.) is %.2f%%',
 | 
			
		||||
      $self->{name}, $self->{usage});
 | 
			
		||||
  $self->set_thresholds(warning => 80, critical => 90);
 | 
			
		||||
  $self->add_message($self->check_thresholds($self->{usage}));
 | 
			
		||||
  $self->add_perfdata(
 | 
			
		||||
      label => 'cpu_'.$self->{label}.'_usage',
 | 
			
		||||
      value => $self->{usage},
 | 
			
		||||
      uom => '%',
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
package Classes::Cisco::NXOS;
 | 
			
		||||
our @ISA = qw(Classes::Cisco);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  if ($self->mode =~ /device::hardware::health/) {
 | 
			
		||||
    $self->mult_snmp_max_msg_size(10);
 | 
			
		||||
    $self->analyze_and_check_environmental_subsystem("Classes::Cisco::NXOS::Component::EnvironmentalSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::cisco::fex::watch/) {
 | 
			
		||||
    $self->analyze_and_check_environmental_subsystem("Classes::Cisco::NXOS::Component::FexSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::hardware::load/) {
 | 
			
		||||
    $self->analyze_and_check_cpu_subsystem("Classes::Cisco::IOS::Component::CpuSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::hardware::memory/) {
 | 
			
		||||
    $self->analyze_and_check_mem_subsystem("Classes::Cisco::NXOS::Component::MemSubsystem");
 | 
			
		||||
  } elsif ($self->mode =~ /device::hsrp/) {
 | 
			
		||||
    $self->analyze_and_check_hsrp_subsystem("Classes::HSRP::Component::HSRPSubsystem");
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->no_such_mode();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
package Classes::Cisco::IOS::Component::CpuSubsystem;
 | 
			
		||||
package Classes::Cisco::NXOS::Component::CpuSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ use strict;
 | 
			
		|||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->get_snmp_tables('CISCO-PROCESS-MIB', [
 | 
			
		||||
      ['cpus', 'cpmCPUTotalTable', 'Classes::Cisco::IOS::Component::CpuSubsystem::Cpu' ],
 | 
			
		||||
      ['cpus', 'cpmCPUTotalTable', 'Classes::Cisco::NXOS::Component::CpuSubsystem::Cpu' ],
 | 
			
		||||
  ]);
 | 
			
		||||
  if (scalar(@{$self->{cpus}}) == 0) {
 | 
			
		||||
    # maybe too old. i fake a cpu. be careful. this is a really bad hack
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ sub init {
 | 
			
		|||
    );
 | 
			
		||||
    if (exists $response->{$Classes::Device::mibs_and_oids->{'OLD-CISCO-CPU-MIB'}->{avgBusy1}}) {
 | 
			
		||||
      push(@{$self->{cpus}},
 | 
			
		||||
          Classes::Cisco::IOS::Component::CpuSubsystem::Cpu->new(
 | 
			
		||||
          Classes::Cisco::NXOS::Component::CpuSubsystem::Cpu->new(
 | 
			
		||||
              cpmCPUTotalPhysicalIndex => 0, #fake
 | 
			
		||||
              cpmCPUTotalIndex => 0, #fake
 | 
			
		||||
              cpmCPUTotal5sec => 0, #fake
 | 
			
		||||
| 
						 | 
				
			
			@ -39,15 +39,15 @@ sub init {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
package Classes::Cisco::IOS::Component::CpuSubsystem::Cpu;
 | 
			
		||||
package Classes::Cisco::NXOS::Component::CpuSubsystem::Cpu;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub finish {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->{cpmCPUTotalIndex} = exists $self->{cpmCPUTotalIndex} ? 
 | 
			
		||||
  $self->{cpmCPUTotalIndex} = exists $self->{cpmCPUTotalIndex} ?
 | 
			
		||||
      $self->{cpmCPUTotalIndex} :
 | 
			
		||||
      $Classes::Cisco::IOS::Component::CpuSubsystem::cpmCPUTotalIndex++;
 | 
			
		||||
      $Classes::Cisco::NXOS::Component::CpuSubsystem::cpmCPUTotalIndex++;
 | 
			
		||||
  $self->{cpmCPUTotalPhysicalIndex} = exists $self->{cpmCPUTotalPhysicalIndex} ? 
 | 
			
		||||
      $self->{cpmCPUTotalPhysicalIndex} : 0;
 | 
			
		||||
  if (exists $self->{cpmCPUTotal5minRev}) {
 | 
			
		||||
| 
						 | 
				
			
			@ -57,27 +57,41 @@ sub finish {
 | 
			
		|||
  }
 | 
			
		||||
  $self->protect_value($self->{cpmCPUTotalIndex}.$self->{cpmCPUTotalPhysicalIndex}, 'usage', 'percent');
 | 
			
		||||
  if ($self->{cpmCPUTotalPhysicalIndex}) {
 | 
			
		||||
    my $entPhysicalName = '1.3.6.1.2.1.47.1.1.1.1.7';
 | 
			
		||||
    $self->{entPhysicalName} = $self->get_request(
 | 
			
		||||
        -varbindlist => [$entPhysicalName.'.'.$self->{cpmCPUTotalPhysicalIndex}]
 | 
			
		||||
    );
 | 
			
		||||
    $self->{entPhysicalName} = $self->get_snmp_object('ENTITY-MIB', 'entPhysicalName', $self->{cpmCPUTotalPhysicalIndex});
 | 
			
		||||
    # This object is a user-assigned asset tracking identifier for the physical entity
 | 
			
		||||
    # as specified by a network manager, and provides non-volatile storage of this 
 | 
			
		||||
    # information. On the first instantiation of an physical entity, the value of
 | 
			
		||||
    # entPhysicalAssetID associated with that entity is set to the zero-length string.
 | 
			
		||||
    # ...
 | 
			
		||||
    # If write access is implemented for an instance of entPhysicalAssetID, and a value
 | 
			
		||||
    # is written into the instance, the agent must retain the supplied value in the
 | 
			
		||||
    # entPhysicalAssetID instance associated with the same physical entity for as long
 | 
			
		||||
    # as that entity remains instantiated. This includes instantiations across all 
 | 
			
		||||
    # re-initializations/reboots of the network management system, including those
 | 
			
		||||
    # which result in a change of the physical entity's entPhysicalIndex value.
 | 
			
		||||
    $self->{entPhysicalAssetID} = $self->get_snmp_object('ENTITY-MIB', 'entPhysicalAssetID', $self->{cpmCPUTotalPhysicalIndex});
 | 
			
		||||
    $self->{name} = $self->{entPhysicalName};
 | 
			
		||||
    $self->{name} .= ' '.$self->{entPhysicalAssetID} if $self->{entPhysicalAssetID};
 | 
			
		||||
    $self->{label} = $self->{entPhysicalName};
 | 
			
		||||
    $self->{label} .= ' '.$self->{entPhysicalAssetID} if $self->{entPhysicalAssetID};
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->{entPhysicalName} = $self->{cpmCPUTotalIndex};
 | 
			
		||||
    $self->{name} = $self->{cpmCPUTotalIndex};
 | 
			
		||||
    $self->{label} = $self->{cpmCPUTotalIndex};
 | 
			
		||||
  }
 | 
			
		||||
  return $self;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->add_info(sprintf 'cpu %s usage (5 min avg.) is %.2f%%',
 | 
			
		||||
      $self->{entPhysicalName}, $self->{usage});
 | 
			
		||||
      $self->{name}, $self->{usage});
 | 
			
		||||
  $self->set_thresholds(warning => 80, critical => 90);
 | 
			
		||||
  $self->add_message($self->check_thresholds(value => $self->{usage},
 | 
			
		||||
      metric => 'cpu_'.$self->{entPhysicalName}.'_usage'));
 | 
			
		||||
  $self->add_message($self->check_thresholds($self->{usage}));
 | 
			
		||||
  $self->add_perfdata(
 | 
			
		||||
      label => 'cpu_'.$self->{entPhysicalName}.'_usage',
 | 
			
		||||
      label => 'cpu_'.$self->{label}.'_usage',
 | 
			
		||||
      value => $self->{usage},
 | 
			
		||||
      uom => '%',
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,115 @@
 | 
			
		|||
package Classes::Cisco::NXOS::Component::FexSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->get_snmp_tables('CISCO-ETHERNET-FABRIC-EXTENDER-MIB', [
 | 
			
		||||
    ['fexes', 'cefexConfigTable', 'Classes::Cisco::NXOS::Component::FexSubsystem::Fex'],
 | 
			
		||||
  ]);
 | 
			
		||||
  if (scalar (@{$self->{fexes}}) == 0) {
 | 
			
		||||
   # fallback
 | 
			
		||||
    $self->get_snmp_tables('ENTITY-MIB', [
 | 
			
		||||
      ['fexes', 'entPhysicalTable', 'Classes::Cisco::NXOS::Component::FexSubsystem::Fex'],
 | 
			
		||||
    ]);
 | 
			
		||||
    @{$self->{fexes}} = grep {
 | 
			
		||||
        $_->{entPhysicalClass} eq 'chassis' && $_->{entPhysicalDescr} =~ /fex/i; 
 | 
			
		||||
    } @{$self->{fexes}};
 | 
			
		||||
    if (scalar (@{$self->{fexes}}) == 0) {
 | 
			
		||||
      $self->get_snmp_tables('ENTITY-MIB', [
 | 
			
		||||
        ['fexes', 'entPhysicalTable', 'Classes::Cisco::NXOS::Component::FexSubsystem::Fex'],
 | 
			
		||||
      ]);
 | 
			
		||||
      # fallback
 | 
			
		||||
      my $known_fexes = {};
 | 
			
		||||
      @{$self->{fexes}} = grep {
 | 
			
		||||
        ! $known_fexes->{$_->{cefexConfigExtenderName}}++;
 | 
			
		||||
      } grep {
 | 
			
		||||
          $_->{entPhysicalClass} eq 'other' && $_->{entPhysicalDescr} =~ /fex.*cable/i; 
 | 
			
		||||
      } @{$self->{fexes}};
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub dump {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  foreach (@{$self->{fexes}}) {
 | 
			
		||||
    $_->dump();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->add_info('counting fexes');
 | 
			
		||||
  $self->{numOfFexes} = scalar (@{$self->{fexes}});
 | 
			
		||||
  $self->{fexNameList} = [map { $_->{cefexConfigExtenderName} } @{$self->{fexes}}];
 | 
			
		||||
  if (scalar (@{$self->{fexes}}) == 0) {
 | 
			
		||||
    $self->add_unknown('no FEXes found');
 | 
			
		||||
  } else {
 | 
			
		||||
    # lookback, denn sonst muesste der check is_volatile sein und koennte bei
 | 
			
		||||
    # einem kurzen netzausfall fehler schmeissen.
 | 
			
		||||
    # empfehlung: check_interval 5 (muss jedesmal die entity-mib durchwalken)
 | 
			
		||||
    #             retry_interval 2
 | 
			
		||||
    #             max_check_attempts 2
 | 
			
		||||
    # --lookback 360
 | 
			
		||||
    $self->opts->override_opt('lookback', 1800) if ! $self->opts->lookback;
 | 
			
		||||
    $self->valdiff({name => $self->{name}, lastarray => 1},
 | 
			
		||||
        qw(fexNameList numOfFexes));
 | 
			
		||||
    if (scalar(@{$self->{delta_found_fexNameList}}) > 0) {
 | 
			
		||||
      $self->add_warning(sprintf '%d new FEX(es) (%s)',
 | 
			
		||||
          scalar(@{$self->{delta_found_fexNameList}}),
 | 
			
		||||
          join(", ", @{$self->{delta_found_fexNameList}}));
 | 
			
		||||
    }
 | 
			
		||||
    if (scalar(@{$self->{delta_lost_fexNameList}}) > 0) {
 | 
			
		||||
      $self->add_critical(sprintf '%d FEXes missing (%s)',
 | 
			
		||||
          scalar(@{$self->{delta_lost_fexNameList}}),
 | 
			
		||||
          join(", ", @{$self->{delta_lost_fexNameList}}));
 | 
			
		||||
    }
 | 
			
		||||
    $self->add_ok(sprintf 'found %d FEXes', scalar (@{$self->{fexes}}));
 | 
			
		||||
    $self->add_perfdata(
 | 
			
		||||
        label => 'num_fexes',
 | 
			
		||||
        value => $self->{numOfFexes},
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package Classes::Cisco::NXOS::Component::FexSubsystem::Fex;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub finish {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->{original_cefexConfigExtenderName} = $self->{cefexConfigExtenderName};
 | 
			
		||||
  if (exists $self->{entPhysicalClass}) {
 | 
			
		||||
    # stammt aus ENTITY-MIB
 | 
			
		||||
    if ($self->{entPhysicalDescr} =~ /^FEX[^\d]*(\d+)/i) {
 | 
			
		||||
      $self->{cefexConfigExtenderName} = "FEX".$1;
 | 
			
		||||
    } else {
 | 
			
		||||
      $self->{cefexConfigExtenderName} = $self->{entPhysicalDescr};
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    # stammt aus CISCO-ETHERNET-FABRIC-EXTENDER-MIB, kann FEX101-J8-VT04.01 heissen
 | 
			
		||||
    if ($self->{cefexConfigExtenderName} =~ /^FEX[^\d]*(\d+)/i) {
 | 
			
		||||
      $self->{cefexConfigExtenderName} = "FEX".$1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
entweder die cefexConfigTable ist bestueckt oder man liest als Fallback die Entities aus
 | 
			
		||||
entPhysicalAlias:
 | 
			
		||||
entPhysicalAssetID:
 | 
			
		||||
entPhysicalClass: chassis
 | 
			
		||||
entPhysicalContainedIn: 10
 | 
			
		||||
entPhysicalDescr: Fex-107 Nexus2248 Chassis
 | 
			
		||||
entPhysicalFirmwareRev:
 | 
			
		||||
entPhysicalHardwareRev: V03
 | 
			
		||||
entPhysicalIsFRU: 2
 | 
			
		||||
entPhysicalMfgName: Cisco Systems, Inc.
 | 
			
		||||
entPhysicalModelName: Fabric Extender Module: 48x1GE, 4x10GE
 | 
			
		||||
entPhysicalName: Fex-107 Nexus2248 Chassis
 | 
			
		||||
entPhysicalParentRelPos: 107
 | 
			
		||||
entPhysicalSerialNum: SSI162802BH
 | 
			
		||||
entPhysicalSoftwareRev:
 | 
			
		||||
entPhysicalVendorType: 1.3.6.1.4.1.9.12.3.1.3.914
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +8,11 @@ sub classify {
 | 
			
		|||
    $self->add_unknown('either specify a hostname or a snmpwalk file');
 | 
			
		||||
  } else {
 | 
			
		||||
    if ($self->opts->servertype && $self->opts->servertype eq 'linuxlocal') {
 | 
			
		||||
    } elsif ($self->opts->servertype && $self->opts->servertype eq 'windowslocal') {
 | 
			
		||||
      eval "use DBD::WMI";
 | 
			
		||||
      if ($@) {
 | 
			
		||||
        $self->add_unknown("module DBD::WMI is not installed");
 | 
			
		||||
      }
 | 
			
		||||
    } elsif ($self->opts->port && $self->opts->port == 49000) {
 | 
			
		||||
      $self->{productname} = 'upnp';
 | 
			
		||||
      $self->check_upnp_and_model();
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +48,9 @@ sub classify {
 | 
			
		|||
      } elsif ($self->{productname} =~ /linuxlocal/i) {
 | 
			
		||||
        bless $self, 'Server::Linux';
 | 
			
		||||
        $self->debug('using Server::Linux');
 | 
			
		||||
      } elsif ($self->{productname} =~ /windowslocal/i) {
 | 
			
		||||
        bless $self, 'Server::Windows';
 | 
			
		||||
        $self->debug('using Server::Windows');
 | 
			
		||||
      } elsif ($self->{productname} =~ /Cisco/i) {
 | 
			
		||||
        bless $self, 'Classes::Cisco';
 | 
			
		||||
        $self->debug('using Classes::Cisco');
 | 
			
		||||
| 
						 | 
				
			
			@ -99,6 +107,9 @@ sub classify {
 | 
			
		|||
      } elsif ($self->implements_mib('NETSCREEN-PRODUCTS-MIB')) {
 | 
			
		||||
        $self->debug('using Classes::Juniper::NetScreen');
 | 
			
		||||
        bless $self, 'Classes::Juniper::NetScreen';
 | 
			
		||||
      } elsif ($self->implements_mib('PAN-PRODUCTS-MIB')) {
 | 
			
		||||
        $self->debug('using Classes::PaloAlto');
 | 
			
		||||
        bless $self, 'Classes::PaloAlto';
 | 
			
		||||
      } elsif ($self->{productname} =~ /SecureOS/i) {
 | 
			
		||||
        bless $self, 'Classes::SecureOS';
 | 
			
		||||
        $self->debug('using Classes::SecureOS');
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
package Classes::ENTITYSENSORMIB;
 | 
			
		||||
our @ISA = qw(Classes::Device);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,107 @@
 | 
			
		|||
package Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::Item);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub init {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->get_snmp_tables('ENTITY-MIB', [
 | 
			
		||||
    ['entities', 'entPhysicalTable', 'GLPlugin::TableItem', sub { my $o = shift; $o->{entPhysicalClass} eq 'sensor';}],
 | 
			
		||||
  ]);
 | 
			
		||||
  $self->get_snmp_tables('ENTITY-SENSOR-MIB', [
 | 
			
		||||
    ['sensors', 'entPhySensorTable', 'Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor' ],
 | 
			
		||||
  ]);
 | 
			
		||||
  foreach (@{$self->{sensors}}) {
 | 
			
		||||
    $_->{entPhySensorEntityName} = shift(@{$self->{entities}})->{entPhysicalName};
 | 
			
		||||
  }
 | 
			
		||||
  delete $self->{entities};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  foreach (@{$self->{sensors}}) {
 | 
			
		||||
    $_->check();
 | 
			
		||||
  }
 | 
			
		||||
  if (! $self->check_messages()) {
 | 
			
		||||
    $self->add_ok("environmental hardware working fine");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub dump {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  foreach (@{$self->{sensors}}) {
 | 
			
		||||
    $_->dump();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor;
 | 
			
		||||
our @ISA = qw(GLPlugin::SNMP::TableItem);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub finish {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  if ($self->{entPhySensorType} eq 'rpm') {
 | 
			
		||||
    bless $self, 'Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor::Fan';
 | 
			
		||||
  } elsif ($self->{entPhySensorType} eq 'celsius') {
 | 
			
		||||
    bless $self, 'Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor::Temperature';
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  if ($self->{entPhySensorOperStatus} ne 'ok') {
 | 
			
		||||
    $self->add_info(sprintf '%s has status %s\n',
 | 
			
		||||
        $self->{entity}->{entPhysicalName},
 | 
			
		||||
        $self->{entPhySensorOperStatus});
 | 
			
		||||
    if ($self->{entPhySensorOperStatus} eq 'nonoperational') {
 | 
			
		||||
      $self->add_critical();
 | 
			
		||||
    } else {
 | 
			
		||||
      $self->add_unknown();
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    $self->add_info(sprintf "%s reports %s%s",
 | 
			
		||||
        $self->{entPhySensorEntityName},
 | 
			
		||||
        $self->{entPhySensorValue},
 | 
			
		||||
        $self->{entPhySensorUnitsDisplay}
 | 
			
		||||
    );
 | 
			
		||||
    #$self->add_ok();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor::Temperature;
 | 
			
		||||
our @ISA = qw(Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub rename {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->SUPER::check();
 | 
			
		||||
  my $label = $self->{entPhySensorEntityName};
 | 
			
		||||
  $label =~ s/[Tt]emperature\s*@\s*(.*)/$1/;
 | 
			
		||||
  $self->add_perfdata(
 | 
			
		||||
    label => 'temp_'.$label,
 | 
			
		||||
    value => $self->{entPhySensorValue},
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
package Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor::Fan;
 | 
			
		||||
our @ISA = qw(Classes::ENTITYSENSORMIB::Component::EnvironmentalSubsystem::Sensor);
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
sub check {
 | 
			
		||||
  my $self = shift;
 | 
			
		||||
  $self->SUPER::check();
 | 
			
		||||
  my $label = $self->{entPhySensorEntityName};
 | 
			
		||||
  $label =~ s/ RPM$//g;
 | 
			
		||||
  $label =~ s/Fan #(\d+)/$1/g;
 | 
			
		||||
  $self->add_perfdata(
 | 
			
		||||
    label => 'fan_'.$label,
 | 
			
		||||
    value => $self->{entPhySensorValue},
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue