#!/bin/sh

### BEGIN INIT INFO
# Provides:          globus-rls-server
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      mysql postgresql
# Should-Stop:       mysql postgresql
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Replica Location Service Server
### END INIT INFO
# compare with http://wiki.debian.org/LSBInitScripts for the above section


# Starts / stops the Globus RLS server.

GLOBUS_RLS_SERVER=/usr/sbin/globus-rls-server
GLOBUS_RLS_ADMIN=/usr/sbin/globus-rls-admin
NAME=globus-rls-server
DESC="Globus RLS server"

PIDFILE=/var/run/$NAME.pid

test -x $GLOBUS_RLS_SERVER || exit 0

port=`grep '^port' /etc/globus-rls-server.conf | sed 's/port\s*//'`
port=${port:-39281}

. /lib/lsb/init-functions

# Default options, these can be overriden by the information
# at /etc/default/$NAME
DIETIME=3
STARTTIME=

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

if [ "x$RUN" != "xyes" ] ; then
    log_warning_msg "$NAME disabled, please adjust the configuration to your needs "
    log_warning_msg "and then set RUN to 'yes' in /etc/default/$NAME to enable it."
    log_warning_msg "See /usr/share/doc/$NAME/README.Debian.gz for details."
    exit 0
fi

set -e

running_pid() {
    # Check if a given process pid's cmdline matches a given name
    pid=$1
    name=$2
    [ -z "$pid" ] && return 1
    [ ! -d /proc/$pid ] && return 1
    cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
    # Is this the expected server
    [ "$cmd" != "$name" ] && return 1
    return 0
}

running() {
    # Check if the process is running looking at /proc (works for all users)
    # No pidfile, probably no daemon present
    [ ! -f "$PIDFILE" ] && return 1
    pid=`cat $PIDFILE`
    running_pid $pid $GLOBUS_RLS_SERVER || return 1
    return 0
}

start_server() {
    $GLOBUS_RLS_SERVER
    errcode=$?
    return $errcode
}

stop_server() {
    $GLOBUS_RLS_ADMIN -q rls://localhost:$port
    errcode=$?
    return $errcode
}

force_stop() {
    # Force the process to die killing it manually
    [ ! -e "$PIDFILE" ] && return
    if running ; then
	kill -15 $pid
	# Is it really dead?
	[ -n "$DIETIME" ] && sleep $DIETIME
	if running ; then
	    kill -9 $pid
	    [ -n "$DIETIME" ] && sleep $DIETIME
	    if running ; then
		echo "Cannot kill $NAME (pid=$pid)!"
		exit 1
	    fi
	fi
    fi
    rm -f $PIDFILE
}

case "$1" in

    start)
	log_daemon_msg "Starting $DESC" "$NAME"
	# Check if it's running first
	if running ; then
	    log_progress_msg "apparently already running"
	    log_end_msg 0
	    exit 0
	fi
	if start_server ; then
	    [ -n "$STARTTIME" ] && sleep $STARTTIME
	    if running ; then
		# It's ok, the server started and is running
		log_end_msg 0
	    else
		# It is not running after we did start
		log_end_msg 1
	    fi
	else
	    # We could not start it
	    log_end_msg 1
	fi
	;;

    stop)
	log_daemon_msg "Stopping $DESC" "$NAME"
	if running ; then
	    # Only stop the server if we see it running
	    errcode=0
	    stop_server || errcode=$?
	    log_end_msg $errcode
	else
	    # If it's not running don't do anything
	    log_progress_msg "apparently not running"
	    log_end_msg 0
	    exit 0
	fi
	;;

    force-stop)
	# First try to stop gracefully the program
	$0 stop
	if running; then
	    # If it's still running try to kill it more forcefully
	    log_daemon_msg "Stopping (force) $DESC" "$NAME"
	    errcode=0
	    force_stop || errcode=$?
	    log_end_msg $errcode
	fi
	;;

    restart|force-reload)
	log_daemon_msg "Restarting $DESC" "$NAME"
	errcode=0
	stop_server || errcode=$?
	# Wait some sensible amount, some server need this
	[ -n "$DIETIME" ] && sleep $DIETIME
	start_server || errcode=$?
	[ -n "$STARTTIME" ] && sleep $STARTTIME
	running || errcode=$?
	log_end_msg $errcode
	;;

    status)
	log_daemon_msg "Checking status of $DESC" "$NAME"
	if running ; then
	    log_progress_msg "running"
	    log_end_msg 0
	    $GLOBUS_RLS_ADMIN -S rls://localhost:$port
	else
	    log_progress_msg "apparently not running"
	    log_end_msg 1
	    exit 1
	fi
	;;

    reload)
	log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
	log_warning_msg "cannot re-read the config file (use restart)."
	;;

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

exit 0
