diff options
author | mail_redacted_for_web | 2019-04-17 19:07:19 +0200 |
---|---|---|
committer | mail_redacted_for_web | 2019-04-17 19:07:19 +0200 |
commit | 1e2387474a449452b78520b9ad96a8b4b5e99722 (patch) | |
tree | 836889471eec7d2aac177405068e2a8f1e2b1978 /nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP | |
download | nagios-plugins-contrib-1e2387474a449452b78520b9ad96a8b4b5e99722.tar.bz2 |
initial commit of source fetch
Diffstat (limited to 'nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP')
60 files changed, 10450 insertions, 0 deletions
diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem.pm new file mode 100755 index 0000000..64e69e6 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem.pm @@ -0,0 +1,240 @@ +package HP::BladeSystem; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; +use Data::Dumper; + +our @ISA = qw(HP::Server HP::Proliant::Component::SNMP); + +sub init { + my $self = shift; + $self->{components} = { + common_enclosure_subsystem => undef, + power_enclosure_subsystem => undef, + power_supply_subsystem => undef, + net_connector_subsystem => undef, + server_blade_subsystem => undef, + }; + $self->{serial} = 'unknown'; + $self->{product} = 'unknown'; + $self->{romversion} = 'unknown'; + $self->trace(3, 'BladeSystem identified'); + $self->collect(); + if (! $self->{runtime}->{plugin}->check_messages()) { + $self->set_serial(); + $self->analyze_common_enclosures(); + $self->analyze_power_enclosures(); + $self->analyze_power_supplies(); + $self->analyze_net_connectors(); + $self->analyze_server_blades(); + $self->check_common_enclosures(); + $self->check_power_enclosures(); + $self->check_power_supplies(); + $self->check_net_connectors(); + $self->check_server_blades(); + } +} + +sub identify { + my $self = shift; + return sprintf "System: '%s', S/N: '%s'", + $self->{product}, $self->{serial}; +} + +sub dump { + my $self = shift; + printf STDERR "serial %s\n", $self->{serial}; + printf STDERR "product %s\n", $self->{product}; + printf STDERR "romversion %s\n", $self->{romversion}; + printf STDERR "%s\n", Data::Dumper::Dumper($self->{enclosures}); +} + +sub analyze_common_enclosures { + my $self = shift; + $self->{components}->{common_enclosure_subsystem} = + HP::BladeSystem::Component::CommonEnclosureSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_power_enclosures { + my $self = shift; + $self->{components}->{power_enclosure_subsystem} = + HP::BladeSystem::Component::PowerEnclosureSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_power_supplies { + my $self = shift; + $self->{components}->{power_supply_subsystem} = + HP::BladeSystem::Component::PowerSupplySubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_net_connectors { + my $self = shift; + $self->{components}->{net_connector_subsystem} = + HP::BladeSystem::Component::NetConnectorSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_server_blades { + my $self = shift; + $self->{components}->{server_blade_subsystem} = + HP::BladeSystem::Component::ServerBladeSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub check_common_enclosures { + my $self = shift; + $self->{components}->{common_enclosure_subsystem}->check(); + $self->{components}->{common_enclosure_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_power_enclosures { + my $self = shift; + $self->{components}->{power_enclosure_subsystem}->check(); + $self->{components}->{power_enclosure_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_power_supplies { + my $self = shift; + $self->{components}->{power_supply_subsystem}->check(); + $self->{components}->{power_supply_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_net_connectors { + my $self = shift; + $self->{components}->{net_connector_subsystem}->check(); + $self->{components}->{net_connector_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_server_blades { + my $self = shift; + $self->{components}->{server_blade_subsystem}->check(); + $self->{components}->{server_blade_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub collect { + my $self = shift; + if ($self->{runtime}->{plugin}->opts->snmpwalk) { + my $cpqRackMibCondition = '1.3.6.1.4.1.232.22.1.3.0'; + $self->trace(3, 'getting cpqRackMibCondition'); + if (! exists $self->{rawdata}->{$cpqRackMibCondition}) { + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqrack-mib)'); + } + } else { + my $net_snmp_version = Net::SNMP->VERSION(); # 5.002000 or 6.000000 + #$params{'-translate'} = [ + # -all => 0x0 + #]; + my ($session, $error) = + Net::SNMP->session(%{$self->{runtime}->{snmpparams}}); + if (! defined $session) { + $self->{plugin}->add_message(CRITICAL, 'cannot create session object'); + $self->trace(1, Data::Dumper::Dumper($self->{runtime}->{snmpparams})); + } else { + # revMajor is often used for discovery of hp devices + my $cpqSeMibRev = '1.3.6.1.4.1.232.22.1'; + my $cpqSeMibRevMajor = '1.3.6.1.4.1.232.22.1.1.0'; + my $cpqRackMibCondition = '1.3.6.1.4.1.232.22.1.3.0'; + $self->trace(3, 'getting cpqRackMibCondition'); + my $result = $session->get_request( + -varbindlist => [$cpqRackMibCondition] + ); + if (!defined($result) || + $result->{$cpqRackMibCondition} eq 'noSuchInstance' || + $result->{$cpqRackMibCondition} eq 'noSuchObject' || + $result->{$cpqRackMibCondition} eq 'endOfMibView') { + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqrack-mib)'); + $session->close; + } else { + $self->trace(3, 'getting cpqRackMibCondition done'); + } + } + if (! $self->{runtime}->{plugin}->check_messages()) { + # snmp peer is alive + $self->trace(2, sprintf "Protocol is %s", + $self->{runtime}->{snmpparams}->{'-version'}); + my $oidtrees = [ + ["cpqSiComponent", "1.3.6.1.4.1.232.2.2"], + ["cpqSiAsset", "1.3.6.1.4.1.232.2.2.2"], + #["cpqRackInfo", "1.3.6.1.4.1.232.22"], + ['cpqRackCommonEnclosureEntry', '1.3.6.1.4.1.232.22.2.3.1.1.1'], + ['cpqRackCommonEnclosureTempEntry', '1.3.6.1.4.1.232.22.2.3.1.2.1'], + ['cpqRackCommonEnclosureFanEntry', '1.3.6.1.4.1.232.22.2.3.1.3.1'], + ['cpqRackCommonEnclosureFuseEntry', '1.3.6.1.4.1.232.22.2.3.1.4.1'], + ['cpqRackCommonEnclosureManagerEntry', '1.3.6.1.4.1.232.22.2.3.1.6.1'], + ['cpqRackPowerEnclosureEntry', '1.3.6.1.4.1.232.22.2.3.3.1.1'], + ['cpqRackServerBladeEntry', '1.3.6.1.4.1.232.22.2.4.1.1.1'], + ['cpqRackPowerSupplyEntry', '1.3.6.1.4.1.232.22.2.5.1.1.1'], + ['cpqRackNetConnectorEntry', '1.3.6.1.4.1.232.22.2.6.1.1.1'], + ['cpqRackMibCondition', '1.3.6.1.4.1.232.22.1.3.0'], + ]; + my $cpqSiComponent = "1.3.6.1.4.1.232.2.2"; + my $cpqSiAsset = "1.3.6.1.4.1.232.2.2.2"; + my $cpqRackInfo = "1.3.6.1.4.1.232.22"; + $session->translate; + my $response = {}; #break the walk up in smaller pieces + foreach my $subtree (@{$oidtrees}) { + my $tic = time; my $tac = $tic; + my $response0 = $session->get_table( + -baseoid => $subtree->[1]); + if (scalar (keys %{$response0}) == 0) { + $self->trace(2, sprintf "maxrepetitions failed. fallback"); + $response0 = $session->get_table( + -maxrepetitions => 1, + -baseoid => $subtree->[1]); + } + $tac = time; + $self->trace(2, sprintf "%03d seconds for walk %s (%d oids)", + $tac - $tic, $subtree->[0], scalar(keys %{$response0})); + map { $response->{$_} = $response0->{$_} } keys %{$response0}; + } + $session->close; + map { $response->{$_} =~ s/^\s+//; $response->{$_} =~ s/\s+$//; } + keys %$response; + $self->{rawdata} = $response; + } + } + return $self->{runtime}->{plugin}->check_messages(); +} + +sub set_serial { + my $self = shift; + + my $cpqSiSysSerialNum = "1.3.6.1.4.1.232.2.2.2.1.0"; + my $cpqSiProductName = "1.3.6.1.4.1.232.2.2.4.2.0"; + + $self->{serial} = + SNMP::Utils::get_object($self->{rawdata}, $cpqSiSysSerialNum); + $self->{product} = + SNMP::Utils::get_object($self->{rawdata}, $cpqSiProductName); + $self->{serial} = $self->{serial}; + $self->{product} = lc $self->{product}; + $self->{romversion} = 'unknown'; +##################################################################### +$self->{runtime}->{product} = $self->{product}; +} + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component.pm new file mode 100755 index 0000000..15fa213 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component.pm @@ -0,0 +1,7 @@ +package HP::BladeSystem::Component; + +use strict; + +our @ISA = qw(HP::BladeSystem); + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem.pm new file mode 100755 index 0000000..37cec73 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem.pm @@ -0,0 +1,176 @@ +package HP::BladeSystem::Component::CommonEnclosureSubsystem; +our @ISA = qw(HP::BladeSystem::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + common_enclosures => [], + common_enclosure_temp_subsys => undef, + common_enclosure_fan_subsys => undef, + common_enclosure_fuse_subsys => undef, + common_enclosure_manager_subsys => undef, + common_enclosure_frus => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + # jeweils ein block fuer + # enclosures, temps, fans, fuses + # loop ueber oids und entspr. new + my $oids = { + cpqRackCommonEnclosureEntry => '1.3.6.1.4.1.232.22.2.3.1.1.1', + cpqRackCommonEnclosureRack => '1.3.6.1.4.1.232.22.2.3.1.1.1.1', + cpqRackCommonEnclosureIndex => '1.3.6.1.4.1.232.22.2.3.1.1.1.2', + cpqRackCommonEnclosureModel => '1.3.6.1.4.1.232.22.2.3.1.1.1.3', + cpqRackCommonEnclosureSparePartNumber => '1.3.6.1.4.1.232.22.2.3.1.1.1.6', + cpqRackCommonEnclosureSerialNum => '1.3.6.1.4.1.232.22.2.3.1.1.1.7', + cpqRackCommonEnclosureFWRev => '1.3.6.1.4.1.232.22.2.3.1.1.1.8', + cpqRackCommonEnclosureName => '1.3.6.1.4.1.232.22.2.3.1.1.1.9', + cpqRackCommonEnclosureCondition => '1.3.6.1.4.1.232.22.2.3.1.1.1.16', + cpqRackCommonEnclosureHasServerBlades => '1.3.6.1.4.1.232.22.2.3.1.1.1.17', + cpqRackCommonEnclosureHasPowerBlades => '1.3.6.1.4.1.232.22.2.3.1.1.1.18', + cpqRackCommonEnclosureHasNetConnectors => '1.3.6.1.4.1.232.22.2.3.1.1.1.19', + cpqRackCommonEnclosureHasTempSensors => '1.3.6.1.4.1.232.22.2.3.1.1.1.20', + cpqRackCommonEnclosureHasFans => '1.3.6.1.4.1.232.22.2.3.1.1.1.21', + cpqRackCommonEnclosureHasFuses => '1.3.6.1.4.1.232.22.2.3.1.1.1.22', + cpqRackCommonEnclosureConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + cpqRackCommonEnclosureHasServerBladesValue => { + 1 => 'false', + 2 => 'true', + }, + }; + $oids->{cpqRackCommonEnclosureHasPowerBladesValue} = + $oids->{cpqRackCommonEnclosureHasServerBladesValue}; + $oids->{cpqRackCommonEnclosureHasNetConnectorsValue} = + $oids->{cpqRackCommonEnclosureHasServerBladesValue}; + $oids->{cpqRackCommonEnclosureHasTempSensorsValue} = + $oids->{cpqRackCommonEnclosureHasServerBladesValue}; + $oids->{cpqRackCommonEnclosureHasFansValue} = + $oids->{cpqRackCommonEnclosureHasServerBladesValue}; + $oids->{cpqRackCommonEnclosureHasServerBladesValue} = + $oids->{cpqRackCommonEnclosureHasServerBladesValue}; + # INDEX { cpqRackCommonEnclosureRack cpqRackCommonEnclosureIndex } + foreach ($self->get_entries($oids, 'cpqRackCommonEnclosureEntry')) { + push(@{$self->{common_enclosures}}, + HP::BladeSystem::Component::CommonEnclosureSubsystem::CommonEnclosure->new(%{$_})); + } + + $self->{common_enclosure_fan_subsys} = HP::BladeSystem::Component::CommonEnclosureSubsystem::FanSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); + $self->{common_enclosure_temp_subsys} = HP::BladeSystem::Component::CommonEnclosureSubsystem::TempSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); + $self->{common_enclosure_fuse_subsys} = HP::BladeSystem::Component::CommonEnclosureSubsystem::FuseSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); + $self->{common_enclosure_manager_subsys} = HP::BladeSystem::Component::CommonEnclosureSubsystem::ManagerSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub check { + my $self = shift; + foreach (@{$self->{common_enclosures}}) { + $_->check(); + } + $self->{common_enclosure_fan_subsys}->check(); + $self->{common_enclosure_temp_subsys}->check(); + $self->{common_enclosure_fuse_subsys}->check(); + $self->{common_enclosure_manager_subsys}->check(); +} + +sub dump { + my $self = shift; + foreach (@{$self->{common_enclosures}}) { + $_->dump(); + } + $self->{common_enclosure_fan_subsys}->dump(); + $self->{common_enclosure_temp_subsys}->dump(); + $self->{common_enclosure_fuse_subsys}->dump(); + $self->{common_enclosure_manager_subsys}->dump(); +} + + +package HP::BladeSystem::Component::CommonEnclosureSubsystem::CommonEnclosure; +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackCommonEnclosure/, keys %params; + $self->{name} = $self->{cpqRackCommonEnclosureRack}.':'.$self->{cpqRackCommonEnclosureIndex}; + $self->{serfw} = sprintf "Ser: %s, FW: %s", $self->{cpqRackCommonEnclosureSerialNum}, + $self->{cpqRackCommonEnclosureFWRev}; + bless $self, $class; + return $self; +} + + +sub check { + my $self = shift; + $self->blacklist('ce', $self->{cpqRackCommonEnclosureName}); + my $info = sprintf 'common enclosure %s condition is %s (%s)', + $self->{cpqRackCommonEnclosureName}, $self->{cpqRackCommonEnclosureCondition}, $self->{serfw}; + $self->add_info($info); + if ($self->{cpqRackCommonEnclosureCondition} eq 'failed') { + $info .= sprintf " (SparePartNum %s)", $self->{cpqRackCommonEnclosureSparePartNumber}; + $self->add_message(CRITICAL, $info); + } elsif ($self->{cpqRackCommonEnclosureCondition} eq 'degraded') { + $info .= sprintf " (SparePartNum %s)", $self->{cpqRackCommonEnclosureSparePartNumber}; + $self->add_message(WARNING, $info); + } +} + +sub dump { + my $self = shift; + printf "[COMMON_ENCLOSURE_%s]\n", $self->{cpqRackCommonEnclosureName}; + foreach (qw(cpqRackCommonEnclosureRack cpqRackCommonEnclosureIndex cpqRackCommonEnclosureModel + cpqRackCommonEnclosureSerialNum cpqRackCommonEnclosureFWRev cpqRackCommonEnclosureFWRev + cpqRackCommonEnclosureName + cpqRackCommonEnclosureCondition cpqRackCommonEnclosureHasServerBlades + cpqRackCommonEnclosureHasPowerBlades cpqRackCommonEnclosureHasNetConnectors + cpqRackCommonEnclosureHasTempSensors cpqRackCommonEnclosureHasFans cpqRackCommonEnclosureHasFuses)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/FanSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/FanSubsystem.pm new file mode 100755 index 0000000..c28b921 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/FanSubsystem.pm @@ -0,0 +1,139 @@ +package HP::BladeSystem::Component::CommonEnclosureSubsystem::FanSubsystem; +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + fans => [], + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $oids = { + cpqRackCommonEnclosureFanEntry => '1.3.6.1.4.1.232.22.2.3.1.3.1', + cpqRackCommonEnclosureFanRack => '1.3.6.1.4.1.232.22.2.3.1.3.1.1', + cpqRackCommonEnclosureFanChassis => '1.3.6.1.4.1.232.22.2.3.1.3.1.2', + cpqRackCommonEnclosureFanIndex => '1.3.6.1.4.1.232.22.2.3.1.3.1.3', + cpqRackCommonEnclosureFanEnclosureName => '1.3.6.1.4.1.232.22.2.3.1.3.1.4', + cpqRackCommonEnclosureFanLocation => '1.3.6.1.4.1.232.22.2.3.1.3.1.5', + cpqRackCommonEnclosureFanPartNumber => '1.3.6.1.4.1.232.22.2.3.1.3.1.6', + cpqRackCommonEnclosureFanSparePartNumber => '1.3.6.1.4.1.232.22.2.3.1.3.1.7', + cpqRackCommonEnclosureFanPresent => '1.3.6.1.4.1.232.22.2.3.1.3.1.8', + cpqRackCommonEnclosureFanRedundant => '1.3.6.1.4.1.232.22.2.3.1.3.1.9', + cpqRackCommonEnclosureFanRedundantGroupId => '1.3.6.1.4.1.232.22.2.3.1.3.1.10', + cpqRackCommonEnclosureFanCondition => '1.3.6.1.4.1.232.22.2.3.1.3.1.11', + cpqRackCommonEnclosureFanEnclosureSerialNum => '1.3.6.1.4.1.232.22.2.3.1.3.1.12', + cpqRackCommonEnclosureFanPresentValue => { + 1 => 'other', + 2 => 'absent', + 3 => 'present', + }, + cpqRackCommonEnclosureFanRedundantValue => { + 0 => 'other', # meiner phantasie entsprungen, da sich hp nicht aeussert + 1 => 'other', + 2 => 'notRedundant', + 3 => 'redundant', + }, + cpqRackCommonEnclosureFanConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + } + }; + # INDEX { cpqRackCommonEnclosureFanRack, cpqRackCommonEnclosureFanChassis, cpqRackCommonEnclosureFanIndex } + foreach ($self->get_entries($oids, 'cpqRackCommonEnclosureFanEntry')) { + push(@{$self->{fans}}, + HP::BladeSystem::Component::CommonEnclosureSubsystem::FanSubsystem::Fan->new(%{$_})); + } + +} + +sub check { + my $self = shift; + foreach (@{$self->{fans}}) { + $_->check() if $_->{cpqRackCommonEnclosureFanPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{fans}}) { + $_->dump() if $_->{cpqRackCommonEnclosureFanPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + + +package HP::BladeSystem::Component::CommonEnclosureSubsystem::FanSubsystem::Fan; + +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem::FanSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackCommonEnclosureFan/, keys %params; + $self->{name} = $self->{cpqRackCommonEnclosureFanRack}.':'.$self->{cpqRackCommonEnclosureFanChassis}.':'.$self->{cpqRackCommonEnclosureFanIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('f', $self->{name}); + $self->add_info(sprintf 'fan %s is %s, location is %s, redundance is %s, condition is %s', + $self->{name}, $self->{cpqRackCommonEnclosureFanPresent}, + $self->{cpqRackCommonEnclosureFanLocation}, + $self->{cpqRackCommonEnclosureFanRedundant}, + $self->{cpqRackCommonEnclosureFanCondition}); + if ($self->{cpqRackCommonEnclosureFanCondition} eq 'degraded') { + $self->{info} .= sprintf ", (SparePartNum: %s)", $self->{cpqRackCommonEnclosureFanSparePartNumber}; + $self->add_message(WARNING, $self->{info}); + } elsif ($self->{cpqRackCommonEnclosureFanCondition} eq 'failed') { + $self->{info} .= sprintf ", (SparePartNum: %s)", $self->{cpqRackCommonEnclosureFanSparePartNumber}; + $self->add_message(CRITICAL, $self->{info}); + } +} + +sub dump { + my $self = shift; + printf "[FAN_%s]\n", $self->{name}; + foreach (qw(cpqRackCommonEnclosureFanRack cpqRackCommonEnclosureFanChassis + cpqRackCommonEnclosureFanIndex cpqRackCommonEnclosureFanEnclosureName + cpqRackCommonEnclosureFanLocation cpqRackCommonEnclosureFanPartNumber + cpqRackCommonEnclosureFanSparePartNumber cpqRackCommonEnclosureFanPresent + cpqRackCommonEnclosureFanRedundant cpqRackCommonEnclosureFanRedundantGroupId + cpqRackCommonEnclosureFanCondition cpqRackCommonEnclosureFanEnclosureSerialNum)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/FuseSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/FuseSubsystem.pm new file mode 100755 index 0000000..bc67e3b --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/FuseSubsystem.pm @@ -0,0 +1,121 @@ +package HP::BladeSystem::Component::CommonEnclosureSubsystem::FuseSubsystem; +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + fuses => [], + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $oids = { + cpqRackCommonEnclosureFuseEntry => '1.3.6.1.4.1.232.22.2.3.1.4.1', + cpqRackCommonEnclosureFuseRack => '1.3.6.1.4.1.232.22.2.3.1.4.1.1', + cpqRackCommonEnclosureFuseChassis => '1.3.6.1.4.1.232.22.2.3.1.4.1.2', + cpqRackCommonEnclosureFuseIndex => '1.3.6.1.4.1.232.22.2.3.1.4.1.3', + cpqRackCommonEnclosureFuseEnclosureName => '1.3.6.1.4.1.232.22.2.3.1.4.1.4', + cpqRackCommonEnclosureFuseLocation => '1.3.6.1.4.1.232.22.2.3.1.4.1.5', + cpqRackCommonEnclosureFusePresent => '1.3.6.1.4.1.232.22.2.3.1.4.1.8', + cpqRackCommonEnclosureFuseCondition => '1.3.6.1.4.1.232.22.2.3.1.4.1.11', + cpqRackCommonEnclosureFusePresentValue => { + 1 => 'other', + 2 => 'absent', + 3 => 'present', + }, + cpqRackCommonEnclosureFuseConditionValue => { + 1 => 'other', + 2 => 'ok', + 4 => 'failed', + } + }; + # INDEX { cpqRackCommonEnclosureFuseRack, cpqRackCommonEnclosureFuseChassis, cpqRackCommonEnclosureFuseIndex } + foreach ($self->get_entries($oids, 'cpqRackCommonEnclosureFuseEntry')) { + push(@{$self->{fuses}}, + HP::BladeSystem::Component::CommonEnclosureSubsystem::FuseSubsystem::Fuse->new(%{$_})); + } + +} + +sub check { + my $self = shift; + foreach (@{$self->{fuses}}) { + $_->check() if $_->{cpqRackCommonEnclosureFusePresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{fuses}}) { + $_->dump() if $_->{cpqRackCommonEnclosureFusePresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + + +package HP::BladeSystem::Component::CommonEnclosureSubsystem::FuseSubsystem::Fuse; + +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem::FuseSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackCommonEnclosureFuse/, keys %params; + $self->{name} = $self->{cpqRackCommonEnclosureFuseRack}.':'.$self->{cpqRackCommonEnclosureFuseChassis}.':'.$self->{cpqRackCommonEnclosureFuseIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('fu', $self->{name}); + $self->add_info(sprintf 'fuse %s is %s, location is %s, condition is %s', + $self->{name}, $self->{cpqRackCommonEnclosureFusePresent}, + $self->{cpqRackCommonEnclosureFuseLocation}, $self->{cpqRackCommonEnclosureFuseCondition}); + if ($self->{cpqRackCommonEnclosureFuseCondition} eq 'failed') { + $self->add_message(CRITICAL, $self->{info}); + } elsif ($self->{cpqRackCommonEnclosureFuseCondition} ne 'ok') { + $self->add_message(WARNING, $self->{info}); + } +} + +sub dump { + my $self = shift; + printf "[FUSE_%s]\n", $self->{name}; + foreach (qw(cpqRackCommonEnclosureFuseRack cpqRackCommonEnclosureFuseChassis + cpqRackCommonEnclosureFuseIndex cpqRackCommonEnclosureFuseEnclosureName + cpqRackCommonEnclosureFuseLocation cpqRackCommonEnclosureFusePresent + cpqRackCommonEnclosureFuseCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/ManagerSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/ManagerSubsystem.pm new file mode 100755 index 0000000..1c2e15b --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/ManagerSubsystem.pm @@ -0,0 +1,154 @@ +package HP::BladeSystem::Component::CommonEnclosureSubsystem::ManagerSubsystem; +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + managers => [], + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $oids = { + cpqRackCommonEnclosureManagerEntry => '1.3.6.1.4.1.232.22.2.3.1.6.1', + cpqRackCommonEnclosureManagerRack => '1.3.6.1.4.1.232.22.2.3.1.6.1.1', + cpqRackCommonEnclosureManagerChassis => '1.3.6.1.4.1.232.22.2.3.1.6.1.2', + cpqRackCommonEnclosureManagerIndex => '1.3.6.1.4.1.232.22.2.3.1.6.1.3', + cpqRackCommonEnclosureManagerEnclosureName => '1.3.6.1.4.1.232.22.2.3.1.6.1.4', + cpqRackCommonEnclosureManagerLocation => '1.3.6.1.4.1.232.22.2.3.1.6.1.5', + cpqRackCommonEnclosureManagerPartNumber => '1.3.6.1.4.1.232.22.2.3.1.6.1.6', + cpqRackCommonEnclosureManagerSparePartNumber => '1.3.6.1.4.1.232.22.2.3.1.6.1.7', + cpqRackCommonEnclosureManagerSerialNum => '1.3.6.1.4.1.232.22.2.3.1.6.1.8', + cpqRackCommonEnclosureManagerRole => '1.3.6.1.4.1.232.22.2.3.1.6.1.9', + cpqRackCommonEnclosureManagerPresent => '1.3.6.1.4.1.232.22.2.3.1.6.1.10', + cpqRackCommonEnclosureManagerRedundant => '1.3.6.1.4.1.232.22.2.3.1.6.1.11', + cpqRackCommonEnclosureManagerCondition => '1.3.6.1.4.1.232.22.2.3.1.6.1.12', + cpqRackCommonEnclosureManagerFWRev => '1.3.6.1.4.1.232.22.2.3.1.6.1.15', + cpqRackCommonEnclosureManagerRoleValue => { + 1 => 'standby', + 2 => 'active', + }, + cpqRackCommonEnclosureManagerPresentValue => { + 1 => 'other', + 2 => 'absent', # mit vorsicht zu geniessen! + 3 => 'present', + }, + cpqRackCommonEnclosureManagerRedundantValue => { + 0 => 'other', # meiner phantasie entsprungen, da sich hp nicht aeussert + 1 => 'other', + 2 => 'notRedundant', + 3 => 'redundant', + }, + cpqRackCommonEnclosureManagerConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + } + }; + # INDEX { cpqRackCommonEnclosureManagerRack, cpqRackCommonEnclosureManagerChassis, cpqRackCommonEnclosureManagerIndex } + foreach ($self->get_entries($oids, 'cpqRackCommonEnclosureManagerEntry')) { + push(@{$self->{managers}}, + HP::BladeSystem::Component::CommonEnclosureSubsystem::ManagerSubsystem::Manager->new(%{$_})); + } +} + +sub check { + my $self = shift; + foreach (@{$self->{managers}}) { + $_->check() if $_->{cpqRackCommonEnclosureManagerPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{managers}}) { + $_->dump() if $_->{cpqRackCommonEnclosureManagerPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + + +package HP::BladeSystem::Component::CommonEnclosureSubsystem::ManagerSubsystem::Manager; + +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem::ManagerSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackCommonEnclosureManager/, keys %params; + $self->{name} = $self->{cpqRackCommonEnclosureManagerRack}. + ':'.$self->{cpqRackCommonEnclosureManagerChassis}. + ':'.$self->{cpqRackCommonEnclosureManagerIndex}; + if ($self->{cpqRackCommonEnclosureManagerPresent} eq "absent" && + defined $self->{cpqRackCommonEnclosureManagerEnclosureName}) { + $self->{cpqRackCommonEnclosureManagerPresent} = "present"; + } + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('em', $self->{name}); + my $info = sprintf 'manager %s is %s, location is %s, redundance is %s, condition is %s, role is %s', + $self->{name}, $self->{cpqRackCommonEnclosureManagerPresent}, + $self->{cpqRackCommonEnclosureManagerLocation}, + $self->{cpqRackCommonEnclosureManagerRedundant}, + $self->{cpqRackCommonEnclosureManagerCondition}, + $self->{cpqRackCommonEnclosureManagerRole}; + $self->add_info($info) if $self->{cpqRackCommonEnclosureManagerPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent managers nur bei -vvv + if ($self->{cpqRackCommonEnclosureManagerCondition} eq 'degraded') { + $self->{info} .= sprintf ' (SparePartNum: %s)', + $self->{cpqRackCommonEnclosureManagerSparePartNumber}; + $self->add_message(WARNING, $self->{info}); + } elsif ($self->{cpqRackCommonEnclosureManagerCondition} eq 'failed') { + $self->{info} .= sprintf ' (SparePartNum: %s)', + $self->{cpqRackCommonEnclosureManagerSparePartNumber}; + $self->add_message(CRITICAL, $self->{info}); + } +} + +sub dump { + my $self = shift; + printf "[ENCLOSURE_MANAGER_%s]\n", $self->{name}; + foreach (qw(cpqRackCommonEnclosureManagerRack cpqRackCommonEnclosureManagerChassis + cpqRackCommonEnclosureManagerIndex cpqRackCommonEnclosureManagerEnclosureName + cpqRackCommonEnclosureManagerLocation cpqRackCommonEnclosureManagerPartNumber + cpqRackCommonEnclosureManagerSparePartNumber cpqRackCommonEnclosureManagerPresent + cpqRackCommonEnclosureManagerRedundant + cpqRackCommonEnclosureManagerCondition cpqRackCommonEnclosureManagerFWRev)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/TempSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/TempSubsystem.pm new file mode 100755 index 0000000..3e004f1 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/CommonEnclosureSubsystem/TempSubsystem.pm @@ -0,0 +1,177 @@ +package HP::BladeSystem::Component::CommonEnclosureSubsystem::TempSubsystem; +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + temperatures => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($params{runtime}->{options}->{customthresholds}) { + if (-f $params{runtime}->{options}->{customthresholds}) { + open CT, $params{runtime}->{options}->{customthresholds}; + $params{runtime}->{options}->{customthresholds} = <CT>; + close CT; + } + foreach my $ct_items + (split(/\//, $params{runtime}->{options}->{customthresholds})) { + if ($ct_items =~ /^(\d+):(\d+)$/) { + my $temp = $2; + $params{runtime}->{options}->{thresholds}->{$1} = $temp; + } else { + die sprintf "invalid threshold %s", $ct_items; + } + } + } + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqRackCommonEnclosureTempEntry => '1.3.6.1.4.1.232.22.2.3.1.2.1', + cpqRackCommonEnclosureTempRack => '1.3.6.1.4.1.232.22.2.3.1.2.1.1', + cpqRackCommonEnclosureTempChassis => '1.3.6.1.4.1.232.22.2.3.1.2.1.2', + cpqRackCommonEnclosureTempSensorIndex => '1.3.6.1.4.1.232.22.2.3.1.2.1.3', + cpqRackCommonEnclosureTempSensorEnclosureName => '1.3.6.1.4.1.232.22.2.3.1.2.1.4', + cpqRackCommonEnclosureTempLocation => '1.3.6.1.4.1.232.22.2.3.1.2.1.5', + cpqRackCommonEnclosureTempCurrent => '1.3.6.1.4.1.232.22.2.3.1.2.1.6', + cpqRackCommonEnclosureTempThreshold => '1.3.6.1.4.1.232.22.2.3.1.2.1.7', + cpqRackCommonEnclosureTempCondition => '1.3.6.1.4.1.232.22.2.3.1.2.1.8', + cpqRackCommonEnclosureTempType => '1.3.6.1.4.1.232.22.2.3.1.2.1.9', + cpqRackCommonEnclosureTempConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + cpqRackCommonEnclosureTempTypeValue => { + 1 => 'other', + 5 => 'blowout', + 9 => 'caution', + 15 => 'critical', + }, + }; + # INDEX { cpqRackCommonEnclosureTempRack cpqRackCommonEnclosureTempChassis + # cpqRackCommonEnclosureTempSensorIndex } + foreach ($self->get_entries($oids, 'cpqRackCommonEnclosureTempEntry')) { + push(@{$self->{temperatures}}, + HP::BladeSystem::Component::CommonEnclosureSubsystem::TempSubsystem::Temp->new(%{$_})) if (($_->{cpqRackCommonEnclosureTempCurrent} != -1 && $_->{cpqRackCommonEnclosureTempThreshold} != -1) && ($_->{cpqRackCommonEnclosureTempThreshold} != 0)); + } + +} + + +sub check { + my $self = shift; + my $errorfound = 0; + if (scalar (@{$self->{temperatures}}) == 0) { + #$self->overall_check(); + } else { + foreach (@{$self->{temperatures}}) { + $_->check(); + } + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{temperatures}}) { + $_->dump(); + } +} + + +package HP::BladeSystem::Component::CommonEnclosureSubsystem::TempSubsystem::Temp; +our @ISA = qw(HP::BladeSystem::Component::CommonEnclosureSubsystem::TempSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackCommonEnclosureTemp/, keys %params; + $self->{name} = $params{cpqRackCommonEnclosureTempRack}.':'. + $params{cpqRackCommonEnclosureTempChassis}.':'. + $params{cpqRackCommonEnclosureTempSensorIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('t', $self->{name}); + if ($self->{cpqRackCommonEnclosureTempCurrent} > $self->{cpqRackCommonEnclosureTempThreshold}) { + $self->add_info(sprintf "%s temperature too high (%d%s)", + $self->{cpqRackCommonEnclosureTempLocation}, + $self->{cpqRackCommonEnclosureTempCurrent}, + $self->{runtime}->{options}->{celsius} ? "C" : "F"); + $self->add_message(CRITICAL, $self->{info}); + } else { + $self->add_info(sprintf "%s temperature is %d%s (%d max)", + $self->{cpqRackCommonEnclosureTempLocation}, + $self->{cpqRackCommonEnclosureTempCurrent}, + $self->{runtime}->{options}->{celsius} ? "C" : "F", + $self->{cpqRackCommonEnclosureTempThreshold}); + } + if ($self->{runtime}->{options}->{perfdata} == 2) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('temp_%s', $self->{name}), + value => $self->{cpqRackCommonEnclosureTempCurrent}, + warning => $self->{cpqRackCommonEnclosureTempThreshold}, + critical => $self->{cpqRackCommonEnclosureTempThreshold} + ); + } elsif ($self->{runtime}->{options}->{perfdata} == 1) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('temp_%s_%s', $self->{name}, + $self->{cpqRackCommonEnclosureTempLocation}), + value => $self->{cpqRackCommonEnclosureTempCurrent}, + warning => $self->{cpqRackCommonEnclosureTempThreshold}, + critical => $self->{cpqRackCommonEnclosureTempThreshold} + ); + } + $self->add_extendedinfo(sprintf "temp_%s=%d", + $self->{name}, $self->{cpqRackCommonEnclosureTempCurrent}); + +} + + +sub dump { + my $self = shift; + printf "[TEMP_%s]\n", $self->{name}; + foreach (qw(cpqRackCommonEnclosureTempRack cpqRackCommonEnclosureTempChassis + cpqRackCommonEnclosureTempSensorIndex cpqRackCommonEnclosureTempSensorEnclosureName + cpqRackCommonEnclosureTempLocation + cpqRackCommonEnclosureTempCurrent cpqRackCommonEnclosureTempThreshold + cpqRackCommonEnclosureTempCondition cpqRackCommonEnclosureTempType)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n\n", $self->{info}; +} + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/NetConnectorSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/NetConnectorSubsystem.pm new file mode 100755 index 0000000..9fbd4d0 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/NetConnectorSubsystem.pm @@ -0,0 +1,134 @@ +package HP::BladeSystem::Component::NetConnectorSubsystem; +our @ISA = qw(HP::BladeSystem::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + net_connectors => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $oids = { + cpqRackNetConnectorEntry => '1.3.6.1.4.1.232.22.2.6.1.1.1', + cpqRackNetConnectorRack => '1.3.6.1.4.1.232.22.2.6.1.1.1.1', + cpqRackNetConnectorChassis => '1.3.6.1.4.1.232.22.2.6.1.1.1.2', + cpqRackNetConnectorIndex => '1.3.6.1.4.1.232.22.2.6.1.1.1.3', + cpqRackNetConnectorEnclosureName => '1.3.6.1.4.1.232.22.2.6.1.1.1.4', + cpqRackNetConnectorName => '1.3.6.1.4.1.232.22.2.6.1.1.1.5', + cpqRackNetConnectorModel => '1.3.6.1.4.1.232.22.2.6.1.1.1.6', + cpqRackNetConnectorSerialNum => '1.3.6.1.4.1.232.22.2.6.1.1.1.7', + cpqRackNetConnectorPartNumber => '1.3.6.1.4.1.232.22.2.6.1.1.1.8', + cpqRackNetConnectorSparePartNumber => '1.3.6.1.4.1.232.22.2.6.1.1.1.9', + cpqRackNetConnectorFWRev => '1.3.6.1.4.1.232.22.2.6.1.1.1.10', + cpqRackNetConnectorType => '1.3.6.1.4.1.232.22.2.6.1.1.1.11', + cpqRackNetConnectorLocation => '1.3.6.1.4.1.232.22.2.6.1.1.1.12', + cpqRackNetConnectorPresent => '1.3.6.1.4.1.232.22.2.6.1.1.1.13', + cpqRackNetConnectorHasFuses => '1.3.6.1.4.1.232.22.2.6.1.1.1.14', + cpqRackNetConnectorEnclosureSerialNum => '1.3.6.1.4.1.232.22.2.6.1.1.1.15', + cpqRackNetConnectorTypeValue => { + 0 => 'other', # undefined + 1 => 'other', + 2 => 'active', + 3 => 'passive', + }, + cpqRackNetConnectorPresentValue => { + 1 => 'other', + 2 => 'absent', + 3 => 'present', + }, + cpqRackNetConnectorHasFusesValue => { + -1 => 'false', # wird geliefert, also vermute ich false + 1 => 'false', + 2 => 'true', + }, + }; + + + # INDEX { cpqRackNetConnectorRack, cpqRackNetConnectorChassis, cpqRackNetConnectorIndex } + # dreckada dreck, dreckada + foreach ($self->get_entries($oids, 'cpqRackNetConnectorEntry')) { + push(@{$self->{net_connectors}}, + HP::BladeSystem::Component::NetConnectorSubsystem::NetConnector->new(%{$_})); + } +} + +sub check { + my $self = shift; + foreach (@{$self->{net_connectors}}) { + $_->check() if $_->{cpqRackNetConnectorPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{net_connectors}}) { + $_->dump() if $_->{cpqRackNetConnectorPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + + +package HP::BladeSystem::Component::NetConnectorSubsystem::NetConnector; +our @ISA = qw(HP::BladeSystem::Component::NetConnectorSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackNetConnector/, keys %params; + $self->{name} = $params{cpqRackNetConnectorRack}. + ':'.$params{cpqRackNetConnectorChassis}. + ':'.$params{cpqRackNetConnectorIndex}; + $self->{serfw} = sprintf "Ser: %s, FW: %s", $self->{cpqRackNetConnectorSerialNum}, $self->{cpqRackNetConnectorFWRev}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('nc', $self->{name}); + my $info = sprintf 'net connector %s is %s, model is %s (%s)', + $self->{name}.($self->{cpqRackNetConnectorName} ? ' \''.$self->{cpqRackNetConnectorName}.'\'' : ''), + $self->{cpqRackNetConnectorPresent}, $self->{cpqRackNetConnectorModel}, $self->{serfw}; + $self->add_info($info); + # hat weder status noch condition, vielleicht spaeter mal + $info .= sprintf " (SparePartNum %s)", $self->{cpqRackNetConnectorSparePartNumber}; +} + +sub dump { + my $self = shift; + printf "[NET_CONNECTOR_%s]\n", $self->{cpqRackNetConnectorName}; + foreach (qw(cpqRackNetConnectorRack cpqRackNetConnectorChassis cpqRackNetConnectorIndex cpqRackNetConnectorEnclosureName cpqRackNetConnectorName cpqRackNetConnectorModel cpqRackNetConnectorSerialNum cpqRackNetConnectorPartNumber cpqRackNetConnectorSparePartNumber cpqRackNetConnectorFWRev cpqRackNetConnectorType cpqRackNetConnectorLocation cpqRackNetConnectorPresent cpqRackNetConnectorHasFuses cpqRackNetConnectorEnclosureSerialNum)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/PowerEnclosureSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/PowerEnclosureSubsystem.pm new file mode 100755 index 0000000..82445d3 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/PowerEnclosureSubsystem.pm @@ -0,0 +1,136 @@ +package HP::BladeSystem::Component::PowerEnclosureSubsystem; +our @ISA = qw(HP::BladeSystem::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + power_enclosures => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + +# cpqRackPowerEnclosureTable + my $oids = { + cpqRackPowerEnclosureEntry => '1.3.6.1.4.1.232.22.2.3.3.1.1', + cpqRackPowerEnclosureRack => '1.3.6.1.4.1.232.22.2.3.3.1.1.1', + cpqRackPowerEnclosureIndex => '1.3.6.1.4.1.232.22.2.3.3.1.1.2', + cpqRackPowerEnclosureName => '1.3.6.1.4.1.232.22.2.3.3.1.1.3', + cpqRackPowerEnclosureMgmgtBoardSerialNum => '1.3.6.1.4.1.232.22.2.3.3.1.1.4', + cpqRackPowerEnclosureRedundant => '1.3.6.1.4.1.232.22.2.3.3.1.1.5', + cpqRackPowerEnclosureLoadBalanced => '1.3.6.1.4.1.232.22.2.3.3.1.1.6', + cpqRackPowerEnclosureInputPwrType => '1.3.6.1.4.1.232.22.2.3.3.1.1.7', + cpqRackPowerEnclosurePwrFeedMax => '1.3.6.1.4.1.232.22.2.3.3.1.1.8', + cpqRackPowerEnclosureCondition => '1.3.6.1.4.1.232.22.2.3.3.1.1.9', + cpqRackPowerEnclosureRedundantValue => { + 1 => 'other', + 2 => 'notRedundant', + 3 => 'redundant', + }, + cpqRackPowerEnclosureLoadBalancedValue => { + 0 => 'aechz', + 1 => 'other', + 2 => 'notLoadBalanced', + 3 => 'loadBalanced', + }, + cpqRackPowerEnclosureInputPwrTypeValue => { + 1 => 'other', + 2 => 'singlePhase', + 3 => 'threePhase', + 4 => 'directCurrent', + }, + cpqRackPowerEnclosureConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + }, + }; + + + # INDEX { cpqRackPowerEnclosureRack, cpqRackPowerEnclosureIndex } + # dreckada dreck, dreckada + foreach ($self->get_entries($oids, 'cpqRackPowerEnclosureEntry')) { + push(@{$self->{power_enclosures}}, + HP::BladeSystem::Component::PowerEnclosureSubsystem::PowerEnclosure->new(%{$_})); + } +} + +sub check { + my $self = shift; + foreach (@{$self->{power_enclosures}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{power_enclosures}}) { + $_->dump(); + } +} + + +package HP::BladeSystem::Component::PowerEnclosureSubsystem::PowerEnclosure; +our @ISA = qw(HP::BladeSystem::Component::PowerEnclosureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackPowerEnclosure/, keys %params; + $self->{name} = $self->{cpqRackPowerEnclosureRack}.':'.$self->{cpqRackPowerEnclosureIndex}; + bless $self, $class; + $self->init(); + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('pe', $self->{name}); + my $info = sprintf 'power enclosure %s \'%s\' condition is %s', + $self->{name}, $self->{cpqRackPowerEnclosureName}, $self->{cpqRackPowerEnclosureCondition}; + $self->add_info($info); + if ($self->{cpqRackPowerEnclosureCondition} eq 'degraded') { + $self->add_message(WARNING, $info); + } +} + +sub dump { + my $self = shift; + printf "[POWER_ENCLOSURE_%s]\n", $self->{cpqRackPowerEnclosureName}; + foreach (qw(cpqRackPowerEnclosureRack cpqRackPowerEnclosureIndex + cpqRackPowerEnclosureName cpqRackPowerEnclosureMgmgtBoardSerialNum + cpqRackPowerEnclosureRedundant cpqRackPowerEnclosureLoadBalanced + cpqRackPowerEnclosureInputPwrType cpqRackPowerEnclosurePwrFeedMax + cpqRackPowerEnclosureCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/PowerSupplySubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/PowerSupplySubsystem.pm new file mode 100755 index 0000000..261ce19 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/PowerSupplySubsystem.pm @@ -0,0 +1,238 @@ +package HP::BladeSystem::Component::PowerSupplySubsystem; +our @ISA = qw(HP::BladeSystem::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + power_supplies => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $oids = { + cpqRackPowerSupplyEntry => '1.3.6.1.4.1.232.22.2.5.1.1.1', + cpqRackPowerSupplyRack => '1.3.6.1.4.1.232.22.2.5.1.1.1.1', + cpqRackPowerSupplyChassis => '1.3.6.1.4.1.232.22.2.5.1.1.1.2', + cpqRackPowerSupplyIndex => '1.3.6.1.4.1.232.22.2.5.1.1.1.3', + cpqRackPowerSupplyEnclosureName => '1.3.6.1.4.1.232.22.2.5.1.1.1.4', + cpqRackPowerSupplySerialNum => '1.3.6.1.4.1.232.22.2.5.1.1.1.5', + cpqRackPowerSupplySparePartNumber => '1.3.6.1.4.1.232.22.2.5.1.1.1.7', + cpqRackPowerSupplyFWRev => '1.3.6.1.4.1.232.22.2.5.1.1.1.8', + cpqRackPowerSupplyMaxPwrOutput => '1.3.6.1.4.1.232.22.2.5.1.1.1.9', + cpqRackPowerSupplyCurPwrOutput => '1.3.6.1.4.1.232.22.2.5.1.1.1.10', + cpqRackPowerSupplyIntakeTemp => '1.3.6.1.4.1.232.22.2.5.1.1.1.12', + cpqRackPowerSupplyExhaustTemp => '1.3.6.1.4.1.232.22.2.5.1.1.1.13', + cpqRackPowerSupplyStatus => '1.3.6.1.4.1.232.22.2.5.1.1.1.14', + cpqRackPowerSupplySupplyInputLineStatus => '1.3.6.1.4.1.232.22.2.5.1.1.1.15', + cpqRackPowerSupplyPresent => '1.3.6.1.4.1.232.22.2.5.1.1.1.16', + cpqRackPowerSupplyCondition => '1.3.6.1.4.1.232.22.2.5.1.1.1.17', + cpqRackPowerSupplySupplyInputLineStatusValue => { + 1 => 'noError', + 2 => 'lineOverVoltage', + 3 => 'lineUnderVoltage', + 4 => 'lineHit', + 5 => 'brownOut', + 6 => 'linePowerLoss', + }, + cpqRackPowerSupplyStatusValue => { + 1 => 'noError', + 2 => 'generalFailure', + 3 => 'bistFailure', + 4 => 'fanFailure', + 5 => 'tempFailure', + 6 => 'interlockOpen', + 7 => 'epromFailed', + 8 => 'vrefFailed', + 9 => 'dacFailed', + 10 => 'ramTestFailed', + 11 => 'voltageChannelFailed', + 12 => 'orringdiodeFailed', + 13 => 'brownOut', + 14 => 'giveupOnStartup', + 15 => 'nvramInvalid', + 16 => 'calibrationTableInvalid', + }, + cpqRackPowerSupplyPresentValue => { + 1 => 'other', + 2 => 'absent', + 3 => 'present', + }, + cpqRackPowerSupplyConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + }; + + + # INDEX { cpqRackPowerSupplyRack, cpqRackPowerSupplyChassis, cpqRackPowerSupplyIndex } + foreach ($self->get_entries($oids, 'cpqRackPowerSupplyEntry')) { + push(@{$self->{power_supplies}}, + HP::BladeSystem::Component::PowerSupplySubsystem::PowerSupply->new(%{$_})); + } +} + +sub check { + my $self = shift; + my $total_current_watt = 0; + my $total_max_watt = 0; + my $total_in_temp = 0; + my $total_out_temp = 0; + my $num_ps = 0; + foreach (@{$self->{power_supplies}}) { + $_->check() if $_->{cpqRackPowerSupplyPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + if ($_->{cpqRackPowerSupplyPresent} eq 'present') { + $total_max_watt += $_->{cpqRackPowerSupplyMaxPwrOutput}; + $total_current_watt += $_->{cpqRackPowerSupplyCurPwrOutput}; + $total_in_temp += $_->{cpqRackPowerSupplyIntakeTemp} + if $_->{cpqRackPowerSupplyIntakeTemp} != -1; + $total_out_temp += $_->{cpqRackPowerSupplyExhaustTemp} + if $_->{cpqRackPowerSupplyExhaustTemp} != -1; + $num_ps++; + } + } + $self->{runtime}->{plugin}->add_perfdata( + label => 'watt_total', + value => $total_current_watt, + warning => $total_max_watt, + critical => $total_max_watt, + ); + #$self->{runtime}->{plugin}->add_perfdata( + # label => 'watt_total_pct', + # value => ($total_current_watt == 0 ? 0 : + # sprintf("%.2f", + # ($total_current_watt / $total_max_watt * 100))), + # warning => 100, + # critical => 100, + # uom => '%', + #); + if ($total_in_temp) { + $self->{runtime}->{plugin}->add_perfdata( + label => 'in_temp', + value => $total_in_temp / $num_ps, + ); + } + if ($total_out_temp) { + $self->{runtime}->{plugin}->add_perfdata( + label => 'out_temp', + value => $total_out_temp / $num_ps, + ); + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{power_supplies}}) { + $_->dump() if $_->{cpqRackPowerSupplyPresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent nur bei -vvv + } +} + + +package HP::BladeSystem::Component::PowerSupplySubsystem::PowerSupply; +our @ISA = qw(HP::BladeSystem::Component::PowerSupplySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackPowerSupply/, keys %params; + $self->{name} = $params{cpqRackPowerSupplyRack}. + ':'.$params{cpqRackPowerSupplyChassis}. + ':'.$params{cpqRackPowerSupplyIndex}; + $self->{serfw} = sprintf "Ser: %s, FW: %s", $self->{cpqRackPowerSupplySerialNum}, $self->{cpqRackPowerSupplyFWRev}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('ps', $self->{name}); + my $info = sprintf 'power supply %s is %s, condition is %s (%s)', + $self->{name}, $self->{cpqRackPowerSupplyPresent}, + $self->{cpqRackPowerSupplyCondition}, $self->{serfw}; + $self->add_info($info); + if ($self->{cpqRackPowerSupplyPresent} eq 'present') { + if ($self->{cpqRackPowerSupplyCondition} eq 'degraded') { + $info .= sprintf " (SparePartNum %s)", $self->{cpqRackPowerSupplySparePartNumber}; + $self->add_message(WARNING, $info); + $self->add_info(sprintf 'power supply %s status is %s, inp.line status is %s', + $self->{name}, $self->{cpqRackPowerSupplyStatus}, + $self->{cpqRackPowerSupplySupplyInputLineStatus}); + } elsif ($self->{cpqRackPowerSupplyCondition} eq 'failed') { + $info .= sprintf " (SparePartNum %s)", $self->{cpqRackPowerSupplySparePartNumber}; + $self->add_message(CRITICAL, $info); + $self->add_info(sprintf 'power supply %s status is %s, inp.line status is %s', + $self->{name}, $self->{cpqRackPowerSupplyStatus}, + $self->{cpqRackPowerSupplySupplyInputLineStatus}); + } + if ($self->{runtime}->{options}->{perfdata} != 2) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('watt_%s', $self->{name}), + value => $self->{cpqRackPowerSupplyCurPwrOutput}, + warning => $self->{cpqRackPowerSupplyMaxPwrOutput}, + critical => $self->{cpqRackPowerSupplyMaxPwrOutput} + ); + #$self->{runtime}->{plugin}->add_perfdata( + # label => sprintf('watt_pct_%s', $self->{name}), + # value => ($self->{cpqRackPowerSupplyCurPwrOutput} == 0 ? 0 : + # sprintf ("%.2f", + # ($self->{cpqRackPowerSupplyCurPwrOutput} / + # $self->{cpqRackPowerSupplyMaxPwrOutput} * 100))), + # warning => 100, + # critical => 100, + # uom => '%', + #); + if ($self->{cpqRackPowerSupplyIntakeTemp} != -1) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('in_temp_%s', $self->{name}), + value => $self->{cpqRackPowerSupplyIntakeTemp}, + ); + } + if ($self->{cpqRackPowerSupplyExhaustTemp} != -1) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('out_temp_%s', $self->{name}), + value => $self->{cpqRackPowerSupplyExhaustTemp}, + ); + } + } + } +} + +sub dump { + my $self = shift; + printf "[POWER_SUPPLY%s]\n", $self->{name}; + foreach (qw(cpqRackPowerSupplyRack cpqRackPowerSupplyChassis cpqRackPowerSupplyIndex cpqRackPowerSupplyEnclosureName cpqRackPowerSupplySerialNum cpqRackPowerSupplySparePartNumber cpqRackPowerSupplyFWRev cpqRackPowerSupplyMaxPwrOutput cpqRackPowerSupplyCurPwrOutput cpqRackPowerSupplyIntakeTemp cpqRackPowerSupplyExhaustTemp cpqRackPowerSupplyStatus cpqRackPowerSupplySupplyInputLineStatus cpqRackPowerSupplyPresent cpqRackPowerSupplyCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/ServerBladeSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/ServerBladeSubsystem.pm new file mode 100755 index 0000000..2b41f7c --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/BladeSystem/Component/ServerBladeSubsystem.pm @@ -0,0 +1,158 @@ +package HP::BladeSystem::Component::ServerBladeSubsystem; +our @ISA = qw(HP::BladeSystem::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + server_blades => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $oids = { + cpqRackServerBladeEntry => '1.3.6.1.4.1.232.22.2.4.1.1.1', + cpqRackServerBladeRack => '1.3.6.1.4.1.232.22.2.4.1.1.1.1', + cpqRackServerBladeChassis => '1.3.6.1.4.1.232.22.2.4.1.1.1.2', + cpqRackServerBladeIndex => '1.3.6.1.4.1.232.22.2.4.1.1.1.3', + cpqRackServerBladeName => '1.3.6.1.4.1.232.22.2.4.1.1.1.4', + cpqRackServerBladeEnclosureName => '1.3.6.1.4.1.232.22.2.4.1.1.1.5', + cpqRackServerBladePartNumber => '1.3.6.1.4.1.232.22.2.4.1.1.1.6', + cpqRackServerBladeSparePartNumber => '1.3.6.1.4.1.232.22.2.4.1.1.1.7', + cpqRackServerBladePosition => '1.3.6.1.4.1.232.22.2.4.1.1.1.8', + cpqRackServerBladeHeight => '1.3.6.1.4.1.232.22.2.4.1.1.1.9', + cpqRackServerBladeWidth => '1.3.6.1.4.1.232.22.2.4.1.1.1.10', + cpqRackServerBladeDepth => '1.3.6.1.4.1.232.22.2.4.1.1.1.11', + cpqRackServerBladePresent => '1.3.6.1.4.1.232.22.2.4.1.1.1.12', + cpqRackServerBladeHasFuses => '1.3.6.1.4.1.232.22.2.4.1.1.1.13', + cpqRackServerBladeEnclosureSerialNum => '1.3.6.1.4.1.232.22.2.4.1.1.1.14', + cpqRackServerBladeSlotsUsed => '1.3.6.1.4.1.232.22.2.4.1.1.1.15', + cpqRackServerBladeStatus => '1.3.6.1.4.1.232.22.2.4.1.1.1.21', + cpqRackServerBladeDiagnosticString => '1.3.6.1.4.1.232.22.2.4.1.1.1.24', + cpqRackServerBladePowered => '1.3.6.1.4.1.232.22.2.4.1.1.1.25', + cpqRackServerBladePOSTStatus => '1.3.6.1.4.1.232.22.2.4.1.1.1.35', + cpqRackServerBladePresentValue => { + 1 => 'other', + 2 => 'absent', + 3 => 'present', + }, + cpqRackServerBladeStatusValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + cpqRackServerBladePoweredValue => { + 0 => 'aechz', + 1 => 'other', + 2 => 'on', + 3 => 'off', + 4 => 'powerStagedOff', + 5 => 'reboot', + }, + cpqRackServerBladePOSTStatusValue => { + 1 => 'other', + 2 => 'started', + 3 => 'completed', + 4 => 'failed', + }, + }; + + + # INDEX { cpqRackServerBladeRack, cpqRackServerBladeChassis, cpqRackServerBladeIndex } + # dreckada dreck, dreckada + foreach ($self->get_entries($oids, 'cpqRackServerBladeEntry')) { + push(@{$self->{server_blades}}, + HP::BladeSystem::Component::ServerBladeSubsystem::ServerBlade->new(%{$_})); + } +} + +sub check { + my $self = shift; + foreach (@{$self->{server_blades}}) { + $_->check() if $_->{cpqRackServerBladePresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent blades nur bei -vvv + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{server_blades}}) { + $_->dump() if $_->{cpqRackServerBladePresent} eq 'present' || + $self->{runtime}->{options}->{verbose} >= 3; # absent blades nur bei -vvv + } +} + + +package HP::BladeSystem::Component::ServerBladeSubsystem::ServerBlade; +our @ISA = qw(HP::BladeSystem::Component::ServerBladeSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqRackServerBlade/, keys %params; + $self->{cpqRackServerBladeDiagnosticString} ||= ''; + $self->{name} = $self->{cpqRackServerBladeRack}. + ':'.$self->{cpqRackServerBladeChassis}. + ':'.$self->{cpqRackServerBladeIndex}; + bless $self, $class; + $self->init(); +#printf "%s\n", Data::Dumper::Dumper(\%params); + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('sb', $self->{name}); + my $info = sprintf 'server blade %s \'%s\' is %s, status is %s, powered is %s', + $self->{name}, $self->{cpqRackServerBladeName}, $self->{cpqRackServerBladePresent}, + $self->{cpqRackServerBladeStatus}, $self->{cpqRackServerBladePowered}; + $self->add_info($info); + if ($self->{cpqRackServerBladePowered} eq 'on') { + if ($self->{cpqRackServerBladeStatus} eq 'degraded') { + $self->add_message(WARNING, sprintf 'server blade %s diag is \'%s\', post status is %s', + $self->{cpqRackServerBladeName}, $self->{cpqRackServerBladeDiagnosticString}, + $self->{cpqRackServerBladePOSTStatus}); + } elsif ($self->{cpqRackServerBladeStatus} eq 'failed') { + $self->add_message(CRITICAL, sprintf 'server blade %s diag is \'%s\', post status is %s', + $self->{cpqRackServerBladeName}, $self->{cpqRackServerBladeDiagnosticString}, + $self->{cpqRackServerBladePOSTStatus}); + } + } +} + +sub dump { + my $self = shift; + printf "[SERVER_BLADE_%s]\n", $self->{cpqRackServerBladeName}; + foreach (qw(cpqRackServerBladeRack cpqRackServerBladeChassis cpqRackServerBladeIndex cpqRackServerBladeName cpqRackServerBladeEnclosureName cpqRackServerBladePartNumber cpqRackServerBladeSparePartNumber cpqRackServerBladePosition cpqRackServerBladeHeight cpqRackServerBladeWidth cpqRackServerBladeDepth cpqRackServerBladePresent cpqRackServerBladeHasFuses cpqRackServerBladeEnclosureSerialNum cpqRackServerBladeSlotsUsed cpqRackServerBladeStatus cpqRackServerBladeDiagnosticString cpqRackServerBladePowered cpqRackServerBladePOSTStatus)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant.pm new file mode 100755 index 0000000..6b0f1ac --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant.pm @@ -0,0 +1,771 @@ +package HP::Proliant; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; +use Data::Dumper; + +our @ISA = qw(HP::Server); + +sub init { + my $self = shift; + $self->{components} = { + powersupply_subsystem => undef, + fan_subsystem => undef, + temperature_subsystem => undef, + cpu_subsystem => undef, + memory_subsystem => undef, + nic_subsystem => undef, + disk_subsystem => undef, + asr_subsystem => undef, + event_subsystem => undef, + battery_subsystem => undef, + }; + $self->{serial} = 'unknown'; + $self->{product} = 'unknown'; + $self->{romversion} = 'unknown'; + $self->collect(); + if (! $self->{runtime}->{plugin}->check_messages() && + ! exists $self->{noinst_hint}) { + $self->set_serial(); + $self->check_for_buggy_firmware(); + $self->analyze_cpus(); + $self->analyze_powersupplies(); + $self->analyze_fan_subsystem(); + $self->analyze_temperatures(); + $self->analyze_memory_subsystem(); + $self->analyze_nic_subsystem(); + $self->analyze_disk_subsystem(); + $self->analyze_asr_subsystem(); + $self->analyze_event_subsystem(); + $self->analyze_battery_subsystem(); + $self->auto_blacklist(); + $self->check_cpus(); + $self->check_powersupplies(); + $self->check_fan_subsystem(); + $self->check_temperatures(); + $self->check_memory_subsystem(); + $self->check_nic_subsystem(); + $self->check_disk_subsystem(); + $self->check_asr_subsystem(); + $self->check_event_subsystem(); + $self->check_battery_subsystem(); + } +} + +sub identify { + my $self = shift; + foreach (qw(product serial romversion)) { + $self->{$_} =~ s/^\s+//; + $self->{$_} =~ s/\s+$//; + } + return sprintf "System: '%s', S/N: '%s', ROM: '%s'", + $self->{product}, $self->{serial}, $self->{romversion}; +} + +sub check_for_buggy_firmware { + my $self = shift; + my @buggyfirmwares = ( + "P24 12/11/2001", + "P24 11/15/2002", + "D13 06/03/2003", + "D13 09/15/2004", + "P20 12/17/2002" + ); + if ($self->{romversion} =~ /^\w+ \d+\/\d+\/\d+$/) { + $self->{runtime}->{options}->{buggy_firmware} = + grep /^$self->{romversion}/, @buggyfirmwares; + } else { + # nicht parsbarer schrott in cpqSeSysRomVer, gesehen bei Gen9 + $self->{runtime}->{options}->{buggy_firmware} = undef; + } +} + +sub dump { + my $self = shift; + printf STDERR "serial %s\n", $self->{serial}; + printf STDERR "product %s\n", $self->{product}; + printf STDERR "romversion %s\n", $self->{romversion}; + printf STDERR "%s\n", Data::Dumper::Dumper($self->{components}); +} + +sub analyze_powersupplies { + my $self = shift; + $self->{components}->{powersupply_subsystem} = + HP::Proliant::Component::PowersupplySubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_fan_subsystem { + my $self = shift; + $self->{components}->{fan_subsystem} = + HP::Proliant::Component::FanSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_temperatures { + my $self = shift; + $self->{components}->{temperature_subsystem} = + HP::Proliant::Component::TemperatureSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_cpus { + my $self = shift; + $self->{components}->{cpu_subsystem} = + HP::Proliant::Component::CpuSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_memory_subsystem { + my $self = shift; + $self->{components}->{memory_subsystem} = + HP::Proliant::Component::MemorySubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_nic_subsystem { + my $self = shift; + return if $self->{method} ne "snmp"; + $self->{components}->{nic_subsystem} = + HP::Proliant::Component::NicSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_disk_subsystem { + my $self = shift; + $self->{components}->{disk_subsystem} = + HP::Proliant::Component::DiskSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_asr_subsystem { + my $self = shift; + $self->{components}->{asr_subsystem} = + HP::Proliant::Component::AsrSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_event_subsystem { + my $self = shift; + $self->{components}->{event_subsystem} = + HP::Proliant::Component::EventSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_battery_subsystem { + my $self = shift; + $self->{components}->{battery_subsystem} = + HP::Proliant::Component::BatterySubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub check_cpus { + my $self = shift; + $self->{components}->{cpu_subsystem}->check(); + $self->{components}->{cpu_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_powersupplies { + my $self = shift; + $self->{components}->{powersupply_subsystem}->check(); + $self->{components}->{powersupply_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_fan_subsystem { + my $self = shift; + $self->{components}->{fan_subsystem}->check(); + $self->{components}->{fan_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_temperatures { + my $self = shift; + $self->{components}->{temperature_subsystem}->check(); + $self->{components}->{temperature_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_memory_subsystem { + my $self = shift; + $self->{components}->{memory_subsystem}->check(); + $self->{components}->{memory_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_nic_subsystem { + my $self = shift; + return if $self->{method} ne "snmp"; + if ($self->{runtime}->{plugin}->{opts}->get('eval-nics')) { + $self->{components}->{nic_subsystem}->check(); + $self->{components}->{nic_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; + } +} +sub check_disk_subsystem { + my $self = shift; + $self->{components}->{disk_subsystem}->check(); + $self->{components}->{disk_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; + # zum anhaengen an die normale ausgabe... da: 2 logical drives, 5 physical... + $self->{runtime}->{plugin}->add_message(OK, + $self->{components}->{disk_subsystem}->{summary}) + if $self->{components}->{disk_subsystem}->{summary}; +} + +sub check_asr_subsystem { + my $self = shift; + $self->{components}->{asr_subsystem}->check(); + $self->{components}->{asr_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_event_subsystem { + my $self = shift; + $self->{components}->{event_subsystem}->check(); + $self->{components}->{event_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_battery_subsystem { + my $self = shift; + $self->{components}->{battery_subsystem}->check(); + $self->{components}->{battery_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub auto_blacklist() { + my $self = shift; + if ($self->{product} =~ /380 g6/) { + # http://bizsupport1.austin.hp.com/bc/docs/support/SupportManual/c01723408/c01723408.pdf seite 19 + if ($self->{components}->{cpu_subsystem}->num_cpus() == 1) { + $self->add_blacklist('ff/f:5,6'); + } + } elsif ($self->{product} =~ /380 g6/) { + # http://bizsupport1.austin.hp.com/bc/docs/support/SupportManual/c01704762/c01704762.pdf Fan 2 is only required when processor 2 is installed in the server. + } +} + + +package HP::Proliant::CLI; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +our @ISA = qw(HP::Proliant); + +sub collect { + my $self = shift; + my $hpasmcli = undef; + if (($self->{runtime}->{plugin}->opts->hpasmcli) && + (-f $self->{runtime}->{plugin}->opts->hpasmcli) && + (! -x $self->{runtime}->{plugin}->opts->hpasmcli)) { + no strict 'refs'; + open(BIRK, $self->{runtime}->{plugin}->opts->hpasmcli); + # all output in one file prefixed with server|powersupply|fans|temp|dimm + while(<BIRK>) { + chomp; + $self->{rawdata} .= $_."\n"; + } + close BIRK; + # If you run this script and redirect it's output to a file + # you can use it for testing purposes with + # --hpasmcli <output> + # It must not be executable. (chmod 644) + my $diag = <<'EOEO'; + hpasmcli=$(which hpasmcli) + hpacucli=$(which hpacucli) + for i in server powersupply fans temp dimm + do + $hpasmcli -s "show $i" | while read line + do + printf "%s %s\n" $i "$line" + done + done + if [ -x "$hpacucli" ]; then + for i in config status + do + $hpacucli ctrl all show $i | while read line + do + printf "%s %s\n" $i "$line" + done + done + fi +EOEO + } else { + #die "exec hpasmcli"; + # alles einsammeln und in rawdata stecken + my $hpasmcli = undef; + $hpasmcli = $self->{runtime}->{plugin}->opts->hpasmcli ? + $self->{runtime}->{plugin}->opts->hpasmcli : '/sbin/hpasmcli'; +# check if this exists at all +# descend the directory + if ($self->{runtime}->{plugin}->opts->hpasmcli && + -e $self->{runtime}->{plugin}->opts->hpasmcli) { + $hpasmcli = $self->{runtime}->{plugin}->opts->hpasmcli; + } elsif (-e '/sbin/hpasmcli') { + $hpasmcli = '/sbin/hpasmcli'; + } else { + $hpasmcli = undef; + } + if ($hpasmcli) { + if ($< != 0) { + close STDIN; + $hpasmcli = "sudo -S ".$hpasmcli; + } + $self->trace(2, sprintf "calling %s\n", $hpasmcli); + $self->check_daemon(); + if (! $self->{runtime}->{plugin}->check_messages()) { + $self->check_hpasm_client($hpasmcli); + if (! $self->{runtime}->{plugin}->check_messages()) { + foreach my $component (qw(server fans temp dimm powersupply iml)) { + if (open HPASMCLI, "$hpasmcli -s \"show $component\" </dev/null |") { + my @output = <HPASMCLI>; + close HPASMCLI; + $self->{rawdata} .= join("\n", map { + $component.' '.$_; + } @output); + } + } + if ($self->{runtime}->{options}->{hpacucli}) { + #1 oder 0. pfad selber finden + my $hpacucli = undef; + if (-e '/usr/sbin/hpssacli') { + $hpacucli = '/usr/sbin/hpssacli'; + } elsif (-e '/usr/local/sbin/hpssacli') { + $hpacucli = '/usr/local/sbin/hpssacli'; + } elsif (-e '/usr/sbin/hpacucli') { + $hpacucli = '/usr/sbin/hpacucli'; + } elsif (-e '/usr/local/sbin/hpacucli') { + $hpacucli = '/usr/local/sbin/hpacucli'; + } elsif (-e '/usr/sbin/hpssacli') { + $hpacucli = '/usr/sbin/hpssacli'; + } elsif (-e '/usr/local/sbin/hpssacli') { + $hpacucli = '/usr/local/sbin/hpssacli'; + } else { + $hpacucli = $hpasmcli; + $hpacucli =~ s/^sudo\s*//; + $hpacucli =~ s/hpasmcli/hpacucli/; + $hpacucli = -e $hpacucli ? $hpacucli : undef; + if (! $hpacucli) { + $hpacucli = $hpasmcli; + $hpacucli =~ s/^sudo\s*//; + $hpacucli =~ s/hpasmcli/hpssacli/; + $hpacucli = -e $hpacucli ? $hpacucli : undef; + } + } + if ($hpacucli) { + if ($< != 0) { + close STDIN; + $hpacucli = "sudo -S ".$hpacucli; + } + $self->trace(2, sprintf "calling %s\n", $hpacucli); + $self->check_hpacu_client($hpacucli); + if (! $self->{runtime}->{plugin}->check_messages()) { + if (open HPACUCLI, "$hpacucli ctrl all show status 2>&1|") { + my @output = <HPACUCLI>; + close HPACUCLI; + $self->{rawdata} .= join("\n", map { + 'status '.$_; + } @output); + } + if (open HPACUCLI, "$hpacucli ctrl all show config 2>&1|") { + my @output = <HPACUCLI>; + close HPACUCLI; + $self->{rawdata} .= join("\n", map { + 'config '.$_; + } @output); + if (grep /Syntax error at "config"/, @output) { + # older version of hpacucli CLI 7.50.18.0 + foreach my $slot (0..10) { + if (open HPACUCLI, "$hpacucli ctrl slot=$slot logicaldrive all show 2>&1|") { + my @output = <HPACUCLI>; + close HPACUCLI; + $self->{rawdata} .= join("\n", map { + 'config '.$_; + } @output); + } + if (open HPACUCLI, "$hpacucli ctrl slot=$slot physicaldrive all show 2>&1|") { + my @output = <HPACUCLI>; + close HPACUCLI; + $self->{rawdata} .= join("\n", map { + 'config '.$_; + } @output); + } + } + } + } + } elsif ($self->{runtime}->{options}->{hpacucli} == 2) { + # we probably don't have sudo-privileges, but we were compiled with + # --enable-hpacucli=maybe + # so we cover it up in silence + $self->remove_message(UNKNOWN); + $self->trace(2, sprintf "calling %s seems to have failed, but nobody cares\n", $hpacucli); + } + } else { + if ($self->{runtime}->{options}->{noinstlevel} eq 'ok') { + $self->add_message(OK, + 'hpacucli is not installed. let\'s hope the best...'); + } else { + $self->add_message( + uc $self->{runtime}->{options}->{noinstlevel}, + 'hpacucli is not installed.'); + } + } + } + } + } + } else { + if ($self->{runtime}->{options}->{noinstlevel} eq 'ok') { + $self->add_message(OK, + 'hpasm is not installed, i can only guess'); + $self->{noinst_hint} = 1; + } else { + $self->add_message( + uc $self->{runtime}->{options}->{noinstlevel}, + 'hpasmcli is not installed.'); + } + } + } +} + + +sub check_daemon { + my $self = shift; + my $multiproc_os_signatures_files = { + '/etc/SuSE-release' => 'VERSION\s*=\s*8', + '/etc/trustix-release' => '.*', + '/etc/redhat-release' => '.*Pensacola.*', + '/etc/debian_version' => '3\.1', + '/etc/issue' => '.*Kernel 2\.4\.9-vmnix2.*', # VMware ESX Server 2.5.4 + }; + if (open PS, "/bin/ps -e -ocmd|") { + my $numprocs = 0; + my $numcliprocs = 0; + my @procs = <PS>; + close PS; + $numprocs = grep /hpasm.*d$/, map { (split /\s+/, $_)[0] } @procs; + $numcliprocs = grep /hpasmcli/, grep !/check_hpasm/, @procs; + if (! $numprocs ) { + $self->add_message(CRITICAL, 'hpasmd needs to be restarted'); + } elsif ($numprocs > 1) { + my $known = 0; + foreach my $osfile (keys %{$multiproc_os_signatures_files}) { + if (-f $osfile) { + open OSSIG, $osfile; + if (grep /$multiproc_os_signatures_files->{$osfile}/, <OSSIG>) { + $known = 1; + } + close OSSIG; + } + } + if (! $known) { + $self->add_message(UNKNOWN, 'multiple hpasmd procs'); + } + } + if ($numcliprocs == 1) { + $self->add_message(UNKNOWN, 'another hpasmcli is running'); + } elsif ($numcliprocs > 1) { + $self->add_message(UNKNOWN, 'hanging hpasmcli processes'); + } + } +} + +sub check_hpasm_client { + my $self = shift; + my $hpasmcli = shift; + if (open HPASMCLI, "$hpasmcli -s help 2>&1 |") { + my @output = <HPASMCLI>; + close HPASMCLI; + if (grep /Could not communicate with hpasmd/, @output) { + $self->add_message(CRITICAL, 'hpasmd needs to be restarted'); + } elsif (grep /(asswor[dt]:)|(You must be root)/, @output) { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpasmcli); + } elsif (grep /must have a tty/, @output) { + $self->add_message(CRITICAL, + 'sudo must be configured with requiretty=no (man sudo)'); + } elsif (grep /ERROR: hpasmcli only runs on HPE Proliant Servers/, @output) { + $self->add_message(UNKNOWN, "hpasmcli detected incompatible hardware"); + } elsif (! grep /CLEAR/, @output) { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpasmcli); + } + } else { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpasmcli); + } +} + +sub check_hpacu_client { + my $self = shift; + my $hpacucli = shift; + if (open HPACUCLI, "$hpacucli help 2>&1 |") { + my @output = <HPACUCLI>; + close HPACUCLI; + if (grep /Another instance of hpacucli is running/, @output) { + $self->add_message(UNKNOWN, 'another hpacucli is running'); + } elsif (grep /You need to have administrator rights/, @output) { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpacucli); + } elsif (grep /(asswor[dt]:)|(You must be root)/, @output) { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpacucli); + } elsif (! grep /(CLI Syntax)|(ACU CLI)/, @output) { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpacucli); + } + } else { + $self->add_message(UNKNOWN, + sprintf "insufficient rights to call %s", $hpacucli); + } +} + +sub set_serial { + my $self = shift; + foreach (grep(/^server/, split(/\n/, $self->{rawdata}))) { + if (/System\s+:\s+(.*[^\s])/) { + $self->{product} = lc $1; + } elsif (/Serial No\.\s+:\s+(\w+)/) { + $self->{serial} = $1; + } elsif (/ROM version\s+:\s+(.*[^\s])/) { + $self->{romversion} = $1; + } + } + $self->{serial} = $self->{serial}; + $self->{product} = lc $self->{product}; + $self->{romversion} = $self->{romversion}; + foreach (qw(serial product romversion)) { + $self->{$_} =~ s/\s+$//g; + } +} + + +package HP::Proliant::SNMP; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +our @ISA = qw(HP::Proliant); + +sub collect { + my $self = shift; + my %oidtables = ( + system => "1.3.6.1.2.1.1", + cpqSeProcessor => "1.3.6.1.4.1.232.1.2.2", + cpqHePWSComponent => "1.3.6.1.4.1.232.6.2.9", + cpqHeThermal => "1.3.6.1.4.1.232.6.2.6", + cpqHeMComponent => "1.3.6.1.4.1.232.6.2.14", + cpqDaComponent => "1.3.6.1.4.1.232.3.2", + cpqSiComponent => "1.3.6.1.4.1.232.2.2", + cpqSeRom => "1.3.6.1.4.1.232.1.2.6", + cpqSasComponent => "1.3.6.1.4.1.232.5", + cpqIdeComponent => "1.3.6.1.4.1.232.14", + cpqFcaComponent => "1.3.6.1.4.1.232.16.2", + cpqHeAsr => "1.3.6.1.4.1.232.6.2.5", + cpqNic => "1.3.6.1.4.1.232.18.2", + cpqHeEventLog => "1.3.6.1.4.1.232.6.2.11", + cpqHeSysBackupBattery => "1.3.6.1.4.1.232.6.2.17", + + # cpqHeComponent => "1.3.6.1.4.1.232.6.2", + # cpqHeFComponent => "1.3.6.1.4.1.232.6.2.6.7", + # cpqHeTComponent => "1.3.6.1.4.1.232.6.2.6.8", + ); + my %oidvalues = ( + cpqHeEventLogSupported => "1.3.6.1.4.1.232.6.2.11.1.0", + cpqHeEventLogCondition => "1.3.6.1.4.1.232.6.2.11.2.0", + cpqNicIfLogMapOverallCondition => "1.3.6.1.4.1.232.18.2.2.2.0", + cpqHeThermalTempStatus => "1.3.6.1.4.1.232.6.2.6.3.0", + cpqHeThermalSystemFanStatus => "1.3.6.1.4.1.232.6.2.6.4.0", + cpqHeThermalCpuFanStatus => "1.3.6.1.4.1.232.6.2.6.5.0", + cpqHeAsrStatus => "1.3.6.1.4.1.232.6.2.5.1.0", + cpqHeAsrCondition => "1.3.6.1.4.1.232.6.2.5.17.0", + ); + if ($self->{runtime}->{plugin}->opts->snmpwalk) { + my $cpqSeMibCondition = '1.3.6.1.4.1.232.1.1.3.0'; # 2=ok + my $cpqHeMibCondition = '1.3.6.1.4.1.232.6.1.3.0'; # hat nicht jeder + if ($self->{productname} =~ /4LEE/) { + # rindsarsch! + $self->{rawdata}->{$cpqHeMibCondition} = 0; + } + if (! exists $self->{rawdata}->{$cpqHeMibCondition} && + ! exists $self->{rawdata}->{$cpqSeMibCondition}) { # vlt. geht doch was + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqhlth-mib)'); + } + $self->{fullrawdata} = {}; + %{$self->{fullrawdata}} = %{$self->{rawdata}}; + $self->{rawdata} = {}; + if (! $self->{runtime}->{plugin}->check_messages()) { + # for a better simulation, only put those oids into + # rawdata which would also be put by a real snmp agent. + foreach my $table (keys %oidtables) { + my $oid = $oidtables{$table}; + $oid =~ s/\./\\./g; + my $tmpoids = {}; + my $tic = time; + map { $tmpoids->{$_} = $self->{fullrawdata}->{$_} } + grep /^$oid/, %{$self->{fullrawdata}}; + my $tac = time; + $self->trace(2, sprintf "%03d seconds for walk %s (%d oids)", + $tac - $tic, $table, scalar(keys %{$tmpoids})); + map { $self->{rawdata}->{$_} = $tmpoids->{$_} } keys %{$tmpoids}; + } + my @oids = values %oidvalues; + map { $self->{rawdata}->{$_} = $self->{fullrawdata}->{$_} } @oids; + } + } else { + my $net_snmp_version = Net::SNMP->VERSION(); # 5.002000 or 6.000000 + #$params{'-translate'} = [ + # -all => 0x0 + #]; + my ($session, $error) = + Net::SNMP->session(%{$self->{runtime}->{snmpparams}}); + if (! defined $session) { + $self->{plugin}->add_message(CRITICAL, 'cannot create session object'); + $self->trace(1, Data::Dumper::Dumper($self->{runtime}->{snmpparams})); + } else { + $session->translate(['-timeticks' => 0]); + # revMajor is often used for discovery of hp devices + my $cpqHeMibRev = '1.3.6.1.4.1.232.6.1'; + my $cpqHeMibRevMajor = '1.3.6.1.4.1.232.6.1.1.0'; + my $cpqHeMibCondition = '1.3.6.1.4.1.232.6.1.3.0'; + my $result = $session->get_request( + -varbindlist => [$cpqHeMibCondition] + ); + if ($self->{productname} =~ /4LEE/) { + # rindsarsch! + $result->{$cpqHeMibCondition} = 0; + } + if (!defined($result) || + $result->{$cpqHeMibCondition} eq 'noSuchInstance' || + $result->{$cpqHeMibCondition} eq 'noSuchObject' || + $result->{$cpqHeMibCondition} eq 'endOfMibView') { + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqhlth-mib)'); + $session->close; + } else { + # this is not reliable. many agents return 4=failed + #if ($result->{$cpqHeMibCondition} != 2) { + # $obstacle = "cmapeerstart"; + #} + } + } + if (! $self->{runtime}->{plugin}->check_messages()) { + # snmp peer is alive + $self->trace(2, sprintf "Protocol is %s", + $self->{runtime}->{snmpparams}->{'-version'}); + $session->translate; + my $response = {}; #break the walk up in smaller pieces + foreach my $table (keys %oidtables) { + my $oid = $oidtables{$table}; + my $tic = time; + my $tmpresponse = $session->get_table( + -baseoid => $oid); + if (scalar (keys %{$tmpresponse}) == 0) { + $self->trace(2, sprintf "maxrepetitions failed. fallback"); + $tmpresponse = $session->get_table( + -maxrepetitions => 1, + -baseoid => $oid); + } + my $tac = time; + $self->trace(2, sprintf "%03d seconds for walk %s (%d oids)", + $tac - $tic, $table, scalar(keys %{$tmpresponse})); + map { $response->{$_} = $tmpresponse->{$_} } keys %{$tmpresponse}; + } + my @oids = values %oidvalues; + my $tic = time; + my $tmpresponse = $session->get_request( + -varbindlist => \@oids, + ); + my $tac = time; + $self->trace(2, sprintf "%03d seconds for get various (%d oids)", + $tac - $tic, scalar(keys %{$tmpresponse})); + map { $response->{$_} = $tmpresponse->{$_} } keys %{$tmpresponse}; + $session->close(); + $self->{rawdata} = $response; + } + } + return $self->{runtime}->{plugin}->check_messages(); +} + +sub set_serial { + my $self = shift; + + my $cpqSiSysSerialNum = "1.3.6.1.4.1.232.2.2.2.1.0"; + my $cpqSiProductName = "1.3.6.1.4.1.232.2.2.4.2.0"; + my $cpqSeSysRomVer = "1.3.6.1.4.1.232.1.2.6.1.0"; + my $cpqSeRedundantSysRomVer = "1.3.6.1.4.1.232.1.2.6.4.0"; + + $self->{serial} = + SNMP::Utils::get_object($self->{rawdata}, $cpqSiSysSerialNum); + $self->{product} = + SNMP::Utils::get_object($self->{rawdata}, $cpqSiProductName); + $self->{romversion} = + SNMP::Utils::get_object($self->{rawdata}, $cpqSeSysRomVer); + $self->{redundantromversion} = + SNMP::Utils::get_object($self->{rawdata}, $cpqSeRedundantSysRomVer); + if ($self->{romversion} && $self->{romversion} =~ + #/(\d{2}\/\d{2}\/\d{4}).*?([ADP]{1}\d{2}).*/) { + /(\d{2}\/\d{2}\/\d{4}).*?Family.*?([A-Z]{1})(\d+).*/) { + $self->{romversion} = sprintf("%s%02d %s", $2, $3, $1); + } elsif ($self->{romversion} && $self->{romversion} =~ + /([ADP]{1}\d{2})\-(\d{2}\/\d{2}\/\d{4})/) { + $self->{romversion} = sprintf("%s %s", $1, $2); + } else { + # fallback if romversion is broken, redundantromversion not + #.1.3.6.1.4.1.232.1.2.6.1.0 = STRING: "4), Family " + #.1.3.6.1.4.1.232.1.2.6.3.0 = "" + #.1.3.6.1.4.1.232.1.2.6.4.0 = STRING: "v1.20 (08/26/2014), Family " + if ($self->{redundantromversion} && $self->{redundantromversion} =~ + /(\d{2}\/\d{2}\/\d{4}).*?Family.*?([A-Z]{1})(\d+).*/) { + $self->{romversion} = sprintf("%s%02d %s", $2, $3, $1); + } elsif ($self->{redundantromversion} && $self->{redundantromversion} =~ + /([ADP]{1}\d{2})\-(\d{2}\/\d{2}\/\d{4})/) { + $self->{romversion} = sprintf("%s %s", $1, $2); + } + } + if (!$self->{serial} && $self->{romversion}) { + # this probably is a very, very old server. + $self->{serial} = "METHUSALEM"; + $self->{runtime}->{scrapiron} = 1; + } + $self->{serial} = $self->{serial}; + $self->{product} = lc $self->{product}; + $self->{romversion} = $self->{romversion}; + $self->{runtime}->{product} = $self->{product}; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component.pm new file mode 100755 index 0000000..cefab99 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component.pm @@ -0,0 +1,5 @@ +package HP::Proliant::Component; +our @ISA = qw(HP::Proliant); + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem.pm new file mode 100755 index 0000000..fccfb3d --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem.pm @@ -0,0 +1,45 @@ +package HP::Proliant::Component::AsrSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + temperatures => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::AsrSubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::AsrSubsystem::CLI->new(%params); + } else { + die "unknown method"; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking ASR'); + $self->overall_check(); +} + +sub dump { + my $self = shift; +} + + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem/CLI.pm new file mode 100755 index 0000000..68dad8a --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem/CLI.pm @@ -0,0 +1,32 @@ +package HP::Proliant::Component::AsrSubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::AsrSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; +} + +sub overall_check { + my $self = shift; + my %params = @_; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem/SNMP.pm new file mode 100755 index 0000000..823ccf4 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/AsrSubsystem/SNMP.pm @@ -0,0 +1,68 @@ +package HP::Proliant::Component::AsrSubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::AsrSubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->overall_init(%params); + return $self; +} + +sub overall_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $params{rawdata}; + my $cpqHeAsrStatus = "1.3.6.1.4.1.232.6.2.5.1.0"; + my $cpqHeAsrStatusValue = { + 1 => "other", + 2 => "notAvailable", + 3 => "disabled", + 4 => "enabled", + }; + my $cpqHeAsrCondition = "1.3.6.1.4.1.232.6.2.5.17.0"; + my $cpqHeAsrConditionValue = { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }; + $self->{asrcondition} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeAsrCondition, + $cpqHeAsrConditionValue); + $self->{asrstatus} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeAsrStatus, + $cpqHeAsrStatusValue); + $self->{asrcondition} |= lc $self->{asrcondition}; + $self->{asrstatus} |= lc $self->{asrstatus}; +} + +sub overall_check { + my $self = shift; + my $result = 0; + $self->blacklist('asr', ''); + if ($self->{asrstatus} and $self->{asrstatus} eq "enabled") { + my $info = sprintf 'ASR overall condition is %s', $self->{asrcondition}; + if ($self->{asrcondition} eq "degraded") { + $self->add_message(WARNING, $info); + } elsif ($self->{asrcondition} eq "failed") { + $self->add_message(CRITICAL, $info); + } + $self->add_info($info); + } else { + $self->add_info('This system does not have ASR.'); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem.pm new file mode 100755 index 0000000..82da78d --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem.pm @@ -0,0 +1,124 @@ +package HP::Proliant::Component::BatterySubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + sysbatteries => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::BatterySubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + #return HP::Proliant::Component::BatterySubsystem::CLI->new(%params); + } else { + die "unknown method"; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking sysbatteries'); + if (scalar (@{$self->{sysbatteries}}) == 0) { + #$self->overall_check(); + $self->add_info('no sysbatteries found'); + } else { + foreach (sort { $a->{cpqHeSysBatteryIndex} <=> $b->{cpqHeSysBatteryIndex}} + @{$self->{sysbatteries}}) { + $_->check(); + } + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{sysbatteries}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::BatterySubsystem::Battery; +our @ISA = qw(HP::Proliant::Component::BatterySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqHeSysBatteryChassis => $params{cpqHeSysBatteryChassis}, + cpqHeSysBatteryIndex => $params{cpqHeSysBatteryIndex}, + cpqHeSysBatteryPresent => $params{cpqHeSysBatteryPresent}, + cpqHeSysBatteryCondition => $params{cpqHeSysBatteryCondition}, + cpqHeSysBatteryStatus => $params{cpqHeSysBatteryStatus}, + cpqHeSysBatteryCapacityMaximum => $params{cpqHeSysBatteryCapacityMaximum}, + cpqHeSysBatteryProductName => $params{cpqHeSysBatteryProductName}, + cpqHeSysBatteryModel => $params{cpqHeSysBatteryModel}, + cpqHeSysBatterySerialNumber => $params{cpqHeSysBatterySerialNumber}, + cpqHeSysBatteryFirmwareRev => $params{cpqHeSysBatteryFirmwareRev}, + cpqHeSysBatterySparePartNum => $params{cpqHeSysBatterySparePartNum}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + $self->{name} = $params{name} || + $self->{cpqHeSysBatteryChassis}.':'.$self->{cpqHeSysBatteryIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('sba', $self->{name}); + my $info = sprintf "battery %s/%s has condition %s and status %s", + $self->{cpqHeSysBatteryChassis}, + $self->{cpqHeSysBatteryIndex}, + $self->{cpqHeSysBatteryCondition}, + $self->{cpqHeSysBatteryStatus}; + if ($self->{cpqHeSysBatteryCondition} eq "ok") { + } elsif ($self->{cpqHeSysBatteryCondition} eq "degraded") { + $self->add_info($info); + $self->add_message(WARNING, $self->{info}); + } elsif ($self->{cpqHeSysBatteryCondition} eq "failed") { + $self->add_info($info); + $self->add_message(CRITICAL, $self->{info}); + } else { + $self->add_info($info); + $self->add_message(UNKNOWN, $self->{info}); + } +} + +sub dump { + my $self = shift; + printf "[SYSBATTERY_%s_%s]\n", $self->{cpqHeSysBatteryChassis}, + $self->{cpqHeSysBatteryIndex}; + foreach (qw(cpqHeSysBatteryChassis cpqHeSysBatteryIndex + cpqHeSysBatteryPresent cpqHeSysBatteryCondition cpqHeSysBatteryStatus + cpqHeSysBatteryCapacityMaximum cpqHeSysBatteryProductName + cpqHeSysBatteryModel cpqHeSysBatterySerialNumber + cpqHeSysBatteryFirmwareRev cpqHeSysBatterySparePartNum)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n\n", $self->{info}; +} + + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem/CLI.pm new file mode 100755 index 0000000..46211e6 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem/CLI.pm @@ -0,0 +1,27 @@ +package HP::Proliant::Component::BatterySubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::BatterySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem/SNMP.pm new file mode 100755 index 0000000..2fb23df --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/BatterySubsystem/SNMP.pm @@ -0,0 +1,78 @@ +package HP::Proliant::Component::BatterySubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::BatterySubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + sysbatteries => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeSysBatteryTable => '1.3.6.1.4.1.232.6.2.17.2', + cpqHeSysBatteryEntry => '1.3.6.1.4.1.232.6.2.17.2.1', + cpqHeSysBatteryChassis => '1.3.6.1.4.1.232.6.2.17.2.1.1', + cpqHeSysBatteryIndex => '1.3.6.1.4.1.232.6.2.17.2.1.2', + cpqHeSysBatteryPresent => '1.3.6.1.4.1.232.6.2.17.2.1.3', + cpqHeSysBatteryPresentValue => { + '1' => 'other', + '2' => 'absent', + '3' => 'present', + }, + cpqHeSysBatteryCondition => '1.3.6.1.4.1.232.6.2.17.2.1.4', + cpqHeSysBatteryConditionValue => { + '1' => 'other', + '2' => 'ok', + '3' => 'degraded', + '4' => 'failed', + }, + cpqHeSysBatteryStatus => '1.3.6.1.4.1.232.6.2.17.2.1.5', + cpqHeSysBatteryStatusValue => { + '1' => 'noError', + '2' => 'generalFailure', + '3' => 'shutdownHighResistance', + '4' => 'shutdownLowVoltage', + '5' => 'shutdownShortCircuit', + '6' => 'shutdownChargeTimeout', + '7' => 'shutdownOverTemperature', + '8' => 'shutdownDischargeMinVoltage', + '9' => 'shutdownDischargeCurrent', + '10' => 'shutdownLoadCountHigh', + '11' => 'shutdownEnablePin', + '12' => 'shutdownOverCurrent', + '13' => 'shutdownPermanentFailure', + '14' => 'shutdownBackupTimeExceeded', + }, + cpqHeSysBatteryCapacityMaximum => '1.3.6.1.4.1.232.6.2.17.2.1.6', + cpqHeSysBatteryProductName => '1.3.6.1.4.1.232.6.2.17.2.1.7', + cpqHeSysBatteryModel => '1.3.6.1.4.1.232.6.2.17.2.1.8', + cpqHeSysBatterySerialNumber => '1.3.6.1.4.1.232.6.2.17.2.1.9', + cpqHeSysBatteryFirmwareRev => '1.3.6.1.4.1.232.6.2.17.2.1.10', + cpqHeSysBatterySparePartNum => '1.3.6.1.4.1.232.6.2.17.2.1.11', + }; + # INDEX { cpqHeSysBatteryChassis, cpqHeSysBatteryIndex } + foreach ($self->get_entries($oids, 'cpqHeSysBatteryEntry')) { + next if ! $_->{cpqHeSysBatteryPresent} eq "present"; + push(@{$self->{sysbatteries}}, + HP::Proliant::Component::BatterySubsystem::Battery->new(%{$_})); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem.pm new file mode 100755 index 0000000..0486fd9 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem.pm @@ -0,0 +1,112 @@ +package HP::Proliant::Component::CpuSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; +################################## scrapiron ########## + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + cpus => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::CpuSubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::CpuSubsystem::CLI->new(%params); + } else { + die "unknown method"; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking cpus'); + if (scalar (@{$self->{cpus}}) == 0) { + # sachen gibts..... + # $self->overall_check(); # sowas ist mir nur einmal untergekommen + } else { + foreach (@{$self->{cpus}}) { + $_->check(); + } + } +} + +sub num_cpus { + my $self = shift; + return scalar @{$self->{cpus}}; +} + +sub dump { + my $self = shift; + foreach (@{$self->{cpus}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::CpuSubsystem::Cpu; +our @ISA = qw(HP::Proliant::Component::CpuSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqSeCpuSlot => $params{cpqSeCpuSlot}, + cpqSeCpuUnitIndex => $params{cpqSeCpuUnitIndex}, + cpqSeCpuName => $params{cpqSeCpuName}, + cpqSeCpuStatus => $params{cpqSeCpuStatus}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('c', $self->{cpqSeCpuUnitIndex}); + if ($self->{cpqSeCpuStatus} ne "ok") { + if ($self->{runtime}->{options}{scrapiron} && + ($self->{cpqSeCpuStatus} eq "unknown")) { + $self->add_info(sprintf "cpu %d probably ok (%s)", + $self->{cpqSeCpuUnitIndex}, $self->{cpqSeCpuStatus}); + } else { + $self->add_info(sprintf "cpu %d needs attention (%s)", + $self->{cpqSeCpuUnitIndex}, $self->{cpqSeCpuStatus}); + $self->add_message(CRITICAL, $self->{info}); + } + } else { + $self->add_info(sprintf "cpu %d is %s", + $self->{cpqSeCpuUnitIndex}, $self->{cpqSeCpuStatus}); + } + $self->add_extendedinfo(sprintf "cpu_%s=%s", + $self->{cpqSeCpuUnitIndex}, $self->{cpqSeCpuStatus}); +} + +sub dump { + my $self = shift; + printf "[CPU_%s]\n", $self->{cpqSeCpuUnitIndex}; + foreach (qw(cpqSeCpuSlot cpqSeCpuUnitIndex cpqSeCpuName cpqSeCpuStatus)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem/CLI.pm new file mode 100755 index 0000000..8953417 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem/CLI.pm @@ -0,0 +1,57 @@ +package HP::Proliant::Component::CpuSubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::CpuSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + cpus => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + my %tmpcpu = ( + runtime => $params{runtime}, + ); + my $inblock = 0; + foreach (grep(/^server/, split(/\n/, $self->{rawdata}))) { + if (/Processor:\s+(\d+)/) { + $tmpcpu{cpqSeCpuUnitIndex} = $1; + $inblock = 1; + } elsif (/Name\s*:\s+(.+?)\s*$/) { + $tmpcpu{cpqSeCpuName} = $1; + } elsif (/Status\s*:\s+(.+?)\s*$/) { + $tmpcpu{cpqSeCpuStatus} = lc $1; + } elsif (/Socket\s*:\s+(.+?)\s*$/) { + $tmpcpu{cpqSeCpuSlot} = $1; + } elsif (/^server\s*$/) { + if ($inblock) { + $inblock = 0; + push(@{$self->{cpus}}, + HP::Proliant::Component::CpuSubsystem::Cpu->new(%tmpcpu)); + %tmpcpu = ( + runtime => $params{runtime}, + ); + } + } + } + if ($inblock) { + push(@{$self->{cpus}}, + HP::Proliant::Component::CpuSubsystem::Cpu->new(%tmpcpu)); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem/SNMP.pm new file mode 100755 index 0000000..0824d04 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/CpuSubsystem/SNMP.pm @@ -0,0 +1,50 @@ +package HP::Proliant::Component::CpuSubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::CpuSubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + cpus => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + # CPQSTDEQ-MIB + my $oids = { + cpqSeCpuEntry => '1.3.6.1.4.1.232.1.2.2.1.1', + cpqSeCpuUnitIndex => '1.3.6.1.4.1.232.1.2.2.1.1.1', + cpqSeCpuSlot => '1.3.6.1.4.1.232.1.2.2.1.1.2', + cpqSeCpuName => '1.3.6.1.4.1.232.1.2.2.1.1.3', + cpqSeCpuStatus => '1.3.6.1.4.1.232.1.2.2.1.1.6', + cpqSeCpuStatusValue => { + 1 => "unknown", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + 5 => "disabled", + }, + }; + + # INDEX { cpqSeCpuUnitIndex } + foreach ($self->get_entries($oids, 'cpqSeCpuEntry')) { + push(@{$self->{cpus}}, + HP::Proliant::Component::CpuSubsystem::Cpu->new(%{$_})); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem.pm new file mode 100755 index 0000000..bd50a87 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem.pm @@ -0,0 +1,159 @@ +package HP::Proliant::Component::DiskSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + da_subsystem => undef, + sas_da_subsystem => undef, + ide_da_subsystem => undef, + fca_da_subsystem => undef, + scsi_da_subsystem => undef, + condition => $params{condition}, + blacklisted => 0, + }; + bless $self, $class; + $self->init(); + return $self; +} + +sub init { + my $self = shift; + $self->{da_subsystem} = HP::Proliant::Component::DiskSubsystem::Da->new( + runtime => $self->{runtime}, + rawdata => $self->{rawdata}, + method => $self->{method}, + ); + $self->{sas_subsystem} = HP::Proliant::Component::DiskSubsystem::Sas->new( + runtime => $self->{runtime}, + rawdata => $self->{rawdata}, + method => $self->{method}, + ); + $self->{scsi_subsystem} = HP::Proliant::Component::DiskSubsystem::Scsi->new( + runtime => $self->{runtime}, + rawdata => $self->{rawdata}, + method => $self->{method}, + ); + $self->{ide_subsystem} = HP::Proliant::Component::DiskSubsystem::Ide->new( + runtime => $self->{runtime}, + rawdata => $self->{rawdata}, + method => $self->{method}, + ); + $self->{fca_subsystem} = HP::Proliant::Component::DiskSubsystem::Fca->new( + runtime => $self->{runtime}, + rawdata => $self->{rawdata}, + method => $self->{method}, + ); +} + +sub check { + my $self = shift; + $self->add_info('checking disk subsystem'); + $self->{da_subsystem}->check(); + $self->{sas_subsystem}->check(); + $self->{scsi_subsystem}->check(); + $self->{ide_subsystem}->check(); + $self->{fca_subsystem}->check(); + $self->disk_summary(); +} + +sub dump { + my $self = shift; + $self->{da_subsystem}->dump(); + $self->{sas_subsystem}->dump(); + $self->{scsi_subsystem}->dump(); + $self->{ide_subsystem}->dump(); + $self->{fca_subsystem}->dump(); +} + +sub disk_summary { + my $self = shift; + foreach my $subsys (qw(da sas scsi ide fca)) { + if (my $pd = $self->{$subsys.'_subsystem'}->has_physical_drives()) { + my $ld = $self->{$subsys.'_subsystem'}->has_logical_drives(); + $self->add_summary(sprintf '%s: %d logical drives, %d physical drives', + $subsys, $ld, $pd); + } + } +} + +sub assemble { + my $self = shift; + $self->trace(3, sprintf "%s controllers und platten zusammenfuehren", + ref($self)); + $self->trace(3, sprintf "has %d controllers", + scalar(@{$self->{controllers}})); + $self->trace(3, sprintf "has %d accelerators", + scalar(@{$self->{accelerators}})) if exists $self->{accelerators}; + $self->trace(3, sprintf "has %d enclosures", + scalar(@{$self->{enclosures}})); + $self->trace(3, sprintf "has %d physical_drives", + scalar(@{$self->{physical_drives}})); + $self->trace(3, sprintf "has %d logical_drives", + scalar(@{$self->{logical_drives}})); + $self->trace(3, sprintf "has %d spare_drives", + scalar(@{$self->{spare_drives}})); + my $found = { + accelerators => {}, + enclosures => {}, + logical_drives => {}, + physical_drives => {}, + spare_drives => {}, + }; + # found->{komponente}->{controllerindex} ist ein array + # von teilen, die zu einem controller gehoeren + foreach my $item (qw(accelerators enclosures logical_drives physical_drives spare_drives)) { + next if ($item eq "enclosures" && ! exists $self->{$item}); + foreach (@{$self->{$item}}) { + $found->{item}->{$_->{controllerindex}} = [] + unless exists $found->{$item}->{$_->{controllerindex}}; + push(@{$found->{$item}->{$_->{controllerindex}}}, $_); + } + } + foreach my $item (qw(accelerators enclosures logical_drives physical_drives spare_drives)) { + foreach (@{$self->{controllers}}) { + if (exists $found->{$item}->{$_->{controllerindex}}) { + $_->{$item} = $found->{$item}->{$_->{controllerindex}}; + delete $found->{$item}->{$_->{controllerindex}}; + } else { + $_->{$item} = []; # z.b. ein leerer controller: physical_drives = [] + } + } + } + # was jetzt noch in $found uebrig ist, gehoert zu keinem controller + # d.h. komponenten mit ungueltigen cnrtlindex wurden gefunden +} + +sub has_controllers { + my $self = shift; + return scalar(@{$self->{controllers}}); +} + +sub has_accelerators { + my $self = shift; + return exists $self->{accelerators} ? scalar(@{$self->{accelerators}}) : 0; +} + +sub has_physical_drives { + my $self = shift; + return scalar(@{$self->{physical_drives}}); +} + +sub has_logical_drives { + my $self = shift; + return scalar(@{$self->{logical_drives}}); +} + +sub has_enclosures { + my $self = shift; + return scalar(@{$self->{enclosures}}); +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da.pm new file mode 100755 index 0000000..5dbc5ef --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da.pm @@ -0,0 +1,407 @@ +package HP::Proliant::Component::DiskSubsystem::Da; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + condition => undef, + blacklisted => 0, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Da::SNMP'; + } else { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Da::CLI'; + } + $self->init(); + $self->assemble(); + return $self; +} + +sub check { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->dump(); + } +} + +package HP::Proliant::Component::DiskSubsystem::Da::Controller; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqDaCntlrIndex => $params{cpqDaCntlrIndex}, + cpqDaCntlrSlot => $params{cpqDaCntlrSlot}, + cpqDaCntlrModel => $params{cpqDaCntlrModel}, + cpqDaCntlrCondition => $params{cpqDaCntlrCondition}, + cpqDaCntlrBoardCondition => $params{cpqDaCntlrBoardCondition}, + blacklisted => 0, + }; + $self->{name} = $params{name} || $self->{cpqDaCntlrSlot}; + $self->{controllerindex} = $self->{cpqDaCntlrIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; +#$self->dumper($self); + $self->blacklist('daco', $self->{cpqDaCntlrIndex}); + foreach (@{$self->{accelerators}}) { + $_->check(); + } + foreach (@{$self->{enclosures}}) { + $_->check(); + } + foreach (@{$self->{logical_drives}}) { + $_->check(); + } + foreach (@{$self->{physical_drives}}) { + $_->check(); + } + foreach (@{$self->{spare_drives}}) { + $_->check(); + } + if ($self->{cpqDaCntlrCondition} eq 'other') { + if (scalar(@{$self->{physical_drives}})) { + $self->add_message(CRITICAL, + sprintf 'da controller %s in slot %s needs attention', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + $self->add_info(sprintf 'da controller %s in slot %s needs attention', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + } else { + $self->add_info(sprintf 'da controller %s in slot %s is ok and unused', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + $self->{blacklisted} = 1; + } + } elsif ($self->{cpqDaCntlrCondition} eq 'degraded') { + # maybe only the battery has failed and is disabled, no problem + if (scalar(grep { + $_->has_failed() && $_->is_disabled() + } @{$self->{accelerators}})) { + # message was already written in the accel code + } else { + $self->add_message(CRITICAL, + sprintf 'da controller %s in slot %s needs attention', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + $self->add_info(sprintf 'da controller %s in slot %s needs attention', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + } + } elsif ($self->{cpqDaCntlrCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf 'da controller %s in slot %s needs attention', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + $self->add_info(sprintf 'da controller %s in slot %s needs attention', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + } else { + $self->add_info(sprintf 'da controller %s in slot %s is ok', + $self->{cpqDaCntlrIndex}, $self->{cpqDaCntlrSlot}); + } +} + +sub dump { + my $self = shift; + printf "[DA_CONTROLLER_%s]\n", $self->{name}; + foreach (qw(cpqDaCntlrSlot cpqDaCntlrIndex cpqDaCntlrCondition + cpqDaCntlrModel)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; + foreach (@{$self->{accelerators}}) { + $_->dump(); + } + foreach (@{$self->{enclosures}}) { + $_->dump(); + } + foreach (@{$self->{logical_drives}}) { + $_->dump(); + } + foreach (@{$self->{physical_drives}}) { + $_->dump(); + } + foreach (@{$self->{spare_drives}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::DiskSubsystem::Da::Accelerator; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqDaAccelCntlrIndex => $params{cpqDaAccelCntlrIndex}, + cpqDaAccelBattery => $params{cpqDaAccelBattery} || 'notPresent', + cpqDaAccelCondition => $params{cpqDaAccelCondition}, + cpqDaAccelStatus => $params{cpqDaAccelStatus}, + cpqDaAccelErrCode => $params{cpqDaAccelErrCode}, + blacklisted => 0, + failed => 0, + }; + $self->{controllerindex} = $self->{cpqDaAccelCntlrIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('daac', $self->{cpqDaAccelCntlrIndex}); + $self->add_info(sprintf 'controller accelerator is %s', + $self->{cpqDaAccelCondition}); + if ($self->{cpqDaAccelCondition} eq "failed" || $self->{cpqDaAccelCondition} eq "degraded") { + $self->add_message(CRITICAL, sprintf + "controller accelerator is %s (reason: %s) and needs attention", + $self->{cpqDaAccelCondition}, $self->{cpqDaAccelErrCode}); + } + $self->blacklist('daacb', $self->{cpqDaAccelCntlrIndex}); + $self->add_info(sprintf 'controller accelerator battery is %s', + $self->{cpqDaAccelBattery}); + if ($self->{cpqDaAccelBattery} eq "notPresent") { + } elsif ($self->{cpqDaAccelBattery} eq "recharging") { + $self->add_message(WARNING, "controller accelerator battery recharging"); + } elsif ($self->{cpqDaAccelBattery} eq "failed" && + $self->{cpqDaAccelStatus} eq "tmpDisabled") { + $self->add_message(WARNING, "controller accelerator battery needs attention"); + } elsif ($self->{cpqDaAccelBattery} ne "ok") { + # (other) failed degraded + $self->add_message(CRITICAL, "controller accelerator battery needs attention"); + } +} + +sub has_failed { + my $self = shift; + return $self->{cpqDaAccelStatus} =~ /Disabled/ ? 1 : 0; +} + +sub is_disabled { + my $self = shift; + return $self->{cpqDaAccelStatus} =~ /Disabled/ ? 1 : 0; +} + +sub dump { + my $self = shift; + printf "[ACCELERATOR]\n"; + foreach (qw(cpqDaAccelCntlrIndex cpqDaAccelBattery + cpqDaAccelStatus cpqDaAccelCondition cpqDaAccelErrCode)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + +package HP::Proliant::Component::DiskSubsystem::Da::Enclosure; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + name => $params{name}, + cpqDaEnclCntlrIndex => $params{cpqDaEnclCntlrIndex}, + cpqDaEnclIndex => $params{cpqDaEnclIndex}, + cpqDaEnclPort => $params{cpqDaEnclPort}, + cpqDaEnclBox => $params{cpqDaEnclBox}, + cpqDaEnclCondition => $params{cpqDaEnclCondition}, + blacklisted => 0, + }; + bless $self, $class; + $self->{name} = $params{name} || + $self->{cpqDaEnclPort}.':'.$self->{cpqDaEnclBox}; ##vorerst + $self->{controllerindex} = $self->{cpqDaEnclCntlrIndex}; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('dae', $self->{name}); + $self->add_info( + sprintf "disk enclosure %s is %s", + $self->{name}, $self->{cpqDaEnclCondition}); + if ($self->{cpqDaEnclCondition} !~ /^OK/) { + $self->add_message(CRITICAL, + sprintf "disk enclosure %s is %s", + $self->{name}, $self->{cpqDaEnclCondition}); + } +} + +sub dump { + my $self = shift; + printf "[Disk Enclosure]\n"; + foreach (qw(cpqDaEnclCntlrIndex cpqDaEnclIndex cpqDaEnclPort + cpqDaEnclBox cpqDaEnclCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + +package HP::Proliant::Component::DiskSubsystem::Da::LogicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqDaLogDrvIndex => $params{cpqDaLogDrvIndex}, + cpqDaLogDrvCntlrIndex => $params{cpqDaLogDrvCntlrIndex}, + cpqDaLogDrvSize => $params{cpqDaLogDrvSize}, + cpqDaLogDrvFaultTol => $params{cpqDaLogDrvFaultTol}, + cpqDaLogDrvPercentRebuild => $params{cpqDaLogDrvPercentRebuild}, + cpqDaLogDrvStatus => $params{cpqDaLogDrvStatus}, + cpqDaLogDrvCondition => $params{cpqDaLogDrvCondition}, + cpqDaLogDrvPhyDrvIDs => $params{cpqDaLogDrvPhyDrvIDs}, + blacklisted => 0, + }; + bless $self, $class; + $self->{name} = $params{name} || + $self->{cpqDaLogDrvCntlrIndex}.':'.$self->{cpqDaLogDrvIndex}; ##vorerst + $self->{controllerindex} = $self->{cpqDaLogDrvCntlrIndex}; + if (! $self->{cpqDaLogDrvPercentRebuild} || + $self->{cpqDaLogDrvPercentRebuild} == 4294967295) { + $self->{cpqDaLogDrvPercentRebuild} = 100; + } + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('dald', $self->{name}); + $self->add_info(sprintf "logical drive %s is %s (%s)", + $self->{name}, $self->{cpqDaLogDrvStatus}, + $self->{cpqDaLogDrvFaultTol}); + if ($self->{cpqDaLogDrvCondition} ne "ok") { + if ($self->{cpqDaLogDrvStatus} =~ + /rebuild|recovering|recovery|expanding|queued/) { + $self->add_message(WARNING, + sprintf "logical drive %s is %s", + $self->{name}, $self->{cpqDaLogDrvStatus}); + } else { + $self->add_message(CRITICAL, + sprintf "logical drive %s is %s", + $self->{name}, $self->{cpqDaLogDrvStatus}); + } + } +} + +sub dump { + my $self = shift; + printf "[LOGICAL_DRIVE]\n"; + foreach (qw(cpqDaLogDrvCntlrIndex cpqDaLogDrvIndex cpqDaLogDrvSize + cpqDaLogDrvFaultTol cpqDaLogDrvStatus cpqDaLogDrvCondition + cpqDaLogDrvPercentRebuild cpqDaLogDrvPhyDrvIDs)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Da::PhysicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + name => $params{name}, + cpqDaPhyDrvCntlrIndex => $params{cpqDaPhyDrvCntlrIndex}, + cpqDaPhyDrvIndex => $params{cpqDaPhyDrvIndex}, + cpqDaPhyDrvBay => $params{cpqDaPhyDrvBay}, + cpqDaPhyDrvBusNumber => $params{cpqDaPhyDrvBusNumber}, + cpqDaPhyDrvSize => $params{cpqDaPhyDrvSize}, + cpqDaPhyDrvStatus => $params{cpqDaPhyDrvStatus}, + cpqDaPhyDrvCondition => $params{cpqDaPhyDrvCondition}, + blacklisted => 0, + }; + bless $self, $class; + $self->{name} = $params{name} || + $self->{cpqDaPhyDrvCntlrIndex}.':'.$self->{cpqDaPhyDrvIndex}; ##vorerst + $self->{controllerindex} = $self->{cpqDaPhyDrvCntlrIndex}; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('dapd', $self->{name}); + $self->add_info( + sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqDaPhyDrvCondition}); + if ($self->{cpqDaPhyDrvCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqDaPhyDrvCondition}); + } +} + +sub dump { + my $self = shift; + printf "[PHYSICAL_DRIVE]\n"; + foreach (qw(cpqDaPhyDrvCntlrIndex cpqDaPhyDrvIndex cpqDaPhyDrvBay + cpqDaPhyDrvBusNumber cpqDaPhyDrvSize cpqDaPhyDrvStatus + cpqDaPhyDrvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Da::SpareDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub dump { + my $self = shift; + printf "[SPARE_DRIVE]\n"; + foreach (qw(cpqDaPhyDrvCntlrIndex cpqDaPhyDrvIndex cpqDaPhyDrvBay + cpqDaPhyDrvBusNumber cpqDaPhyDrvSize cpqDaPhyDrvStatus + cpqDaPhyDrvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da/CLI.pm new file mode 100755 index 0000000..75d3181 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da/CLI.pm @@ -0,0 +1,239 @@ +package HP::Proliant::Component::DiskSubsystem::Da::CLI; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + my $hpacucli = $self->{rawdata}; + my $slot = 0; + my $type = "unkn"; + my @lines = (); + my $thistype = 0; + my $tmpcntl = {}; + my $tmpaccel = {}; + my $tmpld = {}; + my $tmppd = {}; + my $tmpencl = {}; + my $cntlindex = 0; + my $enclosureindex = 0; + my $ldriveindex = 0; + my $pdriveindex = 0; + my $incontroller = 0; + foreach (split(/\n/, $hpacucli)) { + next unless /^status/; + next if /^status\s*$/; + s/^status\s*//; + if (/(MSA[\s\w]+)\s+in\s+(\w+)/) { + $incontroller = 1; + $slot = $2; + $cntlindex++; + $tmpcntl->{$slot}->{cpqDaCntlrIndex} = $cntlindex; + $tmpcntl->{$slot}->{cpqDaCntlrModel} = $1; + $tmpcntl->{$slot}->{cpqDaCntlrSlot} = $slot; + } elsif (/([\s\w]+) in Slot\s+(\d+)/) { + $incontroller = 1; + $slot = $2; + $cntlindex++; + $tmpcntl->{$slot}->{cpqDaCntlrIndex} = $cntlindex; + $tmpcntl->{$slot}->{cpqDaCntlrModel} = $1; + $tmpcntl->{$slot}->{cpqDaCntlrSlot} = $slot; + } elsif (/Controller Status: (\w+)/) { + $tmpcntl->{$slot}->{cpqDaCntlrBoardCondition} = lc $1; + $tmpcntl->{$slot}->{cpqDaCntlrCondition} = lc $1; + } elsif (/Cache Status: ([\w\s]+?)\s*$/) { + # Cache Status: OK + # Cache Status: Not Configured + # Cache Status: Temporarily Disabled + $tmpaccel->{$slot}->{cpqDaAccelCntlrIndex} = $cntlindex; + $tmpaccel->{$slot}->{cpqDaAccelSlot} = $slot; + #condition: other,ok,degraded,failed + #status: other,invalid,enabled,tmpDisabled,permDisabled + $tmpaccel->{$slot}->{cpqDaAccelCondition} = lc $1; + if ($tmpaccel->{$slot}->{cpqDaAccelCondition} eq 'ok') { + $tmpaccel->{$slot}->{cpqDaAccelStatus} = 'enabled'; + } elsif ($tmpaccel->{$slot}->{cpqDaAccelCondition} eq 'not configured') { + $tmpaccel->{$slot}->{cpqDaAccelCondition} = 'ok'; + $tmpaccel->{$slot}->{cpqDaAccelStatus} = 'enabled'; + } elsif ($tmpaccel->{$slot}->{cpqDaAccelCondition} eq 'temporarily disabled') { + $tmpaccel->{$slot}->{cpqDaAccelCondition} = 'ok'; + $tmpaccel->{$slot}->{cpqDaAccelStatus} = 'tmpDisabled'; + } elsif ($tmpaccel->{$slot}->{cpqDaAccelCondition} eq 'permanently disabled') { + $tmpaccel->{$slot}->{cpqDaAccelCondition} = 'ok'; + $tmpaccel->{$slot}->{cpqDaAccelStatus} = 'permDisabled'; + } else { + $tmpaccel->{$slot}->{cpqDaAccelStatus} = 'enabled'; + } + } elsif (/Battery.* Status: (\w+)/) { + # sowas gibts auch Battery/Capacitor Status: OK + $tmpaccel->{$slot}->{cpqDaAccelBattery} = lc $1; + } elsif (/^\s*$/) { + } + } + $slot = 0; + $cntlindex = 0; + $enclosureindex = 0; + $ldriveindex = 0; + $pdriveindex = 0; + foreach (split(/\n/, $hpacucli)) { + next unless /^config/; + next if /^config\s*$/; + s/^config\s*//; + if (/(MSA[\s\w]+)\s+in\s+(\w+)/) { + $slot = $2; + $cntlindex++; + $pdriveindex = 1; + } elsif (/([\s\w]+) in Slot\s+(\d+)/) { + #if ($slot ne $2 || ! $slot) { + $cntlindex++; + # 2012-12-15 das passt nicht zur oberen schleife + # ich habe keine ahnung, was der hintergrund fuer dieses if ist + #} + $slot = $2; + $pdriveindex = 1; + } elsif (/([\s\w]+) at Port ([\w]+), Box (\d+), (.*)/) { + $enclosureindex++; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclCntlrIndex} = $cntlindex; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclIndex} = $enclosureindex; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclPort} = $2; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclBox} = $3; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclCondition} = $4; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclStatus} = + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaEnclCondition}; + $tmpencl->{$slot}->{$enclosureindex}->{cpqDaLogDrvPhyDrvIDs} = 'unknown'; + } elsif (/logicaldrive\s+(.+?)\s+\((.*)\)/) { + # logicaldrive 1 (683.5 GB, RAID 5, OK) + # logicaldrive 1 (683.5 GB, RAID 5, OK) + # logicaldrive 2 (442 MB, RAID 1+0, OK) + $ldriveindex = $1; + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvCntlrIndex} = $cntlindex; + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvIndex} = $ldriveindex; + ($tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvSize}, + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvFaultTol}, + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvCondition}) = + map { lc $_ } split(/,\s*/, $2); + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvStatus} = + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvCondition}; + $tmpld->{$slot}->{$ldriveindex}->{cpqDaLogDrvPhyDrvIDs} = 'unknown'; + } elsif (/physicaldrive\s+(.+?)\s+\((.*)\)/) { + # physicaldrive 2:0 (port 2:id 0 , Parallel SCSI, 36.4 GB, OK) + # physicaldrive 2I:1:6 (port 2I:box 1:bay 6, SAS, 146 GB, OK) + # physicaldrive 1:1 (box 1:bay 1, Parallel SCSI, 146 GB, OK) + my $name = $1; + my($location, $type, $size, $status) = split(/,/, $2); + $status =~ s/^\s+//g; + $status =~ s/\s+$//g; + $status = lc $status; + my %location = (); + foreach (split(/:/, $location)) { + $location{$1} = $2 if /(\w+)\s+(\w+)/; + } + $location{box} ||= 0; + $location{id} ||= $pdriveindex; + $location{bay} ||= $location{id}; + $location{port} ||= $location{bay}; + $tmppd->{$slot}->{$name}->{name} = lc $name; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvCntlrIndex} = $cntlindex; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvIndex} = $location{id}; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvBay} = $location{bay}; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvBusNumber} = $location{port}; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvSize} = $size; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvStatus} = $status; + $tmppd->{$slot}->{$name}->{cpqDaPhyDrvCondition} = $status; + $tmppd->{$slot}->{$name}->{ldriveindex} = $ldriveindex || -1; + foreach (keys %{$tmppd->{$slot}->{$name}}) { + $tmppd->{$slot}->{$name}->{$_} =~ s/^\s+//g; + $tmppd->{$slot}->{$name}->{$_} =~ s/\s+$//g; + $tmppd->{$slot}->{$name}->{$_} = lc $tmppd->{$slot}->{$name}->{$_}; + } + $pdriveindex++; + } + } + + foreach my $slot (keys %{$tmpcntl}) { + if (exists $tmpcntl->{$slot}->{cpqDaCntlrModel} && + ! $self->identified($tmpcntl->{$slot}->{cpqDaCntlrModel})) { + delete $tmpcntl->{$slot}; + delete $tmpaccel->{$slot}; + delete $tmpencl->{$slot}; + delete $tmpld->{$slot}; + delete $tmppd->{$slot}; + } + } + +#printf "%s\n", Data::Dumper::Dumper($tmpcntl); +#printf "%s\n", Data::Dumper::Dumper($tmpaccel); +#printf "%s\n", Data::Dumper::Dumper($tmpld); +#printf "%s\n", Data::Dumper::Dumper($tmppd); + foreach my $slot (sort { + $tmpcntl->{$a}->{cpqDaCntlrIndex} <=> $tmpcntl->{$b}->{cpqDaCntlrIndex} + }keys %{$tmpcntl}) { + $tmpcntl->{$slot}->{runtime} = $self->{runtime}; + push(@{$self->{controllers}}, + HP::Proliant::Component::DiskSubsystem::Da::Controller->new( + %{$tmpcntl->{$slot}})); + } + foreach my $slot (sort { + $tmpaccel->{$a}->{cpqDaAccelCntlrIndex} <=> $tmpaccel->{$b}->{cpqDaAccelCntlrIndex} + } keys %{$tmpaccel}) { + $tmpaccel->{$slot}->{runtime} = $self->{runtime}; + push(@{$self->{accelerators}}, + HP::Proliant::Component::DiskSubsystem::Da::Accelerator->new( + %{$tmpaccel->{$slot}})); + } + foreach my $slot (keys %{$tmpencl}) { + foreach my $enclosureindex (keys %{$tmpencl->{$slot}}) { + $tmpencl->{$slot}->{$enclosureindex}->{runtime} = $self->{runtime}; + push(@{$self->{enclosures}}, + HP::Proliant::Component::DiskSubsystem::Da::Enclosure->new( + %{$tmpencl->{$slot}->{$enclosureindex}})); + } + } + foreach my $slot (keys %{$tmpld}) { + foreach my $ldriveindex (keys %{$tmpld->{$slot}}) { + $tmpld->{$slot}->{$ldriveindex}->{runtime} = $self->{runtime}; + push(@{$self->{logical_drives}}, + HP::Proliant::Component::DiskSubsystem::Da::LogicalDrive->new( + %{$tmpld->{$slot}->{$ldriveindex}})); + } + foreach my $pdriveindex (sort { + (split ':', $a, 2)[0] cmp (split ':', $b, 2)[0] || + (split ':', $a, 2)[1] cmp (split ':', $b, 2)[1] || + (split ':', $a, 2)[2] <=> (split ':', $b, 2)[2] + } keys %{$tmppd->{$slot}}) { + $tmppd->{$slot}->{$pdriveindex}->{runtime} = $self->{runtime}; + push(@{$self->{physical_drives}}, + HP::Proliant::Component::DiskSubsystem::Da::PhysicalDrive->new( + %{$tmppd->{$slot}->{$pdriveindex}})); + } + } +} + +sub identified { + my $self = shift; + my $info = shift; + return 1 if $info =~ /Parallel SCSI/; + return 1 if $info =~ /Smart Array/; # Trond: works fine on E200i, P400, E400 + return 1 if $info =~ /MSA500/; + #return 1 if $info =~ /Smart Array (5|6)/; + #return 1 if $info =~ /Smart Array P400i/; # snmp sagt Da, trotz SAS in cli + #return 1 if $info =~ /Smart Array P410i/; # dto + return 0; +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da/SNMP.pm new file mode 100755 index 0000000..629fe29 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Da/SNMP.pm @@ -0,0 +1,232 @@ +package HP::Proliant::Component::DiskSubsystem::Da::SNMP; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Da + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + + # CPQIDA-MIB + my $oids = { + cpqDaCntlrEntry => "1.3.6.1.4.1.232.3.2.2.1.1", + cpqDaCntlrIndex => "1.3.6.1.4.1.232.3.2.2.1.1.1", + cpqDaCntlrModel => "1.3.6.1.4.1.232.3.2.2.1.1.2", + cpqDaCntlrSlot => "1.3.6.1.4.1.232.3.2.2.1.1.5", + cpqDaCntlrCondition => "1.3.6.1.4.1.232.3.2.2.1.1.6", + cpqDaCntlrBoardCondition => "1.3.6.1.4.1.232.3.2.2.1.1.12", + cpqDaCntlrModelValue => { + 1 => 'other', + 2 => 'ida', + 3 => 'idaExpansion', + 4 => 'ida-2', + 5 => 'smart', + 6 => 'smart-2e', + 7 => 'smart-2p', + 8 => 'smart-2sl', + 9 => 'smart-3100es', + 10 => 'smart-3200', + 11 => 'smart-2dh', + 12 => 'smart-221', + 13 => 'sa-4250es', + 14 => 'sa-4200', + 15 => 'sa-integrated', + 16 => 'sa-431', + 17 => 'sa-5300', + 18 => 'raidLc2', + 19 => 'sa-5i', + 20 => 'sa-532', + 21 => 'sa-5312', + 22 => 'sa-641', + 23 => 'sa-642', + 24 => 'sa-6400', + 25 => 'sa-6400em', + 26 => 'sa-6i', + }, + cpqDaCntlrConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqDaCntlrBoardConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + + # INDEX { cpqDaCntlrIndex } + foreach ($self->get_entries($oids, 'cpqDaCntlrEntry')) { + push(@{$self->{controllers}}, + HP::Proliant::Component::DiskSubsystem::Da::Controller->new(%{$_})); + } + + $oids = { + cpqDaAccelEntry => "1.3.6.1.4.1.232.3.2.2.2.1", + cpqDaAccelCntlrIndex => "1.3.6.1.4.1.232.3.2.2.2.1.1", + cpqDaAccelStatus => "1.3.6.1.4.1.232.3.2.2.2.1.2", + cpqDaAccelErrCode => "1.3.6.1.4.1.232.3.2.2.2.1.5", + cpqDaAccelBattery => "1.3.6.1.4.1.232.3.2.2.2.1.6", + cpqDaAccelCondition => "1.3.6.1.4.1.232.3.2.2.2.1.9", + cpqDaAccelBatteryValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'recharging', + 4 => 'failed', + 5 => 'degraded', + 6 => 'notPresent', + }, + cpqDaAccelConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqDaAccelStatusValue => { + 1 => "other", + 2 => "invalid", + 3 => "enabled", + 4 => "tmpDisabled", + 5 => "permDisabled", + }, + cpqDaAccelErrCodeValue => { + 1 => 'other', + 2 => 'invalid', + 3 => 'badConfig', + 4 => 'lowBattery', + 5 => 'disableCmd', + 6 => 'noResources', + 7 => 'notConnected', + 8 => 'badMirrorData', + 9 => 'readErr', + 10 => 'writeErr', + 11 => 'configCmd', + 12 => 'expandInProgress', + 13 => 'snapshotInProgress', + 14 => 'redundantLowBattery', + 15 => 'redundantSizeMismatch', + 16 => 'redundantCacheFailure', + 17 => 'excessiveEccErrors', + 18 => 'adgEnablerMissing', + 19 => 'postEccErrors', + 20 => 'batteryHotRemoved', + 21 => 'capacitorChargeLow', + 22 => 'notEnoughBatteries', + 23 => 'cacheModuleNotSupported', + 24 => 'batteryNotSupported', + 25 => 'noCapacitorAttached', + 26 => 'capBasedBackupFailed', + 27 => 'capBasedRestoreFailed', + 28 => 'capBasedModuleHWFailure', + 29 => 'capacitorFailedToCharge', + 30 => 'capacitorBasedHWMemBeingErased', + 31 => 'incompatibleCacheModule', + 32 => 'fbcmChargerCircuitFailure', + }, + }; + + # INDEX { cpqDaAccelCntlrIndex } + foreach ($self->get_entries($oids, 'cpqDaAccelEntry')) { + push(@{$self->{accelerators}}, + HP::Proliant::Component::DiskSubsystem::Da::Accelerator->new(%{$_})); + } + + $oids = { + cpqDaLogDrvEntry => "1.3.6.1.4.1.232.3.2.3.1.1", + cpqDaLogDrvCntlrIndex => "1.3.6.1.4.1.232.3.2.3.1.1.1", + cpqDaLogDrvIndex => "1.3.6.1.4.1.232.3.2.3.1.1.2", + cpqDaLogDrvFaultTol => "1.3.6.1.4.1.232.3.2.3.1.1.3", + cpqDaLogDrvStatus => "1.3.6.1.4.1.232.3.2.3.1.1.4", + cpqDaLogDrvSize => "1.3.6.1.4.1.232.3.2.3.1.1.9", + cpqDaLogDrvPhyDrvIDs => "1.3.6.1.4.1.232.3.2.3.1.1.10", + cpqDaLogDrvCondition => "1.3.6.1.4.1.232.3.2.3.1.1.11", + cpqDaLogDrvPercentRebuild => "1.3.6.1.4.1.232.3.2.3.1.1.12", + cpqDaLogDrvFaultTolValue => { + 1 => "other", + 2 => "none", + 3 => "mirroring", + 4 => "dataGuard", + 5 => "distribDataGuard", + 7 => "advancedDataGuard", + }, + cpqDaLogDrvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqDaLogDrvStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + 4 => "unconfigured", + 5 => "recovering", + 6 => "readyForRebuild", + 7 => "rebuilding", + 8 => "wrongDrive", + 9 => "badConnect", + 10 => "overheating", + 11 => "shutdown", + 12 => "expanding", + 13 => "notAvailable", + 14 => "queuedForExpansion", + }, + }; + + # INDEX { cpqDaLogDrvCntlrIndex, cpqDaLogDrvIndex } + foreach ($self->get_entries($oids, 'cpqDaLogDrvEntry')) { + $_->{cpqDaLogDrvPhyDrvIDs} ||= 'empty'; + push(@{$self->{logical_drives}}, + HP::Proliant::Component::DiskSubsystem::Da::LogicalDrive->new(%{$_})); + } + + $oids = { + cpqDaPhyDrvEntry => "1.3.6.1.4.1.232.3.2.5.1.1", + cpqDaPhyDrvCntlrIndex => "1.3.6.1.4.1.232.3.2.5.1.1.1", + cpqDaPhyDrvIndex => "1.3.6.1.4.1.232.3.2.5.1.1.2", + cpqDaPhyDrvBay => "1.3.6.1.4.1.232.3.2.5.1.1.5", + cpqDaPhyDrvStatus => "1.3.6.1.4.1.232.3.2.5.1.1.6", + cpqDaPhyDrvSize => "1.3.6.1.4.1.232.3.2.5.1.1.9", + cpqDaPhyDrvCondition => "1.3.6.1.4.1.232.3.2.5.1.1.37", + cpqDaPhyDrvBusNumber => "1.3.6.1.4.1.232.3.2.5.1.1.50", + cpqDaPhyDrvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqDaPhyDrvStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + 4 => "predictiveFailure", + }, + }; + + # INDEX { cpqDaPhyDrvCntlrIndex, cpqDaPhyDrvIndex } + foreach ($self->get_entries($oids, 'cpqDaPhyDrvEntry')) { + push(@{$self->{physical_drives}}, + HP::Proliant::Component::DiskSubsystem::Da::PhysicalDrive->new(%{$_})); + } + +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca.pm new file mode 100755 index 0000000..2014697 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca.pm @@ -0,0 +1,433 @@ +package HP::Proliant::Component::DiskSubsystem::Fca; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + host_controllers => [], + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + global_status => undef, + blacklisted => 0, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Fca::SNMP'; + } else { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Fca::CLI'; + } + $self->init(); + $self->assemble(); + return $self; +} + +sub assemble { + my $self = shift; + $self->trace(3, sprintf "%s controllers und platten zusammenfuehren", + ref($self)); + $self->trace(3, sprintf "has %d host controllers", + scalar(@{$self->{host_controllers}})); + $self->trace(3, sprintf "has %d controllers", + scalar(@{$self->{controllers}})); + $self->trace(3, sprintf "has %d physical_drives", + scalar(@{$self->{physical_drives}})); + $self->trace(3, sprintf "has %d logical_drives", + scalar(@{$self->{logical_drives}})); + $self->trace(3, sprintf "has %d spare_drives", + scalar(@{$self->{spare_drives}})); +} + +sub check { + my $self = shift; + foreach (@{$self->{host_controllers}}) { + $_->check(); + } + foreach (@{$self->{controllers}}) { + $_->check(); + } + foreach (@{$self->{accelerators}}) { + $_->check(); + } + foreach (@{$self->{logical_drives}}) { + $_->check(); + } + foreach (@{$self->{physical_drives}}) { + $_->check(); + } + # wozu eigentlich? + #if (! $self->has_controllers()) { + #$self->{global_status}->check(); + #} +} + +sub dump { + my $self = shift; + foreach (@{$self->{host_controllers}}) { + $_->dump(); + } + foreach (@{$self->{controllers}}) { + $_->dump(); + } + foreach (@{$self->{accelerators}}) { + $_->dump(); + } + foreach (@{$self->{logical_drives}}) { + $_->dump(); + } + foreach (@{$self->{physical_drives}}) { + $_->dump(); + } + #$self->{global_status}->dump(); +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::GlobalStatus; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqFcaMibCondition => $params{cpqFcaMibCondition}, + }; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + if ($self->{cpqFcaMibCondition} eq 'other') { + $self->add_message(OK, + sprintf 'fcal overall condition is other, update your drivers, please'); + } elsif ($self->{cpqFcaMibCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf 'fcal overall condition is %s', $self->{cpqFcaMibCondition}); + } + $self->{info} = + sprintf 'fcal overall condition is %s', $self->{cpqFcaMibCondition}; +} + +sub dump { + my $self = shift; + printf "[FCAL]\n"; + foreach (qw(cpqFcaMibCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::HostController; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqFcaHostCntlr/, keys %params; + $self->{name} = $params{name} || $self->{cpqFcaHostCntlrIndex}; + $self->{controllerindex} = $self->{cpqFcaHostCntlrIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('fcahc', $self->{name}); + my $info = sprintf 'fcal host controller %s in slot %s is %s', + $self->{name}, $self->{cpqFcaHostCntlrSlot}, $self->{cpqFcaHostCntlrCondition}; + if ($self->{cpqFcaHostCntlrCondition} eq 'other') { + #$info .= sprintf ' and needs attention (%s)', $self->{cpqFcaHostCntlrStatus}; + # let's assume other=ok + $self->add_message(OK, $info); + $self->add_info($info); + } elsif ($self->{cpqFcaHostCntlrCondition} ne 'ok') { + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } else { + $self->add_info($info); + } + $self->blacklist('fcahco', $self->{name}); + $info = sprintf 'fcal host controller %s overall condition is %s', + $self->{name}, $self->{cpqFcaHostCntlrOverallCondition}; + if ($self->{cpqFcaHostCntlrOverallCondition} eq 'other') { + $self->add_message(OK, $info); + } elsif ($self->{cpqFcaHostCntlrOverallCondition} ne 'ok') { + $self->add_message(WARNING, $info); + } + $self->add_info($info); +} + +sub dump { + my $self = shift; + printf "[FCAL_HOST_CONTROLLER_%s]\n", $self->{name}; + foreach (qw(cpqFcaHostCntlrIndex cpqFcaHostCntlrSlot + cpqFcaHostCntlrModel cpqFcaHostCntlrStatus cpqFcaHostCntlrCondition + cpqFcaHostCntlrOverallCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::Controller; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqFcaCntlr/, keys %params; + $self->{name} = $params{name} || + $self->{cpqFcaCntlrBoxIndex}.':'.$self->{cpqFcaCntlrBoxIoSlot}; + $self->{controllerindex} = $self->{cpqFcaCntlrBoxIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('fcaco', $self->{name}); + my $info = sprintf 'fcal controller %s in box %s/slot %s is %s', + $self->{name}, $self->{cpqFcaCntlrBoxIndex}, $self->{cpqFcaCntlrBoxIoSlot}, + $self->{cpqFcaCntlrCondition}; + if ($self->{cpqFcaCntlrCondition} eq 'other') { + if (1) { # was ist mit phys. drives? + $info .= ' needs attention'; + $info .= sprintf(' (%s)', $self->{cpqFcaCntlrStatus}) unless $self->{cpqFcaCntlrStatus} eq 'ok'; + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } else { + $self->add_info($info); + $self->{blacklisted} = 1; + } + } elsif ($self->{cpqFcaCntlrCondition} ne 'ok') { + $info .= ' needs attention'; + $info .= sprintf(' (%s)', $self->{cpqFcaCntlrStatus}) unless $self->{cpqFcaCntlrStatus} eq 'ok'; + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } else { + $self->add_info($info); + } +} + +sub dump { + my $self = shift; + printf "[FCAL_CONTROLLER_%s]\n", $self->{name}; + foreach (qw(cpqFcaCntlrBoxIndex cpqFcaCntlrBoxIoSlot cpqFcaCntlrModel + cpqFcaCntlrStatus cpqFcaCntlrCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::Accelerator; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqFcaAccel/, keys %params; + $self->{name} = $params{name} || + $self->{cpqFcaAccelBoxIndex}.':'.$self->{cpqFcaAccelBoxIoSlot}; + $self->{controllerindex} = $self->{cpqFcaAccelBoxIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + # !!! cpqFcaAccelStatus + $self->blacklist('fcaac', $self->{name}); + my $info = sprintf 'fcal accelerator %s in box %s/slot %s is ', + $self->{name}, $self->{cpqFcaAccelBoxIndex}, $self->{cpqFcaAccelBoxIoSlot}; + if ($self->{cpqFcaAccelStatus} eq 'invalid') { + $info .= 'not installed'; + $self->add_info($info); + } elsif ($self->{cpqFcaAccelStatus} eq 'tmpDisabled') { + $info .= 'temp disabled'; + $self->add_info($info); + } elsif ($self->{cpqFcaAccelCondition} eq 'other') { + $info .= sprintf '%s and needs attention (%s)', + $self->{cpqFcaAccelCondition}, $self->{cpqFcaAccelErrCode}; + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } elsif ($self->{cpqFcaAccelCondition} ne 'ok') { + $info .= sprintf '%s and needs attention (%s)', + $self->{cpqFcaAccelCondition}, $self->{cpqFcaAccelErrCode}; + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } else { + $info .= sprintf '%s', $self->{cpqFcaAccelCondition}; + $self->add_info($info); + } +} + +sub dump { + my $self = shift; + printf "[FCAL_ACCELERATOR_%s]\n", $self->{name}; + foreach (qw(cpqFcaAccelBoxIndex cpqFcaAccelBoxIoSlot cpqFcaAccelStatus + cpqFcaAccelErrCode cpqFcaAccelBatteryStatus cpqFcaAccelCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::LogicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqFcaLogDrv/, keys %params; + bless $self, $class; + $self->{name} = $params{name} || + $self->{cpqFcaLogDrvBoxIndex}.':'. + $self->{cpqFcaLogDrvIndex}; + $self->{controllerindex} = $self->{cpqFcaLogDrvBoxIndex}; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('fcald', $self->{name}); + my $info = sprintf 'logical drive %s (%s) is %s', + $self->{name}, $self->{cpqFcaLogDrvFaultTol}, $self->{cpqFcaLogDrvCondition}; + if ($self->{cpqFcaLogDrvCondition} ne "ok") { + $info .= sprintf ' (%s)', $self->{cpqFcaLogDrvStatus}; + if ($self->{cpqFcaLogDrvStatus} =~ + /rebuild|recovering|expand/) { + $info .= sprintf ' (%s)', $self->{cpqFcaLogDrvStatus}; + $self->add_message(WARNING, $info); + } else { + $self->add_message(CRITICAL, $info); + } + } + $self->add_info($info); +} + +sub dump { + my $self = shift; + printf "[LOGICAL_DRIVE_%s]\n", $self->{name}; + foreach (qw(cpqFcaLogDrvBoxIndex cpqFcaLogDrvIndex cpqFcaLogDrvFaultTol + cpqFcaLogDrvStatus cpqFcaLogDrvPercentRebuild cpqFcaLogDrvSize + cpqFcaLogDrvPhyDrvIDs cpqFcaLogDrvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::PhysicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqFcaPhyDrv/, keys %params; + $self->{name} = $params{name} || + $self->{cpqFcaPhyDrvBoxIndex}.':'.$self->{cpqFcaPhyDrvIndex}; ####vorerst + $self->{controllerindex} = $self->{cpqScsiPhyDrvCntlrIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('fcapd', $self->{name}); + my $info = sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqFcaPhyDrvStatus}; + if ($self->{cpqFcaPhyDrvStatus} eq 'unconfigured') { + # not part of a logical drive + # condition will surely be other + } elsif ($self->{cpqFcaPhyDrvCondition} ne 'ok') { + $self->add_message(CRITICAL, $info); + } + $self->add_info($info); +} + +sub dump { + my $self = shift; + printf "[PHYSICAL_DRIVE_%s]\n", $self->{name}; + foreach (qw(cpqFcaPhyDrvBoxIndex cpqFcaPhyDrvIndex cpqFcaPhyDrvModel + cpqFcaPhyDrvBay cpqFcaPhyDrvStatus cpqFcaPhyDrvCondition + cpqFcaPhyDrvSize cpqFcaPhyDrvBusNumber)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Fca::SpareDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub dump { + my $self = shift; + printf "[SPARE_DRIVE]\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca/CLI.pm new file mode 100755 index 0000000..fd11dbc --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca/CLI.pm @@ -0,0 +1,34 @@ +package HP::Proliant::Component::DiskSubsystem::Fca::CLI; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + # ..... + $self->{global_status} = + HP::Proliant::Component::DiskSubsystem::Fca::GlobalStatus->new( + runtime => $self->{runtime}, + cpqFcaMibCondition => 'n/a', + ); + +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca/SNMP.pm new file mode 100755 index 0000000..fc603e5 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Fca/SNMP.pm @@ -0,0 +1,303 @@ +package HP::Proliant::Component::DiskSubsystem::Fca::SNMP; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Fca + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + + # CPQFCA-MIB + my $oids = { + cpqFcaHostCntlrEntry => '1.3.6.1.4.1.232.16.2.7.1.1', + cpqFcaHostCntlrIndex => '1.3.6.1.4.1.232.16.2.7.1.1.1', + cpqFcaHostCntlrSlot => '1.3.6.1.4.1.232.16.2.7.1.1.2', + cpqFcaHostCntlrModel => '1.3.6.1.4.1.232.16.2.7.1.1.3', + cpqFcaHostCntlrStatus => '1.3.6.1.4.1.232.16.2.7.1.1.4', + cpqFcaHostCntlrCondition => '1.3.6.1.4.1.232.16.2.7.1.1.5', + cpqFcaHostCntlrOverallCondition => '1.3.6.1.4.1.232.16.2.7.1.1.8', + cpqFcaHostCntlrModelValue => { + 1 => "other", + # You may need to upgrade your driver software and\or instrument + # agent(s). You have a drive array controller in the system + # that the instrument agent does not recognize. (other according to CPQFCAL-MIB) + 2 => "fchc-p", + 3 => "fchc-e", + 4 => "fchc64", + 5 => "sa-sam", + 6 => "fca-2101", + 7 => "sw64-33", + 8 => "fca-221x", + 9 => "dpfcmc", + 10 => 'fca-2404', + 11 => 'fca-2214', + 12 => 'a7298a', + 13 => 'fca-2214dc', + 14 => 'a6826a', + 15 => 'fcmcG3', + 16 => 'fcmcG4', + 17 => 'ab46xa', + 18 => 'fc-generic', + 19 => 'fca-1143', + 20 => 'fca-1243', + 21 => 'fca-2143', + 22 => 'fca-2243', + 23 => 'fca-1050', + 24 => 'fca-lpe1105', + 25 => 'fca-qmh2462', + 26 => 'fca-1142sr', + 27 => 'fca-1242sr', + 28 => 'fca-2142sr', + 29 => 'fca-2242sr', + 30 => 'fcmc20pe', + 31 => 'fca-81q', + 32 => 'fca-82q', + 33 => 'fca-qmh2562', + 34 => 'fca-81e', + 35 => 'fca-82e', + 36 => 'fca-1205', + }, + cpqFcaHostCntlrStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + 4 => "shutdown", + 5 => "loopDegraded", + 6 => "loopFailed", + 7 => "notConnected", + }, + cpqFcaHostCntlrConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqFcaHostCntlrOverallConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, # cntrl + alle associated storage boxes + }; + + # INDEX { cpqFcaHostCntlrIndex } + foreach ($self->get_entries($oids, 'cpqFcaHostCntlrEntry')) { + push(@{$self->{host_controllers}}, + HP::Proliant::Component::DiskSubsystem::Fca::HostController->new(%{$_})); + } + + $oids = { + cpqFcaCntlrEntry => '1.3.6.1.4.1.232.16.2.2.1.1', + cpqFcaCntlrBoxIndex => '1.3.6.1.4.1.232.16.2.2.1.1.1', + cpqFcaCntlrBoxIoSlot => '1.3.6.1.4.1.232.16.2.2.1.1.2', + cpqFcaCntlrModel => '1.3.6.1.4.1.232.16.2.2.1.1.3', + cpqFcaCntlrStatus => '1.3.6.1.4.1.232.16.2.2.1.1.5', + cpqFcaCntlrCondition => '1.3.6.1.4.1.232.16.2.2.1.1.6', + cpqFcaCntlrModelValue => { + 1 => "other", + 2 => "fibreArray", + 3 => "msa1000", + 4 => "smartArrayClusterStorage", + 5 => "hsg80", + 6 => "hsv110", + 7 => "msa500g2", + 8 => "msa20", + 8 => "msa1510i", + }, + cpqFcaCntlrStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + 4 => "offline", + 5 => "redundantPathOffline", + 6 => "notConnected", + }, + cpqFcaCntlrConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + + # INDEX { cpqFcaCntlrBoxIndex, cpqFcaCntlrBoxIoSlot } + foreach ($self->get_entries($oids, 'cpqFcaCntlrEntry')) { + push(@{$self->{controllers}}, + HP::Proliant::Component::DiskSubsystem::Fca::Controller->new(%{$_})); + } + + $oids = { + cpqFcaAccelEntry => '1.3.6.1.4.1.232.16.2.2.2.1', + cpqFcaAccelBoxIndex => '1.3.6.1.4.1.232.16.2.2.2.1.1', + cpqFcaAccelBoxIoSlot => '1.3.6.1.4.1.232.16.2.2.2.1.2', + cpqFcaAccelStatus => '1.3.6.1.4.1.232.16.2.2.2.1.3', + cpqFcaAccelErrCode => '1.3.6.1.4.1.232.16.2.2.2.1.5', + cpqFcaAccelBatteryStatus => '1.3.6.1.4.1.232.16.2.2.2.1.6', + cpqFcaAccelCondition => '1.3.6.1.4.1.232.16.2.2.2.1.9', + cpqFcaAccelStatusValue => { + 1 => "other", + 2 => "invalid", + 3 => "enabled", + 4 => "tmpDisabled", + 5 => "permDisabled", + }, + cpqFcaAccelErrCodeValue => { + 1 => 'other', + 2 => 'invalid', + 3 => 'badConfig', + 4 => 'lowBattery', + 5 => 'disableCmd', + 6 => 'noResources', + 7 => 'notConnected', + 8 => 'badMirrorData', + 9 => 'readErr', + 10 => 'writeErr', + 11 => 'configCmd', + 12 => 'expandInProgress', + 13 => 'snapshotInProgress', + 14 => 'redundantLowBattery', + 15 => 'redundantSizeMismatch', + 16 => 'redundantCacheFailure', + 17 => 'excessiveEccErrors', + 19 => 'postEccErrors', + }, + cpqFcaAccelBatteryStatusValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'recharging', + 4 => 'failed', + 5 => 'degraded', + 6 => 'notPresent', + }, + cpqFcaAccelConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + + # INDEX { cpqFcaAccelBoxIndex, cpqFcaAccelBoxIoSlot } + foreach ($self->get_entries($oids, 'cpqFcaAccelEntry')) { + push(@{$self->{accelerators}}, + HP::Proliant::Component::DiskSubsystem::Fca::Accelerator->new(%{$_})); + } + + $oids = { + cpqFcaLogDrvEntry => '1.3.6.1.4.1.232.16.2.3.1.1', + cpqFcaLogDrvBoxIndex => '1.3.6.1.4.1.232.16.2.3.1.1.1', + cpqFcaLogDrvIndex => '1.3.6.1.4.1.232.16.2.3.1.1.2', + cpqFcaLogDrvFaultTol => '1.3.6.1.4.1.232.16.2.3.1.1.3', + cpqFcaLogDrvStatus => '1.3.6.1.4.1.232.16.2.3.1.1.4', + cpqFcaLogDrvPercentRebuild => '1.3.6.1.4.1.232.16.2.3.1.1.6', + cpqFcaLogDrvSize => '1.3.6.1.4.1.232.16.2.3.1.1.9', + cpqFcaLogDrvPhyDrvIDs => '1.3.6.1.4.1.232.16.2.3.1.1.10', + cpqFcaLogDrvCondition => '1.3.6.1.4.1.232.16.2.3.1.1.11', + cpqFcaLogDrvFaultTolValue => { + 1 => 'other', + 2 => 'none', + 3 => 'mirroring', + 4 => 'dataGuard', + 5 => 'distribDataGuard', + 7 => 'advancedDataGuard', + }, + cpqFcaLogDrvStatusValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'failed', + 4 => 'unconfigured', + 5 => 'recovering', + 6 => 'readyForRebuild', + 7 => 'rebuilding', + 8 => 'wrongDrive', + 9 => 'badConnect', + 10 => 'overheating', + 11 => 'shutdown', + 12 => 'expanding', + 13 => 'notAvailable', + 14 => 'queuedForExpansion', + 15 => 'hardError', + }, + cpqFcaLogDrvConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + }; + + # INDEX { cpqFcaLogDrvBoxIndex, cpqFcaLogDrvIndex } + foreach ($self->get_entries($oids, 'cpqFcaLogDrvEntry')) { + push(@{$self->{logical_drives}}, + HP::Proliant::Component::DiskSubsystem::Fca::LogicalDrive->new(%{$_})); + } + + $oids = { + cpqFcaPhyDrvEntry => '1.3.6.1.4.1.232.16.2.5.1.1', + cpqFcaPhyDrvBoxIndex => '1.3.6.1.4.1.232.16.2.5.1.1.1', + cpqFcaPhyDrvIndex => '1.3.6.1.4.1.232.16.2.5.1.1.2', + cpqFcaPhyDrvModel => '1.3.6.1.4.1.232.16.2.5.1.1.3', + cpqFcaPhyDrvBay => '1.3.6.1.4.1.232.16.2.5.1.1.5', + cpqFcaPhyDrvStatus => '1.3.6.1.4.1.232.16.2.5.1.1.6', + cpqFcaPhyDrvCondition => '1.3.6.1.4.1.232.16.2.5.1.1.31', + cpqFcaPhyDrvSize => '1.3.6.1.4.1.232.16.2.5.1.1.38', + cpqFcaPhyDrvBusNumber => '1.3.6.1.4.1.232.16.2.5.1.1.42', + cpqFcaPhyDrvStatusValue => { + 1 => 'other', + 2 => 'unconfigured', + 3 => 'ok', + 4 => 'threshExceeded', + 5 => 'predictiveFailure', + 6 => 'failed', + }, + cpqFcaPhyDrvConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + }; + + # INDEX { cpqFcaPhyDrvBoxIndex, cpqFcaPhyDrvIndex } + foreach ($self->get_entries($oids, 'cpqFcaPhyDrvEntry')) { + push(@{$self->{physical_drives}}, + HP::Proliant::Component::DiskSubsystem::Fca::PhysicalDrive->new(%{$_})); + } + + $oids = { + cpqFcaMibRevMajor => '1.3.6.1.4.1.232.16.1.1.0', + cpqFcaMibRevMinor => '1.3.6.1.4.1.232.16.1.2.0', + cpqFcaMibCondition => '1.3.6.1.4.1.232.16.1.3.0', + cpqFcaMibConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + }; + $self->{global_status} = + HP::Proliant::Component::DiskSubsystem::Fca::GlobalStatus->new( + runtime => $self->{runtime}, + cpqFcaMibCondition => + SNMP::Utils::get_object_value($snmpwalk, + $oids->{cpqFcaMibCondition}, $oids->{cpqFcaMibConditionValue}) + ); +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide.pm new file mode 100755 index 0000000..fdd3230 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide.pm @@ -0,0 +1,256 @@ +package HP::Proliant::Component::DiskSubsystem::Ide; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + controllers => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + condition => undef, + blacklisted => 0, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Ide::SNMP'; + } else { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Ide::CLI'; + } + $self->init(); + $self->assemble(); + return $self; +} + +sub check { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->dump(); + } +} + +package HP::Proliant::Component::DiskSubsystem::Ide::Controller; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Ide); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqIdeControllerIndex => $params{cpqIdeControllerIndex}, + cpqIdeControllerOverallCondition => $params{cpqIdeControllerOverallCondition}, + cpqIdeControllerModel => $params{cpqIdeControllerModel}, + cpqIdeControllerSlot => $params{cpqIdeControllerSlot}, # -1 ist sysboard? + blacklisted => 0, + }; + $self->{name} = $params{name} || $self->{cpqIdeControllerIndex}; + $self->{controllerindex} = $self->{cpqIdeControllerIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('ideco', $self->{name}); + if ($self->{cpqIdeControllerOverallCondition} eq 'other') { + if (scalar(@{$self->{physical_drives}})) { + $self->add_message(CRITICAL, + sprintf 'ide controller %s in slot %s needs attention', + $self->{cpqIdeControllerIndex}, $self->{cpqIdeControllerSlot}); + $self->add_info(sprintf 'ide controller %s in slot %s needs attention', + $self->{cpqIdeControllerIndex}, $self->{cpqIdeControllerSlot}); + } else { + $self->add_info(sprintf 'ide controller %s in slot %s is ok and unused', + $self->{cpqIdeControllerIndex}, $self->{cpqIdeControllerSlot}); + $self->{blacklisted} = 1; + } + } elsif ($self->{cpqIdeControllerOverallCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf 'ide controller %s in slot %s needs attention', + $self->{cpqIdeControllerIndex}, $self->{cpqIdeControllerSlot}); + $self->add_info(sprintf 'ide controller %s in slot %s needs attention', + $self->{cpqIdeControllerIndex}, $self->{cpqIdeControllerSlot}); + } else { + $self->add_info(sprintf 'ide controller %s in slot %s is ok', + $self->{cpqIdeControllerIndex}, $self->{cpqIdeControllerSlot}); + } + foreach (@{$self->{logical_drives}}) { + $_->check(); + } + foreach (@{$self->{physical_drives}}) { + $_->check(); + } + foreach (@{$self->{spare_drives}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + printf "[IDE_CONTROLLER_%s]\n", $self->{name}; + foreach (qw(cpqIdeControllerIndex cpqIdeControllerSlot + cpqIdeControllerModel cpqIdeControllerOverallCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; + foreach (@{$self->{logical_drives}}) { + $_->dump(); + } + foreach (@{$self->{physical_drives}}) { + $_->dump(); + } + foreach (@{$self->{spare_drives}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::DiskSubsystem::Ide::LogicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Ide); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqIdeLogicalDriveControllerIndex => $params{cpqIdeLogicalDriveControllerIndex}, + cpqIdeLogicalDriveIndex => $params{cpqIdeLogicalDriveIndex}, + cpqIdeLogicalDriveRaidLevel => $params{cpqIdeLogicalDriveRaidLevel}, + cpqIdeLogicalDriveCapacity => $params{cpqIdeLogicalDriveCapacity}, + cpqIdeLogicalDriveStatus => $params{cpqIdeLogicalDriveStatus}, + cpqIdeLogicalDriveCondition => $params{cpqIdeLogicalDriveCondition}, + cpqIdeLogicalDriveDiskIds => $params{cpqIdeLogicalDriveDiskIds}, + cpqIdeLogicalDriveSpareIds => $params{cpqIdeLogicalDriveSpareIds}, + cpqIdeLogicalDriveRebuildingDisk => $params{cpqIdeLogicalDriveRebuildingDisk}, + blacklisted => 0, + }; + bless $self, $class; + $self->{name} = $params{name} || + $self->{cpqIdeLogicalDriveControllerIndex}.':'. + $self->{cpqIdeLogicalDriveIndex}; + $self->{controllerindex} = $self->{cpqIdeLogicalDriveControllerIndex}; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('ideld', $self->{name}); + if ($self->{cpqIdeLogicalDriveCondition} ne "ok") { + if ($self->{cpqIdeLogicalDriveStatus} =~ + /rebuild/) { + $self->add_message(WARNING, + sprintf "logical drive %s is %s", + $self->{name}, $self->{cpqIdeLogicalDriveStatus}); + } else { + $self->add_message(CRITICAL, + sprintf "logical drive %s is %s", + $self->{name}, $self->{cpqIdeLogicalDriveStatus}); + } + } + $self->add_info( + sprintf "logical drive %s is %s", $self->{name}, + $self->{cpqIdeLogicalDriveStatus}); +} + +sub dump { + my $self = shift; + printf "[LOGICAL_DRIVE]\n"; + foreach (qw(cpqIdeLogicalDriveControllerIndex cpqIdeLogicalDriveIndex + cpqIdeLogicalDriveRaidLevel cpqIdeLogicalDriveCapacity + cpqIdeLogicalDriveDiskIds cpqIdeLogicalDriveSpareIds + cpqIdeLogicalDriveRebuildingDisk cpqIdeLogicalDriveStatus + cpqIdeLogicalDriveCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Ide::PhysicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Ide); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqIdeAtaDiskControllerIndex => $params{cpqIdeAtaDiskControllerIndex}, + cpqIdeAtaDiskIndex => $params{cpqIdeAtaDiskIndex}, + cpqIdeAtaDiskModel => $params{cpqIdeAtaDiskModel}, + cpqIdeAtaDiskStatus => $params{cpqIdeAtaDiskStatus}, + cpqIdeAtaDiskCondition => $params{cpqIdeAtaDiskCondition}, + cpqIdeAtaDiskCapacity => $params{cpqIdeAtaDiskCapacity}, + cpqIdeAtaDiskLogicalDriveMember => $params{cpqIdeAtaDiskLogicalDriveMember}, + cpqIdeAtaDiskIsSpare => $params{cpqIdeAtaDiskIsSpare}, + blacklisted => 0, + }; + $self->{name} = $params{name} || + $self->{cpqIdeAtaDiskControllerIndex}.':'. + $self->{cpqIdeAtaDiskIndex}; ####vorerst + $self->{controllerindex} = $self->{cpqIdeAtaDiskControllerIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('idepd', $self->{name}); + if ($self->{cpqIdeAtaDiskCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqIdeAtaDiskCondition}); + } + $self->add_info( + sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqIdeAtaDiskCondition}); +} + +sub dump { + my $self = shift; + printf "[PHYSICAL_DRIVE]\n"; + foreach (qw(cpqIdeAtaDiskControllerIndex cpqIdeAtaDiskIndex + cpqIdeAtaDiskModel cpqIdeAtaDiskCapacity cpqIdeAtaDiskLogicalDriveMember + cpqIdeAtaDiskStatus cpqIdeAtaDiskCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Ide::SpareDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Ide); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub dump { + my $self = shift; + printf "[SPARE_DRIVE]\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide/CLI.pm new file mode 100755 index 0000000..babc616 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide/CLI.pm @@ -0,0 +1,27 @@ +package HP::Proliant::Component::DiskSubsystem::Ide::CLI; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Ide); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide/SNMP.pm new file mode 100755 index 0000000..86f9543 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Ide/SNMP.pm @@ -0,0 +1,115 @@ +package HP::Proliant::Component::DiskSubsystem::Ide::SNMP; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Ide + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + + # CPQIDE-MIB + my $oids = { + cpqIdeControllerEntry => '1.3.6.1.4.1.232.14.2.3.1.1', + cpqIdeControllerIndex => '1.3.6.1.4.1.232.14.2.3.1.1.1', + cpqIdeControllerOverallCondition => '1.3.6.1.4.1.232.14.2.3.1.1.2', + cpqIdeControllerModel => '1.3.6.1.4.1.232.14.2.3.1.1.3', + cpqIdeControllerSlot => '1.3.6.1.4.1.232.14.2.3.1.1.5', + cpqIdeControllerOverallConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + + # INDEX { cpqIdeControllerIndex } + foreach ($self->get_entries($oids, 'cpqIdeControllerEntry')) { + push(@{$self->{controllers}}, + HP::Proliant::Component::DiskSubsystem::Ide::Controller->new(%{$_})); + } + + $oids = { + cpqIdeLogicalDriveEntry => '1.3.6.1.4.1.232.14.2.6.1.1', + cpqIdeLogicalDriveControllerIndex => '1.3.6.1.4.1.232.14.2.6.1.1.1', + cpqIdeLogicalDriveIndex => '1.3.6.1.4.1.232.14.2.6.1.1.2', + cpqIdeLogicalDriveRaidLevel => '1.3.6.1.4.1.232.14.2.6.1.1.3', + cpqIdeLogicalDriveCapacity => '1.3.6.1.4.1.232.14.2.6.1.1.4', + cpqIdeLogicalDriveStatus => '1.3.6.1.4.1.232.14.2.6.1.1.5', + cpqIdeLogicalDriveCondition => '1.3.6.1.4.1.232.14.2.6.1.1.6', + cpqIdeLogicalDriveDiskIds => '1.3.6.1.4.1.232.14.2.6.1.1.7', + cpqIdeLogicalDriveSpareIds => '1.3.6.1.4.1.232.14.2.6.1.1.9', + cpqIdeLogicalDriveRebuildingDisk => '1.3.6.1.4.1.232.14.2.6.1.1.10', + cpqIdeLogicalDriveRaidLevelValue => { + 1 => "other", + 2 => "raid0", + 3 => "raid1", + 4 => "raid0plus1", + }, + cpqIdeLogicalDriveStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "rebuilding", + 5 => "failed", + }, + cpqIdeLogicalDriveConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + # INDEX { cpqIdeLogicalDriveControllerIndex, cpqIdeLogicalDriveIndex } + foreach ($self->get_entries($oids, 'cpqIdeLogicalDriveEntry')) { + push(@{$self->{logical_drives}}, + HP::Proliant::Component::DiskSubsystem::Ide::LogicalDrive->new(%{$_})); + } + + $oids = { + cpqIdeAtaDiskEntry => '1.3.6.1.4.1.232.14.2.4.1.1', + cpqIdeAtaDiskControllerIndex => '1.3.6.1.4.1.232.14.2.4.1.1.1', + cpqIdeAtaDiskIndex => '1.3.6.1.4.1.232.14.2.4.1.1.2', + cpqIdeAtaDiskModel => '1.3.6.1.4.1.232.14.2.4.1.1.3', + cpqIdeAtaDiskStatus => '1.3.6.1.4.1.232.14.2.4.1.1.6', + cpqIdeAtaDiskCondition => '1.3.6.1.4.1.232.14.2.4.1.1.7', + cpqIdeAtaDiskCapacity => '1.3.6.1.4.1.232.14.2.4.1.1.8', + cpqIdeAtaDiskLogicalDriveMember => '1.3.6.1.4.1.232.14.2.4.1.1.13', + cpqIdeAtaDiskIsSpare => '1.3.6.1.4.1.232.14.2.4.1.1.14', + cpqIdeAtaDiskStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "smartError", + 4 => "failed", + }, + cpqIdeAtaDiskConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + # INDEX { cpqIdeAtaDiskControllerIndex, cpqIdeAtaDiskIndex } + foreach ($self->get_entries($oids, 'cpqIdeAtaDiskEntry')) { + push(@{$self->{physical_drives}}, + HP::Proliant::Component::DiskSubsystem::Ide::PhysicalDrive->new(%{$_})); + } + +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas.pm new file mode 100755 index 0000000..bb417d4 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas.pm @@ -0,0 +1,251 @@ +package HP::Proliant::Component::DiskSubsystem::Sas; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + controllers => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + condition => undef, + blacklisted => 0, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Sas::SNMP'; + } else { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Sas::CLI'; + } + $self->init(); + $self->assemble(); + return $self; +} + +sub check { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->dump(); + } +} + +package HP::Proliant::Component::DiskSubsystem::Sas::Controller; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Sas); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqSasHbaIndex => $params{cpqSasHbaIndex}, + cpqSasHbaLocation => $params{cpqSasHbaLocation}, + cpqSasHbaSlot => $params{cpqSasHbaSlot}, + cpqSasHbaStatus => $params{cpqSasHbaStatus}, + cpqSasHbaCondition => $params{cpqSasHbaCondition}, + blacklisted => 0, + }; + $self->{name} = $params{name} || $self->{cpqSasHbaSlot}; + $self->{controllerindex} = $self->{cpqSasHbaIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('saco', $self->{cpqSasHbaSlot}); + if ($self->{cpqSasHbaCondition} eq 'other') { + if (scalar(@{$self->{physical_drives}})) { + $self->add_message(CRITICAL, + sprintf 'sas controller in slot %s needs attention', + $self->{cpqSasHbaSlot}); + $self->add_info(sprintf 'sas controller in slot %s needs attention', + $self->{cpqSasHbaSlot}); + } else { + $self->add_info(sprintf 'sas controller in slot %s is ok and unused', + $self->{cpqSasHbaSlot}); + $self->{blacklisted} = 1; + } + } elsif ($self->{cpqSasHbaCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf 'sas controller in slot %s needs attention', + $self->{cpqSasHbaSlot}); + $self->add_info(sprintf 'sas controller in slot %s needs attention', + $self->{cpqSasHbaSlot}); + } else { + $self->add_info(sprintf 'sas controller in slot %s is ok', + $self->{cpqSasHbaSlot}); + } + foreach (@{$self->{logical_drives}}) { + $_->check(); + } + foreach (@{$self->{physical_drives}}) { + $_->check(); + } + foreach (@{$self->{spare_drives}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + printf "[SAS_HBA%s]\n", $self->{name}; + foreach (qw(cpqSasHbaSlot cpqSasHbaIndex cpqSasHbaCondition + cpqSasHbaStatus cpqSasHbaLocation)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; + foreach (@{$self->{logical_drives}}) { + $_->dump(); + } + foreach (@{$self->{physical_drives}}) { + $_->dump(); + } + foreach (@{$self->{spare_drives}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::DiskSubsystem::Sas::LogicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Sas); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqSasLogDrvHbaIndex => $params{cpqSasLogDrvHbaIndex}, + cpqSasLogDrvIndex => $params{cpqSasLogDrvIndex}, + cpqSasLogDrvStatus => $params{cpqSasLogDrvStatus}, + cpqSasLogDrvCondition => $params{cpqSasLogDrvCondition}, + cpqSasLogDrvRebuildingPercent => $params{cpqSasLogDrvRebuildingPercent}, + cpqSasLogDrvRaidLevel => $params{cpqSasLogDrvRaidLevel}, + blacklisted => 0, + }; + bless $self, $class; + $self->{name} = $params{name} || + $self->{cpqSasLogDrvHbaIndex}.':'.$self->{cpqSasLogDrvIndex}; ####vorerst + $self->{controllerindex} = $self->{cpqSasLogDrvHbaIndex}; + if (! $self->{cpqSasLogDrvRebuildingPercent} || + $self->{cpqSasLogDrvRebuildingPercent} == 4294967295) { + $self->{cpqSasLogDrvRebuildingPercent} = 100; + } + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('sald', $self->{name}); + if ($self->{cpqSasLogDrvCondition} ne "ok") { + if ($self->{cpqSasLogDrvStatus} =~ + /rebuild|recovering|expanding|queued/) { + $self->add_message(WARNING, + sprintf "logical drive %s is %s", + $self->{name}, $self->{cpqSasLogDrvStatus}); + } else { + $self->add_message(CRITICAL, + sprintf "logical drive %s is %s", + $self->{name}, $self->{cpqSasLogDrvStatus}); + } + } + $self->add_info( + sprintf "logical drive %s is %s (%s)", $self->{name}, + $self->{cpqSasLogDrvStatus}, $self->{cpqSasLogDrvRaidLevel}); +} + +sub dump { + my $self = shift; + printf "[LOGICAL_DRIVE]\n"; + foreach (qw(cpqSasLogDrvHbaIndex cpqSasLogDrvIndex cpqSasLogDrvRaidLevel + cpqSasLogDrvStatus cpqSasLogDrvCondition + cpqSasLogDrvRebuildingPercent)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Sas::PhysicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Sas); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqSasPhyDrvHbaIndex => $params{cpqSasPhyDrvHbaIndex}, + cpqSasPhyDrvIndex => $params{cpqSasPhyDrvIndex}, + cpqSasPhyDrvLocationString => $params{cpqSasPhyDrvLocationString}, + cpqSasPhyDrvStatus => $params{cpqSasPhyDrvStatus}, + cpqSasPhyDrvSize => $params{cpqSasPhyDrvSize}, + cpqSasPhyDrvCondition => $params{cpqSasPhyDrvCondition}, + blacklisted => 0, + }; + $self->{name} = $params{name} || + $self->{cpqSasPhyDrvHbaIndex}.':'.$self->{cpqSasPhyDrvIndex}; ####vorerst + $self->{controllerindex} = $self->{cpqSasPhyDrvHbaIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('sapd', $self->{name}); + if ($self->{cpqSasPhyDrvCondition} ne 'ok') { + $self->add_message(CRITICAL, + sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqSasPhyDrvCondition}); + } + $self->add_info( + sprintf "physical drive %s is %s", + $self->{name}, $self->{cpqSasPhyDrvCondition}); +} + +sub dump { + my $self = shift; + printf "[PHYSICAL_DRIVE]\n"; + foreach (qw(cpqSasPhyDrvHbaIndex cpqSasPhyDrvIndex cpqSasPhyDrvLocationString + cpqSasPhyDrvSize cpqSasPhyDrvStatus cpqSasPhyDrvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Sas::SpareDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Sas); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub dump { + my $self = shift; + printf "[SPARE_DRIVE]\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas/CLI.pm new file mode 100755 index 0000000..1a250d3 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas/CLI.pm @@ -0,0 +1,27 @@ +package HP::Proliant::Component::DiskSubsystem::Sas::CLI; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Sas); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas/SNMP.pm new file mode 100755 index 0000000..cb493fd --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Sas/SNMP.pm @@ -0,0 +1,126 @@ +package HP::Proliant::Component::DiskSubsystem::Sas::SNMP; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Sas + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + + # CPQSCSI-MIB + my $oids = { + cpqSasHbaEntry => "1.3.6.1.4.1.232.5.5.1.1.1", + cpqSasHbaIndex => "1.3.6.1.4.1.232.5.5.1.1.1.1", + cpqSasHbaLocation => "1.3.6.1.4.1.232.5.5.1.1.1.2", + cpqSasHbaSlot => "1.3.6.1.4.1.232.5.5.1.1.1.6", + cpqSasHbaStatus => "1.3.6.1.4.1.232.5.5.1.1.1.4", + cpqSasHbaStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + }, + cpqSasHbaCondition => "1.3.6.1.4.1.232.5.5.1.1.1.5", + cpqSasHbaConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + }; + + # INDEX { cpqSasHbaIndex } + foreach ($self->get_entries($oids, 'cpqSasHbaEntry')) { + push(@{$self->{controllers}}, + HP::Proliant::Component::DiskSubsystem::Sas::Controller->new(%{$_})); + } + + $oids = { + cpqSasLogDrvEntry => "1.3.6.1.4.1.232.5.5.3.1.1", + cpqSasLogDrvHbaIndex => "1.3.6.1.4.1.232.5.5.3.1.1.1", + cpqSasLogDrvIndex => "1.3.6.1.4.1.232.5.5.3.1.1.2", + cpqSasLogDrvStatus => "1.3.6.1.4.1.232.5.5.3.1.1.4", + cpqSasLogDrvCondition => "1.3.6.1.4.1.232.5.5.3.1.1.5", + cpqSasLogDrvRebuildingPercent => "1.3.6.1.4.1.232.5.5.3.1.1.12", + cpqSasLogDrvRaidLevel => "1.3.6.1.4.1.232.5.5.3.1.1.3", + cpqSasLogDrvRaidLevelValue => { + 1 => "other", + 2 => "raid0", + 3 => "raid1", + 4 => "raid0plus1", + 5 => "raid5", + 6 => "raid15", + 7 => "volume", + }, + cpqSasLogDrvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqSasLogDrvStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "rebuilding", + 5 => "failed", + 6 => "offline", + } + }; + # INDEX { cpqSasLogDrvCntlrIndex, cpqSasLogDrvIndex } + foreach ($self->get_entries($oids, 'cpqSasLogDrvEntry')) { + push(@{$self->{logical_drives}}, + HP::Proliant::Component::DiskSubsystem::Sas::LogicalDrive->new(%{$_})); + } + + $oids = { + cpqSasPhyDrvEntry => "1.3.6.1.4.1.232.5.5.2.1.1", + cpqSasPhyDrvHbaIndex => "1.3.6.1.4.1.232.5.5.2.1.1.1", + cpqSasPhyDrvIndex => "1.3.6.1.4.1.232.5.5.2.1.1.2", + cpqSasPhyDrvLocationString => "1.3.6.1.4.1.232.5.5.2.1.1.3", + cpqSasPhyDrvStatus => "1.3.6.1.4.1.232.5.5.2.1.1.5", + cpqSasPhyDrvSize => "1.3.6.1.4.1.232.5.5.2.1.1.8", + cpqSasPhyDrvCondition => "1.3.6.1.4.1.232.5.5.2.1.1.6", + cpqSasPhyDrvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqSasPhyDrvStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "predictiveFailure", + 4 => "offline", + 5 => "failed", + 6 => "missingWasOk", + 7 => "missingWasPredictiveFailure", + 8 => "missingWasOffline", + 9 => "missingWasFailed", + }, + }; + + # INDEX { cpqPhyLogDrvCntlrIndex, cpqSasPhyDrvIndex } + foreach ($self->get_entries($oids, 'cpqSasPhyDrvEntry')) { + push(@{$self->{physical_drives}}, + HP::Proliant::Component::DiskSubsystem::Sas::PhysicalDrive->new(%{$_})); + } + +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi.pm new file mode 100755 index 0000000..cf38238 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi.pm @@ -0,0 +1,227 @@ +package HP::Proliant::Component::DiskSubsystem::Scsi; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + controllers => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + condition => undef, + blacklisted => 0, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Scsi::SNMP'; + } else { + bless $self, 'HP::Proliant::Component::DiskSubsystem::Scsi::CLI'; + } + $self->init(); + $self->assemble(); + return $self; +} + +sub check { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{controllers}}) { + $_->dump(); + } +} + +package HP::Proliant::Component::DiskSubsystem::Scsi::Controller; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Scsi); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqScsiCntlr/, keys %params; + $self->{name} = $params{name} || $params{cpqScsiCntlrIndex}.':'.$params{cpqScsiCntlrBusIndex}; + $self->{controllerindex} = $self->{cpqScsiCntlrIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('scco', $self->{name}); + my $info = sprintf 'scsi controller %s in slot %s is %s', + $self->{name}, $self->{cpqScsiCntlrSlot}, $self->{cpqScsiCntlrCondition}; + if ($self->{cpqScsiCntlrCondition} eq 'other') { + if (scalar(@{$self->{physical_drives}})) { + $info .= ' and needs attention'; + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } else { + $info .= ' and unused'; + $self->add_info($info); + $self->{blacklisted} = 1; + } + } elsif ($self->{cpqScsiCntlrCondition} ne 'ok') { + $info .= ' and needs attention'; + $self->add_message(CRITICAL, $info); + $self->add_info($info); + } else { + $self->add_info($info); + } + foreach (@{$self->{logical_drives}}) { + $_->check(); + } + foreach (@{$self->{physical_drives}}) { + $_->check(); + } + foreach (@{$self->{spare_drives}}) { + $_->check(); + } +} + +sub dump { + my $self = shift; + printf "[SCSI_CONTROLLER_%s]\n", $self->{name}; + foreach (qw(cpqScsiCntlrIndex cpqScsiCntlrBusIndex cpqScsiCntlrSlot + cpqScsiCntlrStatus cpqScsiCntlrCondition cpqScsiCntlrHwLocation)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; + foreach (@{$self->{logical_drives}}) { + $_->dump(); + } + foreach (@{$self->{physical_drives}}) { + $_->dump(); + } + foreach (@{$self->{spare_drives}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::DiskSubsystem::Scsi::LogicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Scsi); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqScsiLogDrv/, keys %params; + $self->{name} = $params{name} || $params{cpqScsiLogDrvCntlrIndex}.':'.$params{cpqScsiLogDrvBusIndex}.':'.$params{cpqScsiLogDrvIndex}; + bless $self, $class; + $self->{controllerindex} = $self->{cpqScsiLogDrvCntlrIndex}; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('scld', $self->{name}); + my $info = sprintf 'logical drive %s is %s', $self->{name}, $self->{cpqScsiLogDrvStatus}; + if ($self->{cpqScsiLogDrvCondition} ne "ok") { + if ($self->{cpqScsiLogDrvStatus} =~ + /rebuild|recovering/) { + $self->add_message(WARNING, $info); + } else { + $self->add_message(CRITICAL, $info); + } + } + $self->add_info($info); +} + +sub dump { + my $self = shift; + printf "[LOGICAL_DRIVE_%s]\n", $self->{name}; + foreach (qw(cpqScsiLogDrvCntlrIndex cpqScsiLogDrvBusIndex cpqScsiLogDrvIndex + cpqScsiLogDrvFaultTol cpqScsiLogDrvStatus cpqScsiLogDrvSize + cpqScsiLogDrvPhyDrvIDs cpqScsiLogDrvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Scsi::PhysicalDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Scsi); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + map { $self->{$_} = $params{$_} } grep /cpqScsiPhyDrv/, keys %params; + $self->{name} = $params{name} || + $self->{cpqScsiPhyDrvCntlrIndex}.':'.$self->{cpqScsiPhyDrvBusIndex}.':'.$self->{cpqScsiPhyDrvIndex}; + $self->{controllerindex} = $self->{cpqScsiPhyDrvCntlrIndex}; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('scpd', $self->{name}); + my $info = sprintf 'physical drive %s is %s', $self->{name}, $self->{cpqScsiPhyDrvCondition}; + if ($self->{cpqScsiPhyDrvCondition} ne 'ok') { + $self->add_message(CRITICAL, $info); + } + $self->add_info($info); +} + +sub dump { + my $self = shift; + printf "[PHYSICAL_DRIVE_%s]\n", $self->{name}; + foreach (qw(cpqScsiPhyDrvCntlrIndex cpqScsiPhyDrvBusIndex cpqScsiPhyDrvIndex + cpqScsiPhyDrvStatus cpqScsiPhyDrvSize cpqScsiPhyDrvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "\n"; +} + + +package HP::Proliant::Component::DiskSubsystem::Scsi::SpareDrive; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Scsi); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub dump { + my $self = shift; + printf "[SPARE_DRIVE]\n"; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi/CLI.pm new file mode 100755 index 0000000..69b3926 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi/CLI.pm @@ -0,0 +1,27 @@ +package HP::Proliant::Component::DiskSubsystem::Scsi::CLI; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Scsi); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi/SNMP.pm new file mode 100755 index 0000000..71a0f66 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/DiskSubsystem/Scsi/SNMP.pm @@ -0,0 +1,134 @@ +package HP::Proliant::Component::DiskSubsystem::Scsi::SNMP; +our @ISA = qw(HP::Proliant::Component::DiskSubsystem::Scsi + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + controllers => [], + accelerators => [], + enclosures => [], + physical_drives => [], + logical_drives => [], + spare_drives => [], + blacklisted => 0, + }; + bless $self, $class; + return $self; +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + + # CPQSCSI-MIB + my $oids = { + cpqScsiCntlrEntry => '1.3.6.1.4.1.232.5.2.2.1.1', + cpqScsiCntlrIndex => '1.3.6.1.4.1.232.5.2.2.1.1.1', + cpqScsiCntlrBusIndex => '1.3.6.1.4.1.232.5.2.2.1.1.2', + cpqScsiCntlrSlot => '1.3.6.1.4.1.232.5.2.2.1.1.6', + cpqScsiCntlrStatus => '1.3.6.1.4.1.232.5.2.2.1.1.7', + cpqScsiCntlrCondition => '1.3.6.1.4.1.232.5.2.2.1.1.12', + cpqScsiCntlrHwLocation => '1.3.6.1.4.1.232.5.2.2.1.1.16', + cpqScsiCntlrStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + }, + cpqScsiCntlrConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + } + }; + + # INDEX { cpqScsiCntlrIndex, cpqScsiCntlrBusIndex } + foreach ($self->get_entries($oids, 'cpqScsiCntlrEntry')) { + push(@{$self->{controllers}}, + HP::Proliant::Component::DiskSubsystem::Scsi::Controller->new(%{$_})); + } + + $oids = { + cpqScsiLogDrvEntry => '1.3.6.1.4.1.232.5.2.3.1.1', + cpqScsiLogDrvCntlrIndex => '1.3.6.1.4.1.232.5.2.3.1.1.1', + cpqScsiLogDrvBusIndex => '1.3.6.1.4.1.232.5.2.3.1.1.2', + cpqScsiLogDrvIndex => '1.3.6.1.4.1.232.5.2.3.1.1.3', + cpqScsiLogDrvFaultTol => '1.3.6.1.4.1.232.5.2.3.1.1.4', + cpqScsiLogDrvStatus => '1.3.6.1.4.1.232.5.2.3.1.1.5', + cpqScsiLogDrvSize => '1.3.6.1.4.1.232.5.2.3.1.1.6', + cpqScsiLogDrvPhyDrvIDs => '1.3.6.1.4.1.232.5.2.3.1.1.7', + cpqScsiLogDrvCondition => '1.3.6.1.4.1.232.5.2.3.1.1.8', + cpqScsiLogDrvStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + 4 => "unconfigured", + 5 => "recovering", + 6 => "readyForRebuild", + 7 => "rebuilding", + 8 => "wrongDrive", + 9 => "badConnect", + }, + cpqScsiLogDrvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqScsiLogDrvFaultTolValue => { + 1 => "other", + 2 => "none", + 3 => "mirroring", + 4 => "dataGuard", + 5 => "distribDataGuard", + }, + + }; + # INDEX { cpqScsiLogDrvCntlrIndex, cpqScsiLogDrvBusIndex, cpqScsiLogDrvIndex } + foreach ($self->get_entries($oids, 'cpqScsiLogDrvEntry')) { + push(@{$self->{logical_drives}}, + HP::Proliant::Component::DiskSubsystem::Scsi::LogicalDrive->new(%{$_})); + } + + $oids = { + cpqScsiPhyDrvEntry => '1.3.6.1.4.1.232.5.2.4.1.1', + cpqScsiPhyDrvCntlrIndex => '1.3.6.1.4.1.232.5.2.4.1.1.1', + cpqScsiPhyDrvBusIndex => '1.3.6.1.4.1.232.5.2.4.1.1.2', + cpqScsiPhyDrvIndex => '1.3.6.1.4.1.232.5.2.4.1.1.3', + cpqScsiPhyDrvStatus => '1.3.6.1.4.1.232.5.2.4.1.1.9', + cpqScsiPhyDrvSize => '1.3.6.1.4.1.232.5.2.4.1.1.7', + cpqScsiPhyDrvCondition => '1.3.6.1.4.1.232.5.2.4.1.1.26', + cpqScsiPhyDrvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqScsiPhyDrvStatusValue => { + 1 => "other", + 2 => "ok", + 3 => "failed", + 4 => "notConfigured", + 5 => "badCable", + 6 => "missingWasOk", + 7 => "missingWasFailed", + 8 => "predictiveFailure", + 9 => "missingWasPredictiveFailure", + 10 => "offline", + 11 => "missingWasOffline", + 12 => "hardError", + }, + }; + + # INDEX { cpqScsiPhyDrvCntlrIndex, cpqScsiPhyDrvBusIndex, cpqScsiPhyDrvIndex } + foreach ($self->get_entries($oids, 'cpqScsiPhyDrvEntry')) { + push(@{$self->{physical_drives}}, + HP::Proliant::Component::DiskSubsystem::Scsi::PhysicalDrive->new(%{$_})); + } + +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem.pm new file mode 100755 index 0000000..2a7a378 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem.pm @@ -0,0 +1,236 @@ +package HP::Proliant::Component::EventSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + events => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + boottime => 0, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + $self = HP::Proliant::Component::EventSubsystem::SNMP->new(%params); + my $sysUpTime = SNMP::Utils::get_object( + $self->{rawdata}, '1.3.6.1.2.1.1.3.0') || 3600*24*100; + $self->{boottime} = int(time - $sysUpTime / 100); + } elsif ($self->{method} eq 'cli') { + $self = HP::Proliant::Component::EventSubsystem::CLI->new(%params); + my $uptime = do { local (@ARGV, $/) = "/proc/uptime"; my $x = <>; close ARGV; $x }; + # also watch 10 minutes of booting before the operating system starts ticking + $self->{boottime} = time - int((split(/\s+/, $uptime))[0]) - 600; + } else { + die "unknown method"; + } + # repair dates + my $lasttime = 0; + for my $event (reverse @{$self->{events}}) { + if ($event->{cpqHeEventLogUpdateTime} != 0) { + $lasttime = $event->{cpqHeEventLogUpdateTime}; + } else { + $event->{cpqHeEventLogUpdateTime} = $lasttime; + } + } + # maybe the most recent events had zero timestamps. + # fill them up with timestamps from the past. + for my $event (@{$self->{events}}) { + if ($event->{cpqHeEventLogUpdateTime} != 0) { + $lasttime = $event->{cpqHeEventLogUpdateTime}; + } else { + $event->{cpqHeEventLogUpdateTime} = $lasttime; + } + } + # we need the boottime in the event's check method + for my $event (@{$self->{events}}) { + $event->{boottime} = $self->{boottime}; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking events'); + if (scalar (@{$self->{events}}) == 0) { + #$self->overall_check(); + $self->add_info('no events found'); + } else { + foreach (sort { $a->{cpqHeEventLogEntryNumber} <=> $b->{cpqHeEventLogEntryNumber}} + @{$self->{events}}) { + $_->check($self->{warningtime}, $self->{criticaltime}); + } + } +} + +sub dump { + my $self = shift; + foreach (sort { $a->{cpqHeEventLogEntryNumber} <=> $b->{cpqHeEventLogEntryNumber} } @{$self->{events}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::EventSubsystem::Event; +our @ISA = qw(HP::Proliant::Component::EventSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +{ + our $interesting_events = { + # POST Error: 201-Memory Error Multi-bit error occurred during memory initialization, Board 1, Bank B. Bank containing DIMM(s) has been disabled.. + # POST Error: 201-Memory Error Single-bit error occured during memory initialization, Board 1, DIMM 1. Bank containing DIMM(s) has been disabled.. + # POST Error: 207-Memory initialization error on Memory Board 5 DIMM 7. The operating system may not have access to all of the memory installed in the system.. + # POST Error: 207-Invalid Memory Configuration-Mismatched DIMMs within DIMM Bank Memory in Bank A Not Utilized.. + # POST Error: 210 - Quick Path Interconnect (QPI) Link Degradation. A QPI link is operating in a degraded performace state.. + 'POST Messages' => [ + '201-Memory', '207-Memory', + '210\s*-\s*Quick Path Interconnect.*degraded.*' + ], + 'Main Memory' => [ + 'Corrected Memory Error threshold exceeded', + 'Uncorrectable Memory Error', + ], + }; +} + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqHeEventLogEntryNumber => $params{cpqHeEventLogEntryNumber}, + cpqHeEventLogEntrySeverity => lc $params{cpqHeEventLogEntrySeverity}, + cpqHeEventLogEntryClass => $params{cpqHeEventLogEntryClass}, + cpqHeEventLogEntryCount => $params{cpqHeEventLogEntryCount} || 1, + cpqHeEventLogInitialTime => $params{cpqHeEventLogInitialTime}, + cpqHeEventLogUpdateTime => $params{cpqHeEventLogUpdateTime}, + cpqHeEventLogErrorDesc => $params{cpqHeEventLogErrorDesc}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + if (! $self->{cpqHeEventLogInitialTime}) { + $self->{cpqHeEventLogInitialTime} = $self->{cpqHeEventLogUpdateTime}; + } + # + # + #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + # |warn |crit |now + # + #<----- ignore -------><----- warning ------><---------- critical ---------> + # + # If we have --eventrange <warnlookback>/<critlookback> + # Very young events are shown as critical + # If the event gets older, it is shown as warning + # At some time, the event is no longer shown + # Without --eventrange the event is shown as critical until you manually repair it + if ($params{runtime}->{options}->{eventrange}) { + my ($warningrange, $criticalrange) = split(/\//, $params{runtime}->{options}->{eventrange}); + if (! $criticalrange) { + $criticalrange = $warningrange; + } + if ($criticalrange =~ /^(\d+)[s]*$/) { + $criticalrange = $1; + } elsif ($criticalrange =~ /^(\d+)m$/) { + $criticalrange = $1 * 60; + } elsif ($criticalrange =~ /^(\d+)h$/) { + $criticalrange = $1 * 3600; + } elsif ($criticalrange =~ /^(\d+)d$/) { + $criticalrange = $1 * 3600 * 24; + } else { + die "range has to be <number>[smhd]"; + } + if ($warningrange =~ /^(\d+)[s]*$/) { + $warningrange = $1; + } elsif ($warningrange =~ /^(\d+)m$/) { + $warningrange = $1 * 60; + } elsif ($warningrange =~ /^(\d+)h$/) { + $warningrange = $1 * 3600; + } elsif ($warningrange =~ /^(\d+)d$/) { + $warningrange = $1 * 3600 * 24; + } else { + die "range has to be <number>[smhd]"; + } + $self->{warningtime} = time - $warningrange; + $self->{criticaltime} = time - $criticalrange; + } else { + $self->{warningtime} = 0; + $self->{criticaltime} = 0; + } + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('evt', $self->{cpqHeEventLogEntryNumber}); + # only check severity "critical" and "caution" + # optional: only check interesting events + # POST events only if they date maximum from reboot-5min + # younger than critical? -> critical + # + $self->add_info(sprintf "Event: %d Added: %s Class: (%s) %s %s", + $self->{cpqHeEventLogEntryNumber}, + $self->{cpqHeEventLogUpdateTime}, + $self->{cpqHeEventLogEntryClass}, + $self->{cpqHeEventLogEntrySeverity}, + $self->{cpqHeEventLogErrorDesc}); + if ($self->{cpqHeEventLogEntrySeverity} eq "caution" || + $self->{cpqHeEventLogEntrySeverity} eq "critical") { + # also watch 10 minutes of booting before the operating system starts ticking + if ($self->{cpqHeEventLogUpdateTime} >= $self->{boottime}) { + foreach my $class (keys %{$HP::Proliant::Component::EventSubsystem::Event::interesting_events}) { + foreach my $pattern (@{$HP::Proliant::Component::EventSubsystem::Event::interesting_events->{$class}}) { + if ($self->{cpqHeEventLogErrorDesc} =~ /$pattern/) { + if ($self->{cpqHeEventLogUpdateTime} < $self->{warningtime}) { + # you didn't care for this problem too long. + # don't say i didn't warn you. + if (0) { + # auto-ack? + } + last; + } elsif ($self->{cpqHeEventLogUpdateTime} < $self->{criticaltime}) { + $self->add_message(WARNING, $self->{info}); + last; + } else { + $self->add_message(CRITICAL, $self->{info}); + last; + } + } + } + } + } + } else { + # info, repair... + } +} + +sub dump { + my $self = shift; + printf "[EVENT_%s]\n", $self->{cpqHeEventLogEntryNumber}; + foreach (qw(cpqHeEventLogEntryNumber cpqHeEventLogEntrySeverity + cpqHeEventLogEntryCount cpqHeEventLogInitialTime + cpqHeEventLogUpdateTime cpqHeEventLogErrorDesc)) { + if ($_ =~ /.*Time$/) { + printf "%s: %s\n", $_, scalar localtime $self->{$_}; + } else { + printf "%s: %s\n", $_, $self->{$_}; + } + } + printf "info: %s\n\n", $self->{info}; +} + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem/CLI.pm new file mode 100755 index 0000000..b75a547 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem/CLI.pm @@ -0,0 +1,78 @@ +package HP::Proliant::Component::EventSubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::EventSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; +use Time::Local; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + events => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + + +sub init { + my $self = shift; + my %params = @_; + my %tmpevent = ( + runtime => $params{runtime}, + ); + my $inblock = 0; + foreach (grep(/^iml/, split(/\n/, $self->{rawdata}))) { + s/^iml\s*//g; + if (/^Event:\s+(\d+)\s+[\w]+:\s+(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+)/) { + # Event: 31 Added: 09/22/2011 05:11 + # 1 2 3 4 5 6 + $tmpevent{cpqHeEventLogEntryNumber} = $1; + if ($4 == 0) { + # Event: 29 Added: 00/00/0000 00:00 + $tmpevent{cpqHeEventLogUpdateTime} = 0; + } else { + eval { + $tmpevent{cpqHeEventLogUpdateTime} = timelocal(0, $6, $5, $3, $2 - 1, $4); + }; + if ($@) { + # Event: 10 Added: 27/27/2027 27:27 + $tmpevent{cpqHeEventLogUpdateTime} = 0; + } + } + $inblock = 1; + } elsif (/^(\w+):\s+(.*?)\s+\-\s+(.*)/) { + $tmpevent{cpqHeEventLogEntrySeverity} = $1; + $tmpevent{cpqHeEventLogEntryClass} = $2; + $tmpevent{cpqHeEventLogErrorDesc} = $3; + if ($tmpevent{cpqHeEventLogErrorDesc} =~ /.*?:\s+(\d+)/) { + $tmpevent{cpqHeEventLogEntryCode} = $1; + } else { + $tmpevent{cpqHeEventLogEntryCode} = 0; + } + } elsif (/^\s*$/) { + if ($inblock) { + $inblock = 0; + push(@{$self->{events}}, + HP::Proliant::Component::EventSubsystem::Event->new(%tmpevent)); + %tmpevent = ( + runtime => $params{runtime}, + ); + } + } + } + if ($inblock) { + push(@{$self->{events}}, + HP::Proliant::Component::EventSubsystem::Event->new(%tmpevent)); + } +} + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem/SNMP.pm new file mode 100755 index 0000000..506732a --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/EventSubsystem/SNMP.pm @@ -0,0 +1,221 @@ +package HP::Proliant::Component::EventSubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::EventSubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; +use Time::Local; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + events => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->overall_init(%params); + $self->init(%params); + return $self; +} + +sub overall_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $params{rawdata}; + # overall + my $cpqHeEventLogSupported = '1.3.6.1.4.1.232.6.2.11.1.0'; + my $cpqHeEventLogSupportedValue = { + 1 => 'other', + 2 => 'notSupported', + 3 => 'supported', + 4 => 'clear', + }; + my $cpqHeEventLogCondition = '1.3.6.1.4.1.232.6.2.11.2.0'; + my $cpqHeEventLogConditionValue = { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }; + $self->{eventsupp} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeEventLogSupported, + $cpqHeEventLogSupportedValue); + $self->{eventstatus} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeEventLogCondition, + $cpqHeEventLogConditionValue); + $self->{eventsupp} |= lc $self->{eventsupp}; + $self->{eventstatus} |= lc $self->{eventstatus}; +} + +sub init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeEventLogEntry => "1.3.6.1.4.1.232.6.2.11.3.1", + cpqHeEventLogEntryNumber => "1.3.6.1.4.1.232.6.2.11.3.1.1", + cpqHeEventLogEntrySeverity => "1.3.6.1.4.1.232.6.2.11.3.1.2", + cpqHeEventLogEntryClass => "1.3.6.1.4.1.232.6.2.11.3.1.3", + cpqHeEventLogEntryCode => "1.3.6.1.4.1.232.6.2.11.3.1.4", + cpqHeEventLogEntryCount => "1.3.6.1.4.1.232.6.2.11.3.1.5", + cpqHeEventLogInitialTime => "1.3.6.1.4.1.232.6.2.11.3.1.6", + cpqHeEventLogUpdateTime => "1.3.6.1.4.1.232.6.2.11.3.1.7", + cpqHeEventLogErrorDesc => "1.3.6.1.4.1.232.6.2.11.3.1.8", + + cpqHeEventLogEntryClassValue => { + # 2 Fan Failure (Fan 1, Location I/O Board) + # Internal Storage System Overheating (Slot 0, Zone 1, Location Storage, Temperature Unknown) + # System Fans Not Redundant (Location I/O Board) + # MY MUSTARD: only critical events should lead to an alert, if at all. The caution events mean "loss of redundancy". + # We monitor temperatures and fan status anyway. + #2 => "", + # 3 Corrected Memory Error threshold exceeded (System Memory, Memory Module 1) + # Uncorrectable Memory Error detected by ROM-based memory validation (Board 1, Memory Module 4) + # MY MUSTARD: threshold exceeded is caution. Uncorrectable errors are critical. Both should be detected anyway. + 3 => "Main Memory", + # 4 Accelerator Cache Memory Parity Error (Socket 1) + #4 => "", + # 5 Processor Correctable error threshold exceeded (Board 0, Processor 2) + #5 => "", + # 6 Unrecoverable Intermodule Bus error (Error code 0x00000000) + #6 => "", + # 8 PCI Bus Error (Slot 0, Bus 0, Device 0, Function 0) + 8 => "PCI Bus", + # 10 1720-S.M.A.R.T. Hard Drive Detects Imminent Failure + # POST Error: 201-Memory Error Multi-bit error occurred during memory initialization, Board 1, Bank B. Bank containing DIMM(s) has been disabled.. + # POST Error: 201-Memory Error Single-bit error occured during memory initialization, Board 1, DIMM 1. Bank containing DIMM(s) has been disabled.. + # POST Error: 207-Memory Configuration Warning - memory boards should be installed sequentially. + # POST Error: 210-Memory Board Failure on board 4. + # POST Error: 210-Memory Board Power Fault on board 3. + # POST Error: 207-Memory initialization error on Memory Board 5 DIMM 7. The operating system may not have access to all of the memory installed in the system.. + # POST Error: 207-Invalid Memory Configuration-Mismatched DIMMs within DIMM Bank Memory in Bank A Not Utilized.. + 10 => "POST Messages", + 11 => "Power Subsystem", + 13 => "ASR", + # 14 Automatic Operating System Shutdown Initiated Due to Overheat Condition + # Automatic Operating System Shutdown Initiated Due to Fan Failure + # Blue Screen Trap (BugCheck, STOP: 0x00000050 (0x9CB2C5B4, 0x00000001, 0x00000004, 0x00000000)) + # Operating System failure (BugCheck, STOP: 0x000000AB (0x00000005, 0x00000488, 0x00000000, 0x00000002)) + 14 => "OS Class", + # 15 Unknown Event (Class 15, Code 255) + #15 => "", + # 17 Network Adapter Link Down (Slot 0, Port 4) + # Network Adapters Redundancy Reduced (Slot 0, Port 1) + 17 => "Network Adapter", + # 19 Drive Array Device Failure (Slot 0, Bus 2, Bay 4) + # Internal SAS Enclosure Device Failure (Bay 1, Box 1, Port 2I, Slot 1) + #19 => "", + # 20 An Unrecoverable System Error (NMI) has occurred + # Unrecoverable System Error has occurred (Error code 0x01AE0E2F, 0x00000000) + 20 => "Unrecoverable System Error", + # 32 ROM flashed (New version: 01/09/2008) + 32 => "System Revision", + # 33 IML Cleared (Administrator) + # IML cleared through HP ProLiant Health Agent (cmahealthd) + # Insight Diagnostics Note: Physisches Festplattenlaufwerk 5, Controller Steckplatz 0-Diagnosis: Fehlgeschlagen + 33 => "Maintenance Note", + # 34 New Chassis Connected (Enclosure Address 27AC) + # Loss Of Chassis Connectivity (Enclosure Serial Number 8004******) + # Server Blade Enclosure Server Blade Inserted (Slot 16, Enclosure Address 0000) + #34 => "", + }, + cpqHeEventLogEntrySeverityValue => { + 2 => "informational", + 3 => "infoWithAlert", + 6 => "repaired", + 9 => "caution", + 15 => "critical", + }, + # Time + # 07 D8 09 02 11 11 + }; + # INDEX { cpqHeEventLogEntryNumber } + foreach ($self->get_entries($oids, 'cpqHeEventLogEntry')) { + if ($_->{cpqHeEventLogInitialTime} =~ /^(([0-9a-fA-F]{2})( [0-9a-fA-F]{2})*)\s*$/) { + $_->{cpqHeEventLogInitialTime} =~ s/ //; + my ($year, $month, $day, $hour, $min) = map { hex($_) } split(/\s+/, $_->{cpqHeEventLogInitialTime}); + if ($year == 0) { + $_->{cpqHeEventLogInitialTime} = 0; + } else { + eval { + $_->{cpqHeEventLogInitialTime} = timelocal(0, $min, $hour, $day, $month - 1, $year); + }; + if ($@) { + $_->{cpqHeEventLogInitialTime} = 0; + } + } + } elsif ($_->{cpqHeEventLogInitialTime} =~ /^0x([0-9a-fA-F]{4})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/) { + my ($year, $month, $day, $hour, $min) = map { hex($_) } ($1, $2, $3, $4, $5); + if ($year == 0) { + $_->{cpqHeEventLogInitialTime} = 0; + } else { + eval { + $_->{cpqHeEventLogInitialTime} = timelocal(0, $min, $hour, $day, $month - 1, $year); + }; + if ($@) { + $_->{cpqHeEventLogInitialTime} = 0; + } + } + } elsif ($_->{cpqHeEventLogInitialTime} =~ /^\0\0\0\0\0\0/) { + $_->{cpqHeEventLogInitialTime} = 0; + } + if ($_->{cpqHeEventLogUpdateTime} =~ /^(([0-9a-fA-F]{2})( [0-9a-fA-F]{2})*)\s*$/) { + $_->{cpqHeEventLogUpdateTime} =~ s/ //; + my ($year, $month, $day, $hour, $min) = map { hex($_) } split(/\s+/, $_->{cpqHeEventLogUpdateTime}); + if ($year == 0) { + $_->{cpqHeEventLogUpdateTime} = 0; + } else { + eval { + $_->{cpqHeEventLogUpdateTime} = timelocal(0, $min, $hour, $day, $month - 1, $year); + }; + if ($@) { + $_->{cpqHeEventLogUpdateTime} = 0; + } + } + } elsif ($_->{cpqHeEventLogUpdateTime} =~ /^0x([0-9a-fA-F]{4})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/) { + my ($year, $month, $day, $hour, $min) = map { hex($_) } ($1, $2, $3, $4, $5); + if ($year == 0) { + $_->{cpqHeEventLogUpdateTime} = 0; + } else { + eval { + $_->{cpqHeEventLogUpdateTime} = timelocal(0, $min, $hour, $day, $month - 1, $year); + }; + if ($@) { + $_->{cpqHeEventLogUpdateTime} = 0; + } + } + } elsif ($_->{cpqHeEventLogUpdateTime} =~ /^\0\0\0\0\0\0/) { + $_->{cpqHeEventLogUpdateTime} = 0; + } + if ($_->{cpqHeEventLogErrorDesc} =~ /^(([0-9a-fA-F]{2})(\s+[0-9a-fA-F]{2})*)\s*$/) { + $_->{cpqHeEventLogErrorDesc} = join "", map { chr($_) } map { if (hex($_) > 127) { 20; } else { hex($_) } } split(/\s+/, $_->{cpqHeEventLogErrorDesc}); + } + push(@{$self->{events}}, + HP::Proliant::Component::EventSubsystem::Event->new(%{$_})); + } +} + +sub overall_check { + my $self = shift; + my $result = 0; + $self->blacklist('oe', ''); + if ($self->{eventsupp} && $self->{eventsupp} eq "supported") { + if ($self->{eventstatus} eq "ok") { + $result = 0; + $self->add_info('eventlog system is ok'); + } else { + $result = 0; + $self->add_info(sprintf "eventlog system is %s", $self->{eventstatus}); + } + } else { + $result = 0; + $self->add_info('no event status found'); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem.pm new file mode 100755 index 0000000..38da57b --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem.pm @@ -0,0 +1,263 @@ +package HP::Proliant::Component::FanSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; +################################## fan_redundancy ########## + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + fans => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::FanSubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::FanSubsystem::CLI->new(%params); + } else { + die 'unknown method'; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking fans'); + $self->blacklist('ff', ''); + if (scalar (@{$self->{fans}}) == 0) { + $self->overall_check(); # sowas ist mir nur einmal untergekommen + # die maschine hatte alles in allem nur 2 oids (cpqHeFltTolFanChassis) + # SNMPv2-SMI::enterprises.232.6.2.6.7.1.1.0.1 = INTEGER: 0 + # SNMPv2-SMI::enterprises.232.6.2.6.7.1.1.0.2 = INTEGER: 0 + } else { + my $overallhealth = $self->overall_check(); + foreach (@{$self->{fans}}) { + $_->{overallhealth} = $overallhealth; + $_->check(); + } + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{fans}}) { + $_->dump(); + } +} + +sub get_fan_by_index { + my $self = shift; + my $index; + foreach (@{$self->{fans}}) { + return $_ if exists $_->{cpqHeFltTolFanIndex} && + $_->{cpqHeFltTolFanIndex} == $index; + } + return undef; +} + + +package HP::Proliant::Component::FanSubsystem::Fan; +our @ISA = qw(HP::Proliant::Component::FanSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + if (exists $params{cpqHeFltTolFanRedundant}) { + return HP::Proliant::Component::FanSubsystem::Fan::FTol->new(%params); + } else { + return HP::Proliant::Component::FanSubsystem::Fan::Thermal->new(%params); + } +} + + +package HP::Proliant::Component::FanSubsystem::Fan::FTol; +our @ISA = qw(HP::Proliant::Component::FanSubsystem::Fan); + + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqHeFltTolFanChassis => $params{cpqHeFltTolFanChassis}, + cpqHeFltTolFanIndex => $params{cpqHeFltTolFanIndex}, + cpqHeFltTolFanLocale => $params{cpqHeFltTolFanLocale}, + cpqHeFltTolFanPresent => $params{cpqHeFltTolFanPresent}, + cpqHeFltTolFanType => $params{cpqHeFltTolFanType}, + cpqHeFltTolFanSpeed => $params{cpqHeFltTolFanSpeed}, + cpqHeFltTolFanRedundant => $params{cpqHeFltTolFanRedundant}, + cpqHeFltTolFanRedundantPartner => $params{cpqHeFltTolFanRedundantPartner}, + cpqHeFltTolFanCondition => $params{cpqHeFltTolFanCondition}, + cpqHeFltTolFanPctMax => $params{cpqHeFltTolFanPctMax}, #!!! + cpqHeFltTolFanHotPlug => $params{cpqHeFltTolFanHotPlug}, #!!! + partner => $params{partner}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if (($self->{cpqHeFltTolFanRedundant} eq 'redundant') && + ((! defined $self->{cpqHeFltTolFanRedundantPartner}) || + (! $self->{cpqHeFltTolFanRedundantPartner}))) { + $self->{cpqHeFltTolFanRedundant} = 'notRedundant'; + # cpqHeFltTolFanRedundantPartner=0: partner not avail + } + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('f', $self->{cpqHeFltTolFanIndex}); + $self->add_info(sprintf 'fan %d is %s, speed is %s, pctmax is %s%%, '. + 'location is %s, redundance is %s, partner is %s', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanPresent}, + $self->{cpqHeFltTolFanSpeed}, $self->{cpqHeFltTolFanPctMax}, + $self->{cpqHeFltTolFanLocale}, $self->{cpqHeFltTolFanRedundant}, + $self->{cpqHeFltTolFanRedundantPartner}); + $self->add_extendedinfo(sprintf 'fan_%s=%d%%', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanPctMax}); + if ($self->{cpqHeFltTolFanPresent} eq 'present') { + if ($self->{cpqHeFltTolFanSpeed} eq 'high') { + $self->add_info(sprintf 'fan %d (%s) runs at high speed', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(CRITICAL, $self->{info}); + } elsif ($self->{cpqHeFltTolFanSpeed} ne 'normal') { + $self->add_info(sprintf 'fan %d (%s) needs attention', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(CRITICAL, $self->{info}); + } + if ($self->{cpqHeFltTolFanCondition} eq 'failed') { + $self->add_info(sprintf 'fan %d (%s) failed', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(CRITICAL, $self->{info}); + } elsif ($self->{cpqHeFltTolFanCondition} eq 'degraded') { + $self->add_info(sprintf 'fan %d (%s) degraded', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(WARNING, $self->{info}); + } elsif ($self->{cpqHeFltTolFanCondition} ne 'ok' && + $self->{cpqHeFltTolFanCondition} ne 'other') { + $self->add_info(sprintf 'fan %d (%s) is not ok', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(WARNING, $self->{info}); + } + if ($self->{cpqHeFltTolFanRedundant} eq 'notRedundant') { + # sieht so aus, als waere notRedundant und partner=0 normal z.b. dl360 + # das duerfte der fall sein, wenn nur eine cpu verbaut wurde und + # statt einem redundanten paar nur dummies drinstecken. + # "This specifies if the fan is in a redundant configuration" + # notRedundant heisst also sowohl nicht redundant wegen ausfall + # des partners als auch von haus aus nicht redundant ausgelegt + if ($self->{cpqHeFltTolFanRedundantPartner}) { + # nicht redundant, hat aber einen partner. da muss man genauer + # hinschauen + #if (my $partner = $self->{partner}) { + #} + if ($self->{overallhealth}) { + # da ist sogar das system der meinung, dass etwas faul ist + if (! $self->{runtime}->{options}->{ignore_fan_redundancy}) { + $self->add_info(sprintf 'fan %d (%s) is not redundant', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(WARNING, $self->{info}); + } + } else { + # das ist wohl so gewollt, dass einzelne fans eingebaut werden, + # obwohl redundante paerchen vorgesehen sind. + # scheint davon abzuhaengen, wieviele cpus geordert wurden. + } + } + } elsif ($self->{cpqHeFltTolFanRedundant} eq 'other') { + #seen on a dl320 g5p with bios from 2008. + # maybe redundancy is not supported at all + } + } elsif ($self->{cpqHeFltTolFanPresent} eq 'failed') { # from cli + $self->add_info(sprintf 'fan %d (%s) failed', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + $self->add_message(CRITICAL, $self->{info}); + } elsif ($self->{cpqHeFltTolFanPresent} eq 'absent') { + $self->add_info(sprintf 'fan %d (%s) needs attention (is absent)', + $self->{cpqHeFltTolFanIndex}, $self->{cpqHeFltTolFanLocale}); + # weiss nicht, ob absent auch kaputt bedeuten kann + # wenn nicht, dann wuerde man sich hier dumm und daemlich blacklisten + #$self->add_message(CRITICAL, $self->{info}); + $self->add_message(WARNING, $self->{info}) if $self->{overallhealth}; + } + if ($self->{runtime}->{options}->{perfdata}) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('fan_%s', $self->{cpqHeFltTolFanIndex}), + value => $self->{cpqHeFltTolFanPctMax}, + uom => '%', + ); + } +} + +sub dump { + my $self = shift; + printf "[FAN_%s]\n", $self->{cpqHeFltTolFanIndex}; + foreach (qw(cpqHeFltTolFanChassis cpqHeFltTolFanIndex cpqHeFltTolFanLocale + cpqHeFltTolFanPresent cpqHeFltTolFanType cpqHeFltTolFanSpeed + cpqHeFltTolFanRedundant cpqHeFltTolFanRedundantPartner + cpqHeFltTolFanCondition cpqHeFltTolFanHotPlug)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} + + +package HP::Proliant::Component::FanSubsystem::Fan::Thermal; +our @ISA = qw(HP::Proliant::Component::FanSubsystem::Fan); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqHeThermalFanIndex => $params{cpqHeThermalFanIndex}, + cpqHeThermalFanRequired => $params{cpqHeThermalFanRequired}, + cpqHeThermalFanPresent => $params{cpqHeThermalFanPresent}, + cpqHeThermalFanCpuFan => $params{cpqHeThermalFanCpuFan}, + cpqHeThermalFanStatus => $params{cpqHeThermalFanStatus}, + cpqHeThermalFanHwLocation => $params{cpqHeThermalFanHwLocation}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; +} + +sub dump { + my $self = shift; + printf "[FAN_%s]\n", $self->{cpqHeThermalFanIndex}; + foreach (qw(cpqHeThermalFanIndex cpqHeThermalFanRequired + cpqHeThermalFanPresent cpqHeThermalFanCpuFan cpqHeThermalFanStatus + cpqHeThermalFanHwLocation)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem/CLI.pm new file mode 100755 index 0000000..f82c770 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem/CLI.pm @@ -0,0 +1,101 @@ +package HP::Proliant::Component::FanSubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::FanSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + fans => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +# partner not available = cpqHeFltTolFanRedundantPartner=0 +# cpqHeFltTolFanTypeValue = other +sub init { + my $self = shift; + my %params = @_; + my %tmpfan = (); + foreach (grep(/^fans/, split(/\n/, $self->{rawdata}))) { + s/^fans //g; + if (/^#(\d+)\s+([\w#_\/\-]+)\s+(\w+)\s+(\w+)\s+(FAILED|[N\/A\d]+)%*\s+([\w\/]+)\s+(FAILED|[N\/A\d]+)\s+(\w+)/) { + %tmpfan = ( + cpqHeFltTolFanIndex => $1, + cpqHeFltTolFanLocale => lc $2, + cpqHeFltTolFanPresent => lc $3, + cpqHeFltTolFanSpeed => lc $4, + cpqHeFltTolFanPctMax => lc $5, # (FAILED|[N\/A\d]+) + cpqHeFltTolFanRedundant => lc $6, + cpqHeFltTolFanRedundantPartner => lc $7, # (FAILED|[N\/A\d]+) + cpqHeFltTolFanHotPlug => lc $8, + ); + } elsif (/^#(\d+)\s+([\w#_\/\-]+?)(Yes|No|N\/A)\s+(\w+)\s+(FAILED|[N\/A\d]+)%*\s+([\w\/]+)\s+(FAILED|[N\/A\d]+)\s+(\w+)/) { + # #5 SCSI_BACKPLANE_ZONEYes NORMAL N/A .... + %tmpfan = ( + cpqHeFltTolFanIndex => $1, + cpqHeFltTolFanLocale => lc $2, + cpqHeFltTolFanPresent => lc $3, + cpqHeFltTolFanSpeed => lc $4, + cpqHeFltTolFanPctMax => lc $5, + cpqHeFltTolFanRedundant => lc $6, + cpqHeFltTolFanRedundantPartner => lc $7, + cpqHeFltTolFanHotPlug => lc $8, + ); + } elsif (/^#(\d+)\s+([\w#_\/\-]+)\s+[NOno]+\s/) { + # Fan is not installed. #2 CPU#2 No - - No N/A - + } elsif (/^#(\d+)/) { + main::contact_author("FAN", $_); + } + if (%tmpfan) { + $tmpfan{runtime} = $params{runtime}; + $tmpfan{cpqHeFltTolFanChassis} = 1; # geht aus hpasmcli nicht hervor + $tmpfan{cpqHeFltTolFanType} = 'other'; + if ($tmpfan{cpqHeFltTolFanPctMax} !~ /^\d+$/) { + if ($tmpfan{cpqHeFltTolFanSpeed} eq 'normal') { + $tmpfan{cpqHeFltTolFanPctMax} = 50; + } elsif ($tmpfan{cpqHeFltTolFanSpeed} eq 'high') { + $tmpfan{cpqHeFltTolFanPctMax} = 100; + } else { + $tmpfan{cpqHeFltTolFanPctMax} = 0; + } + } + if($tmpfan{cpqHeFltTolFanSpeed} eq 'failed') { + $tmpfan{cpqHeFltTolFanCondition} = 'failed'; + } elsif($tmpfan{cpqHeFltTolFanSpeed} eq 'n/a') { + $tmpfan{cpqHeFltTolFanCondition} = 'other'; + } else { + $tmpfan{cpqHeFltTolFanCondition} = 'ok'; + } + $tmpfan{cpqHeFltTolFanRedundant} = + $tmpfan{cpqHeFltTolFanRedundant} eq 'yes' ? 'redundant' : + $tmpfan{cpqHeFltTolFanRedundant} eq 'no' ? 'notRedundant' : 'other'; + $tmpfan{cpqHeFltTolFanPresent} = + $tmpfan{cpqHeFltTolFanPresent} eq 'yes' ? 'present' : + $tmpfan{cpqHeFltTolFanPresent} eq 'failed' ? 'present' : + $tmpfan{cpqHeFltTolFanPresent} eq 'no' ? 'absent' : 'other'; + $tmpfan{cpqHeFltTolFanHotPlug} = + $tmpfan{cpqHeFltTolFanHotPlug} eq 'yes' ? 'hotPluggable' : + $tmpfan{cpqHeFltTolFanHotPlug} eq 'no' ? 'nonHotPluggable' : 'other'; + push(@{$self->{fans}}, + HP::Proliant::Component::FanSubsystem::Fan->new(%tmpfan)); + %tmpfan = (); + } + } +} + +sub overall_check { + my $self = shift; + # nix. nur wegen der gleichheit mit snmp + return 0; +} +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem/SNMP.pm new file mode 100755 index 0000000..82bd180 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/FanSubsystem/SNMP.pm @@ -0,0 +1,231 @@ +package HP::Proliant::Component::FanSubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::FanSubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + fans => [], + he_fans => [], + th_fans => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->overall_init(%params); + $self->he_init(%params); + $self->te_init(%params); + $self->unite(); + return $self; +} + +sub overall_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $params{rawdata}; + # overall + my $cpqHeThermalSystemFanStatus = '1.3.6.1.4.1.232.6.2.6.4.0'; + my $cpqHeThermalSystemFanStatusValue = { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }; + my $cpqHeThermalCpuFanStatus = '1.3.6.1.4.1.232.6.2.6.5.0'; + my $cpqHeThermalCpuFanStatusValue = { + 1 => 'other', + 2 => 'ok', + 4 => 'failed', # shutdown + }; + $self->{sysstatus} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeThermalSystemFanStatus, + $cpqHeThermalSystemFanStatusValue); + $self->{cpustatus} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeThermalCpuFanStatus, + $cpqHeThermalCpuFanStatusValue); + $self->{sysstatus} |= lc $self->{sysstatus}; + $self->{cpustatus} |= lc $self->{cpustatus}; +} + +sub te_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $params{rawdata}; + my $ignore_redundancy = $params{ignore_redundancy}; + # cpqHeThermalFanTable + my $oids = { + cpqHeThermalFanEntry => '1.3.6.1.4.1.232.6.2.6.6.1', + cpqHeThermalFanIndex => '1.3.6.1.4.1.232.6.2.6.6.1.1', + cpqHeThermalFanRequired => '1.3.6.1.4.1.232.6.2.6.6.1.2', + cpqHeThermalFanPresent => '1.3.6.1.4.1.232.6.2.6.6.1.3', + cpqHeThermalFanCpuFan => '1.3.6.1.4.1.232.6.2.6.6.1.4', + cpqHeThermalFanStatus => '1.3.6.1.4.1.232.6.2.6.6.1.5', + cpqHeThermalFanHwLocation => '1.3.6.1.4.1.232.6.2.6.6.1.6', + cpqHeThermalFanRequiredValue => { + 1 => 'other', + 2 => 'nonRequired', + 3 => 'required', + }, + cpqHeThermalFanPresentValue => { + 1 => 'other', + 2 => 'absent', + 3 => 'present', + }, + cpqHeThermalFanCpuFanValue => { + 1 => 'other', + 2 => 'systemFan', + 3 => 'cpuFan', + }, + cpqHeThermalFanStatusValue => { + 1 => 'other', + 2 => 'ok', + 4 => 'failed', + }, + }; + # INDEX { cpqHeThermalFanIndex } + foreach ($self->get_entries($oids, 'cpqHeThermalFanEntry')) { + next if ! $_->{cpqHeThermalFanPresent}; + push(@{$self->{th_fans}}, + HP::Proliant::Component::FanSubsystem::Fan->new(%{$_})); + } +} + +sub he_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $params{rawdata}; + my $ignore_redundancy = $params{ignore_redundancy}; + # cpqHeFltTolFanTable + my $oids = { + cpqHeFltTolFanEntry => '1.3.6.1.4.1.232.6.2.6.7.1', + cpqHeFltTolFanChassis => '1.3.6.1.4.1.232.6.2.6.7.1.1', + cpqHeFltTolFanIndex => '1.3.6.1.4.1.232.6.2.6.7.1.2', + cpqHeFltTolFanLocale => '1.3.6.1.4.1.232.6.2.6.7.1.3', + cpqHeFltTolFanPresent => '1.3.6.1.4.1.232.6.2.6.7.1.4', + cpqHeFltTolFanType => '1.3.6.1.4.1.232.6.2.6.7.1.5', + cpqHeFltTolFanSpeed => '1.3.6.1.4.1.232.6.2.6.7.1.6', + cpqHeFltTolFanRedundant => '1.3.6.1.4.1.232.6.2.6.7.1.7', + cpqHeFltTolFanRedundantPartner => '1.3.6.1.4.1.232.6.2.6.7.1.8', + cpqHeFltTolFanCondition => '1.3.6.1.4.1.232.6.2.6.7.1.9', + cpqHeFltTolFanHotPlug => '1.3.6.1.4.1.232.6.2.6.7.1.10', + cpqHeFltTolFanHwLocation => '1.3.6.1.4.1.232.6.2.6.7.1.11', + cpqHeFltTolFanCurrentSpeed => '1.3.6.1.4.1.232.6.2.6.7.1.12', + cpqHeFltTolFanLocaleValue => { + 1 => "other", + 2 => "unknown", + 3 => "system", + 4 => "systemBoard", + 5 => "ioBoard", + 6 => "cpu", + 7 => "memory", + 8 => "storage", + 9 => "removableMedia", + 10 => "powerSupply", + 11 => "ambient", + 12 => "chassis", + 13 => "bridgeCard", + }, + cpqHeFltTolFanPresentValue => { + 1 => "other", + 2 => "absent", + 3 => "present", + }, + cpqHeFltTolFanSpeedValue => { + 1 => "other", + 2 => "normal", + 3 => "high", + }, + cpqHeFltTolFanRedundantValue => { + 1 => "other", + 2 => "notRedundant", + 3 => "redundant", + }, + cpqHeFltTolFanTypeValue => { + 1 => "other", + 2 => "tachInput", + 3 => "spinDetect", + }, + cpqHeFltTolFanConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqHeFltTolFanHotPlugValue => { + 1 => "other", + 2 => "nonHotPluggable", + 3 => "hotPluggable", + }, + }; + # INDEX { cpqHeFltTolFanChassis, cpqHeFltTolFanIndex } + foreach ($self->get_entries($oids, 'cpqHeFltTolFanEntry')) { + next if ! defined $_->{cpqHeFltTolFanIndex}; + # z.b. USM65201WS hat nur solche fragmente. die werden erst gar nicht + # als fans akzeptiert. dafuer gibts dann die overall condition + # SNMPv2-SMI::enterprises.232.6.2.6.7.1.1.0.1 = INTEGER: 0 + # SNMPv2-SMI::enterprises.232.6.2.6.7.1.1.0.2 = INTEGER: 0 + $_->{cpqHeFltTolFanPctMax} = ($_->{cpqHeFltTolFanPresent} eq 'present') ? + 50 : 0; + push(@{$self->{he_fans}}, + HP::Proliant::Component::FanSubsystem::Fan->new(%{$_})); + } + +} + +sub unite { + my $self = shift; + my $tmpfans = {}; + foreach (@{$self->{he_fans}}) { + $tmpfans->{$_->{cpqHeFltTolFanIndex}} = $_; + } + foreach (@{$self->{he_fans}}) { + if (exists $tmpfans->{$_->{cpqHeFltTolFanRedundantPartner}}) { + $_->{partner} = $tmpfans->{$_->{cpqHeFltTolFanRedundantPartner}}; + } else { + $_->{partner} = undef; + } + } + @{$self->{fans}} = @{$self->{he_fans}}; +} + +sub overall_check { + my $self = shift; + my $result = 0; + $self->blacklist('ofs', ''); + if ($self->{sysstatus} && $self->{cpustatus}) { + if ($self->{sysstatus} eq 'degraded') { + $result = 1; + $self->add_message(WARNING, + sprintf 'system fan overall status is %s', $self->{sysstatus}); + } elsif ($self->{sysstatus} eq 'failed') { + $result = 2; + $self->add_message(CRITICAL, + sprintf 'system fan overall status is %s', $self->{sysstatus}); + } + if ($self->{cpustatus} eq 'degraded') { + $result = 1; + $self->add_message(WARNING, + sprintf 'cpu fan overall status is %s', $self->{cpustatus}); + } elsif ($self->{cpustatus} eq 'failed') { + $result = 2; + $self->add_message(CRITICAL, + sprintf 'cpu fan overall status is %s', $self->{cpustatus}); + } + $self->add_info(sprintf 'overall fan status: system=%s, cpu=%s', + $self->{sysstatus}, $self->{cpustatus}); + } else { + $result = 0; + $self->add_info('this system seems to be water-cooled. no fans found'); + } + return $result; +} + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem.pm new file mode 100755 index 0000000..17a49ea --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem.pm @@ -0,0 +1,197 @@ +package HP::Proliant::Component::MemorySubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + dimms => [], + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::MemorySubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::MemorySubsystem::CLI->new(%params); + } else { + die "unknown method"; + } +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking memory'); + foreach (@{$self->{dimms}}) { + $_->check(); # info ausfuellen + } + if ((scalar(grep { + $_->is_present() && + ($_->{condition} ne 'n/a' && $_->{condition} ne 'other' ) + } @{$self->{dimms}})) != 0) { + foreach (@{$self->{dimms}}) { + if (($_->is_present()) && ($_->{condition} ne 'ok')) { + $_->add_message(CRITICAL, $_->{info}); + $errorfound++; + } + } + } else { + if ($self->{runtime}->{options}->{ignore_dimms}) { + $self->add_message(OK, + sprintf "ignoring %d dimms with status 'n/a' ", + scalar(grep { ($_->is_present()) } @{$self->{dimms}})); + } elsif ($self->{runtime}->{options}->{buggy_firmware}) { + $self->add_message(OK, + sprintf "ignoring %d dimms with status 'n/a' because of buggy firmware", + scalar(grep { ($_->is_present()) } @{$self->{dimms}})); + } else { + $self->add_message(WARNING, + sprintf "status of all %d dimms is n/a (please upgrade firmware)", + scalar(grep { $_->is_present() } @{$self->{dimms}})); + $errorfound++; + } + } + foreach (@{$self->{dimms}}) { + printf "%s\n", $_->{info} if $self->{runtime}->{options}->{verbose} >= 2; + } + if (! $errorfound && $self->is_faulty()) { + #if ($self->is_faulty()) { + $self->add_message(WARNING, + sprintf 'overall memory error found'); + } +} + +sub dump { + my $self = shift; + printf "i dump the memory\n"; + foreach (@{$self->{dimms}}) { + $_->dump(); + } +} + +package HP::Proliant::Component::MemorySubsystem::Dimm; +our @ISA = qw(HP::Proliant::Component::MemorySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cartridge => $params{cartridge}, + module => $params{module}, + size => $params{size} || 0, + status => $params{status}, + condition => $params{condition}, + type => $params{type}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->{name} = sprintf '%s:%s', + $self->{cartridge}, $self->{module}; + $self->{location} = sprintf 'module %s @ cartridge %s', + $self->{module}, $self->{cartridge}; + return $self; +} + +sub check { + my $self = shift; + # check dient nur dazu, info und extended_info zu fuellen + # die eigentliche bewertung findet eins hoeher statt + $self->blacklist('d', $self->{name}); + if (($self->{status} eq 'present') || ($self->{status} eq 'good')) { + if ($self->{condition} eq 'other') { + $self->add_info(sprintf 'dimm %s (%s) is n/a', + $self->{name}, $self->{location}); + } elsif ($self->{condition} ne 'ok') { + $self->add_info( + sprintf "dimm module %s (%s) needs attention (%s)", + $self->{name}, $self->{location}, $self->{condition}); + } else { + $self->add_info(sprintf 'dimm module %s (%s) is %s', + $self->{name}, $self->{location}, $self->{condition}); + } + } elsif ($self->{status} eq 'notPresent') { + $self->add_info(sprintf 'dimm module %s (%s) is not present', + $self->{name}, $self->{location}); + } else { + $self->add_info( + sprintf "dimm module %s (%s) needs attention (%s)", + $self->{name}, $self->{location}, $self->{condition}); + } +} + +sub is_present { + my $self = shift; + my @signs_of_presence = (qw(present good add upgraded doesnotmatch + notsupported badconfig degraded)); + return scalar(grep { $self->{status} eq $_ } @signs_of_presence); +} + + +sub dump { + my $self = shift; + #printf "[DIMM_%s_%s]\n", $self->{cartridge}, $self->{module}; + #foreach (qw(cartridge module size status condition info)) { + # printf "%s: %s\n", $_, $self->{$_}; + #} + #printf "status: %s\n", $self->{status} if exists $self->{status}; + #printf "\n"; + printf "car %02d mod %02d siz %.0f sta %-12s con %-10s typ %s\n", + $self->{cartridge}, $self->{module}, $self->{size}, + $self->{status}, $self->{condition}, defined $self->{type} ? $self->{type} : ""; +} + + +package HP::Proliant::Component::MemorySubsystem::Cartridge; +our @ISA = qw(HP::Proliant::Component::MemorySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + cpqHeResMemBoardSlotIndex => $params{cpqHeResMemBoardSlotIndex}, + cpqHeResMemBoardOnlineStatus => $params{cpqHeResMemBoardOnlineStatus}, + cpqHeResMemBoardErrorStatus => $params{cpqHeResMemBoardErrorStatus}, + cpqHeResMemBoardNumSockets => $params{cpqHeResMemBoardNumSockets}, + cpqHeResMemBoardOsMemSize => $params{cpqHeResMemBoardOsMemSize}, + cpqHeResMemBoardTotalMemSize => $params{cpqHeResMemBoardTotalMemSize}, + cpqHeResMemBoardCondition => $params{cpqHeResMemBoardCondition}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + return $self; +} + +sub dump { + my $self = shift; + #printf "[CARTRIDGE_%s_%s]\n", $self->{cpqHeResMemBoardSlotIndex}; + #foreach (qw(cpqHeResMemBoardSlotIndex cpqHeResMemBoardOnlineStatus + # cpqHeResMemBoardErrorStatus cpqHeResMemBoardNumSockets + # cpqHeResMemBoardOsMemSize cpqHeResMemBoardTotalMemSize + # cpqHeResMemBoardCondition)) { + # printf "%s: %s\n", $_, $self->{$_}; + #} + #printf "\n"; +} + + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem/CLI.pm new file mode 100755 index 0000000..f53d77f --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem/CLI.pm @@ -0,0 +1,87 @@ +package HP::Proliant::Component::MemorySubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::MemorySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + dimms => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + $self->{dimms} = []; + my %tmpdimm = ( + runtime => $params{runtime}, + ); + my $inblock = 0; + foreach (grep(/^dimm/, split(/\n/, $self->{rawdata}))) { + s/^dimm\s*$//g; + if (/Cartridge #:\s+(\d+)/ || /Processor #:\s+(\d+)/) { + # neuerdings (g6) tauchen hier prozessor- statt cartridge-angaben auf + $tmpdimm{cartridge} = $1; + $tmpdimm{board} = $1; + $inblock = 1; + } elsif (/Module #:\s+(\d+)/) { + $tmpdimm{module} = $1; + } elsif (/Present:\s+(\w+)/) { + $tmpdimm{status} = lc $1 eq 'yes' ? 'present' : + lc $1 eq 'no' ? 'notPresent' : 'other'; + } elsif (/Status:\s+(.+?)\s*$/) { + $tmpdimm{condition} = lc $1 =~ /degraded/ ? 'degraded' : + lc $1 eq 'ok' ? 'ok' : lc $1 =~ /n\/a/ ? 'n/a' : 'other'; + } elsif (/Size:\s+(\d+)\s*(.+?)\s*$/) { + $tmpdimm{size} = $1 * (lc $2 eq 'mb' ? 1024*1024 : + lc $2 eq 'gb' ? 1024*1024*1024 : 1); + } elsif (/^\s*$/) { + if ($inblock) { + $inblock = 0; + push(@{$self->{dimms}}, + HP::Proliant::Component::MemorySubsystem::Dimm->new(%tmpdimm)); + %tmpdimm = ( + runtime => $params{runtime}, + ); + } + } elsif (/(\d+)\s+(\d+)\s+(\w+)\s+(0x\w+)\s+(0x\w+)\s+(\d+[MGT]B)\s+(\d+MHz)\s+(\w+)/) { + $tmpdimm{cartridge} = $1; + $tmpdimm{module} = $2; + $tmpdimm{status} = lc $3 eq 'yes' ? 'present' : + lc $3 eq 'no' ? 'notPresent' : 'other'; + my $formfactor = $4; + my $memorytype = $5; + my $memorysize = $6; + my $memoryspeed = $7; + $tmpdimm{condition} = lc $8 =~ /degraded/ ? 'degraded' : + lc $8 eq 'ok' ? 'ok' : lc $8 =~ /n\/a/ ? 'n/a' : 'other'; + $memorysize =~ /(\d+)([MGT]B)/; + $tmpdimm{size} = $1 * (lc $2 eq 'mb' ? 1024*1024 : + lc $2 eq 'gb' ? 1024*1024*1024 : 1); + push(@{$self->{dimms}}, + HP::Proliant::Component::MemorySubsystem::Dimm->new(%tmpdimm)); + } + } + if ($inblock) { + push(@{$self->{dimms}}, + HP::Proliant::Component::MemorySubsystem::Dimm->new(%tmpdimm)); + } +} + +sub is_faulty { + my $self = shift; + return 0; # cli hat so einen globalen status nicht +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem/SNMP.pm new file mode 100755 index 0000000..410a858 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/MemorySubsystem/SNMP.pm @@ -0,0 +1,746 @@ +package HP::Proliant::Component::MemorySubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::MemorySubsystem + HP::Proliant::Component::SNMP); + +use strict; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + dimms => [], + si_dimms => [], + he_dimms => [], + h2_dimms => [], + he_cartridges => [], + h2_cartridges => [], + si_overall_condition => undef, + he_overall_condition => undef, + h2_overall_condition => undef, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->si_init(); + $self->he_init(); + $self->he_cartridge_init(); + $self->h2_init(); + #$self->h2_cartridge_init(); + $self->condense(); + return $self; +} + +sub si_init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqSiMemModuleEntry => '1.3.6.1.4.1.232.2.2.4.5.1', + cpqSiMemBoardIndex => '1.3.6.1.4.1.232.2.2.4.5.1.1', + cpqSiMemModuleIndex => '1.3.6.1.4.1.232.2.2.4.5.1.2', + cpqSiMemModuleSize => '1.3.6.1.4.1.232.2.2.4.5.1.3', + cpqSiMemModuleType => '1.3.6.1.4.1.232.2.2.4.5.1.4', + cpqSiMemECCStatus => '1.3.6.1.4.1.232.2.2.4.5.1.11', + cpqSiMemModuleHwLocation => '1.3.6.1.4.1.232.2.2.4.5.1.12', + cpqSiMemModuleTypeValue => { + 1 => 'other', + 2 => 'board', + 3 => 'cpqSingleWidthModule', + 4 => 'cpqDoubleWidthModule', + 5 => 'simm', + 6 => 'pcmcia', + 7 => 'compaq-specific', + 8 => 'dimm', + 9 => 'smallOutlineDimm', + 10 => 'rimm', + 11 => 'srimm', + }, + cpqSiMemECCStatusValue => { + 0 => "n/a", + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "degradedModuleIndexUnknown", + 34 => 'n/a', # es ist zum kotzen... + 104 => 'n/a', + }, + }; + # INDEX { cpqSiMemBoardIndex, cpqSiMemModuleIndex } + foreach ($self->get_entries($oids, 'cpqSiMemModuleEntry')) { + $_->{cartridge} = $_->{cpqSiMemBoardIndex}; + $_->{module} = $_->{cpqSiMemModuleIndex}; + next if (! defined $_->{cartridge} || ! defined $_->{module}); + $_->{size} = $_->{cpqSiMemModuleSize}; + $_->{type} = $_->{cpqSiMemModuleType}; + $_->{condition} = $_->{cpqSiMemECCStatus}; + $_->{status} = ($_->{cpqSiMemModuleSize} > 0) ? 'present' : 'notPresent'; + push(@{$self->{si_dimms}}, + HP::Proliant::Component::MemorySubsystem::Dimm->new(%{$_}) + ); + } + my $cpqSiMemECCCondition = '1.3.6.1.4.1.232.2.2.4.15.0'; + my $cpqSiMemECCConditionValue = { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + }; + $self->{si_overall_condition} = SNMP::Utils::get_object_value( + $self->{rawdata}, $cpqSiMemECCCondition, + $cpqSiMemECCConditionValue); + $self->trace(2, sprintf 'overall si condition is %s', + $self->{si_overall_condition} || 'undefined'); +} + +sub he_init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeResMemModuleEntry => '1.3.6.1.4.1.232.6.2.14.11.1', + cpqHeResMemBoardIndex => '1.3.6.1.4.1.232.6.2.14.11.1.1', + cpqHeResMemModuleIndex => '1.3.6.1.4.1.232.6.2.14.11.1.2', + cpqHeResMemModuleStatus => '1.3.6.1.4.1.232.6.2.14.11.1.4', + cpqHeResMemModuleCondition => '1.3.6.1.4.1.232.6.2.14.11.1.5', + cpqHeResMemModuleStatusValue => { + 1 => "other", # unknown or could not be determined + 2 => "notPresent", # not present or un-initialized + 3 => "present", # present but not in use + 4 => "good", # present and in use. ecc threshold not exceeded + 5 => "add", # added but not yet in use + 6 => "upgrade", # upgraded but not yet in use + 7 => "missing", # expected but missing + 8 => "doesNotMatch", # does not match the other modules in the bank + 9 => "notSupported", # module not supported + 10 => "badConfig", # violates add/upgrade configuration + 11 => "degraded", # ecc exceeds threshold + }, + # condition = status of the correctable memory errors + cpqHeResMemModuleConditionValue => { + 0 => "n/a", # this appears only with buggy firmwares. + # (only 1 module shows up) + 1 => "other", + 2 => "ok", + 3 => "degraded", + }, + }; + my $tablesize = SNMP::Utils::get_size($snmpwalk, + $oids->{cpqHeResMemModuleEntry}); + # INDEX { cpqHeResMemBoardIndex, cpqHeResMemModuleIndex } + foreach ($self->get_entries($oids, 'cpqHeResMemModuleEntry')) { + $_->{cartridge} = $_->{cpqHeResMemBoardIndex}; + $_->{module} = $_->{cpqHeResMemModuleIndex}; + $_->{present} = $_->{cpqHeResMemModuleStatus}; + $_->{status} = $_->{cpqHeResMemModuleStatus}; + $_->{condition} = $_->{cpqHeResMemModuleCondition}; + if ((! defined $_->{module}) && ($_->{cartridge} == 0)) { + $_->{module} = $_->{index2}; # auf dem systemboard verbaut + } + + push(@{$self->{he_dimms}}, + HP::Proliant::Component::MemorySubsystem::Dimm->new(%{$_}) + ) unless (! defined $_->{cartridge} || ! defined $_->{module} || + $tablesize == 1); + } + my $cpqHeResilientMemCondition = '1.3.6.1.4.1.232.6.2.14.4.0'; + my $cpqHeResilientMemConditionValue = { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + }; + $self->{he_overall_condition} = SNMP::Utils::get_object_value( + $self->{rawdata}, $cpqHeResilientMemCondition, + $cpqHeResilientMemConditionValue); + $self->trace(2, sprintf 'overall he condition is %s', + $self->{hei_overall_condition} || 'undefined'); +} + +sub he_cartridge_init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeResMemBoardEntry => '1.3.6.1.4.1.232.6.2.14.10.1', + cpqHeResMemBoardSlotIndex => '1.3.6.1.4.1.232.6.2.14.10.1.1', + cpqHeResMemBoardOnlineStatus => '1.3.6.1.4.1.232.6.2.14.10.1.2', + cpqHeResMemBoardErrorStatus => '1.3.6.1.4.1.232.6.2.14.10.1.3', + cpqHeResMemBoardNumSockets => '1.3.6.1.4.1.232.6.2.14.10.1.5', + cpqHeResMemBoardOsMemSize => '1.3.6.1.4.1.232.6.2.14.10.1.6', + cpqHeResMemBoardTotalMemSize => '1.3.6.1.4.1.232.6.2.14.10.1.7', + cpqHeResMemBoardCondition => '1.3.6.1.4.1.232.6.2.14.10.1.8', + # onlinestatus + cpqHeResMemBoardOnlineStatusValue => { + 0 => "n/a", # this appears only with buggy firmwares. + # (only 1 module shows up) + 1 => "other", + 2 => "present", + 3 => "absent", + }, + cpqHeResMemBoardErrorStatusValue => { + 1 => "other", # + 2 => "noError", # + 3 => "dimmEccError", # + 4 => "unlockError", # + 5 => "configError", # + 6 => "busError", # + 7 => "powerError", # + }, + # condition = status of the correctable memory errors + cpqHeResMemBoardConditionValue => { + 0 => "n/a", # this appears only with buggy firmwares. + # (only 1 module shows up) + 1 => "other", + 2 => "ok", + 3 => "degraded", + }, + }; + my $tablesize = SNMP::Utils::get_size($snmpwalk, + $oids->{cpqHeResMemBoardEntry}); + # INDEX { cpqHeResMemBoardIndex, cpqHeResMemBoardIndex } + foreach ($self->get_entries($oids, 'cpqHeResMemBoardEntry')) { + push(@{$self->{he_cartridges}}, + HP::Proliant::Component::MemorySubsystem::Cartridge->new(%{$_}) + ) unless (! defined $_->{cpqHeResMemBoardSlotIndex} || $tablesize == 1); + } +} + +sub h2_init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeResMem2ModuleEntry => '1.3.6.1.4.1.232.6.2.14.13.1', + cpqHeResMem2BoardNum => '1.3.6.1.4.1.232.6.2.14.13.1.2', + cpqHeResMem2ModuleNum => '1.3.6.1.4.1.232.6.2.14.13.1.5', + cpqHeResMem2ModuleStatus => '1.3.6.1.4.1.232.6.2.14.13.1.19', + cpqHeResMem2ModuleCondition => '1.3.6.1.4.1.232.6.2.14.13.1.20', + cpqHeResMem2ModuleSize => '1.3.6.1.4.1.232.6.2.14.13.1.6', + + cpqHeResMem2ModuleStatusValue => { + 1 => "other", # unknown or could not be determined + 2 => "notPresent", # not present or un-initialized + 3 => "present", # present but not in use + 4 => "good", # present and in use. ecc threshold not exceeded + 5 => "add", # added but not yet in use + 6 => "upgrade", # upgraded but not yet in use + 7 => "missing", # expected but missing + 8 => "doesNotMatch", # does not match the other modules in the bank + 9 => "notSupported", # module not supported + 10 => "badConfig", # violates add/upgrade configuration + 11 => "degraded", # ecc exceeds threshold + }, + # condition = status of the correctable memory errors + cpqHeResMem2ModuleConditionValue => { + 0 => "n/a", # this appears only with buggy firmwares. + # (only 1 module shows up) + 1 => "other", + 2 => "ok", + 3 => "degraded", + }, + }; + # INDEX { cpqHeResMem2ModuleNum } + my $lastboard = 0; + my $lastmodule = 0; + my $myboard= 0; + my $hpboard = 0; + foreach (sort { $a->{index1} <=> $b->{index1} } + $self->get_entries($oids, 'cpqHeResMem2ModuleEntry')) { + $hpboard = $_->{cpqHeResMem2BoardNum}; + # dass hier faelschlicherweise 0 zurueckkommt, wundert mich schon + # gar nicht mehr + $_->{module} = $_->{cpqHeResMem2ModuleNum}; + if ($_->{module} < $lastmodule) { + # sieht so aus, als haette man es mit einem neuen board zu tun + # da hp zu bloed ist, selber hochzuzaehlen, muss ich das tun + $myboard++; + } + $lastmodule = $_->{cpqHeResMem2ModuleNum}; + $_->{cartridge} = ($myboard != $hpboard) ? $myboard : $hpboard; + $_->{present} = $_->{cpqHeResMem2ModuleStatus}; + $_->{status} = $_->{cpqHeResMem2ModuleStatus}; + $_->{condition} = $_->{cpqHeResMem2ModuleCondition}; + $_->{size} = $_->{cpqHeResMem2ModuleSize}; + push(@{$self->{h2_dimms}}, + HP::Proliant::Component::MemorySubsystem::Dimm->new(%{$_}) + ) unless (! defined $_->{cpqHeResMem2BoardNum} || + ! defined $_->{cpqHeResMem2ModuleNum}); + } +} + +sub h2_cartridge_init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeResMem2BoardEntry => '1.3.6.1.4.1.232.6.2.14.12.1', + cpqHeResMem2BoardIndex => '1.3.6.1.4.1.232.6.2.14.12.1.1', + cpqHeResMem2BoardOnlineStatus => '1.3.6.1.4.1.232.6.2.14.12.1.5', + cpqHeResMem2BoardErrorStatus => '1.3.6.1.4.1.232.6.2.14.12.1.6', + cpqHeResMem2BoardNumSockets => '1.3.6.1.4.1.232.6.2.14.12.1.8', + cpqHeResMem2BoardOsMemSize => '1.3.6.1.4.1.232.6.2.14.12.1.9', + cpqHeResMem2BoardTotalMemSize => '1.3.6.1.4.1.232.6.2.14.12.1.10', + cpqHeResMem2BoardCondition => '1.3.6.1.4.1.232.6.2.14.12.1.11', + # onlinestatus + cpqHeResMem2BoardOnlineStatusValue => { + 0 => "n/a", # this appears only with buggy firmwares. + # (only 1 module shows up) + 1 => "other", + 2 => "present", + 3 => "absent", + }, + cpqHeResMem2BoardErrorStatusValue => { + 1 => "other", # + 2 => "noError", # + 3 => "dimmEccError", # + 4 => "unlockError", # + 5 => "configError", # + 6 => "busError", # + 7 => "powerError", # + }, + # condition = status of the correctable memory errors + cpqHeResMem2BoardConditionValue => { + 0 => "n/a", # this appears only with buggy firmwares. + # (only 1 module shows up) + 1 => "other", + 2 => "ok", + 3 => "degraded", + }, + }; + my $tablesize = SNMP::Utils::get_size($snmpwalk, + $oids->{cpqHeResMemBoardEntry}); + # INDEX { cpqHeResMem2BoardIndex, cpqHeResMem2BoardIndex } + foreach ($self->get_entries($oids, 'cpqHeResMem2BoardEntry')) { + push(@{$self->{h2_cartridges}}, + HP::Proliant::Component::MemorySubsystem::Cartridge->new(%{$_}) + ) unless (! defined $_->{cpqHeRes2MemBoardIndex} || $tablesize == 1); + } +} + +sub condense { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + # wenn saemtliche dimms n/a sind + # wenn ignore dimms: ignoring %d dimms with status 'n/a' + # wenn buggyfirmware: ignoring %d dimms with status 'n/a' because of buggy firmware + # if buggy firmware : condition n/a ist normal + # ignore-dimms : + # es gibt si_dimms und he_dimms + my $si_dimms = scalar(@{$self->{si_dimms}}); + my $he_dimms = scalar(@{$self->{he_dimms}}); + my $h2_dimms = scalar(@{$self->{h2_dimms}}); + $self->trace(2, sprintf "SI: %02d HE: %02d H2: %02d", + $si_dimms, $he_dimms, $h2_dimms) + if ($self->{runtime}->{options}->{verbose} >= 2); + foreach ($self->get_si_boards()) { + printf "SI%02d-> ", $_ if ($self->{runtime}->{options}->{verbose} >= 2); + foreach ($self->get_si_modules($_)) { + printf "%02d ", $_ if ($self->{runtime}->{options}->{verbose} >= 2); + } + printf "\n" if ($self->{runtime}->{options}->{verbose} >= 2); + } + foreach ($self->get_he_boards()) { + printf "HE%02d-> ", $_ if ($self->{runtime}->{options}->{verbose} >= 2); + foreach ($self->get_he_modules($_)) { + printf "%02d ", $_ if ($self->{runtime}->{options}->{verbose} >= 2); + } + printf "\n" if ($self->{runtime}->{options}->{verbose} >= 2); + } + foreach ($self->get_h2_boards()) { + printf "H2%02d-> ", $_ if ($self->{runtime}->{options}->{verbose} >= 2); + foreach ($self->get_h2_modules($_)) { + printf "%02d ", $_ if ($self->{runtime}->{options}->{verbose} >= 2); + } + printf "\n" if ($self->{runtime}->{options}->{verbose} >= 2); + } + if (($h2_dimms == 0) && ($he_dimms == 0) && ($si_dimms > 0)) { + printf "TYP1 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_si_with_si(); + } elsif (($h2_dimms == 0) && ($he_dimms > 0) && ($si_dimms > 0)) { + printf "TYP2 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_si_with_he(); + } elsif (($h2_dimms == 0) && ($he_dimms > 0) && ($si_dimms == 0)) { + printf "TYP3 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_he_with_he(); + } elsif (($h2_dimms > 0) && ($he_dimms == 0) && ($si_dimms == 0)) { + printf "TYP4 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_h2_with_h2(); + } elsif (($h2_dimms > 0) && ($he_dimms > 0) && ($si_dimms == 0)) { + printf "TYP5 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_he_with_h2(); + } elsif (($h2_dimms > 0) && ($he_dimms == 0) && ($si_dimms > 0)) { + printf "TYP6 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_si_with_h2(); + } elsif (($h2_dimms > 0) && ($he_dimms > 0) && ($si_dimms > 0)) { + if ($h2_dimms > $si_dimms) { + printf "TYP7 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_he_with_h2(); + } else { + printf "TYP8 %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + @{$self->{dimms}} = $self->update_si_with_he(); + } + } else { + printf "TYPX %s\n", $self->{runtime}->{product} + if ($self->{runtime}->{options}->{verbose} >= 2); + } + my $all_dimms = scalar(@{$self->{dimms}}); + $self->trace(2, sprintf "ALL: %02d", $all_dimms); +} + +sub dump { + my $self = shift; + if ($self->{runtime}->{options}->{verbose} > 2) { + printf "[SI]\n"; + foreach (@{$self->{si_dimms}}) { + $_->dump(); + } + printf "[HE]\n"; + foreach (@{$self->{he_dimms}}) { + $_->dump(); + } + printf "[H2]\n"; + foreach (@{$self->{h2_dimms}}) { + $_->dump(); + } + } + $self->SUPER::dump(); +} + +sub update_si_with_si { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my @dimms = (); + my $repaircondition = undef; + # wenn si keine statusinformationen liefert, dann besteht die chance + # dass ein undokumentiertes he-fragment vorliegt + # 1.3.6.1.4.1.232.6.2.14.11.1.1.0.<anzahl der dimms> + my $cpqHeResMemModuleEntry = "1.3.6.1.4.1.232.6.2.14.11.1"; + if (SNMP::Utils::get_size($snmpwalk, $cpqHeResMemModuleEntry) == 1) { + $repaircondition = lc SNMP::Utils::get_object( + $snmpwalk, $cpqHeResMemModuleEntry.'.1.0.'.scalar(@{$self->{si_dimms}})); + # repaircondition 0 (ok) biegt alles wieder gerade + } else { + # anderer versuch + if ($self->{si_overall_condition} && + $self->{si_overall_condition} eq 'ok') { + $repaircondition = 0; + } + } + foreach my $si_dimm (@{$self->{si_dimms}}) { + if (($si_dimm->{condition} eq 'n/a') || + ($si_dimm->{condition} eq 'other')) { + $si_dimm->{condition} = 'ok' if + (defined $repaircondition && $repaircondition == 0); + } + push(@dimms, + HP::Proliant::Component::MemorySubsystem::Dimm->new( + runtime => $si_dimm->{runtime}, + cartridge => $si_dimm->{cartridge}, + module => $si_dimm->{module}, + size => $si_dimm->{size}, + status => $si_dimm->{status}, + condition => $si_dimm->{condition}, + )); + } + return @dimms; +} + +sub update_si_with_he { + my $self = shift; + my @dimms = (); + my $first_si_cartridge = ($self->get_si_boards())[0]; + my $first_he_cartridge = ($self->get_he_boards())[0]; + my $offset = 0; + if (scalar(@{$self->{si_dimms}}) == scalar(@{$self->{he_dimms}})) { + # aufpassen! sowas kann vorkommen: si cartridge 0...6, he cartridge 1...7 + if ($first_si_cartridge != $first_he_cartridge) { + # README case 5 + $offset = $first_si_cartridge - $first_he_cartridge; + } + } elsif ((scalar(@{$self->{si_dimms}}) > 1) && + (scalar(@{$self->{he_dimms}}) == 1)) { + # siehe update_si_with_si. he-fragment + return $self->update_si_with_si(); + } else { + # z.b. 4 si notpresent, 4 si present, 4 he + } + foreach my $si_dimm (@{$self->{si_dimms}}) { + if (($si_dimm->{condition} eq 'n/a') || + ($si_dimm->{condition} eq 'other')) { + if (my $he_dimm = $self->get_he_module( + $si_dimm->{cartridge} - $offset, $si_dimm->{module})) { + # vielleicht hat he mehr ahnung + $si_dimm->{condition} = $he_dimm->{condition}; + if (($si_dimm->{condition} eq 'n/a') || + ($si_dimm->{condition} eq 'other')) { + # wenns immer noch kein brauchbares ergebnis gibt.... + if ($self->{he_overall_condition} && + $self->{he_overall_condition} eq 'ok') { + # wird schon stimmen... + $si_dimm->{condition} = 'ok'; + } else { + # ansonsten stellen wir uns dumm + $si_dimm->{status} = 'notPresent'; + } + } + } else { + # in dem fall zeigt si unbestueckte cartridges an + } + } + push(@dimms, + HP::Proliant::Component::MemorySubsystem::Dimm->new( + runtime => $si_dimm->{runtime}, + cartridge => $si_dimm->{cartridge}, + module => $si_dimm->{module}, + size => $si_dimm->{size}, + status => $si_dimm->{status}, + condition => $si_dimm->{condition}, + )); + } + return @dimms; +} + +sub update_he_with_he { + my $self = shift; + my @dimms = (); + foreach my $he_dimm (@{$self->{he_dimms}}) { + push(@dimms, + HP::Proliant::Component::MemorySubsystem::Dimm->new( + runtime => $he_dimm->{runtime}, + cartridge => $he_dimm->{cartridge}, + module => $he_dimm->{module}, + size => $he_dimm->{size}, + status => $he_dimm->{status}, + condition => $he_dimm->{condition}, + )); + } + return @dimms; +} + +sub update_si_with_h2 { + my $self = shift; + my @dimms = (); + my $first_si_cartridge = ($self->get_si_boards())[0]; + my $first_h2_cartridge = ($self->get_h2_boards())[0]; + my $offset = 0; + if (scalar(@{$self->{si_dimms}}) == scalar(@{$self->{h2_dimms}})) { + # aufpassen! sowas kann vorkommen: si cartridge 0...6, he cartridge 1...7 + if ($first_si_cartridge != $first_h2_cartridge) { + # README case 5 + $offset = $first_si_cartridge - $first_h2_cartridge; + } + } else { + # z.b. 4 si notpresent, 4 si present, 4 he + } + foreach my $si_dimm (@{$self->{si_dimms}}) { + if (($si_dimm->{condition} eq 'n/a') || + ($si_dimm->{condition} eq 'other')) { + if (my $h2_dimm = $self->get_h2_module( + $si_dimm->{cartridge} - $offset, $si_dimm->{module})) { + # vielleicht hat h2 mehr ahnung + $si_dimm->{condition} = $h2_dimm->{condition}; + if (1) { + # ist zwar da, aber irgendwie auskonfiguriert + $si_dimm->{status} = 'notPresent' if $h2_dimm->{status} eq 'other'; + } + } else { + # in dem fall zeigt si unbestueckte cartridges an + } + } + push(@dimms, + HP::Proliant::Component::MemorySubsystem::Dimm->new( + runtime => $si_dimm->{runtime}, + cartridge => $si_dimm->{cartridge}, + module => $si_dimm->{module}, + size => $si_dimm->{size}, + status => $si_dimm->{status}, + condition => $si_dimm->{condition}, + )); + } + return @dimms; +} + +sub update_he_with_h2 { + my $self = shift; + my @dimms = (); + my $first_he_cartridge = ($self->get_he_boards())[0]; + my $first_h2_cartridge = ($self->get_h2_boards())[0]; + my $offset = 0; + # auch hier koennte sowas u.u.vorkommen: he cartridge 0..6, h2 cartridge 1..7 + # ich habs zwar nie gesehen, aber wer weiss... + if ($first_h2_cartridge != $first_he_cartridge) { + $offset = $first_h2_cartridge - $first_he_cartridge; + } + foreach my $he_dimm (@{$self->{he_dimms}}) { + if (($he_dimm->{condition} eq 'n/a') || + ($he_dimm->{condition} eq 'other')) { + if (my $h2_dimm = $self->get_h2_module( + $he_dimm->{cartridge} + $offset, $he_dimm->{module})) { + # vielleicht hat h2 mehr ahnung + $he_dimm->{condition} = $h2_dimm->{condition}; + if (1) { + # ist zwar da, aber irgendwie auskonfiguriert + $he_dimm->{status} = 'notPresent' if $h2_dimm->{status} eq 'other'; + } + } else { + # in dem fall weiss he mehr als h2 + } + } + if ($he_dimm->{size} == 0) { + if (my $h2_dimm = $self->get_h2_module( + $he_dimm->{cartridge} + $offset, $he_dimm->{module})) { + $he_dimm->{size} = $h2_dimm->{size}; + # h2 beinhaltet eine size-oid + } + } + push(@dimms, + HP::Proliant::Component::MemorySubsystem::Dimm->new( + runtime => $he_dimm->{runtime}, + cartridge => $he_dimm->{cartridge}, + module => $he_dimm->{module}, + size => $he_dimm->{size}, + status => $he_dimm->{status}, + condition => $he_dimm->{condition}, + )); + } + return @dimms; +} + +sub update_h2_with_h2 { + my $self = shift; + my @dimms = (); + foreach my $h2_dimm (@{$self->{h2_dimms}}) { + push(@dimms, + HP::Proliant::Component::MemorySubsystem::Dimm->new( + runtime => $h2_dimm->{runtime}, + cartridge => $h2_dimm->{cartridge}, + module => $h2_dimm->{module}, + size => $h2_dimm->{size}, + status => $h2_dimm->{status}, + condition => $h2_dimm->{condition}, + )); + } + return @dimms; +} + +sub is_faulty { + my $self = shift; + if (scalar(@{$self->{si_dimms}}) > 0 && + scalar(@{$self->{he_dimms}}) > 0) { + return $self->si_is_faulty() || $self->he_is_faulty(); + } elsif (scalar(@{$self->{si_dimms}}) > 0 && + scalar(@{$self->{he_dimms}}) == 0) { + return $self->si_is_faulty(); + } elsif (scalar(@{$self->{si_dimms}}) == 0 && + scalar(@{$self->{he_dimms}}) > 0) { + return $self->he_is_faulty(); + } else { + return 0; + } +} + +sub si_is_faulty { + my $self = shift; + return ! defined $self->{si_overall_condition} ? 0 : + $self->{si_overall_condition} eq 'degraded' ? 1 : 0; +} + +sub si_is_ok { + my $self = shift; + return ! defined $self->{si_overall_condition} ? 1 : + $self->{si_overall_condition} eq 'ok' ? 1 : 0; +} + +sub he_is_faulty { + my $self = shift; + return ! defined $self->{he_overall_condition} ? 0 : + $self->{he_overall_condition} eq 'degraded' ? 1 : 0; +} + +sub he_is_ok { + my $self = shift; + return ! defined $self->{he_overall_condition} ? 1 : + $self->{he_overall_condition} eq 'ok' ? 1 : 0; +} + +sub get_si_boards { + my $self = shift; + my %found = (); + foreach (@{$self->{si_dimms}}) { + $found{$_->{cartridge}} = 1; + } + return sort { $a <=> $b } keys %found; +} + +sub get_si_modules { + my $self = shift; + my $board = shift; + my %found = (); + foreach (grep { $_->{cartridge} == $board } @{$self->{si_dimms}}) { + $found{$_->{module}} = 1; + } + return sort { $a <=> $b } keys %found; +} + +sub get_he_boards { + my $self = shift; + my %found = (); + foreach (@{$self->{he_dimms}}) { + $found{$_->{cartridge}} = 1; + } + return sort { $a <=> $b } keys %found; +} + +sub get_he_modules { + my $self = shift; + my $board = shift; + my %found = (); + foreach (grep { $_->{cartridge} == $board } @{$self->{he_dimms}}) { + $found{$_->{module}} = 1; + } + return sort { $a <=> $b } keys %found; +} + +sub get_he_module { + my $self = shift; + my $board = shift; + my $module = shift; + my $found = (grep { $_->{cartridge} == $board && $_->{module} == $module } + @{$self->{he_dimms}})[0]; + return $found; +} + +sub get_h2_boards { + my $self = shift; + my %found = (); + # + foreach (@{$self->{h2_dimms}}) { + $found{$_->{cartridge}} = 1; + } + return sort { $a <=> $b } keys %found; +} + +sub get_h2_modules { + my $self = shift; + my $board = shift; + my %found = (); + foreach (grep { $_->{cartridge} == $board } @{$self->{h2_dimms}}) { + $found{$_->{module}} = 1; + } + return sort { $a <=> $b } keys %found; +} + +sub get_h2_module { + my $self = shift; + my $board = shift; + my $module = shift; + my $found = (grep { $_->{cartridge} == $board && $_->{module} == $module } + @{$self->{h2_dimms}})[0]; + return $found; +} + + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/NicSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/NicSubsystem.pm new file mode 100755 index 0000000..02e5703 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/NicSubsystem.pm @@ -0,0 +1,202 @@ +package HP::Proliant::Component::NicSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + logical_nics => [], + physical_nics => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::NicSubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::NicSubsystem::CLI->new(%params); + } else { + die "unknown method"; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking nic teams'); + if (scalar (@{$self->{logical_nics}}) == 0) { + $self->add_info('no logical nics found'); + $self->overall_check(); + } else { + foreach (@{$self->{logical_nics}}) { + $_->check(); + } + } + if (scalar (@{$self->{physical_nics}}) == 0) { + $self->add_info('no physical nics found. do you connect with slip?'); + } else { + foreach (@{$self->{physical_nics}}) { + $_->check(); + } + } +} + +sub num_logical_nics { + my $self = shift; + return scalar @{$self->{logical_nics}}; +} + +sub num_physical_nics { + my $self = shift; + return scalar @{$self->{physical_nics}}; +} + +sub dump { + my $self = shift; + foreach (@{$self->{logical_nics}}) { + $_->dump(); + } + foreach (@{$self->{physical_nics}}) { + $_->dump(); + } +} + +sub overall_check { + my $self = shift; + if ($self->{lognicstatus} ne "ok") { + $self->add_info(sprintf 'overall logical nic status is %s', + $self->{lognicstatus}); + } +} + + +package HP::Proliant::Component::NicSubsystem::LogicalNic; +our @ISA = qw(HP::Proliant::Component::NicSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + foreach (qw(cpqNicIfLogMapIndex cpqNicIfLogMapIfNumber cpqNicIfLogMapDescription cpqNicIfLogMapGroupType cpqNicIfLogMapAdapterCount cpqNicIfLogMapAdapterOKCount cpqNicIfLogMapPhysicalAdapters cpqNicIfLogMapSwitchoverMode cpqNicIfLogMapCondition cpqNicIfLogMapStatus cpqNicIfLogMapNumSwitchovers cpqNicIfLogMapHwLocation cpqNicIfLogMapSpeed cpqNicIfLogMapVlanCount cpqNicIfLogMapVlans)) { + $self->{$_} = $params{$_}; + } + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('lni', $self->{cpqNicIfLogMapIndex}); + if ($self->{cpqNicIfLogMapAdapterCount} > 0) { + if ($self->{cpqNicIfLogMapCondition} eq "other") { + # simply ignore this. if there is a physical nic + # it is usually unknown/other/scheissegal + $self->add_info(sprintf "logical nic %d (%s) is %s", + $self->{cpqNicIfLogMapIndex}, $self->{cpqNicIfLogMapDescription}, + $self->{cpqNicIfLogMapCondition}); + } elsif ($self->{cpqNicIfLogMapCondition} ne "ok") { + $self->add_info(sprintf "logical nic %d (%s) is %s (%s)", + $self->{cpqNicIfLogMapIndex}, $self->{cpqNicIfLogMapDescription}, + $self->{cpqNicIfLogMapCondition}, $self->{cpqNicIfLogMapStatus}); + $self->add_message(CRITICAL, $self->{info}); + } else { + $self->add_info(sprintf "logical nic %d (%s) is %s", + $self->{cpqNicIfLogMapIndex}, $self->{cpqNicIfLogMapDescription}, + $self->{cpqNicIfLogMapCondition}); + } + } else { + $self->add_info(sprintf "logical nic %d (%s) has 0 physical nics", + $self->{cpqNicIfLogMapIndex}, $self->{cpqNicIfLogMapDescription}); + } +} + +sub dump { + my $self = shift; + printf "[LNIC_%s]\n", $self->{cpqNicIfLogMapIndex}; + foreach (qw(cpqNicIfLogMapIndex cpqNicIfLogMapIfNumber cpqNicIfLogMapDescription cpqNicIfLogMapAdapterCount cpqNicIfLogMapGroupType cpqNicIfLogMapSwitchoverMode cpqNicIfLogMapCondition cpqNicIfLogMapStatus cpqNicIfLogMapNumSwitchovers cpqNicIfLogMapHwLocation cpqNicIfLogMapSpeed)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} + + +package HP::Proliant::Component::NicSubsystem::PhysicalNic; +our @ISA = qw(HP::Proliant::Component::NicSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + foreach (qw(cpqNicIfPhysAdapterIndex cpqNicIfPhysAdapterIfNumber cpqNicIfPhysAdapterRole cpqNicIfPhysAdapterDuplexState cpqNicIfPhysAdapterCondition cpqNicIfPhysAdapterState cpqNicIfPhysAdapterStatus cpqNicIfPhysAdapterBadTransmits cpqNicIfPhysAdapterBadReceives)) { + $self->{$_} = $params{$_}; + } + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('pni', $self->{cpqNicIfPhysAdapterIndex}); + if ($self->{cpqNicIfPhysAdapterCondition} eq "other") { + # hp doesnt output a clear status. i am optimistic, unknown/other + # means "dont care" + $self->add_info(sprintf "physical nic %d (%s) is %s", + $self->{cpqNicIfPhysAdapterIndex}, $self->{cpqNicIfPhysAdapterRole}, + $self->{cpqNicIfPhysAdapterCondition}); + } elsif ($self->{cpqNicIfPhysAdapterCondition} ne "ok") { + $self->add_info(sprintf "physical nic %d (%s) is %s (%s,%s)", + $self->{cpqNicIfPhysAdapterIndex}, $self->{cpqNicIfPhysAdapterRole}, + $self->{cpqNicIfPhysAdapterCondition}, + $self->{cpqNicIfPhysAdapterState}, $self->{cpqNicIfPhysAdapterStatus}); + $self->add_message(CRITICAL, $self->{info}); + } else { + if ($self->{cpqNicIfPhysAdapterDuplexState} ne "full") { + $self->add_info(sprintf "physical nic %d (%s) is %s duplex", + $self->{cpqNicIfPhysAdapterIndex}, $self->{cpqNicIfPhysAdapterRole}, + $self->{cpqNicIfPhysAdapterDuplexState}); + } else { + $self->add_info(sprintf "physical nic %d (%s) is %s", + $self->{cpqNicIfPhysAdapterIndex}, $self->{cpqNicIfPhysAdapterRole}, + $self->{cpqNicIfPhysAdapterCondition}); + } + } +} + +sub dump { + my $self = shift; + printf "[PNIC_%s]\n", $self->{cpqNicIfPhysAdapterIndex}; + foreach (qw(cpqNicIfPhysAdapterIndex cpqNicIfPhysAdapterIfNumber cpqNicIfPhysAdapterRole cpqNicIfPhysAdapterDuplexState cpqNicIfPhysAdapterCondition cpqNicIfPhysAdapterState cpqNicIfPhysAdapterStatus cpqNicIfPhysAdapterBadTransmits cpqNicIfPhysAdapterBadReceives)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n", $self->{info}; + printf "\n"; +} + + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/NicSubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/NicSubsystem/SNMP.pm new file mode 100755 index 0000000..85f1fd4 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/NicSubsystem/SNMP.pm @@ -0,0 +1,189 @@ +package HP::Proliant::Component::NicSubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::NicSubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + blacklisted => 0, + info => undef, + extendedinfo => undef, + logical_nics => [], + physical_nics => [], + }; + bless $self, $class; + $self->overall_init(%params); + $self->init(); + return $self; +} + +sub overall_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + # overall + my $cpqNicIfLogMapOverallCondition = '1.3.6.1.4.1.232.18.2.2.2.0'; + my $cpqNicIfLogMapOverallConditionValue = { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }; + $self->{lognicstatus} = SNMP::Utils::get_object_value( + $snmpwalk, $cpqNicIfLogMapOverallCondition, + $cpqNicIfLogMapOverallConditionValue); +} + +sub init { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my $ifconnect = {}; + # CPQNIC-MIB + my $oids = { + cpqNicIfLogMapEntry => '1.3.6.1.4.1.232.18.2.2.1.1', + cpqNicIfLogMapIndex => '1.3.6.1.4.1.232.18.2.2.1.1.1', + cpqNicIfLogMapIfNumber => '1.3.6.1.4.1.232.18.2.2.1.1.2', + cpqNicIfLogMapDescription => '1.3.6.1.4.1.232.18.2.2.1.1.3', + cpqNicIfLogMapGroupType => '1.3.6.1.4.1.232.18.2.2.1.1.4', + cpqNicIfLogMapAdapterCount => '1.3.6.1.4.1.232.18.2.2.1.1.5', + cpqNicIfLogMapAdapterOKCount => '1.3.6.1.4.1.232.18.2.2.1.1.6', + cpqNicIfLogMapPhysicalAdapters => '1.3.6.1.4.1.232.18.2.2.1.1.7', + cpqNicIfLogMapMACAddress => '1.3.6.1.4.1.232.18.2.2.1.1.8', + cpqNicIfLogMapSwitchoverMode => '1.3.6.1.4.1.232.18.2.2.1.1.9', + cpqNicIfLogMapCondition => '1.3.6.1.4.1.232.18.2.2.1.1.10', + cpqNicIfLogMapStatus => '1.3.6.1.4.1.232.18.2.2.1.1.11', + cpqNicIfLogMapNumSwitchovers => '1.3.6.1.4.1.232.18.2.2.1.1.12', + cpqNicIfLogMapHwLocation => '1.3.6.1.4.1.232.18.2.2.1.1.13', + cpqNicIfLogMapSpeed => '1.3.6.1.4.1.232.18.2.2.1.1.14', + cpqNicIfLogMapVlanCount => '1.3.6.1.4.1.232.18.2.2.1.1.15', + cpqNicIfLogMapVlans => '1.3.6.1.4.1.232.18.2.2.1.1.16', + + cpqNicIfLogMapGroupTypeValue => { + 1 => "unknown", + 2 => "none", + 3 => "redundantPair", + 4 => "nft", + 5 => "alb", + 6 => "fec", + 7 => "gec", + 8 => "ad", + 9 => "slb", + 10 => "tlb", + 11 => "redundancySet", + }, + cpqNicIfLogMapConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqNicIfLogMapStatusValue => { + 1 => "unknown", + 2 => "ok", + 3 => "primaryFailed", + 4 => "standbyFailed", + 5 => "groupFailed", + 6 => "redundancyReduced", + 7 => "redundancyLost", + }, + cpqNicIfLogMapSwitchoverModeValue => { + 1 => "unknown", + 2 => "none", + 3 => "manual", + 4 => "switchOnFail", + 5 => "preferredPrimary", + }, + }; + + # INDEX { cpqNicIfLogMapIndex } + foreach ($self->get_entries($oids, 'cpqNicIfLogMapEntry')) { + push(@{$self->{logical_nics}}, + HP::Proliant::Component::NicSubsystem::LogicalNic->new(%{$_}) + ); + } + + $oids = { + cpqNicIfPhysAdapterEntry => '1.3.6.1.4.1.232.18.2.3.1.1', + cpqNicIfPhysAdapterIndex => '1.3.6.1.4.1.232.18.2.3.1.1.1', + cpqNicIfPhysAdapterIfNumber => '1.3.6.1.4.1.232.18.2.3.1.1.2', + cpqNicIfPhysAdapterRole => '1.3.6.1.4.1.232.18.2.3.1.1.3', + cpqNicIfPhysAdapterMACAddress => '1.3.6.1.4.1.232.18.2.3.1.1.4', + cpqNicIfPhysAdapterSlot => '1.3.6.1.4.1.232.18.2.3.1.1.5', + cpqNicIfPhysAdapterIoAddr => '1.3.6.1.4.1.232.18.2.3.1.1.6', + cpqNicIfPhysAdapterIrq => '1.3.6.1.4.1.232.18.2.3.1.1.7', + cpqNicIfPhysAdapterDma => '1.3.6.1.4.1.232.18.2.3.1.1.8', + cpqNicIfPhysAdapterMemAddr => '1.3.6.1.4.1.232.18.2.3.1.1.9', + cpqNicIfPhysAdapterPort => '1.3.6.1.4.1.232.18.2.3.1.1.10', + cpqNicIfPhysAdapterDuplexState => '1.3.6.1.4.1.232.18.2.3.1.1.11', + cpqNicIfPhysAdapterCondition => '1.3.6.1.4.1.232.18.2.3.1.1.12', + cpqNicIfPhysAdapterState => '1.3.6.1.4.1.232.18.2.3.1.1.13', + cpqNicIfPhysAdapterStatus => '1.3.6.1.4.1.232.18.2.3.1.1.14', + cpqNicIfPhysAdapterStatsValid => '1.3.6.1.4.1.232.18.2.3.1.1.15', + cpqNicIfPhysAdapterGoodTransmits => '1.3.6.1.4.1.232.18.2.3.1.1.16', + cpqNicIfPhysAdapterGoodReceives => '1.3.6.1.4.1.232.18.2.3.1.1.17', + cpqNicIfPhysAdapterBadTransmits => '1.3.6.1.4.1.232.18.2.3.1.1.18', + cpqNicIfPhysAdapterBadReceives => '1.3.6.1.4.1.232.18.2.3.1.1.19', + cpqNicIfPhysAdapterAlignmentErrors => '1.3.6.1.4.1.232.18.2.3.1.1.20', + cpqNicIfPhysAdapterFCSErrors => '1.3.6.1.4.1.232.18.2.3.1.1.21', + cpqNicIfPhysAdapterSingleCollisionFrames => '1.3.6.1.4.1.232.18.2.3.1.1.22', + cpqNicIfPhysAdapterMultipleCollisionFrames => '1.3.6.1.4.1.232.18.2.3.1.1.23', + cpqNicIfPhysAdapterDeferredTransmissions => '1.3.6.1.4.1.232.18.2.3.1.1.24', + cpqNicIfPhysAdapterLateCollisions => '1.3.6.1.4.1.232.18.2.3.1.1.25', + cpqNicIfPhysAdapterExcessiveCollisions => '1.3.6.1.4.1.232.18.2.3.1.1.26', + cpqNicIfPhysAdapterInternalMacTransmitErrors => '1.3.6.1.4.1.232.18.2.3.1.1.27', + cpqNicIfPhysAdapterCarrierSenseErrors => '1.3.6.1.4.1.232.18.2.3.1.1.28', + cpqNicIfPhysAdapterFrameTooLongs => '1.3.6.1.4.1.232.18.2.3.1.1.29', + cpqNicIfPhysAdapterInternalMacReceiveErrors => '1.3.6.1.4.1.232.18.2.3.1.1.30', + cpqNicIfPhysAdapterHwLocation => '1.3.6.1.4.1.232.18.2.3.1.1.31', + cpqNicIfPhysAdapterPartNumber => '1.3.6.1.4.1.232.18.2.3.1.1.32', + cpqNicIfPhysAdapterRoleValue => { + 1 => "unknown", + 2 => "primary", + 3 => "secondary", + 4 => "member", + 5 => "txRx", + 6 => "tx", + 7 => "standby", + 8 => "none", + 255 => "notApplicable", + }, + cpqNicIfPhysAdapterDuplexStateValue => { + 1 => "unknown", + 2 => "half", + 3 => "full", + }, + cpqNicIfPhysAdapterConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqNicIfPhysAdapterStateValue => { + 1 => "unknown", + 2 => "ok", + 3 => "standby", + 4 => "failed", + }, + cpqNicIfPhysAdapterStatusValue => { + 1 => "unknown", + 2 => "ok", + 3 => "generalFailure", + 4 => "linkFailure", + }, + + }; + # INDEX { cpqNicIfPhysAdapterIndex } + foreach ($self->get_entries($oids, 'cpqNicIfPhysAdapterEntry')) { + push(@{$self->{physical_nics}}, + HP::Proliant::Component::NicSubsystem::PhysicalNic->new(%{$_})); + } + +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem.pm new file mode 100755 index 0000000..6abba29 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem.pm @@ -0,0 +1,214 @@ +package HP::Proliant::Component::PowersupplySubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + powersupplies => [], + powerconverters => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::PowersupplySubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::PowersupplySubsystem::CLI->new(%params); + } else { + die "unknown method"; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking power supplies'); + if (scalar (@{$self->{powersupplies}}) == 0) { + #$self->overall_check(); + } else { + foreach (@{$self->{powersupplies}}) { + $_->check(); + } + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{powersupplies}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::PowersupplySubsystem::Powersupply; +our @ISA = qw(HP::Proliant::Component::PowersupplySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqHeFltTolPowerSupplyChassis => $params{cpqHeFltTolPowerSupplyChassis}, + cpqHeFltTolPowerSupplyBay => $params{cpqHeFltTolPowerSupplyBay}, + cpqHeFltTolPowerSupplyPresent => $params{cpqHeFltTolPowerSupplyPresent}, + cpqHeFltTolPowerSupplyCondition => $params{cpqHeFltTolPowerSupplyCondition}, + cpqHeFltTolPowerSupplyRedundant => $params{cpqHeFltTolPowerSupplyRedundant}, + cpqHeFltTolPowerSupplyCapacityUsed => $params{cpqHeFltTolPowerSupplyCapacityUsed} || 0, + cpqHeFltTolPowerSupplyCapacityMaximum => $params{cpqHeFltTolPowerSupplyCapacityMaximum} || 0, + blacklisted => 0, + info => undef, + extendexinfo => undef, + }; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('p', $self->{cpqHeFltTolPowerSupplyBay}); + if ($self->{cpqHeFltTolPowerSupplyPresent} eq "present") { + if ($self->{cpqHeFltTolPowerSupplyCondition} ne "ok") { + if ($self->{cpqHeFltTolPowerSupplyCondition} eq "other") { + $self->add_info(sprintf "powersupply %d is missing", + $self->{cpqHeFltTolPowerSupplyBay}); + } else { + $self->add_info(sprintf "powersupply %d needs attention (%s)", + $self->{cpqHeFltTolPowerSupplyBay}, + $self->{cpqHeFltTolPowerSupplyCondition}); + } + $self->add_message(CRITICAL, $self->{info}); + } else { + $self->add_info(sprintf "powersupply %d is %s", + $self->{cpqHeFltTolPowerSupplyBay}, + $self->{cpqHeFltTolPowerSupplyCondition}); + } + $self->add_extendedinfo(sprintf "ps_%s=%s", + $self->{cpqHeFltTolPowerSupplyBay}, + $self->{cpqHeFltTolPowerSupplyCondition}); + if ($self->{cpqHeFltTolPowerSupplyCapacityUsed} && + $self->{cpqHeFltTolPowerSupplyCapacityMaximum}) { + if ($self->{runtime}->{options}->{perfdata}) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf("pc_%s", $self->{cpqHeFltTolPowerSupplyBay}), + value => $self->{cpqHeFltTolPowerSupplyCapacityUsed}, + warning => $self->{cpqHeFltTolPowerSupplyCapacityMaximum}, + critical => $self->{cpqHeFltTolPowerSupplyCapacityMaximum} + ); + } + } elsif ($self->{cpqHeFltTolPowerSupplyCapacityUsed}) { + if ($self->{runtime}->{options}->{perfdata}) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf("pc_%s", $self->{cpqHeFltTolPowerSupplyBay}), + value => $self->{cpqHeFltTolPowerSupplyCapacityUsed} + ); + } + } + } else { + $self->add_info(sprintf "powersupply %d is %s", + $self->{cpqHeFltTolPowerSupplyBay}, + $self->{cpqHeFltTolPowerSupplyPresent}); + $self->add_extendedinfo(sprintf "ps_%s=%s", + $self->{cpqHeFltTolPowerSupplyBay}, + $self->{cpqHeFltTolPowerSupplyPresent}); + } +} + + +sub dump { + my $self = shift; + printf "[PS_%s]\n", $self->{cpqHeFltTolPowerSupplyBay}; + foreach (qw(cpqHeFltTolPowerSupplyBay cpqHeFltTolPowerSupplyChassis + cpqHeFltTolPowerSupplyPresent cpqHeFltTolPowerSupplyCondition + cpqHeFltTolPowerSupplyRedundant cpqHeFltTolPowerSupplyCapacityUsed + cpqHeFltTolPowerSupplyCapacityMaximum)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n\n", $self->{info}; +} + + +package HP::Proliant::Component::PowersupplySubsystem::Powerconverter; +our @ISA = qw(HP::Proliant::Component::PowersupplySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + + cpqHePowerConvEntry => $params{cpqHePowerConvEntry}, + cpqHePowerConvChassis => $params{cpqHePowerConvChassis}, + cpqHePowerConvIndex => $params{cpqHePowerConvIndex}, + cpqHePowerConvPresent => $params{cpqHePowerConvPresent}, + cpqHePowerConvRedundant => $params{cpqHePowerConvRedundant}, + cpqHePowerConvCondition => $params{cpqHePowerConvCondition}, + cpqHePowerConvHwLocation => $params{cpqHePowerConvHwLocation}, + blacklisted => 0, + info => undef, + extendexinfo => undef, + }; + bless $self, $class; + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('pc', $self->{cpqHePowerConvIndex}); + if ($self->{cpqHePowerConvPresent} eq "present") { + if ($self->{cpqHePowerConvCondition} ne "ok") { + if ($self->{cpqHePowerConvCondition} eq "other") { + $self->add_info(sprintf "powerconverter %d is missing", + $self->{cpqHePowerConvIndex}); + } else { + $self->add_info(sprintf "powerconverter %d needs attention (%s)", + $self->{cpqHePowerConvIndex}, + $self->{cpqHePowerConvCondition}); + } + $self->add_message(CRITICAL, $self->{info}); + } else { + $self->add_info(sprintf "powerconverter %d is %s", + $self->{cpqHePowerConvIndex}, + $self->{cpqHePowerConvCondition}); + } + $self->add_extendedinfo(sprintf "pc_%s=%s", + $self->{cpqHePowerConvIndex}, + $self->{cpqHePowerConvCondition}); + } else { + $self->add_info(sprintf "powerconverter %d is %s", + $self->{cpqHePowerConvIndex}, + $self->{cpqHePowerConvPresent}); + $self->add_extendedinfo(sprintf "pc_%s=%s", + $self->{cpqHePowerConvIndex}, + $self->{cpqHePowerConvPresent}); + } +} + + +sub dump { + my $self = shift; + printf "[PS_%s]\n", ($self->{cpqHePowerConvChassis} ? $self->{cpqHePowerConvChassis}.":" : "").$self->{cpqHePowerConvIndex}; + foreach (qw(cpqHePowerConvIndex cpqHePowerConvPresent cpqHePowerConvRedundant cpqHePowerConvCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n\n", $self->{info}; +} + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem/CLI.pm new file mode 100755 index 0000000..c218975 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem/CLI.pm @@ -0,0 +1,81 @@ +package HP::Proliant::Component::PowersupplySubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::PowersupplySubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + powersupplies => [], + powerconverters => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + my %tmpps = ( + runtime => $self->{runtime}, + cpqHeFltTolPowerSupplyChassis => 1, + ); + my $inblock = 0; + foreach (grep(/^powersupply/, split(/\n/, $self->{rawdata}))) { + s/^powersupply\s*//g; + if (/^Power supply #(\d+)/) { + if ($inblock) { + $inblock = 0; + push(@{$self->{powersupplies}}, + HP::Proliant::Component::PowersupplySubsystem::Powersupply->new(%tmpps)); + %tmpps = ( + runtime => $self->{runtime}, + cpqHeFltTolPowerSupplyChassis => 1, + ); + } + $tmpps{cpqHeFltTolPowerSupplyBay} = $1; + $inblock = 1; + } elsif (/\s*Present\s+:\s+(\w+)/) { + $tmpps{cpqHeFltTolPowerSupplyPresent} = lc $1 eq 'yes' ? 'present' : + lc $1 eq 'no' ? 'absent': 'other'; + } elsif (/\s*Redundant\s*:\s+(\w+)/) { + $tmpps{cpqHeFltTolPowerSupplyRedundant} = lc $1 eq 'yes' ? 'redundant' : + lc $1 eq 'no' ? 'notRedundant' : 'other'; + } elsif (/\s*Condition\s*:\s+(\w+)/) { + $tmpps{cpqHeFltTolPowerSupplyCondition} = lc $1; + } elsif (/\s*Power\s*:\s+(\d+)/) { + $tmpps{cpqHeFltTolPowerSupplyCapacityUsed} = $1; + } elsif (/\s*Power Supply not present/) { + $tmpps{cpqHeFltTolPowerSupplyPresent} = "absent"; + $tmpps{cpqHeFltTolPowerSupplyCondition} = "other"; + $tmpps{cpqHeFltTolPowerSupplyRedundant} = "notRedundant"; + } elsif (/^\s*$/) { + if ($inblock) { + $inblock = 0; + push(@{$self->{powersupplies}}, + HP::Proliant::Component::PowersupplySubsystem::Powersupply->new(%tmpps)); + %tmpps = ( + runtime => $self->{runtime}, + cpqHeFltTolPowerSupplyChassis => 1, + ); + } + } + } + if ($inblock) { + push(@{$self->{powersupplies}}, + HP::Proliant::Component::PowersupplySubsystem::Powersupply->new(%tmpps)); + %tmpps = ( + runtime => $params{runtime}, + ); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem/SNMP.pm new file mode 100755 index 0000000..3fa8599 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/PowersupplySubsystem/SNMP.pm @@ -0,0 +1,96 @@ +package HP::Proliant::Component::PowersupplySubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::PowersupplySubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + powersupplies => [], + powerconverters => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeFltTolPowerSupplyEntry => "1.3.6.1.4.1.232.6.2.9.3.1", + cpqHeFltTolPowerSupplyChassis => "1.3.6.1.4.1.232.6.2.9.3.1.1", + cpqHeFltTolPowerSupplyBay => "1.3.6.1.4.1.232.6.2.9.3.1.2", + cpqHeFltTolPowerSupplyPresent => "1.3.6.1.4.1.232.6.2.9.3.1.3", + cpqHeFltTolPowerSupplyCondition => "1.3.6.1.4.1.232.6.2.9.3.1.4", + cpqHeFltTolPowerSupplyRedundant => "1.3.6.1.4.1.232.6.2.9.3.1.9", + cpqHeFltTolPowerSupplyPresentValue => { + 1 => "other", + 2 => "absent", + 3 => "present", + }, + cpqHeFltTolPowerSupplyConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqHeFltTolPowerSupplyCapacityUsed => '1.3.6.1.4.1.232.6.2.9.3.1.7', + cpqHeFltTolPowerSupplyCapacityMaximum => '1.3.6.1.4.1.232.6.2.9.3.1.8', + cpqHeFltTolPowerSupplyRedundantValue => { + 1 => "other", + 2 => "notRedundant", + 3 => "redundant", + }, + }; + + # INDEX { cpqHeFltTolPowerSupplyChassis, cpqHeFltTolPowerSupplyBay } + foreach ($self->get_entries($oids, 'cpqHeFltTolPowerSupplyEntry')) { + push(@{$self->{powersupplies}}, + HP::Proliant::Component::PowersupplySubsystem::Powersupply->new(%{$_})); + } + + $oids = { + cpqHePowerConvEntry => "1.3.6.1.4.1.232.6.2.13.3.1", + cpqHePowerConvChassis => "1.3.6.1.4.1.232.6.2.13.3.1.1", + cpqHePowerConvIndex => "1.3.6.1.4.1.232.6.2.13.3.1.2", + cpqHePowerConvPresent => "1.3.6.1.4.1.232.6.2.13.3.1.3", + cpqHePowerConvRedundant => "1.3.6.1.4.1.232.6.2.13.3.1.6", + cpqHePowerConvCondition => "1.3.6.1.4.1.232.6.2.13.3.1.8", + cpqHePowerConvPresentValue => { + 1 => "other", + 2 => "absent", + 3 => "present", + }, + cpqHePowerConvRedundantValue => { + 1 => "other", + 2 => "notRedundant", + 3 => "redundant", + }, + cpqHePowerConvConditionValue => { + 1 => "other", + 2 => "ok", + 3 => "degraded", + 4 => "failed", + }, + cpqHePowerConvHwLocation => "1.3.6.1.4.1.232.6.2.13.3.1.9", + }; + + # INDEX { cpqHePowerConvChassis cpqHePowerConvIndex } + foreach ($self->get_entries($oids, 'cpqHePowerConvEntry')) { + push(@{$self->{powerconverters}}, + HP::Proliant::Component::PowersupplySubsystem::Powerconverter->new(%{$_})); + } + # keine ahnung, was man damit machen kann + +} + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/SNMP.pm new file mode 100755 index 0000000..708f7f6 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/SNMP.pm @@ -0,0 +1,67 @@ +package HP::Proliant::Component::SNMP; + +sub get_entries { + my $self = shift; + my $oids = shift; + my $entry = shift; + my $snmpwalk = $self->{rawdata}; + my @params = (); + my @indices = SNMP::Utils::get_indices($snmpwalk, $oids->{$entry}); + foreach (@indices) { + my @idx = @{$_}; + my %params = ( + runtime => $self->{runtime}, + ); + my $maxdimension = scalar(@idx) - 1; + foreach my $idxnr (1..scalar(@idx)) { + $params{'index'.$idxnr} = $_->[$idxnr - 1]; + } + foreach my $oid (keys %{$oids}) { + next if $oid =~ /Entry$/; + next if $oid =~ /Value$/; + if (exists $oids->{$oid.'Value'}) { + $params{$oid} = SNMP::Utils::get_object_value( + $snmpwalk, $oids->{$oid}, $oids->{$oid.'Value'}, @idx); + if (! defined $params{$oid}) { + my $numerical_value = SNMP::Utils::get_object( + $snmpwalk, $oids->{$oid}, @idx); + if (! defined $numerical_value) { + # maschine liefert schrott + $params{$oid} = 'value_unknown'; + } else { + $params{$oid} = 'value_'.SNMP::Utils::get_object( + $snmpwalk, $oids->{$oid}, @idx); + } + } + } else { + $params{$oid} = SNMP::Utils::get_object( + $snmpwalk, $oids->{$oid}, @idx); + } + } + push(@params, \%params); + } + return @params; +} + +sub mib { + my $self = shift; + my $mib = shift; + my $condition = { + 0 => 'other', + 1 => 'ok', + 2 => 'degraded', + 3 => 'failed', + }; + my $MibRevMajor = $mib.'.1.0'; + my $MibRevMinor = $mib.'.2.0'; + my $MibRevCondition = $mib.'.3.0'; + return ( + $self->SNMP::Utils::get_object($self->{rawdata}, + $MibRevMajor), + $self->SNMP::Utils::get_object($self->{rawdata}, + $MibRevMinor), + $self->SNMP::Utils::get_object_value($self->{rawdata}, + $MibRevCondition, $condition)); +}; + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem.pm new file mode 100755 index 0000000..7c82a11 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem.pm @@ -0,0 +1,205 @@ +package HP::Proliant::Component::TemperatureSubsystem; +our @ISA = qw(HP::Proliant::Component); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; +################################## custom_thresholds + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + method => $params{method}, + condition => $params{condition}, + status => $params{status}, + temperatures => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($params{runtime}->{options}->{customthresholds}) { + if (-f $params{runtime}->{options}->{customthresholds}) { + $params{runtime}->{options}->{customthresholds} = + do { local (@ARGV, $/) = + $params{runtime}->{options}->{customthresholds}; <> }; + } + foreach my $ct_items + (split(/\//, $params{runtime}->{options}->{customthresholds})) { + if ($ct_items =~ /^(\d+):(\d+)$/) { + $params{runtime}->{options}->{thresholds}->{$1} = $2; + } else { + die sprintf "invalid threshold %s", $ct_items; + } + } + } + if ($self->{method} eq 'snmp') { + return HP::Proliant::Component::TemperatureSubsystem::SNMP->new(%params); + } elsif ($self->{method} eq 'cli') { + return HP::Proliant::Component::TemperatureSubsystem::CLI->new(%params); + } else { + die "unknown method"; + } + return $self; +} + +sub check { + my $self = shift; + my $errorfound = 0; + $self->add_info('checking temperatures'); + if (scalar (@{$self->{temperatures}}) == 0) { + #$self->overall_check(); + $self->add_info('no temperatures found'); + } else { + foreach (sort { $a->{cpqHeTemperatureIndex} <=> $b->{cpqHeTemperatureIndex}} + @{$self->{temperatures}}) { + $_->check(); + } + } +} + +sub dump { + my $self = shift; + foreach (@{$self->{temperatures}}) { + $_->dump(); + } +} + + +package HP::Proliant::Component::TemperatureSubsystem::Temperature; +our @ISA = qw(HP::Proliant::Component::TemperatureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + cpqHeTemperatureChassis => $params{cpqHeTemperatureChassis}, + cpqHeTemperatureIndex => $params{cpqHeTemperatureIndex}, + cpqHeTemperatureLocale => $params{cpqHeTemperatureLocale}, + cpqHeTemperatureCelsius => $params{cpqHeTemperatureCelsius}, + cpqHeTemperatureThresholdCelsius => $params{cpqHeTemperatureThresholdCelsius}, + cpqHeTemperatureCondition => $params{cpqHeTemperatureCondition}, + cpqHeTemperatureThresholdType => $params{cpqHeTemperatureThresholdType} || "unknown", + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + if ($params{runtime}->{options}->{celsius}) { + $self->{cpqHeTemperatureUnits} = 'C'; + $self->{cpqHeTemperature} = $self->{cpqHeTemperatureCelsius}; + $self->{cpqHeTemperatureThreshold} = + $self->{cpqHeTemperatureThresholdCelsius}; + } else { + $self->{cpqHeTemperatureUnits} = 'F'; + $self->{cpqHeTemperature} = + (($self->{cpqHeTemperatureCelsius} * 9) / 5) + 32; + $self->{cpqHeTemperatureThreshold} = + (($self->{cpqHeTemperatureThresholdCelsius} * 9) / 5) + 32; + } + my $index = $self->{cpqHeTemperatureIndex}; + if (exists $params{runtime}->{options}->{thresholds}->{$index}) { + $self->{cpqHeTemperatureThreshold} = + $params{runtime}->{options}->{thresholds}->{$index}; + + } + if ($self->{cpqHeTemperatureThresholdCelsius} == -99) { + bless $self, 'HP::Proliant::Component::TemperatureSubsystem::SoSTemperature'; + } elsif ($self->{cpqHeTemperatureThresholdCelsius} == 0) { + # taucht auf, seit man gen8 ueber das ilo abfragen kann + bless $self, 'HP::Proliant::Component::TemperatureSubsystem::SoSTemperature'; + } + return $self; +} + +sub check { + my $self = shift; + $self->blacklist('t', $self->{cpqHeTemperatureIndex}); + if ($self->{cpqHeTemperature} > $self->{cpqHeTemperatureThreshold}) { + $self->add_info(sprintf "%d %s temperature too high (%d%s, %d max)", + $self->{cpqHeTemperatureIndex}, $self->{cpqHeTemperatureLocale}, + $self->{cpqHeTemperature}, $self->{cpqHeTemperatureUnits}, + $self->{cpqHeTemperatureThreshold}); + $self->add_message(CRITICAL, $self->{info}); + } elsif ($self->{cpqHeTemperature} < 0) { + # #21 SCSI_BACKPLANE_ZONE -1C/31F 60C/140F OK - can't be true + $self->add_info(sprintf "%d %s temperature too low (%d%s)", + $self->{cpqHeTemperatureIndex}, $self->{cpqHeTemperatureLocale}, + $self->{cpqHeTemperature}, $self->{cpqHeTemperatureUnits}); + $self->add_message(CRITICAL, $self->{info}); + } else { + $self->add_info(sprintf "%d %s temperature is %d%s (%d max)", + $self->{cpqHeTemperatureIndex}, $self->{cpqHeTemperatureLocale}, + $self->{cpqHeTemperature}, $self->{cpqHeTemperatureUnits}, + $self->{cpqHeTemperatureThreshold}); + } + if ($self->{runtime}->{options}->{perfdata} == 2) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('temp_%s', $self->{cpqHeTemperatureIndex}), + value => $self->{cpqHeTemperature}, + warning => $self->{cpqHeTemperatureThreshold}, + critical => $self->{cpqHeTemperatureThreshold} + ); + } elsif ($self->{runtime}->{options}->{perfdata} == 1) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('temp_%s_%s', $self->{cpqHeTemperatureIndex}, + $self->{cpqHeTemperatureLocale}), + value => $self->{cpqHeTemperature}, + warning => $self->{cpqHeTemperatureThreshold}, + critical => $self->{cpqHeTemperatureThreshold} + ); + } + $self->add_extendedinfo(sprintf "temp_%s=%d", + $self->{cpqHeTemperatureIndex}, + $self->{cpqHeTemperature}); +} + +sub dump { + my $self = shift; + printf "[TEMP_%s]\n", $self->{cpqHeTemperatureIndex}; + foreach (qw(cpqHeTemperatureChassis cpqHeTemperatureIndex + cpqHeTemperatureLocale cpqHeTemperatureCelsius cpqHeTemperatureThreshold + cpqHeTemperatureThresholdType cpqHeTemperatureCondition)) { + printf "%s: %s\n", $_, $self->{$_}; + } + printf "info: %s\n\n", $self->{info}; +} + + +package HP::Proliant::Component::TemperatureSubsystem::SoSTemperature; +our @ISA = qw(HP::Proliant::Component::TemperatureSubsystem::Temperature); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub check { + my $self = shift; + $self->blacklist('t', $self->{cpqHeTemperatureIndex}); + $self->add_info(sprintf "%d %s temperature is %d%s (no thresh.)", + $self->{cpqHeTemperatureIndex}, $self->{cpqHeTemperatureLocale}, + $self->{cpqHeTemperature}, $self->{cpqHeTemperatureUnits}); + if ($self->{runtime}->{options}->{perfdata} == 2) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('temp_%s', $self->{cpqHeTemperatureIndex}), + value => $self->{cpqHeTemperature}, + ); + } elsif ($self->{runtime}->{options}->{perfdata} == 1) { + $self->{runtime}->{plugin}->add_perfdata( + label => sprintf('temp_%s_%s', $self->{cpqHeTemperatureIndex}, + $self->{cpqHeTemperatureLocale}), + value => $self->{cpqHeTemperature}, + ); + } + $self->add_extendedinfo(sprintf "temp_%s=%d", + $self->{cpqHeTemperatureIndex}, + $self->{cpqHeTemperature}); +} + +1; + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem/CLI.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem/CLI.pm new file mode 100755 index 0000000..9e8e6be --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem/CLI.pm @@ -0,0 +1,56 @@ +package HP::Proliant::Component::TemperatureSubsystem::CLI; +our @ISA = qw(HP::Proliant::Component::TemperatureSubsystem); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + temperatures => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->init(%params); + return $self; +} + +sub init { + my $self = shift; + my %params = @_; + my $tempcnt = 1; + foreach (grep(/^temp/, split(/\n/, $params{rawdata}))) { + s/^temp\s*//g; + if (/^#(\d+)\s+([\w_\/\-#]+)\s+(-*\d+)C\/(\d+)F\s+(\d+)C\/(\d+)F/) { + my %params = (); + $params{runtime} = $self->{runtime}; + $params{cpqHeTemperatureChassis} = 1; + $params{cpqHeTemperatureIndex} = $1; + $params{cpqHeTemperatureLocale} = lc $2; + $params{cpqHeTemperatureCelsius} = $3; + $params{cpqHeTemperatureThresholdCelsius} = $5; + $params{cpqHeTemperatureCondition} = 'unknown'; + push(@{$self->{temperatures}}, + HP::Proliant::Component::TemperatureSubsystem::Temperature->new( + %params)); + } elsif (/^#(\d+)\s+([\w_\/\-#]+)\s+\-\s+(\d+)C\/(\d+)F/) { + # #3 CPU#2 - 0C/0F + $self->trace(2, sprintf "skipping temperature %s", $_); + } elsif (/^#(\d+)\s+([\w_\/\-#]+)\s+(\d+)C\/(\d+)F\s+\-/) { + # #3 CPU#2 0C/0F - + $self->trace(2, sprintf "skipping temperature %s", $_); + } elsif (/^#(\d+)\s+([\w_\/\-#]+)\s+\-\s+\-/) { + # #3 CPU#2 - - + $self->trace(2, sprintf "skipping temperature %s", $_); + } elsif (/^#(\d+)/) { + $self->trace(0, sprintf "send this to lausser: %s", $_); + } + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem/SNMP.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem/SNMP.pm new file mode 100755 index 0000000..de8e4cb --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Proliant/Component/TemperatureSubsystem/SNMP.pm @@ -0,0 +1,119 @@ +package HP::Proliant::Component::TemperatureSubsystem::SNMP; +our @ISA = qw(HP::Proliant::Component::TemperatureSubsystem + HP::Proliant::Component::SNMP); + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + rawdata => $params{rawdata}, + temperatures => [], + blacklisted => 0, + info => undef, + extendedinfo => undef, + }; + bless $self, $class; + $self->overall_init(%params); + $self->init(%params); + return $self; +} + +sub overall_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $params{rawdata}; + # overall + my $cpqHeThermalTempStatus = '1.3.6.1.4.1.232.6.2.6.3.0'; + my $cpqHeThermalTempStatusValue = { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }; + $self->{tempstatus} = lc SNMP::Utils::get_object_value( + $snmpwalk, $cpqHeThermalTempStatus, + $cpqHeThermalTempStatusValue); + $self->{tempstatus} |= lc $self->{tempstatus}; +} + +sub init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + my $oids = { + cpqHeTemperatureEntry => "1.3.6.1.4.1.232.6.2.6.8.1", + cpqHeTemperatureChassis => "1.3.6.1.4.1.232.6.2.6.8.1.1", + cpqHeTemperatureIndex => "1.3.6.1.4.1.232.6.2.6.8.1.2", + cpqHeTemperatureLocale => "1.3.6.1.4.1.232.6.2.6.8.1.3", + cpqHeTemperatureCelsius => "1.3.6.1.4.1.232.6.2.6.8.1.4", + cpqHeTemperatureThresholdCelsius => "1.3.6.1.4.1.232.6.2.6.8.1.5", + cpqHeTemperatureCondition => "1.3.6.1.4.1.232.6.2.6.8.1.6", + cpqHeTemperatureThresholdType => "1.3.6.1.4.1.232.6.2.6.8.1.7", + cpqHeTemperatureLocaleValue => { + 1 => "other", + 2 => "unknown", + 3 => "system", + 4 => "systemBoard", + 5 => "ioBoard", + 6 => "cpu", + 7 => "memory", + 8 => "storage", + 9 => "removableMedia", + 10 => "powerSupply", + 11 => "ambient", + 12 => "chassis", + 13 => "bridgeCard", + }, + cpqHeTemperatureConditionValue => { + 1 => 'other', + 2 => 'ok', + 3 => 'degraded', + 4 => 'failed', + }, + cpqHeTemperatureThresholdTypeValue => { + 1 => 'other', + 5 => 'blowout', + 9 => 'caution', + 15 => 'critical', + }, + }; + # INDEX { cpqHeTemperatureChassis, cpqHeTemperatureIndex } + foreach ($self->get_entries($oids, 'cpqHeTemperatureEntry')) { + # sieht aus, als wurden die gar nicht existieren. + # im ilo4 werden sie als n/a angezeigt + next if $_->{cpqHeTemperatureThresholdType} eq "caution" && $_->{cpqHeTemperatureThresholdCelsius} == 0; + push(@{$self->{temperatures}}, + HP::Proliant::Component::TemperatureSubsystem::Temperature->new(%{$_})); + } +} + +sub overall_check { + my $self = shift; + my $result = 0; + $self->blacklist('ots', ''); + if ($self->{tempstatus}) { + if ($self->{tempstatus} eq "ok") { + $result = 0; + $self->add_info('all temp sensors are within normal operating range'); + } elsif ($self->{tempstatus} eq "degraded") { + $result = 1; + $self->add_info('a temp sensor is outside of normal operating range'); + } elsif ($self->{tempstatus} eq "failed") { + $result = 2; + $self->add_info('a temp sensor detects a condition that could permanently +damage the system'); + } elsif ($self->{tempstatus} eq "other") { + $result = 0; + $self->add_info('temp sensing is not supported by this system or driver'); + } + } else { + $result = 0; + $self->add_info('no global temp status found'); + } +} + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/SNMP/Utils.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/SNMP/Utils.pm new file mode 100755 index 0000000..f2d31a9 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/SNMP/Utils.pm @@ -0,0 +1,103 @@ +package SNMP::Utils; + +use strict; + +{ + sub get_indices { + my $oids = shift; + my $entry = shift; + my $numindices = shift; + # find all oids beginning with $entry + # then skip one field for the sequence + # then read the next numindices fields + my $entrypat = $entry; + $entrypat =~ s/\./\\\./g; + my @indices = map { + /^$entrypat\.\d+\.(.*)/ && $1; + } grep { + /^$entrypat/ + } keys %{$oids}; + my %seen = (); + my @o = map {[split /\./]} sort grep !$seen{$_}++, @indices; + return @o; + } + + sub get_size { + my $oids = shift; + my $entry = shift; + my $entrypat = $entry; + $entrypat =~ s/\./\\\./g; + my @entries = grep { + /^$entrypat/ + } keys %{$oids}; + return scalar(@entries); + } + + sub get_object { + my $oids = shift; + my $object = shift; + my @indices = @_; + #my $oid = $object.'.'.join('.', @indices); + my $oid = $object; + $oid .= '.'.join('.', @indices) if (@indices); + return $oids->{$oid}; + } + + sub get_object_value { + my $oids = shift; + my $object = shift; + my $values = shift; + my @indices = @_; + my $key = get_object($oids, $object, @indices); + if (defined $key) { + return $values->{$key}; + } else { + return undef; + } + } + + #SNMP::Utils::counter([$idxs1, $idxs2], $idx1, $idx2), + # this flattens a n-dimensional array and returns the absolute position + # of the element at position idx1,idx2,...,idxn + # element 1,2 in table 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 is at pos 6 + sub get_number { + my $indexlists = shift; #, zeiger auf array aus [1, 2] + my @element = @_; + my $dimensions = scalar(@{$indexlists->[0]}); + my @sorted = (); + my $number = 0; + if ($dimensions == 1) { + @sorted = + sort { $a->[0] <=> $b->[0] } @{$indexlists}; + } elsif ($dimensions == 2) { + @sorted = + sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @{$indexlists}; + } elsif ($dimensions == 3) { + @sorted = + sort { $a->[0] <=> $b->[0] || + $a->[1] <=> $b->[1] || + $a->[2] <=> $b->[2] } @{$indexlists}; + } + foreach (@sorted) { + if ($dimensions == 1) { + if ($_->[0] == $element[0]) { + last; + } + } elsif ($dimensions == 2) { + if ($_->[0] == $element[0] && $_->[1] == $element[1]) { + last; + } + } elsif ($dimensions == 3) { + if ($_->[0] == $element[0] && + $_->[1] == $element[1] && + $_->[2] == $element[2]) { + last; + } + } + $number++; + } + return ++$number; + } + +} + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Server.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Server.pm new file mode 100755 index 0000000..7477c40 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Server.pm @@ -0,0 +1,447 @@ +package HP::Server; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; + +sub new { + my $class = shift; + my %params = @_; + my $self = { + runtime => $params{runtime}, + productname => 'unknown', + }; + bless $self, $class; + if (! ($self->{runtime}->{plugin}->opts->hostname || + $self->{runtime}->{plugin}->opts->snmpwalk)) { + bless $self, 'HP::Proliant::CLI'; + $self->{method} = 'cli'; + } else { + $self->check_snmp_and_model(); + if ($self->{runtime}->{options}->{servertype}) { + $self->{productname} = 'ProLiant' if + $self->{runtime}->{options}->{servertype} eq 'proliant'; + $self->{productname} = 'BladeSystem' if + $self->{runtime}->{options}->{servertype} eq 'bladesystem'; + $self->{productname} = 'Storage' if + $self->{runtime}->{options}->{servertype} eq 'storage'; + } + if (! $self->{runtime}->{plugin}->check_messages()) { + if ($self->{productname} =~ /ProLiant/) { + bless $self, 'HP::Proliant::SNMP'; + $self->trace(3, 'using HP::Proliant::SNMP'); + } elsif ($self->{productname} =~ /^DL\d+\s*G\d+/) { + bless $self, 'HP::Proliant::SNMP'; + $self->trace(3, 'using HP::Proliant::SNMP'); + } elsif ($self->{productname} =~ /OpenView .* appliance/) { + bless $self, 'HP::Proliant::SNMP'; + $self->trace(3, 'using HP::Proliant::SNMP'); + } elsif ($self->{productname} =~ /Synergy.*Gen/i) { + bless $self, 'HP::Proliant::SNMP'; + $self->trace(3, 'using HP::Proliant::SNMP'); + } elsif ($self->{productname} =~ /Superdome.*Enclosure/i) { + bless $self, 'HP::BladeSystem'; + $self->trace(3, 'using HP::BladeSystem'); + } elsif ($self->{productname} =~ /BladeSystem/) { + bless $self, 'HP::BladeSystem'; + $self->trace(3, 'using HP::BladeSystem'); + } elsif ($self->{productname} =~ /PROLIANT 4LEE/) { + bless $self, 'HP::Storage'; + $self->trace(3, 'using HP::Storage'); + } elsif ($self->{productname} =~ /X\d+[\s\w]* Network Storage/) { + # HP X1600 Network Storage System + # HP X1600 G2 Network Storage System + bless $self, 'HP::Proliant::SNMP'; + $self->trace(3, 'using HP::Proliant::SNMP'); + } elsif ($self->{productname} =~ /StorageWorks/i) { + bless $self, 'HP::StorageWorks'; + $self->trace(3, 'using HP::StorageWorks'); + } elsif ($self->{productname} =~ /MSA/i) { + bless $self, 'HP::StorageWorks'; + $self->trace(3, 'using HP::StorageWorks'); + } elsif ($self->{productname} =~ /StoreEasy/i) { + bless $self, 'HP::Proliant::SNMP'; + $self->trace(3, 'using HP::Proliant::SNMP'); + } elsif ($self->{productname} =~ /Storage/) { # fake + bless $self, 'HP::Storage'; + $self->trace(3, 'using HP::Storage'); + } else { + $self->add_message(CRITICAL, + sprintf('unknown device%s', $self->{productname} eq 'unknown' ? + '' : '('.$self->{productname}.')')); + } + $self->{method} = 'snmp'; + } + } + if ($self->{runtime}->{options}->{blacklist} && + -f $self->{runtime}->{options}->{blacklist}) { + $self->{runtime}->{options}->{blacklist} = do { + local (@ARGV, $/) = $self->{runtime}->{options}->{blacklist}; <> }; + } + return $self; +} + +sub check_snmp_and_model { +# uptime pruefen +# dann whoami + my $self = shift; + if ($self->{runtime}->{plugin}->opts->snmpwalk) { + my $response = {}; + if (! -f $self->{runtime}->{plugin}->opts->snmpwalk) { + $self->{runtime}->{plugin}->add_message(CRITICAL, + sprintf 'file %s not found', + $self->{runtime}->{plugin}->opts->snmpwalk); + } elsif (-x $self->{runtime}->{plugin}->opts->snmpwalk) { + my $cmd = sprintf "%s -On -v%s -c%s %s:%s 1.3.6.1.4.1.232 2>&1", + $self->{runtime}->{plugin}->opts->snmpwalk, + $self->{runtime}->{plugin}->opts->protocol, + $self->{runtime}->{plugin}->opts->community, + $self->{runtime}->{plugin}->opts->domain, + $self->{runtime}->{plugin}->opts->hostname; + open(WALK, "$cmd |"); + while (<WALK>) { + if (/^.*?\.(232\.[\d\.]+) = .*?: (\-*\d+)/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + } elsif (/^.*?\.(232\.[\d\.]+) = .*?: "(.*?)"/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $response->{'1.3.6.1.4.1.'.$1} =~ s/\s+$//; + } + } + close WALK; + } else { + open(MESS, $self->{runtime}->{plugin}->opts->snmpwalk); + my $in_string = 0; + my $in_hex_string = 0; + my $hex_oid = 0; + while(<MESS>) { + chomp; + if ($in_hex_string && /^(([0-9a-fA-F]{2})( [0-9a-fA-F]{2})*)\s*$/) { + $response->{$hex_oid} .= " ".$1; + } elsif ($in_string) { + if (/(.*)"$/) { + $response->{$hex_oid} .= $1; + $in_string = 0; + } else { + $response->{$hex_oid} .= $_; + } + } elsif (/^.*?\.(232\.[\d\.]+) = .*?: (\-*\d+)\s*$/) { + # SNMPv2-SMI::enterprises.232.6.2.6.7.1.3.1.4 = INTEGER: 6 + $response->{'1.3.6.1.4.1.'.$1} = $2; + $in_hex_string = 0; + } elsif (/^.*?\.(232\.[\d\.]+) = .*?: "(.*?)"/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $response->{'1.3.6.1.4.1.'.$1} =~ s/\s+$//; + $in_hex_string = 0; + } elsif (/^.*?\.(232\.[\d\.]+) = (\-*\d+)/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $in_hex_string = 0; + } elsif (/^.*?\.(232\.[\d\.]+) = "(.*?)"/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $response->{'1.3.6.1.4.1.'.$1} =~ s/\s+$//; + $in_hex_string = 0; + } elsif (/^.*?\.(232\.[\d\.]+) = STRING: "(.*?[^"])$/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $response->{'1.3.6.1.4.1.'.$1} =~ s/\s+$//; + $in_string = 0; + $in_hex_string = 0; + } elsif (/^.*?\.(232\.[\d\.]+) = Hex-STRING: (.*)/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $in_hex_string = 1; + $hex_oid = '1.3.6.1.4.1.'.$1; + } elsif (/^.*?\.(232\.[\d\.]+) =[ ]{1,2}Hex: (.*)/) { + $response->{'1.3.6.1.4.1.'.$1} = $2; + $in_hex_string = 1; + $hex_oid = '1.3.6.1.4.1.'.$1; + } + } + close MESS; + } + map { $response->{$_} =~ s/^\s+//; $response->{$_} =~ s/\s+$//; } + keys %$response; + $self->{rawdata} = $response; + $self->whoami(); + } else { + if (eval "require Net::SNMP") { + my %params = (); + my $net_snmp_version = Net::SNMP->VERSION(); # 5.002000 or 6.000000 + $params{'-translate'} = [ + -timeticks => 0x0 + ]; + $params{'-hostname'} = $self->{runtime}->{plugin}->opts->hostname; + $params{'-domain'} = $self->{runtime}->{plugin}->opts->domain; + $params{'-version'} = $self->{runtime}->{plugin}->opts->protocol; + if ($self->{runtime}->{plugin}->opts->port) { + $params{'-port'} = $self->{runtime}->{plugin}->opts->port; + } + if ($self->{runtime}->{plugin}->opts->protocol eq '3') { + $params{'-username'} = $self->{runtime}->{plugin}->opts->username; + if ($self->{runtime}->{plugin}->opts->authpassword) { + $params{'-authpassword'} = $self->decode_password($self->{runtime}->{plugin}->opts->authpassword); + } + if ($self->{runtime}->{plugin}->opts->authprotocol) { + $params{'-authprotocol'} = $self->{runtime}->{plugin}->opts->authprotocol; + } + if ($self->{runtime}->{plugin}->opts->privpassword) { + $params{'-privpassword'} = $self->decode_password($self->{runtime}->{plugin}->opts->privpassword); + } + if ($self->{runtime}->{plugin}->opts->privprotocol) { + $params{'-privprotocol'} = $self->{runtime}->{plugin}->opts->privprotocol; + } + } elsif ($self->decode_password($self->{runtime}->{plugin}->opts->community) =~ /^snmpv3(.)(.+)/) { + my $separator = $1; + my ($authprotocol, $authpassword, $privprotocol, $privpassword, + $username, $contextengineid, $contextname) = split(/$separator/, $2); + $params{'-version'} = 3; + $params{'-username'} = $self->decode_password($username) if $username; + $params{'-authprotocol'} = $self->decode_password($authprotocol) if $authprotocol; + $params{'-authpassword'} = $self->decode_password($authpassword) if $authpassword; + $params{'-privprotocol'} = $self->decode_password($privprotocol) if $privprotocol; + $params{'-privpassword'} = $self->decode_password($privpassword) if $privpassword; + } else { + $params{'-community'} = $self->decode_password($self->{runtime}->{plugin}->opts->community); + } + $self->{runtime}->{snmpparams} = \%params; + my ($session, $error) = Net::SNMP->session(%params); + $self->{session} = $session; + if (! defined $session) { + $self->add_message(CRITICAL, 'cannot create session object (maybe wrong hostname)'); + $self->trace(1, Data::Dumper::Dumper(\%params)); + } else { + my $sysUpTime = '1.3.6.1.2.1.1.3.0'; + my $result = $session->get_request( + -varbindlist => [$sysUpTime] + ); + if (!defined($result)) { + $self->add_message(CRITICAL, + 'could not contact snmp agent'); + $session->close; + } else { + $self->trace(3, 'snmp agent answered'); + $self->whoami(); + } + } + } else { + $self->add_message(CRITICAL, + 'could not find Net::SNMP module'); + } + } +} + +sub whoami { + my $self = shift; + my $productname = undef; + if ($self->{runtime}->{plugin}->opts->snmpwalk) { + my $cpqSiProductName = '1.3.6.1.4.1.232.2.2.4.2.0'; + my $cpqSsMibRevMajor = '1.3.6.1.4.1.232.8.1.1.0'; + my $cpqSsBackplaneModel = '1.3.6.1.4.1.232.8.2.2.6.1.9'.'.1.1'; + my $cpqHoMibStatusArray = '1.3.6.1.4.1.232.11.2.10.1.0'; + if ($productname = $self->{rawdata}->{$cpqSiProductName}) { + if (! $productname) { + $self->{productname} = 'ProLiant'; + } else { + $self->{productname} = $self->{rawdata}->{$cpqSiProductName}; + } + } elsif (exists $self->{rawdata}->{$cpqSsBackplaneModel}) { + $self->{productname} = $self->{rawdata}->{$cpqSsBackplaneModel}; + } elsif (exists $self->{rawdata}->{$cpqSsMibRevMajor}) { + # at least there is a CPQSTSYS-MIB + $self->{productname} = 'Storage' + } else { + $self->add_message(CRITICAL, + 'snmpwalk returns no product name (cpqsinfo-mib)'); + } + } else { + my $cpqSiProductName = '1.3.6.1.4.1.232.2.2.4.2.0'; + my $cpqSsMibRevMajor = '1.3.6.1.4.1.232.8.1.1.0'; + my $cpqSsBackplaneModel = '1.3.6.1.4.1.232.8.2.2.6.1.9'.'.1.1'; + my $cpqHoMibStatusArray = '1.3.6.1.4.1.232.11.2.10.1.0'; + my $dummy = '1.3.6.1.2.1.1.5.0'; + if ($productname = $self->valid_response($cpqSiProductName)) { + if ($productname =~ /HP P\d+ .*SAS/ && $self->valid_response($cpqHoMibStatusArray)) { + $self->{productname} = 'StorageWorks' + } elsif ($productname eq '') { + $self->{productname} = 'ProLiant'; + } else { + $self->{productname} = $productname; + } + } elsif ($productname = $self->valid_response($cpqSsBackplaneModel)) { + $self->{productname} = $productname; + } elsif ($self->valid_response($cpqSsMibRevMajor)) { + # at least there is a CPQSTSYS-MIB + $self->{productname} = 'Storage' + } elsif ($self->valid_response($cpqHoMibStatusArray)) { + $self->{productname} = 'StorageWorks' + } else { + $self->add_message(CRITICAL, + 'snmpwalk returns no product name (cpqsinfo-mib)'); + $self->{session}->close; + } + $self->trace(3, 'whoami: '.$self->{productname}); + } +} + +sub valid_response { + my $self = shift; + my $oid = shift; + my $result = $self->{session}->get_request( + -varbindlist => [$oid] + ); + if (!defined($result) || + ! defined $result->{$oid} || + $result->{$oid} eq 'noSuchInstance' || + $result->{$oid} eq 'noSuchObject' || + $result->{$oid} eq 'endOfMibView') { + return undef; + } else { + return $result->{$oid}; + } +} + +sub trace { + my $self = shift; + my $level = shift; + my $message = shift; + if ($self->{runtime}->{options}->{verbose} >= $level) { + printf "%s\n", $message; + } +} + +sub blacklist { + my $self = shift; + my $type = shift; + my $name = shift; + $self->{blacklisted} = $self->is_blacklisted($type, $name); +} + +sub add_blacklist { + my $self = shift; + my $list = shift; + $self->{runtime}->{options}->{blacklist} = join('/', + (split('/', $self->{runtime}->{options}->{blacklist}), $list)); +} + +sub is_blacklisted { + my $self = shift; + my $type = shift; + my $name = shift; + my $blacklisted = 0; +# $name =~ s/\:/-/g; + foreach my $bl_items (split(/\//, $self->{runtime}->{options}->{blacklist})) { + if ($bl_items =~ /^(\w+):([\:\w\-,]+)$/) { + my $bl_type = $1; + my $bl_names = $2; + foreach my $bl_name (split(/,/, $bl_names)) { + if ($bl_type eq $type && $bl_name eq $name) { + $blacklisted = 1; + } + } + } elsif ($bl_items =~ /^(\w+)$/) { + my $bl_type = $1; + if ($bl_type eq $type) { + $blacklisted = 1; + } + } + } + return $blacklisted; +} + +sub add_message { + my $self = shift; + my $level = shift; + my $message = shift; + $self->{runtime}->{plugin}->add_message($level, $message) + unless $self->{blacklisted}; + if (exists $self->{failed}) { + if ($level == UNKNOWN && $self->{failed} == OK) { + $self->{failed} = $level; + } elsif ($level > $self->{failed}) { + $self->{failed} = $level; + } + } +} + +sub remove_message { + my $self = shift; + my $level = shift; + my $message = shift; + $self->{runtime}->{plugin}->remove_message($level) ; +} + +sub has_failed { + my $self = shift; + return $self->{failed}; +} + +sub add_info { + my $self = shift; + my $info = shift; + $info = $self->{blacklisted} ? $info.' (blacklisted)' : $info; + $self->{info} = $info; + if (! exists $self->{runtime}->{plugin}->{info}) { + $self->{runtime}->{plugin}->{info} = []; + } + push(@{$self->{runtime}->{plugin}->{info}}, $info); +} + +sub annotate_info { + my $self = shift; + my $annotation = shift; + my $lastinfo = pop(@{$self->{runtime}->{plugin}->{info}}); + $lastinfo .= sprintf ' (%s)', $annotation; + push(@{$self->{runtime}->{plugin}->{info}}, $lastinfo); +} + +sub add_extendedinfo { + my $self = shift; + my $info = shift; + $self->{extendedinfo} = $info; + return if ! $self->{runtime}->{options}->{extendedinfo}; + if (! exists $self->{runtime}->{plugin}->{extendedinfo}) { + $self->{runtime}->{plugin}->{extendedinfo} = []; + } + push(@{$self->{runtime}->{plugin}->{extendedinfo}}, $info); +} + +sub get_extendedinfo { + my $self = shift; + if (! exists $self->{runtime}->{plugin}->{extendedinfo}) { + $self->{runtime}->{plugin}->{extendedinfo} = []; + } + return join(' ', @{$self->{runtime}->{plugin}->{extendedinfo}}); +} + +sub add_summary { + my $self = shift; + my $summary = shift; + if (! exists $self->{runtime}->{plugin}->{summary}) { + $self->{runtime}->{plugin}->{summary} = []; + } + push(@{$self->{runtime}->{plugin}->{summary}}, $summary); +} + +sub get_summary { + my $self = shift; + if (! exists $self->{runtime}->{plugin}->{summary}) { + $self->{runtime}->{plugin}->{summary} = []; + } + return join(', ', @{$self->{runtime}->{plugin}->{summary}}); +} + +sub dumper { + my $self = shift; + my $object = shift; + my $run = $object->{runtime}; + delete $object->{runtime}; + printf STDERR "%s\n", Data::Dumper::Dumper($object); + $object->{runtime} = $run; +} + +sub decode_password { + my $self = shift; + my $password = shift; + if ($password && $password =~ /^rfc3986:\/\/(.*)/) { + $password = $1; + $password =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg; + } + return $password; +} + diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Storage.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Storage.pm new file mode 100755 index 0000000..6fecca1 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/Storage.pm @@ -0,0 +1,308 @@ +package HP::Storage; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; +use Data::Dumper; + +our @ISA = qw(HP::Server); + +sub init { + my $self = shift; + $self->{components} = { + powersupply_subsystem => undef, + fan_subsystem => undef, + temperature_subsystem => undef, + cpu_subsystem => undef, + memory_subsystem => undef, + disk_subsystem => undef, + sensor_subsystem => undef, + }; + $self->{serial} = 'unknown'; + $self->{product} = 'unknown'; + $self->{romversion} = 'unknown'; + $self->collect(); + if (! $self->{runtime}->{plugin}->check_messages()) { + $self->set_serial(); +# $self->check_for_buggy_firmware(); +# $self->analyze_cpus(); +# $self->analyze_powersupplies(); +# $self->analyze_fan_subsystem(); +# $self->analyze_temperatures(); +# $self->analyze_memory_subsystem(); + $self->analyze_disk_subsystem(); +## $self->analyze_sensor_subsystem(); +# $self->check_cpus(); +# $self->check_powersupplies(); +# $self->check_fan_subsystem(); +# $self->check_temperatures(); +# $self->check_memory_subsystem(); + $self->check_disk_subsystem(); +## $self->check_sensor_subsystem(); + } +} + +sub identify { + my $self = shift; + return sprintf "System: '%s', S/N: '%s', ROM: '%s'", + $self->{product}, $self->{serial}, $self->{romversion}; +} + +sub check_for_buggy_firmware { + my $self = shift; + my @buggyfirmwares = ( + "P24 12/11/2001", + "P24 11/15/2002", + "D13 06/03/2003", + "D13 09/15/2004", + "P20 12/17/2002" + ); + $self->{runtime}->{options}->{buggy_firmware} = + grep /^$self->{romversion}/, @buggyfirmwares; +} + +sub dump { + my $self = shift; + printf STDERR "serial %s\n", $self->{serial}; + printf STDERR "product %s\n", $self->{product}; + printf STDERR "romversion %s\n", $self->{romversion}; + printf STDERR "%s\n", Data::Dumper::Dumper($self->{components}); +} + +sub analyze_powersupplies { + my $self = shift; + $self->{components}->{powersupply_subsystem} = + HP::Storage::Component::PowersupplySubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_fan_subsystem { + my $self = shift; + $self->{components}->{fan_subsystem} = + HP::Storage::Component::FanSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_temperatures { + my $self = shift; + $self->{components}->{temperature_subsystem} = + HP::Storage::Component::TemperatureSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_cpus { + my $self = shift; + $self->{components}->{cpu_subsystem} = + HP::Storage::Component::CpuSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_memory_subsystem { + my $self = shift; + $self->{components}->{memory_subsystem} = + HP::Storage::Component::MemorySubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_disk_subsystem { + my $self = shift; + $self->{components}->{disk_subsystem} = + HP::Proliant::Component::DiskSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub analyze_sensor_subsystem { + my $self = shift; + $self->{components}->{sensor_subsystem} = + HP::FCMGMT::Component::SensorSubsystem->new( + rawdata => $self->{rawdata}, + method => $self->{method}, + runtime => $self->{runtime}, + ); +} + +sub check_cpus { + my $self = shift; + $self->{components}->{cpu_subsystem}->check(); + $self->{components}->{cpu_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_powersupplies { + my $self = shift; + $self->{components}->{powersupply_subsystem}->check(); + $self->{components}->{powersupply_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_fan_subsystem { + my $self = shift; + $self->{components}->{fan_subsystem}->check(); + $self->{components}->{fan_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_temperatures { + my $self = shift; + $self->{components}->{temperature_subsystem}->check(); + $self->{components}->{temperature_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_memory_subsystem { + my $self = shift; + $self->{components}->{memory_subsystem}->check(); + $self->{components}->{memory_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 2; +} + +sub check_disk_subsystem { + my $self = shift; + $self->{components}->{disk_subsystem}->check(); + $self->{components}->{disk_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 1; +} + +sub check_sensor_subsystem { + my $self = shift; + $self->{components}->{isensor_subsystem}->check(); + $self->{components}->{sensor_subsystem}->dump() + if $self->{runtime}->{options}->{verbose} >= 1; +} + + +sub collect { + my $self = shift; + if ($self->{runtime}->{plugin}->opts->snmpwalk) { + my $cpqSeMibCondition = '1.3.6.1.4.1.232.6.1.3.0'; + # rindsarsch! + $self->{rawdata}->{$cpqSeMibCondition} = 0; + if (! exists $self->{rawdata}->{$cpqSeMibCondition}) { + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqhlth-mib)'); + } + } else { + my $net_snmp_version = Net::SNMP->VERSION(); # 5.002000 or 6.000000 + #$params{'-translate'} = [ + # -all => 0x0 + #]; + my ($session, $error) = + Net::SNMP->session(%{$self->{runtime}->{snmpparams}}); + if (! defined $session) { + $self->{plugin}->add_message(CRITICAL, 'cannot create session object'); + $self->trace(1, Data::Dumper::Dumper($self->{runtime}->{snmpparams})); + } else { + # revMajor is often used for discovery of hp devices + my $cpqSeMibRev = '1.3.6.1.4.1.232.6.1'; + my $cpqSeMibRevMajor = '1.3.6.1.4.1.232.6.1.1.0'; + my $cpqSeMibCondition = '1.3.6.1.4.1.232.6.1.3.0'; + my $result = $session->get_request( + -varbindlist => [$cpqSeMibCondition] + ); + # rindsarsch! + $result->{$cpqSeMibCondition} = 0; + if (!defined($result) || + $result->{$cpqSeMibCondition} eq 'noSuchInstance' || + $result->{$cpqSeMibCondition} eq 'noSuchObject' || + $result->{$cpqSeMibCondition} eq 'endOfMibView') { + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqhlth-mib)'); + $session->close; + } else { + # this is not reliable. many agents return 4=failed + #if ($result->{$cpqSeMibCondition} != 2) { + # $obstacle = "cmapeerstart"; + #} + } + } + if (! $self->{runtime}->{plugin}->check_messages()) { + # snmp peer is alive + $self->trace(2, sprintf "Protocol is %s", + $self->{runtime}->{snmpparams}->{'-version'}); + my $cpqSsSys = "1.3.6.1.4.1.232.8"; + $session->translate; + my $response = {}; #break the walk up in smaller pieces + my $tic = time; my $tac = $tic; + my $response1 = $session->get_table( + -baseoid => $cpqSsSys); + $tac = time; + $self->trace(2, sprintf "%03d seconds for walk cpqSsSys (%d oids)", + $tac - $tic, scalar(keys %{$response1})); + $session->close; + map { $response->{$_} = $response1->{$_} } keys %{$response1}; + map { $response->{$_} =~ s/^\s+//; $response->{$_} =~ s/\s+$//; } + keys %$response; + $self->{rawdata} = $response; + } + } + return $self->{runtime}->{plugin}->check_messages(); +} + +sub set_serial { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my @serials = (); + my @models = (); + my @fws = (); + my $cpqSsBackplaneEntry = '1.3.6.1.4.1.232.8.2.2.6.1'; + my $cpqSsBackplaneFWRev = '1.3.6.1.4.1.232.8.2.2.6.1.3'; + my $cpqSsBackplaneModel = '1.3.6.1.4.1.232.8.2.2.6.1.9'; + my $cpqSsBackplaneSerialNumber = '1.3.6.1.4.1.232.8.2.2.6.1.13'; + # INDEX { cpqSsBackplaneChassisIndex, cpqSsBackplaneIndex } + my @indexes = SNMP::Utils::get_indices($snmpwalk, + $cpqSsBackplaneEntry); + foreach (@indexes) { + my($idx1, $idx2) = ($_->[0], $_->[1]); + my $fw = SNMP::Utils::get_object($snmpwalk, + $cpqSsBackplaneFWRev, $idx1, $idx2); + my $model = SNMP::Utils::get_object($snmpwalk, + $cpqSsBackplaneModel, $idx1, $idx2); + my $serial = SNMP::Utils::get_object($snmpwalk, + $cpqSsBackplaneSerialNumber, $idx1, $idx2); + push(@serials, $serial); + push(@models, $model); + push(@fws, $fw); + } + + $self->{serial} = join('/', @serials); + $self->{product} = join('/', @models); + $self->{romversion} = join('/', @fws); + $self->{runtime}->{product} = $self->{product}; +} + + + + + + + + + + + + + + + + + + + +1; diff --git a/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/StorageWorks.pm b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/StorageWorks.pm new file mode 100755 index 0000000..5792961 --- /dev/null +++ b/nagios-plugins-contrib-24.20190301~bpo9+1/check_hpasm/check_hpasm-4.8/plugins-scripts/HP/StorageWorks.pm @@ -0,0 +1,157 @@ +package HP::StorageWorks; + +use strict; +use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 }; +use Data::Dumper; + +our @ISA = qw(HP::Server); + +sub init { + my $self = shift; + $self->{serial} = 'unknown'; + $self->{product} = 'unknown'; + $self->{romversion} = 'unknown'; + $self->collect(); + if (! $self->{runtime}->{plugin}->check_messages()) { + $self->set_serial(); + $self->overall_init(); + $self->overall_check(); + } +} + +sub overall_init { + my $self = shift; + my %params = @_; + my $snmpwalk = $self->{rawdata}; + my $cpqHoMibStatusArray = '1.3.6.1.4.1.232.11.2.10.1.0'; + $self->{cpqHoMibStatusArray} = SNMP::Utils::get_object( + $snmpwalk, $cpqHoMibStatusArray); + if ($self->{cpqHoMibStatusArray} =~ /^(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) { + $self->{cpqHoMibStatusArray} = 1 * $2; + } elsif ($self->{cpqHoMibStatusArray} =~ /^0x.*(\d\d)(\d\d)(\d\d)(\d\d)$/) { + $self->{cpqHoMibStatusArray} = 1 * $2; + } +} + +sub overall_check { + my $self = shift; + if ($self->{cpqHoMibStatusArray} == 4) { + $self->add_info('overall status is failed'); + $self->add_message(CRITICAL, 'overall status is failed'); + } elsif ($self->{cpqHoMibStatusArray} == 3) { + $self->add_info('overall status is degraded'); + $self->add_message(WARNING, 'overall status is degraded'); + } elsif ($self->{cpqHoMibStatusArray} == 2) { + $self->add_info('overall status is ok'); + $self->add_message(OK, 'overall status is ok'); + } elsif ($self->{cpqHoMibStatusArray} == 1) { + $self->add_info('overall status is other'); + $self->add_message(UNKNOWN, 'overall status is other'); + } +} + +sub identify { + my $self = shift; + return $self->{productname}; +} + +sub dump { + my $self = shift; + printf STDERR "serial %s\n", $self->{serial}; + printf STDERR "product %s\n", $self->{product}; + printf STDERR "romversion %s\n", $self->{romversion}; + printf STDERR "%s\n", Data::Dumper::Dumper($self->{components}); +} + +sub collect { + my $self = shift; + if ($self->{runtime}->{plugin}->opts->snmpwalk) { + my $cpqHoMibStatusArray = '1.3.6.1.4.1.232.11.2.10.1.0'; + if (! exists $self->{rawdata}->{$cpqHoMibStatusArray}) { + $self->add_message(CRITICAL, + 'snmpwalk returns no health data (cpqhost-mib)'); + } + } else { + my $net_snmp_version = Net::SNMP->VERSION(); # 5.002000 or 6.000000 + #$params{'-translate'} = [ + # -all => 0x0 + #]; + my ($session, $error) = + Net::SNMP->session(%{$self->{runtime}->{snmpparams}}); + if (! defined $session) { + $self->{plugin}->add_message(CRITICAL, 'cannot create session object'); + $self->trace(1, Data::Dumper::Dumper($self->{runtime}->{snmpparams})); + } + if (! $self->{runtime}->{plugin}->check_messages()) { + # snmp peer is alive + $self->trace(2, sprintf "Protocol is %s", + $self->{runtime}->{snmpparams}->{'-version'}); + my $cpqHoMibStatusArray = '1.3.6.1.4.1.232.11.2.10.1.0'; + $session->translate; + my $tic = time; + my $response = $session->get_request( + -varbindlist => [$cpqHoMibStatusArray] + ); + my $tac = time; + $self->trace(2, sprintf "%03d seconds for walk cpqHoMibStatusArray (%d oids)", + $tac - $tic, scalar(keys %{$response})); + $session->close; + map { $response->{$_} =~ s/^\s+//; $response->{$_} =~ s/\s+$//; } + keys %$response; + $self->{rawdata} = $response; + } + } + return $self->{runtime}->{plugin}->check_messages(); +} + +sub set_serial { + my $self = shift; + my $snmpwalk = $self->{rawdata}; + my @serials = (); + my @models = (); + my @fws = (); + my $cpqSsBackplaneEntry = '1.3.6.1.4.1.232.8.2.2.6.1'; + my $cpqSsBackplaneFWRev = '1.3.6.1.4.1.232.8.2.2.6.1.3'; + my $cpqSsBackplaneModel = '1.3.6.1.4.1.232.8.2.2.6.1.9'; + my $cpqSsBackplaneSerialNumber = '1.3.6.1.4.1.232.8.2.2.6.1.13'; + # INDEX { cpqSsBackplaneChassisIndex, cpqSsBackplaneIndex } + my @indexes = SNMP::Utils::get_indices($snmpwalk, + $cpqSsBackplaneEntry); + foreach (@indexes) { + my($idx1, $idx2) = ($_->[0], $_->[1]); + my $fw = SNMP::Utils::get_object($snmpwalk, + $cpqSsBackplaneFWRev, $idx1, $idx2); + my $model = SNMP::Utils::get_object($snmpwalk, + $cpqSsBackplaneModel, $idx1, $idx2); + my $serial = SNMP::Utils::get_object($snmpwalk, + $cpqSsBackplaneSerialNumber, $idx1, $idx2); + push(@serials, $serial); + push(@models, $model); + push(@fws, $fw); + } + + $self->{serial} = join('/', @serials); + $self->{product} = join('/', @models); + $self->{romversion} = join('/', @fws); + $self->{runtime}->{product} = $self->{product}; +} + + + + + + + + + + + + + + + + + + + +1; |