57 lines
1.5 KiB
Bash
57 lines
1.5 KiB
Bash
#!/bin/bash
|
|
|
|
# XML escape in string metrics. Gmond handles this for its own metrics, we must do it ourself
|
|
xml_escape() {
|
|
local input="$1"
|
|
input="${input//&/\&}"
|
|
input="${input//</\<}"
|
|
input="${input//>/\>}"
|
|
input="${input//\"/\"}"
|
|
input="${input//\'/\'}"
|
|
echo "$input"
|
|
}
|
|
|
|
# Read all the IPMI hardware sensors
|
|
/usr/sbin/ipmi-sensors --ignore-not-available --no-header-output |
|
|
sed -Es 's/ *\| */|/g' |
|
|
while read line; do
|
|
# Read the line into a split array
|
|
readarray -td '|' linearray < <(echo $line)
|
|
|
|
# line looks like:
|
|
# 4 | CPU1 Temp | Temperature | 46.00 | C | 'OK'
|
|
|
|
# name of the sensor
|
|
reading_name=${linearray[1]}
|
|
|
|
# replace spaces with underscores
|
|
reading_name=${reading_name// /_}
|
|
|
|
# fix the tilde on some machines which report ram temperatures in banks
|
|
reading_name=${reading_name//\~/_thru_}
|
|
|
|
# make it all lowercase
|
|
reading_name=${reading_name,,*}
|
|
|
|
# reading units and value
|
|
reading_value=${linearray[3]}
|
|
reading_units=${linearray[4]}
|
|
|
|
# If it's an event, report a string not a float
|
|
if [ $reading_value == "N/A" ]; then
|
|
reading_event=${linearray[5]}
|
|
reading_event=${reading_event//$'\n'/}
|
|
reading_event=${reading_event//"' '"/, }
|
|
reading_event=${reading_event//"'"/}
|
|
gmetric --name="$reading_name" --value="$(xml_escape "$reading_event")" --type=string --group=physical
|
|
else
|
|
gmetric --name="$reading_name" --value="$reading_value" --units=$reading_units --type=float --group=physical
|
|
fi
|
|
|
|
# echo "$reading_name $reading_value $reading_units"
|
|
done
|
|
|
|
|
|
|
|
|