diff --git a/zabbix_scripts/util_generate_sensors_ini b/zabbix_scripts/util_generate_sensors_ini index 658ae4c..4337802 100755 --- a/zabbix_scripts/util_generate_sensors_ini +++ b/zabbix_scripts/util_generate_sensors_ini @@ -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"; } }