#!/bin/sh


#
# Script to get system temperatures
#


#VERSION="0.0.11a, SPDsoft.  Aug 11, 2009"
#VERSION="0.0.11d, SPDsoft.  Mar 29, 2010"
#VERSION="0.0.11e, SPDsoft. Jul  8, 2011"
#VERSION="0.0.11f, SPDsoft. Oct 26, 2011"
#VERSION="0.0.11g, SPDsoft.  Feb  3 2012"
#VERSION="0.0.11h, SPDsoft.  Sep 19 2012"
#VERSION="0.0.11i, SPDsoft.  Oct 2 2012"
#VERSION="0.0.11j, SPDsoft.  Jan 25 2013"
VERSION="0.0.11k, SPDsoft.  Jul 10 2015"
# 11c -> XEON 1.8 , P4 2.8
# 11d -> XEON 3.0
# 11e -> XEON 3.0 fixed for CentOS 5.6
# 11f -> PIV 3.60
# 11g -> PIV 2.80
# 11h -> XEON E5606
# 11i -> XEON E5620
# 11j -> Xeon(TM) CPU 2.40GHz, Pentium(R) 4 CPU 2.80GHz
# 11k -> Xeon(R) CPU E5-2450 v2 @ 2.50GHz
DIST=http://webdiis.unizar.es/pub/unix/util/ghot
BIN=/usr/local/etc
PATH=$PATH:/usr/local/bin; export PATH

#

set -- `getopt VIDh $*`
for i in $*
do
	case $i in
	-V) echo "$VERSION"; exit 0;;
	-I)
		LD_LIBRARY_PATH=/usr/lib:/usr/local/lib
		export LD_LIBRARY_PATH
		DV=`lynx -source $DIST | awk -F'"' '/^VERSION/{print $2; exit;}'`
		if [ "_$DV" != "_$VERSION" ]
		then
			echo "#### Warning: Server version is  \"$DV\""
			echo "####          program version is \"$VERSION\""
			exit 1
		fi
		exit 0
		;;
	-D)
		LD_LIBRARY_PATH=/usr/lib:/usr/local/lib
		export LD_LIBRARY_PATH
		lynx -source $DIST > /tmp/ghot.$$ ||\
		exit 1 && \
		mv /tmp/ghot.$$ $BIN/ghot
		chmod 755 $BIN/ghot
		chown root $BIN/ghot
		chgrp 0 $BIN/ghot
		exit 0
		;;

	-h)
		echo "Use: $0 -VIDhng"
		echo "         -V: version"
		echo "         -I: internet version"
		echo "         -D: download and install update"
		echo "         -h: help"
		exit 0
		;;
	esac
done


case `uname` in
	OSF1)
		ARCH=osf-alpha
		;;

	SunOS)
		ARCH=sunos-`arch`
		LC_CTYPE=iso_8859_1; export LC_CTYPE
		;;

	Linux)
		ARCH=linux-`arch`
		;;

	IRIX*)
		ARCH=irix-mips
		;;

	Darwin*)
		ARCH=darwin-`arch`
		;;

	HP-UX)
		if /bin/hp-mc680x0
		then
			ARCH=hpux-68k
		else
			ARCH=hpux-hppa
		fi
		;;

	CYGWIN_NT*)
		ARCH=cygwin-i386
		;;

	FreeBSD)
		ARCH=FreeBSD-i386
		;;

	*)
		echo Warning: unsupported system
		;;
esac

