Compare commits

..

No commits in common. "master" and "v0.7" have entirely different histories.
master ... v0.7

4 changed files with 116 additions and 231 deletions

46
HISTORY
View File

@ -1,46 +0,0 @@
Version 0.2:
Line 103, fixed the missing "-n" option (Thanks to Chad who pointed this out
this out for me). Also added a "shopt -s extglob". (Thx to Chad)
Version 0.5:
Line 168, fixed a typo (EXIT_UNKNOWN to STATE_UNKNOWN)
Version 0.7:
Line 193, modified sensor parsing to cut after the first '+' since all
positive temperatures are preceded by a '+'
Line 211, reduced "verbosity" needed to see verbose info (was 2: -v -v)
Line 229-232, now checks to see if no sensor data was found and
exits with STATE_UNKNOWN
Version 0.8:
Line 196 and 230, added 'head -n1' to only fetch the first result from
sensors output. On some machine you get two Core0 and two Core1 temps.
Moved version history to it's own file, HISTORY
Version 0.94:
Lots of changes and bugfixes. A huge thank you to Ryan Loudfoot who
has fixed bugs and worked out a new way to detect the sensors-program.
In 0.94 I removed /etc from the whereis path as it didn't work for me
on my setup. It found the config-file for lm-sensors and tried to run
it.
Version 0.95:
Changed the Performance Data Field to only contain a label and the
actual value in celsius. For example, "temperature=39".
Version 1.0:
Several improvements made by Nikodimos, including:
- Added support for multiple sensors
- Enriched performance data output. For example, "CPU=34;40;55 MB=32;40;55"
- Changed (and improved) the way temperatures are retrieved
- Other fixes and touch-ups, such as the help text now shows long options
Version 1.1:
Improvements for Icinga 2, made by Onkobu
- order of arguments is irrelevant now, --sensor first ignored following -c & -w
- current sensors' multiline output needs sophisticated treatment
Version 1.2:
Improvements for Icinga 2, made by Onkobu
- Added the ability to switch between old and new style with an -n option
- Fixed multi-sensor with identical thresholds

27
README
View File

@ -5,34 +5,11 @@ It's written in Bash and uses *nix "sensors" and some sed & awk.
Default is to check the CPU temperature but this can be changed to, for example, Default is to check the CPU temperature but this can be changed to, for example,
the motherboard temperature with a "--sensor" argument. the motherboard temperature with a "--sensor" argument.
The plugin complies with the guidelines, for example uses -w -c -v arguments The plugin complies with the guidelines, for example uses -w -c -v arguments
etc. It also does some basic sanity checks and has a exit 3 catch-all. etc. It also does some basic sanity checks and has a exit 3 catchall.
The plugin was submitted to Nagios Exchange in 2011. The plugin was submitted to Nagios Exchange in 2011.
Known forks of check_temp: Known forks of check_temp:
There is a very good Perl fork of check_temp written by Chad Columbus. It's There is a very good Perl fork of check_temp written by Chad Columbus. It's
available on Nagios Exchange at avalible on Nagios Exchange at
http://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/check_temp-2Epl/details http://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/check_temp-2Epl/details
Required:
1) Install lm-sensors:
a) On Debian/Ubuntu... apt-get install lm-sensors
b) On OpenSUSE etc... zypper in sensors
2) Run sensors-detect:
sudo sensors-detect
Let it check for any sensors that you feel are necessary, or all. You can just
press <ENTER> to have it use the default option for each check. There is a
warning in the manpages (man sensors-detect) that there are (some rare)
hardware sensors that may lock up or even be permanently damaged, so be aware
of that.
**********
MAKE SURE YOU TYPE "YES" TO THE LAST OPTION: "Do you want to add these lines automatically to /etc/modules? (yes/NO)"
**********
3) Restart module-init-tools service (On Debian/Ubuntu)
a) /etc/init.d/module-init-tools restart
or
b) service module-init-tools restart

7
THANKS
View File

@ -5,8 +5,5 @@ Some kind people have been contributing by reporting problems, suggesting
improvements or submitting code. improvements or submitting code.
Here is a list of these kind people. Here is a list of these kind people.
Chad Columbus ccolumbu@hotmail.com Chad Columbus ccolumbu@hotmail.com
Ryan Loudfoot elyrith@gmail.com Ryan Loudfoot elyrith@gmail.com
Nikodimos kikniknik on Github
Shakalandy shakalandy on Github
Onkobu Tanaake onkobu on Github

View File

