#!/bin/sh
#  
# Startup script for mcemonitor
# 
# This should be customized for distribution standards
# (using rc_status etc.)
# The paths are hardcoded and are not automatically adjusted
# for different prefix
#
### BEGIN INIT INFO
# Provides:		mcemonitor 
# chkconfig: - 42 60
# Default-Start:	3 5
# Default-Stop:		0 1 2 6
# Short-Description:	mcemonitor hardware error logging
# Description:          Start the mcemonitor hardware error logging. 
#                       This logs and handles CPU hardware errors on x86 systems.
### END INIT INFO
# pull in settings
[ -f /etc/sysconfig/mcemonitord ] && . /etc/sysconfig/mcemonitord
MCEMONITOR_MODE=daemon

# Source function library.
. /etc/init.d/functions

# private settings
MCELOG=${MCELOG:-/usr/sbin/mcelog}
MCEMONITOR=${MCEMONITOR:-/opt/nec/mcemonitor/mcemonitor}
LOCKFILE="/var/lock/subsys/mcemonitord"
MONITORLOCKFILE="/var/opt/nec/mcemonitor_lock"
MCELOGLOCKFILE="/var/lock/subsys/mcelogd"
DEVMCELOG="/dev/mcelog"
NECLOGDIR="/var/opt/nec"
MCELOGCRONFILE="/etc/cron.hourly/mcelog.cron"
SELINUX=`getenforce`
MCEMONITORPID="/var/run/mcemonitor.pid"
MCELOGPID="/var/run/mcelog.pid"


check_mcemonitor() {
	if [ ! -e $DEVMCELOG ] ; then
		echo -n $DEVMCELOG " was not found." 
		echo_failure
		echo
		flock -u 9
		rm -f $MONITORLOCKFILE
		exit 1
	fi
	if [ ! -e $MCEMONITOR ] ; then
		echo -n $MCEMONITOR " was not found." 
		echo_failure
		echo
		flock -u 9
		rm -f $MONITORLOCKFILE
		exit 1
	fi
	if [ ! -d $NECLOGDIR ] ; then
		echo -n $NECLOGDIR " was not found." 
		echo_failure
		echo
		flock -u 9
		rm -f $MONITORLOCKFILE
		exit 1
	fi
}

delete_mcelogcron() {
	if [ -e $MCELOGCRONFILE ] ; then
		rm -f $MCELOGCRONFILE
	fi
}

local_killproc() {
	pid=`cat $1`
	if checkpid $pid ; then
		kill -TERM $pid
		usleep 100000
		try=0
		while [ $try -lt 30 ] ; do
			checkpid $pid || break
			sleep 1
			let try+=1
		done
		if checkpid $pid ; then
			kill -KILL $pid >/dev/null 2>&1
			usleep 100000
		fi
	fi
	checkpid $pid
	RC=$?
	if [ "$RC" -eq 0 ]; then
		echo_failure
	else
		echo_success
	fi
}

case "$MCEMONITOR_MODE" in
daemon)
	;;
*)
	echo "Unknown mcemonitor mode $MCEMONITOR_MODE. Valid daemon"
	exit 1
esac

case "$1" in
start)
	if [ -e $LOCKFILE ]; then
		if ps aux | awk '{print $2,$11}' | grep mcemonitor
		then
			echo "mcemonitor already running."
			exit 0
		fi
	fi

	exec 9>>$MONITORLOCKFILE
	flock -n 9
	if [ $? -ne 0 ] ; then
		echo "/etc/rc.d/init.d/mcemonitord start already running."
		exit 0
	fi
	
	if [ "$SELINUX" != "Disabled" ]; then
		chcon -t var_log_t $NECLOGDIR -R
		chcon -t var_log_t $MONITORLOCKFILE -R
	fi
	check_mcemonitor
	delete_mcelogcron

	if [ "$MCEMONITOR_MODE" = "daemon" ] ; then
		if [ -e $MCELOGLOCKFILE ] ; then
			echo -n "Stopping mcelog"
			local_killproc $MCELOGPID
			rm -f $MCELOGLOCKFILE
			echo
		fi
		echo -n "Starting mcemonitor daemon"
		cat /dev/mcelog > /dev/null
		daemon $MCEMONITOR
		if [ "$SELINUX" != "Disabled" ]; then
			chcon -t var_log_t /var/opt/nec/mcemonitor -R
		fi
		touch $LOCKFILE
	else
		echo "No machine check decode capability" 
	fi
	echo
	flock -u 9
	;;
stop)
	if ! ps aux | awk '{print $2,$11}' | grep mcemonitor
	then
		echo "mcemonitor already stopped."
		exit 0
	fi
	if [ ! -e $LOCKFILE ]; then
		echo "mcemonitor already stopped."
		exit 0
	fi

	exec 9>>$MONITORLOCKFILE
	flock -n 9
	if [ $? -ne 0 ] ; then
		echo "/etc/rc.d/init.d/mcemonitord stop already running."
		exit 0
	fi
	if [ "$SELINUX" != "Disabled" ]; then
		chcon -t var_log_t $MONITORLOCKFILE -R
	fi

	if [ "$MCEMONITOR_MODE" = "daemon" ] ; then
		echo -n "Stopping mcemonitor"
		local_killproc $MCEMONITORPID
	else
		echo mcemonitor not running
	fi
	flock -u 9
	rm -f $MONITORLOCKFILE
	rm -f $LOCKFILE
	echo
	;;
try-restart)
	$0 status > /dev/null && $0 restart
	;;
restart)
	$0 stop
	$0 start
	;;
reload)
	$0 try-restart
	;;
force-reload)
	$0 try-restart
	;;
status)
	if [ "$MCEMONITOR_MODE" = "daemon" ] ; then
		echo "Checking for mcemonitor"
		status $MCEMONITOR
	fi
	;;
*)
	echo "Usage: $0 {start|stop|try-restart|restart|status|force-reload|reload}"
	exit 1
esac


