#!/bin/bash
#
# mailscanner   This shell script takes care of starting and stopping
#               MailScanner only.
#
# chkconfig: 2345 80 30
# description: MailScanner is an open-source E-Mail Gateway Virus Scanner.

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

# Source networking configuration.
. /etc/sysconfig/network

SHOWNAME="MailScanner"
INSTANCENAME="MailScanner"
PROGNAME=/opt/MailScanner/bin/MailScanner
CONFIG=/opt/MailScanner/etc/${INSTANCENAME}.conf
#PIDFILE=/opt/MailScanner/var/${INSTANCENAME}.pid
# get PID file name from configuration
PIDFILE=`/bin/grep -i '^ *PID *File *=' $CONFIG 2>/dev/null | cut -d '=' -f 2`
#WORKDIR=/var/spool/MailScanner/incoming/${INSTANCENAME}
# get working directory name from configuration
WORKDIR=`/bin/grep -i '^ *Incoming *Work *Dir *=' $CONFIG 2>/dev/null | cut -d '=' -f 2`
LOCKFILE=/var/lock/subsys/${INSTANCENAME}.lock

export SHOWNAME
export INSTANCENAME
export PROGNAME
export CONFIG
export PIDFILE
export WORKDIR

# debug variables
#echo SHOWNAME $SHOWNAME
#echo INSTANCENAME $INSTANCENAME
#echo PROGNAME $PROGNAME
#echo CONFIG $CONFIG
#echo PIDFILE $PIDFILE
#echo WORKDIR $WORKDIR

#echo PID: $PIDFILE

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

if [ -f $PROGNAME ] 
then
	echo -n
else
	echo Program $PROGNAME: No such file
	exit 100
fi
if [ -f $CONFIG ] 
then
	echo -n
else
	echo Configuration $CONFIG: No such file
	exit 101
fi

checkpidisours() {
	if [ "$#" -ne 1 ]; then
		echo $"Usage: checkpidisours {pid}"
		return 1
	fi
	pid=$1
        [ -d "/proc/$pid" ] || return 1
	/bin/grep -q -s $PROGNAME /proc/$pid/cmdline 
	return $?

}

RETVAL=0

# See how we were called.
case "$1" in
  start)
	# Start daemons.
	echo -n "Starting $SHOWNAME daemon: "
	touch $PIDFILE
	if [ -d $WORKDIR ]
	then
		echo -n ""
	else
		/bin/mkdir -p $WORKDIR
	fi
        pid=`cat $PIDFILE 2>/dev/null`
	if [ -n $pid ] && checkpidisours $pid >/dev/null ; then
		echo -n "already running - PID "
		$SETCOLOR_WARNING
		echo -n $pid
		$SETCOLOR_NORMAL
		failure
	else
		$PROGNAME $CONFIG 2>/dev/null
		RETVAL=$?
		[ $RETVAL -eq 0 ] && touch $LOCKFILE
        	if [ $RETVAL -eq 0 ] ; then success; else failure; fi
	fi
	echo
	;;
  stop)
	# Stop daemons.
	echo -n "Shutting down $SHOWNAME daemon: "
        pid=`cat $PIDFILE 2>/dev/null`
	if [ -z $pid ] ; then 
		echo -n "PID file missing or empty"
		failure
		echo
	else
		if checkpidisours $pid ; then 
			/bin/kill -TERM -- $pid 2>/dev/null
			RETVAL=$?
        		if [ $RETVAL -eq 0 ] ; then success; else failure; fi
			echo
			[ $RETVAL -eq 0 ] && rm -f  $LOCKFILE
			# Clear out all the old pid files
			# Clear out the old incoming dirs
			cd $WORKDIR && ls | xargs /bin/rm -rf
		else 
			# this pid is no longer valid
			echo -n "PID "
			$SETCOLOR_WARNING
			echo -n $pid
			$SETCOLOR_NORMAL
			echo -n " is not $SHOWNAME"
			failure
			echo
		fi
	fi
	/bin/rm -f $PIDFILE
	;;
  status)
        # Work out if all of MailScanner is running
	echo -n "Checking $SHOWNAME daemon: "
        pid=`cat $PIDFILE 2>/dev/null`
	if [ -z $pid ] ; 
	then 
		echo -n "PID file missing or empty"
		failure
	else
		if checkpidisours $pid ; 
		then 
		echo -n "running - PID "
			$SETCOLOR_WARNING
			echo -n $pid
			$SETCOLOR_NORMAL
			success
		else 
			# this pid is no longer valid
			echo -n "PID "
			$SETCOLOR_WARNING
			echo -n $pid
			$SETCOLOR_NORMAL
			echo -n " is not $SHOWNAME"
			failure
			/bin/rm -f $PIDFILE
		fi
	fi
        echo
        ;;
  reload)
	echo -n "Reloading $SHOWNAME workers: "
        pid=`cat $PIDFILE 2>/dev/null`
	if [ -n $pid ] && checkpidisours $pid >/dev/null ; then 
		childrenpid=`pgrep -d " "  -P $pid`
		if [ -z "$childrenpid" ] ; then
			echo -n "No $SHOWNAME children PID(s)"
	  		failure
		else
	  		/bin/kill -HUP -- $childrenpid
	  		success
		fi
	else 
		# this pid is no longer valid
		/bin/rm -f $PIDFILE
		echo -n "PID "
		$SETCOLOR_WARNING
		echo -n $pid
		$SETCOLOR_NORMAL
		echo -n " is not $SHOWNAME"
		failure
	fi
	echo
	;;
  restart)
	$0 stop
	echo -n "Waiting for $SHOWNAME to stop..."
	sleep 5
	echo
	$0 start
	RETVAL=$?
	;;
  *)
	 echo "Usage: $0 {start|stop|status|restart|reload}"
	exit 1
esac

exit $RETVAL


