#! /bin/sh
#
### BEGIN INIT INFO
# Provides: cyrus-common cyrus-imapd
# Required-Start: $syslog $network $remote_fs
# Required-Stop: $syslog $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: common init system for cyrus IMAP/POP3 daemons.
# Description: common init system the for cyrus IMAP/POP3 daemons.
#              starts the central cyrus master process, which can 
#              then start various services depending on configuration.
#              Typically starts IMAP and POP3 daemons, but might also
#              start an NNTP daemon and various helper daemons for
#              distributed mail/news storage systems (high-performance
#              and/or high-reliability setups).
### END INIT INFO
#
#		Copyright 2001-2005 by Henrique de Moraes Holschuh <hmh@debian.org>
#		Various modifications done by Sven Mueller <debian@incase.de>
#               Updated with regards to current /etc/init.d/skeleon by Ondřej Surý <ondrej@sury.org>
#
#		Distributed under the GPL version 2

# Make sure we get sane results on borked locales
LC_ALL=C
export LC_ALL

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=cyrmaster
DAEMON=/usr/sbin/${NAME}
PIDFILE="/run/cyrus-master.pid"
DESC="Cyrus IMAPd"

# Check if Cyrus is installed (vs. removed but not purged)
test -x "$DAEMON" || exit 0

# Overridable defaults
unset CYRUS_VERBOSE
unset LISTENQUEUE
unset CONF
unset MASTERCONF

# Read configuration variable file if it is present
[ -r /etc/default/cyrus-imapd ] && . /etc/default/cyrus-imapd

[ "x${CYRUS_VERBOSE}" != "x" ] && export CYRUS_VERBOSE
# Make sure the master process is daemonized
OPTIONS="${OPTIONS} -d"
[ "x${CONF}" != "x" ] && OPTIONS="-C ${CONF} ${OPTIONS}"
[ "x${MASTERCONF}" != "x" ] && OPTIONS="-M ${MASTERCONF} ${OPTIONS}"
[ "x${LISTENQUEUE}" != "x" ] && OPTIONS="-l ${LISTENQUEUE} ${OPTIONS}"

if [ -n "$CONF" ]; then
       	[ -r "$CONF" ] || ( echo Could not read config file $CONF; exit 1)
else
       	CONF=/etc/imapd.conf
fi

SYNC_CLIENT=/usr/lib/cyrus/bin/sync_client
SYNCSHUTDOWN="$(gawk '/^sync_shutdown_file:[[:blank:]]/ { print $2 }' $CONF)"

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
	|| return 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
	$OPTIONS \
	|| return 2

    # cyrmaster is not running
    pidofproc $DAEMON >/dev/null || return 2
}

sync_stop () {
    if [ -e $SYNC_CLIENT ]; then
	# is sync_client running?
	pidofproc $SYNC_CLIENT >/dev/null || return 1

        # Check if the sync file is set and use it is defined
	if [ -n "$SYNCSHUTDOWN" ]; then
	    touch "$SYNCSHUTDOWN" || return 2
	    start-stop-daemon --stop --quiet --retry 0/10 --exec $SYNC_CLIENT
	    rm -f $SYNCSHUTDOWN
	fi
    fi
    return 0
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred

    sync_stop
    [ "$?" = 2 ] && return 2
    
    start-stop-daemon --stop --quiet --retry=QUIT/30/TERM/10/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2

    # cyrmaster is still running
    pidofproc $DAEMON >/dev/null && return 2

    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
    return 0
}

do_tmpfiles() {
    local tmpfile type path mode user group age argument
    tmpfile=/usr/lib/tmpfiles.d/$1.conf
    if [ -r "$tmpfile" ]; then
	if [ -x /bin/systemd-tmpfiles ]; then
	    /bin/systemd-tmpfiles --create "$tmpfile"
	else
	    while read type path mode user group age argument; do
		case "$type" in
		    d)
			mkdir -p "$path";
			chmod "$mode" "$path";
			chown "$user:$group" "$path";
			;;
		    L)
			if [ ! -e "$path" ]; then ln -s "$argument" "$path"; fi
			;;
		    \#*)
			;;
		    *)
			log_warning_msg "tmpfile.d type '$type' is not supported yet"
			;;
		esac
	    done < "$tmpfile"
	fi
    else
	log_warning_msg "tmpfiles.d file '$1' doesn't exist or is not readable"
    fi
}

do_tmpfiles cyrus-imapd

case "$1" in
    start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
	    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
	    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
    stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
	    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
	    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  reload|force-reload)
	log_daemon_msg "Reloading $DESC" "$NAME"
	do_reload
	log_end_msg $?
  	;;
  restart)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	    0|1)
		do_start
		case "$?" in
		    0) log_end_msg 0 ;;
		    1) log_end_msg 1 ;; # Old process is still running
		    *) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  try-restart)
  	pidofproc "$DAEMON" >/dev/null && exec $0 restart
	;;
  *)
	echo "Usage: $0 {start|stop|status|restart|reload|force-reload|try-restart}" 1>&2
	exit 3
	;;
esac

:
