#! /bin/sh
#
### BEGIN INIT INFO
# Provides:		opendkim
# Required-Start:	$syslog $time $local_fs $remote_fs $named $network
# Required-Stop:	$syslog $time $local_fs $remote_fs
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Start the OpenDKIM service
# Description:		Enable DKIM signing and verification provided by OpenDKIM
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/opendkim
NAME=opendkim
DESC="OpenDKIM"

# How long to wait for the process to die on stop/restart
stoptimeout=5

test -x $DAEMON || exit 0

# Include LSB provided init functions
. /lib/lsb/init-functions



# Include opendkim defaults if available
if [ -f /etc/default/opendkim ] ; then
	. /etc/default/opendkim
fi

pathfind() {
    OLDIFS="$IFS"
    IFS=:
    for p in $PATH; do
        if [ -x "$p/$*" ]; then
            IFS="$OLDIFS"
            return 0
        fi
    done
    IFS="$OLDIFS"
    return 1
}

USER=$USER
GROUP=$GROUP
PIDFILE=$RUNDIR/$NAME.pid

if [ -f /etc/opendkim.conf ]; then
	CONFIG_SOCKET=`awk '$1 == "Socket" { print $2 }' /etc/opendkim.conf`
fi

# This can be set via Socket option in config file, so it's not required
if [ -n "$SOCKET" -a -z "$CONFIG_SOCKET" ]; then
	DAEMON_OPTS="-p $SOCKET $DAEMON_OPTS"
fi

DAEMON_OPTS="-u $USER -P $PIDFILE $DAEMON_OPTS"

start() {
	# Create the run directory if it doesn't exist
	if [ ! -d "$RUNDIR" ]; then
		install -o "$USER" -g "$GROUP" -m 755 -d "$RUNDIR" || exit 2
		if pathfind restorecon; then restorecon "$RUNDIR"
                fi
	fi
	# Clean up stale sockets
	if [ -f "$PIDFILE" ]; then
		pid=`cat $PIDFILE`
		if ! ps -C "$NAME" -s "$pid" >/dev/null; then
			rm "$PIDFILE"
			TMPSOCKET=""
			if [ -n "$SOCKET" ]; then
				TMPSOCKET="$SOCKET"
			elif [ -n "$CONFIG_SOCKET" ]; then
				TMPSOCKET="$CONFIG_SOCKET"
			fi
			if [ -n "$TMPSOCKET" ]; then
				# UNIX sockets may be specified with or without the
				# local: prefix; handle both
				t=`echo $SOCKET | cut -d: -f1`
				s=`echo $SOCKET | cut -d: -f2`
				if [ -e "$s" -a -S "$s" ]; then
					if [ "$t" = "$s" -o "$t" = "local" ]; then
						rm "$s"
					fi
				fi
			fi
		fi
	fi
	start-stop-daemon --start --quiet --pidfile "$PIDFILE" --exec "$DAEMON" --test -- $DAEMON_OPTS || exit 1
	start-stop-daemon --start --quiet --pidfile "$PIDFILE" --exec "$DAEMON" -- $DAEMON_OPTS || exit 2
	# Detect exit status 78 (configuration error)
	ret=$?
	if [ $ret -eq 78 ]; then
		echo "See /usr/share/doc/opendkim/README.Debian for help"
		echo "Starting for DKIM verification only"
		DAEMON_OPTS="-b v $DAEMON_OPTS"
		start-stop-daemon --start --quiet --pidfile "$PIDFILE" --exec "$DAEMON" -- $DAEMON_OPTS
		exit 0
	elif [ $ret -ne 0 ]; then
		exit $ret
	fi
}

stop() {
	start-stop-daemon --stop --retry "$stoptimeout" --exec "$DAEMON"
	[ "$?" = 2 ] && exit 2
}

reload() {
	start-stop-daemon --stop --signal USR1 --exec "$DAEMON"
}

status() {
    local pidfile daemon name status

    pidfile=
    OPTIND=1
    while getopts p: opt ; do
        case "$opt" in
            p)  pidfile="$OPTARG";;
        esac
    done
    shift $(($OPTIND - 1))

    if [ -n "$pidfile" ]; then
        pidfile="-p $pidfile"
    fi
    daemon="$1"
    name="$2"

    status="0"
    pidofproc $pidfile $daemon >/dev/null || status="$?"
    if [ "$status" = 0 ]; then
        log_success_msg "$name is running"
        return 0
    else
        log_failure_msg "$name is not running"
        exit $status
    fi
}

case "$1" in
  start)
	echo -n "Starting $DESC: "
	start
	echo "$NAME."
	;;
  stop)
	echo -n "Stopping $DESC: "
	stop
	echo "$NAME."
	;;
  restart)
	echo -n "Restarting $DESC: "
	stop
	start
	echo "$NAME."
	;;
  reload|force-reload)
	echo -n "Restarting $DESC: "
	reload
	echo "$NAME."
	;;
  status)
	status $DAEMON $NAME
	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
	exit 1
	;;
esac

exit 0
