X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=check_openmanage;h=5a1e30971fb4f5d07f3eb885d503d6029b42a8c6;hb=3fd597dd6a1a62ea9a2d91f0c2c9ba96eebf0212;hp=0a0b233e47c5445bd33f6bad2c9bf36e55f2ab1a;hpb=8bcaa7cd3d1d98400bea1fce1d6b342974ad0335;p=check_openmanage.git diff --git a/check_openmanage b/check_openmanage index 0a0b233..5a1e309 100755 --- a/check_openmanage +++ b/check_openmanage @@ -51,7 +51,7 @@ $SIG{__WARN__} = sub { push @perl_warnings, [@_]; }; # Version and similar info $NAME = 'check_openmanage'; -$VERSION = '3.7.0-beta13'; +$VERSION = '3.7.2'; $AUTHOR = 'Trond H. Amundsen'; $CONTACT = 't.h.amundsen@usit.uio.no'; @@ -138,6 +138,7 @@ END_LICENSE 'debug' => 0, # debugging / verbose output 'help' => 0, # display help output 'perfdata' => undef, # output performance data + 'legacy_perfdata' => 0, # legacy performance data output 'info' => 0, # display servicetag 'extinfo' => 0, # display extra info 'htmlinfo' => undef, # html tags in output @@ -166,6 +167,7 @@ END_LICENSE 'privkey' => undef, # SMNP v3 'privprotocol' => undef, # SMNP v3 'use_get_table' => 0, # hack for SNMPv3 on Windows with net-snmp + 'hide_servicetag' => 0, # hidden servicetag ); # Get options @@ -181,6 +183,7 @@ GetOptions('b|blacklist=s' => \@{ $opt{blacklist} }, 'h|help' => \$opt{help}, 'V|version' => \$opt{version}, 'p|perfdata:s' => \$opt{perfdata}, + 'legacy-perfdata' => \$opt{legacy_perfdata}, 'i|info' => \$opt{info}, 'e|extinfo' => \$opt{extinfo}, 'I|htmlinfo:s' => \$opt{htmlinfo}, @@ -208,6 +211,7 @@ GetOptions('b|blacklist=s' => \@{ $opt{blacklist} }, 'privkey=s' => \$opt{privkey}, 'privprotocol=s' => \$opt{privprotocol}, 'use-get_table' => \$opt{use_get_table}, + 'hide-servicetag' => \$opt{hide_servicetag}, ) or do { print $USAGE; exit $E_UNKNOWN }; # If user requested help @@ -480,26 +484,28 @@ sub parse_configfile { # Mapping between command line options and the corresponding # config file options our %opt2config - = ( 'info' => 'output_servicetag', - 'extinfo' => 'output_sysinfo', - 'postmsg' => 'output_post_message', - 'state' => 'output_servicestate', - 'shortstate' => 'output_servicestate_abbr', - 'show_blacklist' => 'output_blacklist', - 'htmlinfo' => 'output_html', - 'okinfo' => 'output_ok_verbosity', - 'protocol' => 'snmp_version', - 'community' => 'snmp_community', - 'port' => 'snmp_port', - 'ipv6' => 'snmp_use_ipv6', - 'tcp' => 'snmp_use_tcp', - 'warning' => 'temp_threshold_warning', - 'critical' => 'temp_threshold_critical', - 'all' => 'check_everything', - 'perfdata' => 'performance_data', - 'tempunit' => 'temperature_unit', - 'timeout' => 'timeout', - 'blacklist' => 'blacklist', + = ( 'info' => 'output_servicetag', + 'extinfo' => 'output_sysinfo', + 'postmsg' => 'output_post_message', + 'state' => 'output_servicestate', + 'shortstate' => 'output_servicestate_abbr', + 'show_blacklist' => 'output_blacklist', + 'hide_servicetag' => 'output_hide_servicetag', + 'htmlinfo' => 'output_html', + 'okinfo' => 'output_ok_verbosity', + 'protocol' => 'snmp_version', + 'community' => 'snmp_community', + 'port' => 'snmp_port', + 'ipv6' => 'snmp_use_ipv6', + 'tcp' => 'snmp_use_tcp', + 'warning' => 'temp_threshold_warning', + 'critical' => 'temp_threshold_critical', + 'all' => 'check_everything', + 'perfdata' => 'performance_data', + 'tempunit' => 'temperature_unit', + 'timeout' => 'timeout', + 'blacklist' => 'blacklist', + 'legacy_perfdata' => 'legacy_performance_data', ); # Load the perl module @@ -772,6 +778,8 @@ sub parse_configfile { configfile_set_boolean($sect, 'show_blacklist'); configfile_set_boolean($sect, 'ipv6'); configfile_set_boolean($sect, 'tcp'); + configfile_set_boolean($sect, 'legacy_perfdata'); + configfile_set_boolean($sect, 'hide_servicetag'); configfile_set_snmp_version($sect); configfile_set_snmp_community($sect); configfile_set_snmp_port($sect); @@ -1499,13 +1507,13 @@ sub temp_from_celsius { my $to = shift; if ($to eq 'F') { - return ceil($x * 9/5 + 32); + return sprintf '%.1f', ($x * 9/5 + 32); } elsif ($to eq 'K') { - return ceil($x + 273.15); + return sprintf '%.1f', ($x + 273.15); } elsif ($to eq 'R') { - return ceil($x * 9/5 + 32 + 459.67); + return sprintf '%.1f', ($x * 9/5 + 32 + 459.67); } return $x; } @@ -1965,6 +1973,13 @@ sub check_physical_disks { report('storage', $msg, $E_WARNING, $nexus); } } + # Special case: Foreign disk + elsif ($status eq 'Non-Critical' and $state eq 'Foreign' + and blacklisted('pdisk_foreign', $nexus)) { + my $msg = sprintf '%s [%s %s, %s] on ctrl %d is %s', + $name, $vendor, $product, $capacity, $ctrl, $state; + report('storage', $msg, $E_OK, $nexus); + } # Default elsif ($status ne 'Ok') { my $msg = sprintf '%s [%s %s, %s] on ctrl %d needs attention: %s', @@ -2225,7 +2240,7 @@ sub check_cache_battery { $state = get_hashval($out->{batteryState}, \%bat_state) || 'Unknown state'; $learn = get_hashval($out->{batteryLearnState}, \%bat_learn_state) || 'Unknown learn state'; $pred = get_hashval($out->{batteryPredictedCapacity}, \%bat_pred_cap) || 'Unknown predicted capacity status'; - $ctrl = ($out->{batteryConnectionControllerNumber} || 10000) - 1; + $ctrl = $snmp_controller{$out->{batteryConnectionControllerNumber}}; $nexus = convert_nexus(($out->{batteryNexusID} || 9999)); $id = $nexus; $id =~ s{\A \d+:(\d+) \z}{$1}xms; @@ -2866,25 +2881,25 @@ sub check_enclosure_temp { report('storage', $msg, $E_OK, $nexus); } elsif ($status ne 'Ok' and $max_crit ne '[N/A]' and $reading > $max_crit) { - my $msg = sprintf '%s in enclosure %s [%s] is critically high at %d %s', + my $msg = sprintf '%s in enclosure %s [%s] is critically high at %s %s', $name, $encl_id, $encl_name, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $nexus); } elsif ($status ne 'Ok' and $max_warn ne '[N/A]' and $reading > $max_warn) { - my $msg = sprintf '%s in enclosure %s [%s] is too high at %d %s', + my $msg = sprintf '%s in enclosure %s [%s] is too high at %s %s', $name, $encl_id, $encl_name, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $nexus); } elsif ($status ne 'Ok' and $min_crit ne '[N/A]' and $reading < $min_crit) { - my $msg = sprintf '%s in enclosure %s [%s] is critically low at %d %s', + my $msg = sprintf '%s in enclosure %s [%s] is critically low at %s %s', $name, $encl_id, $encl_name, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $nexus); } elsif ($status ne 'Ok' and $min_warn ne '[N/A]' and $reading < $min_warn) { - my $msg = sprintf '%s in enclosure %s [%s] is too low at %d %s', + my $msg = sprintf '%s in enclosure %s [%s] is too low at %s %s', $name, $encl_id, $encl_name, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $nexus); @@ -2915,7 +2930,7 @@ sub check_enclosure_temp { if (defined $reading && $reading ne '[N/A]') { # take into account that with certain states the # reading doesn't exist or is not an integer - $msg .= sprintf ' reads %d %s', $reading, $opt{tempunit}; + $msg .= sprintf ' reads %s %s', $reading, $opt{tempunit}; if ($min_warn eq '[N/A]' or $min_crit eq '[N/A]') { $msg .= sprintf ' (max=%s/%s)', $max_warn, $max_crit; } @@ -2934,14 +2949,21 @@ sub check_enclosure_temp { if (defined $opt{perfdata} && $reading ne '[N/A]') { my $index = $name; $index =~ s{\A Temperature\sProbe\s(\d+) \z}{$1}gxms; + my $legacy_name = $name; + $legacy_name =~ s{\A Temperature\sProbe\s(\d+) \z}{temp_$1}gxms; + my $legacy_label = lc "enclosure_${encl_id}_${legacy_name}"; + my $legacy_mini = $legacy_label; + $legacy_mini =~ s{enclosure_(.+?)_temp_(.+?)}{e$1t$2}xms; push @perfdata, { - type => 'E', - id => $opt{perfdata} eq 'minimal' ? "${encl_id}_t${index}" : "${encl_id}_temp_${index}", - unit => $opt{tempunit}, - label => q{}, - value => $reading, - warn => $max_warn, - crit => $max_crit, + type => 'E', + id => $opt{perfdata} eq 'minimal' ? "${encl_id}_t${index}" : "${encl_id}_temp_${index}", + unit => $opt{tempunit}, + label => q{}, + legacy => $legacy_label, + mini => $legacy_mini, + value => $reading, + warn => $max_warn, + crit => $max_crit, }; } } @@ -3271,15 +3293,18 @@ sub check_fans { my $pname = $location; $pname =~ s{\s}{_}gxms; $pname =~ s{proc_}{cpu#}xms; + my $legacy_pname = $pname; $pname =~ s{_rpm\z}{}ixms; push @perfdata, { - type => 'F', - id => $index, - unit => 'rpm', - label => $pname, - value => $reading, - warn => $max_warn, - crit => $max_crit, + type => 'F', + id => $index, + unit => 'rpm', + label => $pname, + legacy => lc "fan_${index}_${legacy_pname}", + mini => "f$index", + value => $reading, + warn => $max_warn, + crit => $max_crit, }; } } @@ -3540,55 +3565,55 @@ sub check_temperatures { # First check according to custom thresholds if (exists $crit_threshold{$index}{max} and $reading > $crit_threshold{$index}{max}) { # Custom critical MAX - my $msg = sprintf 'Temperature Probe %d [%s] reads %d %s (custom max=%d)', + my $msg = sprintf 'Temperature Probe %d [%s] reads %s %s (custom max=%s)', $index, $location, $reading, $opt{tempunit}, $crit_threshold{$index}{max}; report('chassis', $msg, $E_CRITICAL, $index); } elsif (exists $warn_threshold{$index}{max} and $reading > $warn_threshold{$index}{max}) { # Custom warning MAX - my $msg = sprintf 'Temperature Probe %d [%s] reads %d %s (custom max=%d)', + my $msg = sprintf 'Temperature Probe %d [%s] reads %s %s (custom max=%s)', $index, $location, $reading, $opt{tempunit}, $warn_threshold{$index}{max}; report('chassis', $msg, $E_WARNING, $index); } elsif (exists $crit_threshold{$index}{min} and $reading < $crit_threshold{$index}{min}) { # Custom critical MIN - my $msg = sprintf 'Temperature Probe %d [%s] reads %d %s (custom min=%d)', + my $msg = sprintf 'Temperature Probe %d [%s] reads %s %s (custom min=%s)', $index, $location, $reading, $opt{tempunit}, $crit_threshold{$index}{min}; report('chassis', $msg, $E_CRITICAL, $index); } elsif (exists $warn_threshold{$index}{min} and $reading < $warn_threshold{$index}{min}) { # Custom warning MIN - my $msg = sprintf 'Temperature Probe %d [%s] reads %d %s (custom min=%d)', + my $msg = sprintf 'Temperature Probe %d [%s] reads %s %s (custom min=%s)', $index, $location, $reading, $opt{tempunit}, $warn_threshold{$index}{min}; report('chassis', $msg, $E_WARNING, $index); } elsif ($status ne 'Ok' and $max_crit ne '[N/A]' and $reading > $max_crit) { - my $msg = sprintf 'Temperature Probe %d [%s] is critically high at %d %s', + my $msg = sprintf 'Temperature Probe %d [%s] is critically high at %s %s', $index, $location, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $index); } elsif ($status ne 'Ok' and $max_warn ne '[N/A]' and $reading > $max_warn) { - my $msg = sprintf 'Temperature Probe %d [%s] is too high at %d %s', + my $msg = sprintf 'Temperature Probe %d [%s] is too high at %s %s', $index, $location, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $index); } elsif ($status ne 'Ok' and $min_crit ne '[N/A]' and $reading < $min_crit) { - my $msg = sprintf 'Temperature Probe %d [%s] is critically low at %d %s', + my $msg = sprintf 'Temperature Probe %d [%s] is critically low at %s %s', $index, $location, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $index); } elsif ($status ne 'Ok' and $min_warn ne '[N/A]' and $reading < $min_warn) { - my $msg = sprintf 'Temperature Probe %d [%s] is too low at %d %s', + my $msg = sprintf 'Temperature Probe %d [%s] is too low at %s %s', $index, $location, $reading, $opt{tempunit}; my $err = $snmp ? $probestatus2nagios{$status} : $status2nagios{$status}; report('chassis', $msg, $err, $index); } # Ok else { - my $msg = sprintf 'Temperature Probe %d [%s] reads %d %s', + my $msg = sprintf 'Temperature Probe %d [%s] reads %s %s', $index, $location, $reading, $opt{tempunit}; if ($min_warn eq '[N/A]' and $min_crit eq '[N/A]') { $msg .= sprintf ' (max=%s/%s)', $max_warn, $max_crit; @@ -3605,16 +3630,18 @@ sub check_temperatures { if (defined $opt{perfdata}) { my $pname = $location; $pname =~ s{\s}{_}gxms; - $pname =~ s{_temp\z}{}xms; + $pname =~ s{_temp\z}{}ixms; $pname =~ s{proc_}{cpu#}xms; push @perfdata, { - type => 'T', - id => $index, - unit => $opt{tempunit}, - label => $pname, - value => $reading, - warn => $max_warn, - crit => $max_crit, + type => 'T', + id => $index, + unit => $opt{tempunit}, + label => $pname, + legacy => lc "temp_${index}_${pname}", + mini => "t$index", + value => $reading, + warn => $max_warn, + crit => $max_crit, }; } } @@ -3996,20 +4023,20 @@ sub check_volts { report('chassis', $msg, $err, $index); # Collect performance data - if (defined $opt{perfdata}) { + if (defined $opt{perfdata} and !$opt{legacy_perfdata}) { $reading =~ s{\s+V\z}{}xms; # remove unit $reading =~ s{\.000\z}{}xms; # if integer next VOLT if $reading !~ m{\A \d+(\.\d+)? \z}xms; # discrete reading (not number) my $label = join q{_}, $location; $label =~ s{\s}{_}gxms; push @perfdata, { - type => 'V', - id => $index, - unit => 'V', - label => $label, - value => $reading, - warn => 0, - crit => 0, + type => 'V', + id => $index, + unit => 'V', + label => $label, + value => $reading, + warn => 0, + crit => 0, }; } } @@ -4191,6 +4218,12 @@ sub check_pwrmonitoring { $max_warn /= 10; $unit = 'A'; } + if ($unit eq 'mA' and $type ne 'amperageProbeTypeIsDiscrete') { + $reading /= 1000; + $max_crit /= 1000; + $max_warn /= 1000; + $unit = 'A'; + } } else { $index = get_nonempty_string('Index', $out, 9999); @@ -4244,13 +4277,15 @@ sub check_pwrmonitoring { my $label = join q{_}, $location; $label =~ s{\s}{_}gxms; push @perfdata, { - type => $unit, - id => $index, - unit => $unit, - label => $label, - value => $reading, - warn => $max_warn, - crit => $max_crit, + type => $unit, + id => $index, + unit => $unit, + label => $label, + legacy => (join q{_}, 'pwr_mon', $index, lc $label), + mini => "p${index}" . lc $unit, + value => $reading, + warn => $max_warn, + crit => $max_crit, }; } } @@ -4272,7 +4307,7 @@ sub check_pwrmonitoring { AMP2: foreach my $line (@{ run_command("$omreport $omopt_chassis pwrmonitoring -fmt ssv") }) { chop $line; - if ($line eq 'Location;Reading') { + if ($line eq 'Location;Reading' or $line eq 'Amperage') { $found = 1; next AMP2; } @@ -4290,13 +4325,15 @@ sub check_pwrmonitoring { while (exists $used{$index}) { ++$index; } push @perfdata, { - type => $aunit, - id => $index, - unit => $aunit, - label => $aname, - value => $aval, - warn => 0, - crit => 0, + type => $aunit, + id => $index, + unit => $aunit, + label => $aname, + legacy => "pwr_mon_${index}_${aname}", + mini => "p${index}a", + value => $aval, + warn => 0, + crit => 0, }; ++$index; } @@ -4648,7 +4685,7 @@ sub get_omreport_chassis_info { $sysinfo{model} = $val; } if ($key eq 'Chassis Service Tag' or $key eq 'Service Tag') { - $sysinfo{serial} = $val; + $sysinfo{serial} = $opt{hide_servicetag} ? 'XXXXXXX' : $val; } if ($key eq 'System Revision') { $sysinfo{rev} = q{ } . $val; @@ -4738,7 +4775,7 @@ sub get_snmp_chassis_info { $sysinfo{model} =~ s{\s+\z}{}xms; # remove trailing whitespace } elsif (exists $chassis_oid{$oid} and $chassis_oid{$oid} eq 'chassisServiceTagName') { - $sysinfo{serial} = $result->{$oid}; + $sysinfo{serial} = $opt{hide_servicetag} ? 'XXXXXXX' : $result->{$oid}; } elsif (exists $chassis_oid{$oid} and $chassis_oid{$oid} eq 'chassisSystemRevisionName') { $sysinfo{rev} = q{ } . $result->{$oid}; @@ -5106,8 +5143,8 @@ else { # Prefix with service tag if specified with option '-i|--info' if ($opt{info}) { - if (defined $opt{htmlinfo}) { - $msg = '[$sysinfo{serial}] " . $msg; } else { @@ -5174,11 +5211,16 @@ if ($exit_code == $E_OK && defined $opt{only} && $opt{only} !~ m{\A critical|war } } elsif ($exit_code == $E_OK && !$opt{debug}) { - if (defined $opt{htmlinfo}) { - printf q{OK - System: '%s%s', SN: '%s'}, + if (defined $opt{htmlinfo} and !$opt{hide_servicetag}) { + printf q{OK - System: '%s%s', SN: '%s'}, documentation_url($sysinfo{model}), $sysinfo{model}, $sysinfo{rev}, warranty_url($sysinfo{serial}), $sysinfo{serial}; } + if (defined $opt{htmlinfo} and $opt{hide_servicetag}) { + printf q{OK - System: '%s%s', SN: '%s'}, + documentation_url($sysinfo{model}), $sysinfo{model}, $sysinfo{rev}, + $sysinfo{serial}; + } else { printf q{OK - System: '%s%s', SN: '%s'}, $sysinfo{model}, $sysinfo{rev}, $sysinfo{serial}; @@ -5260,11 +5302,16 @@ elsif ($exit_code == $E_OK && !$opt{debug}) { else { if ($opt{extinfo}) { print $linebreak; - if (defined $opt{htmlinfo}) { - printf '------ SYSTEM: %s%s, SN: %s', + if (defined $opt{htmlinfo} && !$opt{hide_servicetag}) { + printf '------ SYSTEM: %s%s, SN: %s', documentation_url($sysinfo{model}), $sysinfo{model}, $sysinfo{rev}, warranty_url($sysinfo{serial}), $sysinfo{serial}; } + elsif (defined $opt{htmlinfo} && $opt{hide_servicetag}) { + printf '------ SYSTEM: %s%s, SN: %s', + documentation_url($sysinfo{model}), $sysinfo{model}, $sysinfo{rev}, + $sysinfo{serial}; + } else { printf '------ SYSTEM: %s%s, SN: %s', $sysinfo{model}, $sysinfo{rev}, $sysinfo{serial}; @@ -5333,12 +5380,25 @@ if (defined $opt{perfdata} && !$opt{debug} && @perfdata) { $a->{label} cmp $b->{label}; } + # LEGACY sort routine for performance data + sub perfsort_legacy { + my %order = ( fan => 0, pwr => 1, tem => 2, enc => 3, ); + return ($order{(substr $a->{legacy}, 0, 3)} cmp $order{(substr $b->{legacy}, 0, 3)}) || + $a->{legacy} cmp $b->{legacy}; + } + # Print performance data sorted - if ($opt{perfdata} eq 'minimal') { - print join $lb, map { "$_->{type}$_->{id}=$_->{value}$_->{unit};$_->{warn};$_->{crit}" } sort perfsort @perfdata; + if ($opt{legacy_perfdata}) { + my $type = $opt{perfdata} eq 'minimal' ? 'mini' : 'legacy'; + print join $lb, map { "$_->{$type}=$_->{value};$_->{warn};$_->{crit}" } sort perfsort_legacy @perfdata; } else { - print join $lb, map { "$_->{type}$_->{id}_$_->{label}=$_->{value}$_->{unit};$_->{warn};$_->{crit}" } sort perfsort @perfdata; + if ($opt{perfdata} eq 'minimal') { + print join $lb, map { "$_->{type}$_->{id}=$_->{value}$_->{unit};$_->{warn};$_->{crit}" } sort perfsort @perfdata; + } + else { + print join $lb, map { "$_->{type}$_->{id}_$_->{label}=$_->{value}$_->{unit};$_->{warn};$_->{crit}" } sort perfsort @perfdata; + } } }