#!/bin/sh

### BEGIN INIT INFO
# Provides:          proftpd
# Required-Start:    $remote_fs $syslog $local_fs $network
# Required-Stop:     $remote_fs $syslog $local_fs $network
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts ProFTPD daemon
# Description:       This script runs the FTP service offered
#                    by the ProFTPD daemon
### END INIT INFO

# Start the proftpd FTP daemon.

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/proftpd
NAME=proftpd

# Defaults
RUN="no"
OPTIONS=""
CONFIG_FILE=/etc/proftpd.conf

PIDFILE=`grep -i '^pidfile' $CONFIG_FILE|awk '{ print $2 }'`
if [ "x$PIDFILE" = "x" ];
then
    PIDFILE=/var/run/proftpd.pid
fi

# Read config (will override defaults)
[ -r /etc/default/proftpd ] && . /etc/default/proftpd

trap "" 1
trap "" 15

test -f $DAEMON || exit 0

. /etc/init.d/functions

#
# Servertype could be inetd|standalone|none.
# In all cases check against inetd and xinetd support.
#
if ! egrep -qi "^[[:space:]]*ServerType.*standalone" $CONFIG_FILE
then
    if egrep -qi "server[[:space:]]*=[[:space:]]*/usr/sbin/proftpd" /etc/xinetd.conf 2>/dev/null || \
       egrep -qi "server[[:space:]]*=[[:space:]]*/usr/sbin/proftpd" /etc/xinetd.d/* 2>/dev/null || \
       egrep -qi "^ftp.*/usr/sbin/proftpd" /etc/inetd.conf 2>/dev/null
    then
        RUN="no"
        INETD="yes"
    else
        if ! egrep -qi "^[[:space:]]*ServerType.*inetd" $CONFIG_FILE
        then
            RUN="yes"
            INETD="no"
        else
            RUN="no"
            INETD="no"
        fi
    fi
fi

# /var/run could be on a tmpfs

[ ! -d /var/run/proftpd ] && mkdir /var/run/proftpd

inetd_check()
{
    if [ ! -x /usr/sbin/inetd -a ! -x /usr/sbin/xinetd ]; then
        echo "Neither inetd nor xinetd appears installed: check your configuration."
    fi
}

start()
{
    set -e
    echo -n "Starting ftp server $NAME... "
    start-stop-daemon --start --quiet --pidfile "$PIDFILE" --oknodo --exec $DAEMON -- -c $CONFIG_FILE $OPTIONS
    echo "done."
}

signal()
{

    if [ "$1" = "stop" ]; then
        SIGNAL="TERM"
        echo -n "Stopping ftp server $NAME... "
    else
        if [ "$1" = "reload" ]; then
            SIGNAL="HUP"
            echo -n "Reloading ftp server $NAME... "
        else
            echo "ERR: wrong parameter given to signal()"
            exit 1
        fi
    fi
    if [ -f "$PIDFILE" ]; then
        start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile "$PIDFILE"
        if [ $? = 0 ]; then
            echo "done."
            return
        else
            SIGNAL="KILL"
            start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile "$PIDFILE"
            if [ $? != 0 ]; then
                echo
                [ $2 != 0 ] || exit 0
            else
                echo "done."
                return
            fi
        fi
        if [ "$SIGNAL" = "KILL" ]; then
            rm -f "$PIDFILE"
        fi
    else
        echo "done."
        return
    fi
}

case "$1" in
    start)
        if [ "x$RUN" = "xyes" ] ; then
            start
        else
            if [ "x$INETD" = "xyes" ] ; then
                echo "ProFTPD is started from inetd/xinetd."
                inetd_check
            else
                echo "ProFTPD warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration."
            fi
        fi
        ;;

    force-start)
        if [ "x$INETD" = "xyes" ] ; then
            echo "Warning: ProFTPD is started from inetd/xinetd (trying to start anyway)."
            inetd_check
        fi
        start
        ;;

    stop)
        if [ "x$RUN" = "xyes" ] ; then
            signal stop 0
        else
            if [ "x$INETD" = "xyes" ] ; then
                echo "ProFTPD is started from inetd/xinetd."
                inetd_check
            else
                echo "ProFTPD warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration."
            fi
        fi
        ;;

    force-stop)
        if [ "x$INETD" = "xyes" ] ; then
            echo "Warning: ProFTPD is started from inetd/xinetd (trying to kill anyway)."
            inetd_check
        fi
        signal stop 0
        ;;

    reload)
        signal reload 0
        ;;

    force-reload|restart)
        if [ "x$RUN" = "xyes" ] ; then
            signal stop 1
            sleep 2
            start
        else
            if [ "x$INETD" = "xyes" ] ; then
                echo "ProFTPD is started from inetd/xinetd."
                inetd_check
            else
                echo "ProFTPD warning: cannot start neither in standalone nor in inetd/xinetd mode. Check your configuration."
            fi
        fi
        ;;

    status)
        if [ "x$INETD" = "xyes" ] ; then
            echo "ProFTPD is started from inetd/xinetd."
            inetd_check
            exit 0
        else
            if [ -f "$PIDFILE" ]; then
                pid=$(cat $PIDFILE)
            else
                pid="x"
            fi
            if [ `pidof proftpd|grep "$pid"|wc -l` -ne 0 ] ; then
                echo "ProFTPD is started in standalone mode, currently running."
                exit 0
            else
                echo "ProFTPD is started in standalone mode, currently not running."
                exit 3
            fi
        fi
        ;;

    check-config)
        $DAEMON -t >/dev/null && echo "ProFTPD configuration OK" && exit 0
        exit 1
        ;;

    *)
        echo "Usage: /etc/init.d/$NAME {start|status|force-start|stop|force-stop|reload|restart|force-reload|check-config}"
        exit 1
        ;;
esac

exit 0
