HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/local/bin/zabbix/discover_temp_sensor.pl
#!/usr/bin/perl

# TODO add getops - pass sensor name to get temp ?

# TODO see about replacing this by having zabbix connect to IPMI directly.

use strict;
use warnings;
use Getopt::Long;

my $query;
GetOptions(
	"s|sensor=s" => \$query,
);

sub exit_empty {
  print '{ "data": [] }';
  exit;
}

my $ipmi = "/usr/bin/ipmitool";
# Check whether this machine has ipmi or not.
(-e "/dev/ipmi0") || exit_empty();
(-e $ipmi) || exit_empty();

my %sensors;

my $command = $ipmi . " sdr elist full 2>/dev/null | grep degrees";
my $output = qx($command);

# Gather all the data
my @lines = split /\n/, $output; # Splits output on new lines
for my $line (@lines) {
	$line =~ s/\h+/ /g; # Removes extra white spaces
	# Expected line format example:
	# Outlet_TEMP      | 42h | ok  | 66.2 | 52 degrees C
	my @line_fields = split / \Q| /, $line; # Fields are separated by ' | '
	my $sensor_name = $line_fields[0];
	my $temperature = $line_fields[4];
	$temperature =~ s/\s+.*$//; # strip off ' degrees C'
	$sensors{$sensor_name} = $temperature;
}

# If a sensor name was passed in, return its temperature and quit.
if ($query) {
	print $sensors{$query};
	exit;
}

# json-ify the sensor names for zabbix discovery
my $json = qq({ "data": [\n);
for my $sensor (keys %sensors) {
	$json .= qq(    { "{#TEMPSENSOR}":"$sensor"},\n);
}
# trim the last ',' off, json doesn't like trailing commas
$json =~ s/,\n$/\n/;
# close up shop
$json .= qq(]}\n);

print $json;

exit;