|
|
|
@ -12,6 +12,7 @@ my $output = undef; |
|
|
|
|
# you may want to be notified before it's reached, so you can |
|
|
|
|
# set a margin which will be substracted from the real threshold |
|
|
|
|
my $temp_margin = '10'; |
|
|
|
|
my $pwr_margin = '200'; |
|
|
|
|
#This value will be substracted from the higher threshold to define the low one |
|
|
|
|
#so you can have hysteresis to prevent flip-flop |
|
|
|
|
my $temp_hyst = '10'; |
|
|
|
@ -19,7 +20,8 @@ my $temp_hyst = '10'; |
|
|
|
|
GetOptions( |
|
|
|
|
"output=s" => \$output, |
|
|
|
|
"temp-margin=i" => \$temp_margin, |
|
|
|
|
"temp-hyst=i" => \$temp_hyst |
|
|
|
|
"pwr-margin=i" => \$pwr_margin, |
|
|
|
|
"temp-hyst=i" => \$temp_hyst, |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
sub usage(){ |
|
|
|
@ -43,6 +45,9 @@ my $def_temp_thres_high = '50'; |
|
|
|
|
my $def_fan_thres_high = '1000'; |
|
|
|
|
my $def_fan_thres_low = '700'; |
|
|
|
|
|
|
|
|
|
my $def_pwr_thres_high = '1000'; |
|
|
|
|
my $def_pwr_thres_low = '800'; |
|
|
|
|
|
|
|
|
|
my $cfg = new Config::Simple(syntax => 'ini'); |
|
|
|
|
|
|
|
|
|
my $sensors = {}; |
|
|
|
@ -51,86 +56,144 @@ my $sensors = {}; |
|
|
|
|
if (-x $ipmitool){ |
|
|
|
|
# First check for temperature sensors |
|
|
|
|
my @lines = qx($ipmitool sdr type Temperature); |
|
|
|
|
SENSOR: foreach my $l (@lines){ |
|
|
|
|
chomp $l; |
|
|
|
|
# Looks like |
|
|
|
|
# Inlet Temp | 04h | ok | 7.1 | 25 degrees C |
|
|
|
|
if ($l !~ m/^(\w+[\s\w]+?\w+)\s*\|.*\|\s*([\w\.\s]+)\s*\|.*\|\s*([\-\w\.\s]+)$/){ |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
my $name = $1; |
|
|
|
|
my $sensor = {}; |
|
|
|
|
|
|
|
|
|
my @details = qx($ipmitool sdr get '$name'); |
|
|
|
|
foreach my $d (@details){ |
|
|
|
|
chomp $d; |
|
|
|
|
if ($d =~ m/^\s*Sensor\sReading\s*:\s*(\w+)/){ |
|
|
|
|
my $val = $1; |
|
|
|
|
if ($val !~ m/^\d+$/){ |
|
|
|
|
print "Skipping sensor $name, couldn't parse its value: $val\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
if ($? == 0){ |
|
|
|
|
SENSOR: foreach my $l (@lines){ |
|
|
|
|
chomp $l; |
|
|
|
|
# Looks like |
|
|
|
|
# Inlet Temp | 04h | ok | 7.1 | 25 degrees C |
|
|
|
|
if ($l !~ m/^(\w+[\s\w]+?\w+)\s*\|.*\|\s*([\w\.\s]+)\s*\|.*\|\s*([\-\w\.\s]+)$/){ |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Upper\scritical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_high} = $1-$temp_margin; |
|
|
|
|
my $name = $1; |
|
|
|
|
my $sensor = {}; |
|
|
|
|
|
|
|
|
|
my @details = qx($ipmitool sdr get '$name'); |
|
|
|
|
if ($? != 0){ |
|
|
|
|
print "Couldn't get detail for sensor $name\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Upper\snon\-critical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_low} = $1-$temp_margin; |
|
|
|
|
foreach my $d (@details){ |
|
|
|
|
chomp $d; |
|
|
|
|
if ($d =~ m/^\s*Sensor\sReading\s*:\s*(\w+)/){ |
|
|
|
|
my $val = $1; |
|
|
|
|
if ($val !~ m/^\d+$/){ |
|
|
|
|
print "Skipping sensor $name, couldn't parse its value: $val\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Upper\scritical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_high} = $1-$temp_margin; |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Upper\snon\-critical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_low} = $1-$temp_margin; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
$sensor->{threshold_high} ||= $def_temp_thres_high; |
|
|
|
|
$sensor->{threshold_low} ||= $def_temp_thres_high-$temp_hyst; |
|
|
|
|
$sensor->{threshold_high} =~ s/\.0+$//; |
|
|
|
|
$sensor->{threshold_low} =~ s/\.0+$//; |
|
|
|
|
$sensor->{description} = $name; |
|
|
|
|
$sensor->{type} = 'temp'; |
|
|
|
|
$sensor->{unit} = '°C'; |
|
|
|
|
$sensor->{cmd} = "$ipmitool sdr get '$name' | grep 'Sensor Reading' | awk '{print \$4}'"; |
|
|
|
|
my $id = lc $name; |
|
|
|
|
$id =~ s/\s/_/g; |
|
|
|
|
$sensors->{$id} = $sensor; |
|
|
|
|
print "Found a temperature sensor using IPMI: $name\n"; |
|
|
|
|
} |
|
|
|
|
$sensor->{threshold_high} ||= $def_temp_thres_high; |
|
|
|
|
$sensor->{threshold_low} ||= $def_temp_thres_high-$temp_hyst; |
|
|
|
|
$sensor->{threshold_high} =~ s/\.0+$//; |
|
|
|
|
$sensor->{threshold_low} =~ s/\.0+$//; |
|
|
|
|
$sensor->{description} = $name; |
|
|
|
|
$sensor->{type} = 'temp'; |
|
|
|
|
$sensor->{unit} = '°C'; |
|
|
|
|
$sensor->{cmd} = "$ipmitool sdr get '$name' | grep 'Sensor Reading' | awk '{print \$4}'"; |
|
|
|
|
my $id = lc $name; |
|
|
|
|
$id =~ s/\s/_/g; |
|
|
|
|
$sensors->{$id} = $sensor; |
|
|
|
|
print "Found a temperature sensor using IPMI: $name\n"; |
|
|
|
|
} |
|
|
|
|
# Now check for Fan, nearly the same as Temp, but |
|
|
|
|
# * We try to detect the unit |
|
|
|
|
# * threshold handling is not the same |
|
|
|
|
@lines = qx($ipmitool sdr type Fan); |
|
|
|
|
SENSOR: foreach my $l (@lines){ |
|
|
|
|
chomp $l; |
|
|
|
|
$l =~ m/^(\w+[\s\w]+?\w+)\s*\|.*\|\s*([\w\.\s]+)\s*\|.*\|\s*([\-\w\.\s]+)$/; |
|
|
|
|
my $name = $1; |
|
|
|
|
my $val = $3; |
|
|
|
|
my $sensor = {}; |
|
|
|
|
|
|
|
|
|
my @details = qx($ipmitool sdr get '$name'); |
|
|
|
|
foreach my $d (@details){ |
|
|
|
|
chomp $d; |
|
|
|
|
if ($d =~ m/^\s*Sensor\sReading\s*:\s*(\w+)/){ |
|
|
|
|
my $val = $1; |
|
|
|
|
if ($val !~ m/^\d+$/){ |
|
|
|
|
print "Skipping sensor $name, couldn't parse its value: $val\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
if ($? == 0){ |
|
|
|
|
SENSOR: foreach my $l (@lines){ |
|
|
|
|
chomp $l; |
|
|
|
|
$l =~ m/^(\w+[\s\w]+?\w+)\s*\|.*\|\s*([\w\.\s]+)\s*\|.*\|\s*([\-\w\.\s]+)$/; |
|
|
|
|
my $name = $1; |
|
|
|
|
my $value = my $val = $3; |
|
|
|
|
my $sensor = {}; |
|
|
|
|
|
|
|
|
|
my @details = qx($ipmitool sdr get '$name'); |
|
|
|
|
if ($? != 0){ |
|
|
|
|
print "Couldn't get detail for sensor $name\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Lower\scritical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_low} = $1-$temp_margin; |
|
|
|
|
foreach my $d (@details){ |
|
|
|
|
chomp $d; |
|
|
|
|
if ($d =~ m/^\s*Sensor\sReading\s*:\s*(\w+)/){ |
|
|
|
|
$val = $1; |
|
|
|
|
if ($val !~ m/^\d+$/){ |
|
|
|
|
print "Skipping sensor $name, couldn't parse its value: $val\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Lower\scritical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_low} = $1-$temp_margin; |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Lower\snon\-critical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_high} = $1-$temp_margin; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Lower\snon\-critical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_high} = $1-$temp_margin; |
|
|
|
|
$sensor->{threshold_high} ||= $def_fan_thres_high; |
|
|
|
|
$sensor->{threshold_low} ||= $def_fan_thres_high-$temp_hyst; |
|
|
|
|
$sensor->{threshold_high} =~ s/\.0+$//; |
|
|
|
|
$sensor->{threshold_low} =~ s/\.0+$//; |
|
|
|
|
$sensor->{description} = $name; |
|
|
|
|
$sensor->{type} = 'fan'; |
|
|
|
|
$sensor->{unit} = ($value =~ m/percent|%/ || $val < 100) ? '%' : 'rpm'; |
|
|
|
|
$sensor->{cmd} = "$ipmitool sdr get '$name' | grep 'Sensor Reading' | awk '{print \$4}'"; |
|
|
|
|
my $id = lc $name; |
|
|
|
|
$id =~ s/\s/_/g; |
|
|
|
|
$sensors->{$id} = $sensor; |
|
|
|
|
print "Found a fan sensor using IPMI: $name\n"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
# Now look for power information |
|
|
|
|
@lines = qx($ipmitool sdr type 'Current'); |
|
|
|
|
if ($? == 0){ |
|
|
|
|
SENSOR: foreach my $l (@lines){ |
|
|
|
|
chomp $l; |
|
|
|
|
$l =~ m/^(\w+[\s\w]+?\w+)\s*\|.*\|\s*([\w\.\s]+)\s*\|.*\|\s*([\-\w\.\s]+)$/; |
|
|
|
|
my $name = $1; |
|
|
|
|
my $val = $3; |
|
|
|
|
my $sensor = {}; |
|
|
|
|
if ($name =~ m/Power|Pwr|Consumption/i || $val =~ m/W(att)?/i){ |
|
|
|
|
my @details = qx($ipmitool sdr get '$name'); |
|
|
|
|
if ($? != 0){ |
|
|
|
|
print "Couldn't get detail for sensor $name\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
foreach my $d (@details){ |
|
|
|
|
chomp $d; |
|
|
|
|
if ($d =~ m/^\s*Sensor\sReading\s*:\s*(\w+)/){ |
|
|
|
|
$val = $1; |
|
|
|
|
if ($val !~ m/^\d+$/){ |
|
|
|
|
print "Skipping sensor $name, couldn't parse its value: $val\n"; |
|
|
|
|
next SENSOR; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Lower\scritical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_low} = $1-$pwr_margin; |
|
|
|
|
} |
|
|
|
|
elsif ($d =~ m/^\s*Lower\snon\-critical\s*:\s*(\d+(\.\d+))/){ |
|
|
|
|
$sensor->{threshold_high} = $1-$pwr_margin; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
$sensor->{threshold_high} ||= $def_pwr_thres_high; |
|
|
|
|
$sensor->{threshold_low} ||= $def_pwr_thres_high-$temp_hyst; |
|
|
|
|
$sensor->{threshold_high} =~ s/\.0+$//; |
|
|
|
|
$sensor->{threshold_low} =~ s/\.0+$//; |
|
|
|
|
$sensor->{description} = $name; |
|
|
|
|
$sensor->{type} = 'power'; |
|
|
|
|
$sensor->{unit} = 'Watt'; |
|
|
|
|
$sensor->{cmd} = "$ipmitool sdr get '$name' | grep 'Sensor Reading' | awk '{print \$4}'"; |
|
|
|
|
my $id = lc $name; |
|
|
|
|
$id =~ s/\s/_/g; |
|
|
|
|
$sensors->{$id} = $sensor; |
|
|
|
|
print "Found a power sensor using IPMI: $name\n"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
$sensor->{threshold_high} ||= $def_fan_thres_high; |
|
|
|
|
$sensor->{threshold_low} ||= $def_fan_thres_high-$temp_hyst; |
|
|
|
|
$sensor->{threshold_high} =~ s/\.0+$//; |
|
|
|
|
$sensor->{threshold_low} =~ s/\.0+$//; |
|
|
|
|
$sensor->{description} = $name; |
|
|
|
|
$sensor->{type} = 'fan'; |
|
|
|
|
$sensor->{unit} = ($val =~ m/percent|%/) ? '%' : 'rpm'; |
|
|
|
|
$sensor->{cmd} = "$ipmitool sdr get '$name' | grep 'Sensor Reading' | awk '{print \$4}'"; |
|
|
|
|
my $id = lc $name; |
|
|
|
|
$id =~ s/\s/_/g; |
|
|
|
|
$sensors->{$id} = $sensor; |
|
|
|
|
print "Found a fan sensor using IPMI: $name\n"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|