#!/bin/bash -e
#
# spampd	SpamPD is a spamdetection proxy daemon for SMTP and LMTP
#
#		This script was written for debian
#		by Sven Mueller <debian@incase.de>
#
# Version:	2.0  22-Aug-2005  debian@incase.de
#
### BEGIN INIT INFO
# Provides:		spampd
# Required-Start: 	$remote_fs $syslog $network $named $time
# Required-Stop:  	$remote_fs $syslog $network $named $time
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	spam detection proxy for SMTP and LMTP
# Description: 		SpamAssassin based perl proxy for SMTP and LMTP
#			which marks mails as spam/nonspam based on SpamAssassin
#			results
### END INIT INFO

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
DESC='spam checking proxy daemon'
NAME='spampd'
PROGRAM=/usr/sbin/spampd
EXECUTABLE=/usr/bin/perl
PIDFILE=/var/run/spampd.pid

. /lib/lsb/init-functions

# set some important defaults (overridable via /etc/default/spampd)
USERID=spampd
GRPID=spampd

if [ "`id -u`" !=  "0" ]; then
	log_failure_msg "ERROR: Insufficient privileges. Retry as root"
	# LSB 3.0 says that return value of 4 indicates insufficient privileges
	exit 4
fi

#
# Check whether the program is actually there
#
# return 5 as demanded by LSB 2.1 when program isn't installed.
[  -x $PROGRAM ] || exit 5

function check_pid () {
	# $1 : process name
	# $2 : pid file
	# $3 : (optional) verbosity
	VERBOSE=""
	[ "$3" = "verbose" ] && VERBOSE=1
	if [ -f $2 ]; then
		kill -0 `cat $2` > /dev/null 2>&1
		RETVAL=$?
		if [ "$RETVAL" = "0" ]; then
			[ "$VERBOSE" ] && log_success_msg "$1 is running as `cat $2`"
			return 0
		else
			[ "$VERBOSE" ] && log_failure_msg "PIDFILE $2 for $1 exists, but $1 is not running."
			rm $2
			return 1
		fi
	else
		[ "$VERBOSE" ] && log_failure_msg "PIDFILE $2 for $1 doesn't exist."
		return 4
	fi
	return 3
}

case "$1" in
	start)
		log_daemon_msg "Starting $DESC" "$NAME"
		# if spampd is already running, exit 0 as demanded by LSB 2.1
		# this also removes the PIDFILE if it exists but has no matching
		# process
		if check_pid $PROGRAM $PIDFILE ; then
			log_end_msg 0
			exit 0
		fi
		# if spampd is not installed, return 5 as demanded by LSB 2.1
		if [ ! -x $EXECUTABLE ]; then
			log_error_msg "failed! - executable not found"
			exit 5
		fi
		# start daemon
		start-stop-daemon --start --exec $EXECUTABLE \
			--startas $PROGRAM --pidfile $PIDFILE \
			--user $USERID --group $GRPID -- --setsid  --config /etc/spampd.cfg
		if [ "$?" = '0' ]; then
			log_end_msg 0
			exit 0
		else
			log_end_msg 7
			# LSB 2.1 says 7 should be returned when program
			# isn't running.
			exit 7
		fi
		;;
	stop)
		echo -n "Stopping $DESC: $NAME "
		set +e
		# if $PROGRAM is not running under PID given in
		# $PIDFILE, exit with 0 to be LSB compliant
		check_pid $PROGRAM $PIDFILE || exit 0
		start-stop-daemon --stop --exec $EXECUTABLE \
			--pidfile $PIDFILE
		if [ "$?" = "0" ]; then
			log_end_msg 0
			rm $PIDFILE
			exit 0
		else
			if ! check_pid $PROGRAM $PIDFILE ; then
				log_end_msg 0
				exit 0
			else
				# if we had not successfully stopped the
				# program, we can assume the user didn't
				# have sufficient privileges.
				log_end_msg 1
				exit 4
			fi
		fi
		;;
	status)
		check_pid $PROGRAM $PIDFILE verbose
		exit $?
		;;
	reload)
		log_warning_msg "reload not implemented, try force-reload/restart instead"
		exit 3
		;;
	force-reload|try-restart)
		if check_pid $PROGRAM $PIDFILE ; then
			exec $0 restart
		else
			log_warning_msg "$DESC is not running. Try '$0 start' to start it."
			# LSB 2.1 says that this should return success, anyhow.
			exit 0
		fi
		;;
	restart)
		if check_pid $PROGRAM $PIDFILE ; then
			$0 stop
		fi
		exec $0 start
		;;
	help)
		echo "Usage: $0 (start|stop|restart|try-restart|force-reload|status)"
		exit 0
		;;
	*)	echo "Usage: $0 (start|stop|restart|try-restart|force-reload|status|help)"
		exit 2
		;;

esac

log_error_msg "This point shouldn't be reached. Some weird thing happened"
exit 1
