# 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';
'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
'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
'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},
'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
# 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
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);
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;
}
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',
$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;
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);
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;
}
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,
};
}
}
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,
};
}
}
# 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;
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,
};
}
}
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,
};
}
}
$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);
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,
};
}
}
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;
}
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;
}
$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;
$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};
# Prefix with service tag if specified with option '-i|--info'
if ($opt{info}) {
- if (defined $opt{htmlinfo}) {
- $msg = '[<a href="' . warranty_url($sysinfo{serial})
+ if (defined $opt{htmlinfo} and !$opt{hide_servicetag}) {
+ $msg = '[<a target="_blank" href="' . warranty_url($sysinfo{serial})
. "\">$sysinfo{serial}</a>] " . $msg;
}
else {
}
}
elsif ($exit_code == $E_OK && !$opt{debug}) {
- if (defined $opt{htmlinfo}) {
- printf q{OK - System: '<a href="%s">%s%s</a>', SN: '<a href="%s">%s</a>'},
+ if (defined $opt{htmlinfo} and !$opt{hide_servicetag}) {
+ printf q{OK - System: '<a target="_blank" href="%s">%s%s</a>', SN: '<a target="_blank" href="%s">%s</a>'},
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: '<a target="_blank" href="%s">%s%s</a>', 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};
else {
if ($opt{extinfo}) {
print $linebreak;
- if (defined $opt{htmlinfo}) {
- printf '------ SYSTEM: <a href="%s">%s%s</a>, SN: <a href="%s">%s</a>',
+ if (defined $opt{htmlinfo} && !$opt{hide_servicetag}) {
+ printf '------ SYSTEM: <a target="_blank" href="%s">%s%s</a>, SN: <a target="_blank" href="%s">%s</a>',
documentation_url($sysinfo{model}), $sysinfo{model}, $sysinfo{rev},
warranty_url($sysinfo{serial}), $sysinfo{serial};
}
+ elsif (defined $opt{htmlinfo} && $opt{hide_servicetag}) {
+ printf '------ SYSTEM: <a target="_blank" href="%s">%s%s</a>, 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};
$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;
+ }
}
}