From 12d43ee14c7de01f066d3de5591f72e183d2159c Mon Sep 17 00:00:00 2001 From: rmorandell_pgum Date: Thu, 31 Jul 2025 17:46:44 +0200 Subject: [PATCH] code beautify & refactoring --- src/hardware/ups/apc/snmp/mode/sensors.pm | 199 ++++++++++++++++------ 1 file changed, 147 insertions(+), 52 deletions(-) diff --git a/src/hardware/ups/apc/snmp/mode/sensors.pm b/src/hardware/ups/apc/snmp/mode/sensors.pm index 0cacce02a..d9aa8445d 100644 --- a/src/hardware/ups/apc/snmp/mode/sensors.pm +++ b/src/hardware/ups/apc/snmp/mode/sensors.pm @@ -34,17 +34,17 @@ sub set_system { $self->{thresholds} = { sensor => [ - ['uioNormal', 'OK'], - ['uioWarning', 'WARNING'], - ['uioCritical', 'CRITICAL'], - ['sensorStatusNotApplicable', 'OK'], - ['disconnected', 'CRITICAL'], - ['connected', 'OK'] + [ 'uioNormal', 'OK' ], + [ 'uioWarning', 'WARNING' ], + [ 'uioCritical', 'CRITICAL' ], + [ 'sensorStatusNotApplicable', 'OK' ], + [ 'disconnected', 'CRITICAL' ], + [ 'connected', 'OK' ] ] }; $self->{components_path} = 'hardware::ups::apc::snmp::mode::components'; - $self->{components_module} = ['sensor']; + $self->{components_module} = [ 'sensor' ]; } sub new { @@ -116,10 +116,10 @@ my $map_iem_unit = { }; my $mapping = { - uioSensorStatusSensorName => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.3' }, - uioSensorStatusTemperatureDegC => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.6' }, - uioSensorStatusHumidity => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.7' }, - uioSensorStatusAlarmStatus => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.9', map => $map_alarm_status } + uioSensorStatusSensorName => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.3' }, + uioSensorStatusTemperatureDegC => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.6' }, + uioSensorStatusHumidity => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.7' }, + uioSensorStatusAlarmStatus => { oid => '.1.3.6.1.4.1.318.1.1.25.1.2.1.9', map => $map_alarm_status } }; my $mapping_iem = { iemStatusProbeName => { oid => '.1.3.6.1.4.1.318.1.1.10.2.3.2.1.2' }, @@ -128,14 +128,24 @@ my $mapping_iem = { iemStatusProbeTempUnits => { oid => '.1.3.6.1.4.1.318.1.1.10.2.3.2.1.5', map => $map_iem_unit }, iemStatusProbeCurrentHumid => { oid => '.1.3.6.1.4.1.318.1.1.10.2.3.2.1.6' } }; + my $oid_uioSensorStatusEntry = '.1.3.6.1.4.1.318.1.1.25.1.2.1'; my $oid_iemStatusProbesEntry = '.1.3.6.1.4.1.318.1.1.10.2.3.2.1'; sub load { my ($self) = @_; - push @{$self->{request}}, { oid => $oid_uioSensorStatusEntry, start => $mapping->{uioSensorStatusSensorName}->{oid}, end => $mapping->{uioSensorStatusAlarmStatus}->{oid} }, - { oid => $oid_iemStatusProbesEntry, start => $mapping_iem->{iemStatusProbeName}->{oid}, end => $mapping_iem->{iemStatusProbeCurrentHumid}->{oid} }; + push @{$self->{request}}, + { + oid => $oid_uioSensorStatusEntry, + start => $mapping->{uioSensorStatusSensorName}->{oid}, + end => $mapping->{uioSensorStatusAlarmStatus}->{oid} + }, + { + oid => $oid_iemStatusProbesEntry, + start => $mapping_iem->{iemStatusProbeName}->{oid}, + end => $mapping_iem->{iemStatusProbeCurrentHumid}->{oid} + }; } sub check_uoi { @@ -145,7 +155,11 @@ sub check_uoi { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_uioSensorStatusEntry}})) { next if ($oid !~ /^$mapping->{uioSensorStatusSensorName}->{oid}\.(.*)$/); my $instance = $1; - my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_uioSensorStatusEntry}, instance => $instance); + my $result = $self->{snmp}->map_instance( + mapping => $mapping, + results => $self->{results}->{$oid_uioSensorStatusEntry}, + instance => $instance + ); $instance = 'universal-' . $1; next if ($self->check_filter(section => 'sensor', instance => $instance)); @@ -162,16 +176,24 @@ sub check_uoi { $exit = $self->get_severity(section => 'sensor', value => $result->{uioSensorStatusAlarmStatus}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, - short_msg => sprintf("universal sensor '%s' status is '%s'", $result->{uioSensorStatusSensorName}, $result->{uioSensorStatusAlarmStatus}) + severity => $exit, + short_msg => sprintf( + "universal sensor '%s' status is '%s'", + $result->{uioSensorStatusSensorName}, + $result->{uioSensorStatusAlarmStatus}) ); } if ($result->{uioSensorStatusTemperatureDegC} != -1) { - ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{uioSensorStatusTemperatureDegC}); + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric( + section => 'temperature', + instance => $instance, + value => $result->{uioSensorStatusTemperatureDegC} + ); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, + severity => $exit, short_msg => sprintf( "universal sensor temperature '%s' is %s C", $result->{uioSensorStatusSensorName}, @@ -181,21 +203,26 @@ sub check_uoi { } $self->{output}->perfdata_add( - nlabel => 'sensor.universal.temperature.celsius', - unit => 'C', + nlabel => 'sensor.universal.temperature.celsius', + unit => 'C', instances => $result->{uioSensorStatusSensorName}, - value => $result->{uioSensorStatusTemperatureDegC}, - warning => $warn, - critical => $crit + value => $result->{uioSensorStatusTemperatureDegC}, + warning => $warn, + critical => $crit ); } next if ($result->{uioSensorStatusHumidity} == -1); - ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'humidity', instance => $instance, value => $result->{uioSensorStatusHumidity}); + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric( + section => 'humidity', + instance => $instance, + value => $result->{uioSensorStatusHumidity} + ); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, + severity => $exit, short_msg => sprintf( "universal sensor humidity '%s' is %s %%", $result->{uioSensorStatusSensorName}, @@ -205,13 +232,13 @@ sub check_uoi { } $self->{output}->perfdata_add( - nlabel => 'sensor.universal.humidity.percentage', - unit => '%', + nlabel => 'sensor.universal.humidity.percentage', + unit => '%', instances => $result->{uioSensorStatusSensorName}, - value => $result->{uioSensorStatusHumidity}, - warning => $warn, - critical => $crit, - min => 0, max => 100 + value => $result->{uioSensorStatusHumidity}, + warning => $warn, + critical => $crit, + min => 0, max => 100 ); } } @@ -223,7 +250,11 @@ sub check_iem { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_iemStatusProbesEntry}})) { next if ($oid !~ /^$mapping_iem->{iemStatusProbeName}->{oid}\.(.*)$/); my $instance = $1; - my $result = $self->{snmp}->map_instance(mapping => $mapping_iem, results => $self->{results}->{$oid_iemStatusProbesEntry}, instance => $instance); + my $result = $self->{snmp}->map_instance( + mapping => $mapping_iem, + results => $self->{results}->{$oid_iemStatusProbesEntry}, + instance => $instance + ); $instance = 'integrated-' . $1; next if ($self->check_filter(section => 'sensor', instance => $instance)); @@ -241,18 +272,25 @@ sub check_iem { $exit = $self->get_severity(section => 'sensor', value => $result->{iemStatusProbeStatus}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, - short_msg => sprintf("integrated sensor '%s' status is '%s'", $result->{iemStatusProbeName}, $result->{iemStatusProbeStatus}) + severity => $exit, + short_msg => sprintf( + "integrated sensor '%s' status is '%s'", + $result->{iemStatusProbeName}, + $result->{iemStatusProbeStatus}) ); } next if ($result->{iemStatusProbeStatus} eq 'disconnected'); if ($result->{iemStatusProbeCurrentTemp} != -1) { - ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{iemStatusProbeCurrentTemp}); + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric( + section => 'temperature', + instance => $instance, + value => $result->{iemStatusProbeCurrentTemp} + ); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, + severity => $exit, short_msg => sprintf( "integrated sensor temperature '%s' is %s %s", $result->{iemStatusProbeName}, @@ -263,21 +301,25 @@ sub check_iem { } $self->{output}->perfdata_add( - unit => $result->{iemStatusProbeTempUnits} eq 'celsius' ? 'C' : 'F', - nlabel => 'sensor.integrated.temperature.' . $result->{iemStatusProbeTempUnits}, + unit => $result->{iemStatusProbeTempUnits} eq 'celsius' ? 'C' : 'F', + nlabel => 'sensor.integrated.temperature.' . $result->{iemStatusProbeTempUnits}, instances => $result->{iemStatusProbeName}, - value => $result->{iemStatusProbeCurrentTemp}, - warning => $warn, - critical => $crit + value => $result->{iemStatusProbeCurrentTemp}, + warning => $warn, + critical => $crit ); } next if ($result->{iemStatusProbeCurrentHumid} == -1); - ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'humidity', instance => $instance, value => $result->{iemStatusProbeCurrentHumid}); + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric( + section => 'humidity', + instance => $instance, + value => $result->{iemStatusProbeCurrentHumid} + ); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { $self->{output}->output_add( - severity => $exit, + severity => $exit, short_msg => sprintf( "integrated sensor humidity '%s' is %s %%", $result->{iemStatusProbeName}, @@ -287,26 +329,79 @@ sub check_iem { } $self->{output}->perfdata_add( - nlabel => 'sensor.integrated.humidity.percentage', - unit => '%', + nlabel => 'sensor.integrated.humidity.percentage', + unit => '%', instances => $result->{iemStatusProbeName}, - value => $result->{iemStatusProbeCurrentHumid}, - warning => $warn, - critical => $crit, - min => 0, max => 100 + value => $result->{iemStatusProbeCurrentHumid}, + warning => $warn, + critical => $crit, + min => 0, max => 100 ); } } +sub check_galaxy_vs_temp { + my ($self) = @_; + + my ($instance, $name) = (0, 'ambient'); + my $oid_ambientCurrentTemp = '.1.3.6.1.4.1.318.1.1.1.13.11.1.0'; + my $result = $self->{snmp}->get_leef(oids => [ $oid_ambientCurrentTemp ], nothing_quit => 1); + my $temperature = $result->{$oid_ambientCurrentTemp} / 10; + + return if ($self->check_filter(section => 'temperature', instance => $instance, name => $name)); + $self->{components}->{sensor}->{total}++; + + $self->{output}->output_add( + long_msg => sprintf( + "temperature '%s' [instance = %s, value = %s C]", + $name, + $instance, + $temperature) + ); + + my ($exit, $warn, $crit) = $self->get_severity_numeric( + section => 'temperature', + instance => $instance, + name => $name, + value => $temperature + ); + + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("temperature '%s' is %s C", $name, $temperature) + ); + } + + $self->{output}->perfdata_add( + unit => 'C', + nlabel => 'sensor.ambient.temperature.celsius', + instances => $name, + value => $temperature, + warning => $warn, + critical => $crit + ); +} + sub check { my ($self) = @_; $self->{output}->output_add(long_msg => 'checking sensors'); - $self->{components}->{sensor} = {name => 'sensors', total => 0, skip => 0}; + $self->{components}->{sensor} = { name => 'sensors', total => 0, skip => 0 }; return if ($self->check_filter(section => 'sensor')); - check_uoi($self); - check_iem($self); + # get the model info + my $oid_upsBasicIdentModel = '.1.3.6.1.4.1.318.1.1.1.1.1.1.0'; + my $result = $self->{snmp}->get_leef(oids => [ $oid_upsBasicIdentModel ], nothing_quit => 1); + + # if the model is an Galaxy VS we use other MIB for the temperature sensor + if (defined($result->{$oid_upsBasicIdentModel}) && $result->{$oid_upsBasicIdentModel} =~ /Galaxy VS/) { + check_galaxy_vs_temp($self); + } else { + check_uoi($self); + check_iem($self); + } + } 1;