From d11cf4987ba7af7a76478bf78e09e728cd4bc2b3 Mon Sep 17 00:00:00 2001 From: Mathieu Gauthier-Pilote Date: Mon, 8 Apr 2024 11:17:43 -0400 Subject: [PATCH] Add option to return the amp values --- munin/files/plugins/ipmi_ | 224 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 munin/files/plugins/ipmi_ diff --git a/munin/files/plugins/ipmi_ b/munin/files/plugins/ipmi_ new file mode 100644 index 00000000..51e713d3 --- /dev/null +++ b/munin/files/plugins/ipmi_ @@ -0,0 +1,224 @@ +#!/bin/bash +# -*- sh -*- + +: << =cut + +=head1 NAME + +ipmi_ - Plugin to monitor temperature, fan speed, watts or volts using IPMI + +=head1 CONFIGURATION + +=head2 ENVIRONMENT VARIABLES + +This plugin does not use environment variables + +=head2 WILDCARD PLUGIN + +This plugin should be linked as ipmi_temp, ipmi_fans, ipmi_power or ipmi_volts, +and will show either temperatures, fan speeds, watts or volts based on its link +name. + +=head1 NOTE + +WARNING: Munin has a 10 second default timeout on plugins. On some +hosts ipmitool takes longer than that to probe all your hardware. In +this case this plugin us unusable. + +=head1 AUTHOR + +Nicolai Langfeldt + +Modified by Mathieu Gauthier-Pilote from Evolix to return amp values as well (2024/04). + +=head1 LICENSE + +Donated to the public domain by Nicolai Langfeldt (janl@linpro.no) + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf suggest + +=cut + +#### Parse commandline to determine what the job is + +CONFIG=no + +case $1 in + autoconf) + type -p ipmitool &>/dev/null || + { echo 'no (missing ipmitool command)' && exit 0; } + + ipmitool sensor &>/dev/null || + { echo 'no (unable to access IPMI device)' && exit 0; } + + echo yes + exit 0 + ;; + suggest) echo fans + echo temp + echo power + echo volts + echo amp + exit 0;; + config) CONFIG=config;; +esac + +case $0 in + *_temp) MEASURE=temp;; + *_fans) MEASURE=fans;; + *_power) MEASURE=power;; + *_volts) MEASURE=volts;; + *_amp) MEASURE=amp;; + *) echo "Please invoke as ipmi_temp, ipmi_fans, ipmi_power ipmi_volts or ipmi_amp" >&2 + exit 1;; +esac + +export CONFIG MEASURE + +#### Work is done in this awk script + +ipmitool sensor | gawk -F'|' ' +BEGIN { + FANS = ""; + TEMPS = ""; + POWER = ""; + VOLTS = ""; + AMP = ""; + CFANS = "graph_title Fan speeds based on IPMI\ngraph_vlabel RPM or %\ngraph_category Sensors\n"; + CTEMPS = "graph_title Machine temperature based on IPMI\ngraph_vlabel Degrees celcius\ngraph_category Sensors\n"; + CPOWER = "graph_title Power usage based on IPMI\ngraph_vlabel W\ngraph_category Sensors\n"; + CVOLTS = "graph_title Volts based on IPMI\ngraph_vlabel V\ngraph_category Sensors\n"; + CAMP = "graph_title Amps based on IPMI\ngraph_vlabel A\ngraph_category Sensors\n"; +} + +# Remove extraneous spaces to make output prettyer +{ gsub(/\t/," "); gsub(/ +/," "); gsub(/ +\|/,"|"); gsub(/\| +/,"|") } + +# Skip lines with 0x0 in first column +/^[^|]+\|0x0\|/ { next; }; + +# Skip lines with na in first column +/^[^|]+\|na\|/ { next; }; + +# Parse temperatures +/degrees C/ { + NAME=THING=$1; + gsub(/[^A-Za-z0-9]/,"",NAME); + TEMP=$2; + + # Find unique name + while (NAMES[NAME] >= 1) { + NAME=sprintf("%si",NAME); + } + NAMES[NAME]=1; + + WARN=$8; + CRIT=$9; + + TEMPS = sprintf("%s%s.value %s\n",TEMPS,NAME,TEMP); + CTEMPS = sprintf("%s%s.label %s\n",CTEMPS,NAME,THING); + + if (CRIT !~ /na/) { + CTEMPS = sprintf("%s%s.critical 0:%s\n",CTEMPS,NAME,CRIT); + } + + if (WARN !~ /na/) { + CTEMPS = sprintf("%s%s.warning 0:%s\n",CTEMPS,NAME,WARN); + } +} + +/(RPM|^Fan.*percent)/ { + NAME=THING=$1; + gsub(/[^A-Za-z0-9]/,"",NAME); + SPEED=$2; + + # Find unique name + while (NAMES[NAME] >= 1) { + NAME=sprintf("%si",NAME); + } + NAMES[NAME]=1; + + FANS = sprintf("%s%s.value %s\n",FANS,NAME,SPEED); + CFANS = sprintf("%s%s.label %s\n",CFANS,NAME,THING); + + OK=$4; + + MIN=$6; + if (MIN !~ /na/) { + CFANS = sprintf("%s%s.warning %s:\n",CFANS,NAME,MIN); + } +} + +/Watts/ { + NAME=THING=$1; + gsub(/[^A-Za-z0-9]/,"",NAME); + WATTS=$2; + + # Find unique name + while (NAMES[NAME] >= 1) { + NAME=sprintf("%si",NAME); + } + NAMES[NAME]=1; + + POWER = sprintf("%s%s.value %s\n",POWER,NAME,WATTS); + CPOWER = sprintf("%s%s.label %s\n",CPOWER,NAME,THING); +} + +/Volts/ { + NAME=THING=$1 + gsub(/[^A-Za-z0-9]/,"",NAME); + VOLTS_SENSOR=$2; + + # Find unique name + while (NAMES[NAME] >= 1) { + NAME=sprintf("%si",NAME); + } + NAMES[NAME]=1; + + VOLTS = sprintf("%s%s.value %s\n",VOLTS,NAME,VOLTS_SENSOR); + CVOLTS = sprintf("%s%s.label %s\n",CVOLTS,NAME,THING); +} + +/Amps/ { + NAME=THING=$1 + gsub(/[^A-Za-z0-9]/,"",NAME); + AMPS=$2; + + # Find unique name + while (NAMES[NAME] >= 1) { + NAME=sprintf("%si",NAME); + } + NAMES[NAME]=1; + + AMP = sprintf("%s%s.value %s\n",AMP,NAME,AMPS); + CAMP = sprintf("%s%s.label %s\n",CAMP,NAME,THING); +} + +END { + if (ENVIRON["MEASURE"] == "temp") { + VALUE=TEMPS; + CONFIG=CTEMPS; + } else if (ENVIRON["MEASURE"] == "power") { + VALUE=POWER; + CONFIG=CPOWER; + } else if (ENVIRON["MEASURE"] == "volts") { + VALUE=VOLTS; + CONFIG=CVOLTS; + } else if (ENVIRON["MEASURE"] == "amp") { + VALUE=AMP; + CONFIG=CAMP; + } else { + VALUE=FANS; + CONFIG=CFANS; + } + if (ENVIRON["CONFIG"] == "config") + printf "%s",CONFIG; + else + printf "%s",VALUE; +} +' + +# vim: syntax=sh ts=4 et