#!/bin/bash
# This control script is a modified version of the condor init script
# developed by Matt Farrellee.  The main differences are that it controls
# the schedd instead of master, there is no lockfile, and all echo 
# statements have been removed.

# The program being managed
prog=condor_schedd

pidfile=/var/run/condor/$prog.pid

# Source function library
. /etc/init.d/functions

# Source networking configuration
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network

# Source Condor configuration
[ -f /etc/sysconfig/condor ] && . /etc/sysconfig/condor

# Check that networking is up
[ "${NETWORKING}" = "no" ] && exit 1


start() {
    pid_status $pidfile
    if [ $? -ne 0 ]; then
        rm -f $pidfile
    fi
    daemon --pidfile $pidfile --check $prog $prog -pidfile $pidfile
    RETVAL=$?
    return $RETVAL
}

stop() {
    killproc -p $pidfile $prog -QUIT
    RETVAL=$?
    wait_pid $pidfile 15
    if [ $? -ne 0 ]; then
	RETVAL=1
    fi
    return $RETVAL
}

#
# Determine if a process is running only by looking in a pidfile.
# There is no use of pidof, which can find processes that are not
# started by this script.
#
# ASSUMPTION: The pidfile will exist if the process does, see false
# negative warning.
#
# WARNING: A false positive is possible if the process that dropped
# the pid file has crashed and the pid has been recycled. A false
# negative is possible if the process has not yet dropped the pidfile,
# or it contains the incorrect pid.
#
# Usage: pid_status <pidfile>
# Result: 0 = pid exists
#         1 = pid does not exist, but pidfile does
#         2 = pidfile does not exist, thus pid does not exist
#         3 = status unknown
#
pid_status() {
    pid=$(get_pid $1)
    case $? in
	1) return 2 ;;
	2) return 3 ;;
    esac

    ps $pid &>/dev/null
    if [ $? -ne 0 ]; then

	return 1
    fi

    return 0
}

#
# Wait for the pid in the pidfile to disappear, but only do so for at
# most timeout seconds.
#
# Usage: wait_pid <pidfile> <timeout>
# Result: 0 = pid was not found (doesn't exist or not accessible)
#         1 = pid still exists after timeout
wait_pid() {
    pid=$(get_pid $1)
    if [ $? -ne 0 ]; then
	return 0
    fi

    wait=0
    while [ $wait -lt $2 ]; do
	pid_status $1
	if [ $? -ne 0 ]; then
	    return 0
        fi

	sleep 1
	wait=$((wait + 1))
    done

    return 1
}

#
# Retrieve pid from a pidfile
#
# Usage: get_pid <pidfile>
# Result: 0 = pid returned
#         1 = pidfile not found
#         2 = pidfile not accessible or didn't contain pid
# Stdout: pid
#
get_pid() {
    if [ -s $1 ]; then
	pid=`cat $1` &>/dev/null
	if [ $? -ne 0 -o -z "$pid" ]; then
	    return 2
	fi

	echo -n $pid
	return 0
    fi

    return 1
}


pid_status $pidfile
running=$?

if [ "$1" != "status" -a "$1" != "stop" ]; then
    # Report that $prog does not exist, or is not executable
    if [ ! -x /usr/sbin/$prog ]; then
	exit 5
    fi

    [ $running -eq 4 ] && exit 7
fi

case "$1" in
    start)
	[ $running -eq 0 ] && exit 0
	start
	RETVAL=$?
	;;
    stop)
	[ $running -eq 0 ] || exit 0
	stop
	RETVAL=$?
	;;
    status)
	if [ $running -ne 0 ]; then
	    exit $running
	fi

	# WARNING: status uses pidof and may find more pids than it
	# should.
	status -p $pidfile $prog
	RETVAL=$?
	;;
    *)
	RETVAL=2
esac

exit $RETVAL