@ -25,32 +25,30 @@
# Nagios plugin to monitor CPU and M/B temperature with sensors. # # Nagios plugin to monitor CPU and M/B temperature with sensors. #
# Written in Bash (and uses sed & awk). # # Written in Bash (and uses sed & awk). #
# Latest version of check_temp can be found at the below URL: # # Latest version of check_temp can be found at the below URL: #
# https://github.com/jackbenny/check_temp # # https://bitbucket.org/jackbenny/check_temp #
# #
# If you are having problems getting it to work, check the instructions in #
# the README first. It walks you though install lm-sensors and getting it to #
# display sensor data. #
# # # #
# Version 0.2: Line 103, fixed the missing "-n" option (Thanks to Chad who #
# pointed this out for me). Also added a "shopt -s extglob". (Thx to Chad) #
# Version 0.5: Line 168, fixed a typo (EXIT_UNKNOWN to STATE_UNKNOWN) #
# Version 0.7: #
# Line 193, modified sensor parsing to cut after the first '+' since all #
# positive temperatures are preceded by a '+' #
# Line 211, reduced "verbosity" needed to see verbose info (was 2: -v -v) #
# Line 229-232, now checks to see if no sensor data was found and #
# exits with STATE_UNKNOWN #
############################################################################### ###############################################################################
VERSION="Version 1.2" VERSION="Version 0.7"
AUTHOR="(c) 2011 Jack-Benny Persson (jack-benny@cyberinfo.se), (c) 2020 Onkobu Tanaake (oss@onkobutanaake.de)" AUTHOR="(c) 2011 Jack-Benny Persson (jack-benny@cyberinfo.se)"
# Sensor program # Sensor program
SENSORPROG=$(whereis -b -B /{bin,sbin,usr} /{bin,sbin,usr}/* -f sensors | awk '{print $2}') SENSORPROG=/usr/bin/sensors
# Ryan's note: utils.sh is installed with nagios-plugins in with the plugins # Exit codes
# Check if utils.sh exists. This lets you use check_domain in a testing environment STATE_OK=0
# or outside of Nagios. STATE_WARNING=1
if [ -e "$PROGPATH/utils.sh" ]; then STATE_CRITICAL=2
. "$PROGPATH/utils.sh" STATE_UNKNOWN=3
else
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# STATE_DEPENDENT=4 (Commented because it's unused.)
fi
shopt -s extglob shopt -s extglob
@ -59,42 +57,32 @@ shopt -s extglob
# Print version information # Print version information
print_version() print_version()
{ {
echo "$0 - $VERSION" printf "\n\n$0 - $VERSION\n"
} }
#Print help information #Print help information
print_help() print_help()
{ {
print_version print_version
echo "$AUTHOR" printf "$AUTHOR\n"
echo "Monitor temperature with the use of sensors" printf "Monitor temperature with the use of sensors\n"
/bin/cat <<EOT /bin/cat <<EOT
Options: Options:
-h, --help -h
Print detailed help screen Print detailed help screen
-V, --version -V
Print version information Print version information
-v, --verbose -v
Verbose output Verbose output
-s, --sensor <WORD[,DISPLAY_NAME]> --sensor WORD
Set what to monitor, for example CPU or MB (or M/B). Check sensors for the Set what to monitor, for example CPU or MB (or M/B). Check sensors for the
correct word. Default is CPU. A different display name can be used in output, correct word. Default is CPU.
by adding it next to sensor with a comma. -w INTEGER
It can be used more than once, with different warning/critical thresholds optionally. Exit with WARNING status if above INTEGER degres
-w, --warning <INTEGER> -c INTEGER
Exit with WARNING status if above INTEGER degrees Exit with CRITICAL status if above INTEGER degres
-c, --critical <INTEGER>
Exit with CRITICAL status if above INTEGER degrees
Warning and critical thresholds must be provided before the corresponding --sensor option.
-n
Use the new sed based filter in case classic filter yields no temperature.
Examples:
./check_temp.sh [-n] -w 65 -c 75 --sensor CPU
./check_temp.sh [-n] -w 65 -c 75 --sensor CPU --sensor temp1
./check_temp.sh [-n] -w 65 -c 75 --sensor CPU -w 75 -c 85 --sensor temp1,GPU
EOT EOT
} }
@ -106,92 +94,14 @@ thresh_warn=
# Critical threshold # Critical threshold
thresh_crit= thresh_crit=
# Hardware to monitor # Hardware to monitor
default_sensor="CPU" sensor=CPU
sensor_declared=false
STATE=$STATE_OK
# See if we have sensors program installed and can execute it # See if we have sensors program installed and can execute it
if [[ ! -x "$SENSORPROG" ]]; then if [[ ! -x "$SENSORPROG" ]]; then
echo "It appears you don't have lm-sensors installed. You may find help in the readme for this script." printf "\nIt appears you don't have sensors installed in $SENSORPROG\n"
exit $STATE_UNKNOWN exit $STATE_UNKOWN
fi fi
function set_state {
[[ "$STATE" -lt "$1" ]] && STATE=$1
}
function process_sensor {
sensor=$(echo $1 | cut -d, -f1)
sensor_display=$(echo $1 | cut -d, -f2)
# Check if a sensor were specified
if [[ -z "$sensor" ]]; then
# No sensor to monitor were specified
echo "No sensor specified"
print_help
exit $STATE_UNKNOWN
fi
# Check if the thresholds have been set correctly
if [[ -z "$thresh_warn" || -z "$thresh_crit" ]]; then
# One or both thresholds were not specified
echo "Threshold not set"
print_help
exit $STATE_UNKNOWN
elif [[ "$thresh_crit" -lt "$thresh_warn" ]]; then
# The warning threshold must be lower than the critical threshold
echo "Warning temperature should be lower than critical"
print_help
exit $STATE_UNKNOWN
fi
# Get the temperature
# Grep the first float with a plus sign and keep only the integer
if [ $CLASSIC_FILTER -eq 1 ]; then
WHOLE_TEMP=$(${SENSORPROG} | grep "$sensor" | head -n1 | grep -o "+[0-9]\+\(\.[0-9]\+\)\?[^ \t,()]*" | head -n1)
else
WHOLE_TEMP=$(${SENSORPROG} -A "$sensor" | sed -n '2 p' | grep -o "+[0-9]\+\(\.[0-9]\+\)\?[^ \t,()]*" | head -n1)
fi
TEMPF=$(echo "$WHOLE_TEMP" | grep -o "[0-9]\+\(\.[0-9]\+\)\?")
TEMP=$(echo "$TEMPF" | cut -d. -f1)
# Verbose output
if [[ "$verbosity" -ge 1 ]]; then
/bin/cat <<__EOT
Debugging information:
Warning threshold: $thresh_warn
Critical threshold: $thresh_crit
Verbosity level: $verbosity
Current $sensor temperature: $TEMP
__EOT
echo "Temperature lines directly from sensors:"
${SENSORPROG}
fi
# Get performance data for Nagios "Performance Data" field
PERFDATA="$PERFDATA $sensor_display=$TEMP;$thresh_warn;$thresh_crit"
# And finally check the temperature against our thresholds
if [[ "$TEMP" != +([0-9]) ]]; then
# Temperature not found for that sensor
OUTPUT_TEXT="$OUTPUT_TEXT, No data found for sensor ($sensor)"
set_state $STATE_UNKNOWN
elif [[ "$TEMP" -gt "$thresh_crit" ]]; then
# Temperature is above critical threshold
OUTPUT_TEXT="$OUTPUT_TEXT, $sensor_display has temperature: $WHOLE_TEMP"
set_state $STATE_CRITICAL
elif [[ "$TEMP" -gt "$thresh_warn" ]]; then
# Temperature is above warning threshold
OUTPUT_TEXT="$OUTPUT_TEXT, $sensor_display has temperature: $WHOLE_TEMP"
set_state $STATE_WARNING
else
# Temperature is ok
OUTPUT_TEXT="$OUTPUT_TEXT, $sensor_display has temperature: $WHOLE_TEMP"
set_state $STATE_OK
fi
}
CLASSIC_FILTER=1
# Parse command line options # Parse command line options
while [[ -n "$1" ]]; do while [[ -n "$1" ]]; do
case "$1" in case "$1" in
@ -214,7 +124,7 @@ while [[ -n "$1" ]]; do
-w | --warning) -w | --warning)
if [[ -z "$2" ]]; then if [[ -z "$2" ]]; then
# Threshold not provided # Threshold not provided
echo "Option $1 requires an argument" printf "\nOption $1 requires an argument"
print_help print_help
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
elif [[ "$2" = +([0-9]) ]]; then elif [[ "$2" = +([0-9]) ]]; then
@ -222,7 +132,7 @@ while [[ -n "$1" ]]; do
thresh=$2 thresh=$2
else else
# Threshold is not an integer # Threshold is not an integer
echo "Threshold must be an integer" printf "\nThreshold must be an integer"
print_help print_help
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
fi fi
@ -233,7 +143,7 @@ while [[ -n "$1" ]]; do
-c | --critical) -c | --critical)
if [[ -z "$2" ]]; then if [[ -z "$2" ]]; then
# Threshold not provided # Threshold not provided
echo "Option '$1' requires an argument" printf "\nOption '$1' requires an argument"
print_help print_help
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
elif [[ "$2" = +([0-9]) ]]; then elif [[ "$2" = +([0-9]) ]]; then
@ -241,7 +151,7 @@ while [[ -n "$1" ]]; do
thresh=$2 thresh=$2
else else
# Threshold is not an integer # Threshold is not an integer
echo "Threshold must be an integer" printf "\nThreshold must be an integer"
print_help print_help
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
fi fi
@ -249,47 +159,94 @@ while [[ -n "$1" ]]; do
shift 2 shift 2
;; ;;
-s | --sensor) -\?)
print_help
exit $STATE_OK
;;
--sensor)
if [[ -z "$2" ]]; then if [[ -z "$2" ]]; then
echo "Option $1 requires an argument" printf "\nOption $1 requires an argument"
print_help print_help
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
fi fi
sensor_declared=true sensor=$2
sensors_to_check="$2"
shift 2 shift 2
;; ;;
-n | --new-filter)
CLASSIC_FILTER=0
shift 1
;;
*) *)
echo "Invalid option '$1'" printf "\nInvalid option '$1'"
print_help print_help
exit $STATE_UNKNOWN exit $STATE_UNKNOWN
;; ;;
esac esac
# argument order is irrelevant, Icinga2 gives no guarantees
# as soon as there are enough output is generated
if [ ! -z "$thresh_warn" ] && [ ! -z "$thresh_crit" ] && [ ! -z "$sensors_to_check" -o $# -eq 0 ]; then
if [ "$sensor_declared" = false ]; then
process_sensor "$default_sensor"
else
process_sensor "$sensors_to_check"
fi
fi
done done
case "$STATE" in # Check if a sensor were specified
"$STATE_OK") STATE_TEXT="OK" ;; if [[ -z "$sensor" ]]; then
"$STATE_WARNING") STATE_TEXT="WARNING" ;; # No sensor to monitor were specified
"$STATE_CRITICAL") STATE_TEXT="CRITICAL" ;; printf "\nNo sensor specified"
"$STATE_UNKNOWN") STATE_TEXT="UNKNOWN" ;; print_help
esac exit $STATE_UNKNOWN
fi
OUTPUT_TEXT=$(echo $OUTPUT_TEXT | sed -e 's/, //')
echo "TEMPERATURE $STATE_TEXT - $OUTPUT_TEXT |$PERFDATA" #Get the temperature
exit $STATE TEMP=`${SENSORPROG} | grep "$sensor" | cut -d+ -f2 | cut -c1-2 `
# Check if the thresholds have been set correctly
if [[ -z "$thresh_warn" || -z "$thresh_crit" ]]; then
# One or both thresholds were not specified
printf "\nThreshold not set"
print_help
exit $STATE_UNKNOWN
elif [[ "$thresh_crit" -lt "$thresh_warn" ]]; then
# The warning threshold must be lower than the critical threshold
printf "\nWarning temperature should be lower than critical"
print_help
exit $STATE_UNKNOWN
fi
# Verbose output
if [[ "$verbosity" -ge 1 ]]; then
/bin/cat <<__EOT
Debugging information:
Warning threshold: $thresh_warn
Critical threshold: $thresh_crit
Verbosity level: $verbosity
Current $sensor temperature: $TEMP
__EOT
printf "\n Temperature lines directly from sensors:\n"
${SENSORPROG}
printf "\n\n"
fi
# Get performance data for Nagios "Performance Data" field
PERFDATA=`${SENSORPROG} | grep "$sensor"`
# And finally check the temperature against our thresholds
if [[ "$TEMP" != +([0-9]) ]]; then
# Temperature not found for that sensor
printf "No data found for that sensor ($sensor)\n"
exit $STATE_UNKNOWN
elif [[ "$TEMP" -gt "$thresh_crit" ]]; then
# Temperature is above critical threshold
echo "$sensor CRITICAL - Temperature is $TEMP | $PERFDATA"
exit $STATE_CRITICAL
elif [[ "$TEMP" -gt "$thresh_warn" ]]; then
# Temperature is above warning threshold
echo "$sensor WARNING - Temperature is $TEMP | $PERFDATA"
exit $STATE_WARNING
else
# Temperature is ok
echo "$sensor OK - Temperature is $TEMP | $PERFDATA"
exit $STATE_OK
fi
exit 3