#!/bin/bash
#
# check_thermal_zone0 - Nagios plugin to check the SoC/board temperature
# reported via the kernel thermal sysfs interface (thermal_zone0), as found
# on Raspberry Pi and many other ARM boards.

PROGNAME=$(basename "$0")
THERMAL_FILE="/sys/class/thermal/thermal_zone0/temp"

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

WARNING=60
CRITICAL=70

print_usage() {
    echo "Usage: $PROGNAME [-w <warning>] [-c <critical>]"
    echo ""
    echo "  -w <warning>   Warning temperature threshold in Celsius (default: $WARNING)"
    echo "  -c <critical>  Critical temperature threshold in Celsius (default: $CRITICAL)"
    echo "  -h             Show this help message"
}

while getopts "w:c:h" opt; do
    case $opt in
        w) WARNING=$OPTARG ;;
        c) CRITICAL=$OPTARG ;;
        h) print_usage; exit $STATE_OK ;;
        *) print_usage; exit $STATE_UNKNOWN ;;
    esac
done

if ! [[ "$WARNING" =~ ^[0-9]+$ ]] || ! [[ "$CRITICAL" =~ ^[0-9]+$ ]]; then
    echo "UNKNOWN: Warning and critical thresholds must be non-negative integers"
    exit $STATE_UNKNOWN
fi

if [ "$WARNING" -ge "$CRITICAL" ]; then
    echo "UNKNOWN: Warning threshold must be less than critical threshold"
    exit $STATE_UNKNOWN
fi

if [ ! -r "$THERMAL_FILE" ]; then
    echo "UNKNOWN: Cannot read $THERMAL_FILE"
    exit $STATE_UNKNOWN
fi

MILLIDEG=$(cat "$THERMAL_FILE")
if ! [[ "$MILLIDEG" =~ ^-?[0-9]+$ ]]; then
    echo "UNKNOWN: Unexpected content in $THERMAL_FILE: $MILLIDEG"
    exit $STATE_UNKNOWN
fi

TEMP=$((MILLIDEG / 1000))

STATE=$STATE_OK
LABEL="OK"
if [ "$TEMP" -ge "$CRITICAL" ]; then
    STATE=$STATE_CRITICAL
    LABEL="CRITICAL"
elif [ "$TEMP" -ge "$WARNING" ]; then
    STATE=$STATE_WARNING
    LABEL="WARNING"
fi

echo "${LABEL}: Temperature ${TEMP}C | temperature=${TEMP}C;${WARNING};${CRITICAL};;"
exit $STATE