case $ARCH in

	sunos-sun4)

		# E-450, Fire 280R
		WARN=29
		ALERT=32
		HW=`env PATH=$PATH:/usr/platform/sun4u/sbin:/usr/sbin prtdiag | head -1`
		case "$HW" in
			*"Enterprise 450"*)

			#
			# This kind of host can raise it's temperature about 7 C
			# when CPU's start working at 100% load
			# Default sleep temperature: about 22 C
			#
			WHAT=ambt
			WARN=30
			ALERT=34
			TEMP=`/usr/platform/sun4u/sbin/prtdiag -v |\
				awk  '/^AMBIENT/ {print $2}'`
			;;

			*"Fire 280R"*)

			# Two CPU's, Core

			WHAT=core
			WARN=55
			ALERT=70
			TEMP=`/usr/platform/sun4u/sbin/prtdiag -v |\
			awk '/Temperatures/ { getline; getline; getline ; getline; if ( $1 > $2 ) print $1; else print $2;}'`
			;;

			*"Fire V440"*)

			# Four CPU's, Ambient

			WHAT=ambt
			WARN=32
			ALERT=37
			TEMP=`/usr/platform/sun4u/sbin/prtdiag -v |\
			/usr/xpg4/bin/awk -F"[ ]*|C" \
			'/^C.*T_AMB/ { t+=$4; n+=1.0; }
			END {print t/n;}'`
			;;

			*"Sun Fire V240"*)

			# Two UltraSPARC IIIi 1503 MHz

			WHAT=ambt
			WARN=27
			ALERT=32
			TEMP=`/usr/sbin/prtpicl -v -c temperature-sensor |\
			awk '/T_ENC/ { enc=1;}
			/:Temperature/ {if (enc==1) print $2; }'`
			;;

			*"SPARC Enterprise T5120"*)

			WHAT=ambt
			WARN=59
			ALERT=64
			TEMP=`/usr/sbin/prtpicl -v -c temperature-sensor |\
			awk ' BEGIN { temp=0;}
			/^[ ]*T_AMB/ { enc=1;}
			/:Temperature/ {if (enc==1) { enc=0; if  ($2 > temp)
						{ temp=$2;}}}
			END { print temp;}'`
			;;



		esac

	;;

	sunos-i86pc)
		HW=`/usr/sbin/prtdiag | head -1`
		case "$HW" in
			*"Fire X2200 M2"*)
			WHAT=core
			WARN=55
			ALERT=65
			TEMP=`/usr/sfw/bin/ipmitool sdr | awk '/CPU 0 Temp/{print $5}'`
			;;

			*"FIRE X4150"*)
			WHAT=Motherboard
			WARN=50
			ALERT=55
			TEMP=`/usr/sfw/bin/ipmitool sdr | awk '/MB\/T_AMB0/{print $3}'`
			;;
		esac
	;;

	osf-alpha)

		WHAT=ambt #(?)
		WARN=44
		ALERT=50
		TEMP=`/sbin/sysconfig -q envmon env_current_temp |\
			awk  '/env_current_temp/{print $3}'`

	;;

	irix-mips)

		# IP19
		WHAT=ambt
		WARN=32
		ALERT=35
		TEMP=`/usr/etc/sysctlrd -p | awk  '/System air temp/{print $5}'`

	;;

	linux-*86)

		CPU=`awk -F: '/model name/ {print $2; exit}' < /proc/cpuinfo`

		case "_$CPU" in

			_*Pentium\ III*)
				WARN=40
				ALERT=45
		TEMP=`sensors | sed -n 's/^CPU Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;

			_*Pentium\(R\)\ 4\ CPU\ 2.60*)
				WARN=28
				ALERT=32
		TEMP=`sensors | sed -n 's/^Temp3:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;

			_*Pentium\(R\)\ 4\ CPU\ 2.80*)
				WARN=45
				ALERT=50
		TEMP=`sensors | sed -n 's/^M.B Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
		if [ "_$TEMP" = "_" ]
		then
			WARN=55
			ALERT=60
			TEMP=`sensors | sed -n 's/^temp2:[ ]*[-+]\([0-9\.]*\)[^0-9].*/\1/p'`
		fi
		if [ "_$TEMP" = "_" ]
		then
			WARN=40
			ALERT=45
			TEMP=`sensors | sed -n 's/^temp1:[ ]*[-+]\([0-9\.]*\)[^0-9].*/\1/p' | tail -1`
		fi


			;;


			_*XEON\(TM\)*1.80*)
				WARN=45
				ALERT=50
		TEMP=`sensors | sed -n 's/^M.B Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'|tail -1`
				;;

			_*Xeon\(TM\)*2.40*)
				WARN=55
				ALERT=60
		TEMP=`sensors | sed -n 's/^temp1:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'|tail -1`
				;;

			_*Pentium\(R\)\ 4*)
				WARN=70
				ALERT=75
		TEMP=`sensors | sed -n 's/^CPU Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;

			*)
				echo "Warning: unknown x86 ($CPU)" >&2
				WARN=55
				ALERT=60
		TEMP=`sensors | sed -n 's/^CPU Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;
		esac


	;;
	linux-*64)
		CPU=`awk -F: '/model name/ {print $2; exit}' < /proc/cpuinfo`
		case "_$CPU" in
			_*Xeon\(R\)*E5620*)
				WARN=35
				ALERT=55
		TEMP=`sensors | sed -n 's/^temp1:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'|tail -1`
				;;

			_*Xeon\(R\)*2450*2.50*)
				WARN=45
				ALERT=60
		TEMP=` sensors |\
			awk '/Core/ {print $3}' |\
			tr -d -c '[0-9\n.]' |\
			awk '{ if ( $0 > m ) {m =$0;}} END {print m}' `
				;;

			_*Xeon\(R\)*2.*)
				WARN=45
				ALERT=60
		TEMP=`sensors | sed -n 's/^temp3:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'|tail -1`
				;;

			*X5365*3.00GHz)
				WARN=75
				ALERT=85
#	TEMP=`sensors | sed -n 's/^temp1:[ ]*[-+]\([0-9\.]*\)[^0-9].*/\1/p'`
				TEMP=`sensors | awk '/^Core .:/{t+=$3; n++;} END {print t/n;}'`
				;;
			_*AMD\ Athlon*64*3200*)
				WARN=42
				ALERT=47
		TEMP=`sensors | sed -n 's/^CPU Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;
			_*Pentium\(R\)\ 4\ CPU\ 3.60*)
				WARN=60
				ALERT=65
		TEMP=`sensors | sed -n 's/^M.B Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;
			*)
				echo "Warning: unknown x86_64 ($CPU)" >&2
				WARN=45
				ALERT=50
		TEMP=`sensors | sed -n 's/^CPU Temp:[ ]*[+]\([0-9\.]*\)[^0-9].*/\1/p'`
				;;
		esac

	;;
	darwin-ppc)
	;; 

	hpux-*)
	;;

	cygwin-*)
	
	;;

	FreeBSD-i386)
	;;

	*)

	;;
esac


ITEMP=`echo $TEMP | sed -e 's/\..*//'`

W=0
A=0

HOSTNAME=`hostname | sed -e 's/\..*//'`

if [ $ITEMP -gt $WARN ]
then
	echo "#### WARNING: " $HOSTNAME $TEMP "is over" $WARN >&2
	W=1
	if [ $ITEMP -gt $ALERT ]
	then
		echo "#### ALERT: " $HOSTNAME $TEMP "is over" $ALERT >&2
		A=1
	fi
fi

echo "$HOSTNAME|`date +'%m/%d/%y %H:%M:%S'`|$TEMP|$WARN|$ALERT|$W|$A"

