#!/bin/sh
#
# rfiod         Start/Stop rfiod.
#
# chkconfig: - 92 18
# description: RFIO server daemon
#
# $Id: rfiod.scripts 6384 2012-06-06 14:39:34Z rocha $
#
# @(#)$RCSfile: rfiod.scripts,v $ $Revision: 6384 $ $Date: 2012-06-06 16:39:34 +0200 (Wed, 06 Jun 2012) $ CERN/IT/ADC/CA Jean-Damien Durand
#

PREFIX=/usr
GRIDMAPDIR=/etc/grid-security/gridmapdir
export GRIDMAPDIR
if [ -d /opt/lcg/lib ] ; then
    LD_LIBRARY_PATH=/opt/lcg/lib:/opt/glite/lib:/opt/globus/lib
    export LD_LIBRARY_PATH
fi
CSEC_MECH=ID
export CSEC_MECH
CSEC_NOTHREAD=1
export CSEC_NOTHREAD
RFIO_PORT_RANGE="20000 25000"
export RFIO_PORT_RANGE
RFIOLOGFILE=/var/log/rfio/log

sysname=`uname -s`

# source function library
if [ -r /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
    DAEMON=daemon
    FAILURE=failure
    ECHO_FAILURE=failure
    SUCCESS=success
    ECHO_SUCCESS=echo_success
    ECHO_END=echo
    if [ $sysname = "Linux" ]; then
        ECHOOPT=-n
    fi
else
    DAEMON=eval
    FAILURE=
    ECHO_FAILURE=
    SUCCESS=
    ECHO_SUCCESS=
    ECHOOPT=
    ECHO_END=
fi

RETVAL=0
prog="rfiod"
NOMORERFIO=/etc/operator/nomorerfio
PIDFILE=/var/run/rfiod.pid
PIDDIR=/var/run
SUBSYS=/var/lock/subsys/rfiod
SUBSYSDIR=/var/lock/subsys
[ -z "$SILENTSTOP" ] && SILENTSTOP=0
RFIOD=$PREFIX/sbin/rfiod
OPTIONS="-sl"
if [ -r /etc/rfiod.conf ]; then
    SYSCONFIGRFIOD=/etc/rfiod.conf
elif [ -r /etc/sysconfig/rfiod ]; then
    SYSCONFIGRFIOD=/etc/sysconfig/rfiod
elif [ -r /etc/default/rfiod ]; then
    SYSCONFIGRFIOD=/etc/default/rfiod
fi

#
## Blindly attempt to create useful directories
#
# [ ! -d $PIDDIR ] && mkdir -p $PIDDIR > /dev/null 2>&1
# [ ! -d $SUBSYSDIR ] && mkdir -p $SUBSYSDIR > /dev/null 2>&1

if [ $sysname = "HP-UX" ]; then
    export UNIX95=1
fi
if [ $sysname = "SunOS" ]; then
    format4comm="fname"
elif [ $sysname = "Darwin" ]; then
    format4comm="ucomm"
else
    format4comm="comm"
fi

case "$1" in
  start)
    echo $ECHOOPT "Starting $prog: "
    if [ -f ${NOMORERFIO} ]; then
        echo $ECHOOPT "${NOMORERFIO} exists: "
        [ -n "$ECHO_SUCCESS" ] && $ECHO_SUCCESS "${NOMORERFIO} exists: "
        RETVAL=0
    else
        if [ $sysname = "Linux" -a `whoami` = "root" ]; then
            netstat -ap | egrep '\*:5001|\*:rfio' | grep LISTEN | grep rfiod > /dev/null
        else
            netstat -a  | egrep '\*[:.]5001|\*[:.]rfio' | egrep 'LISTEN *$' > /dev/null
        fi
        # ps -eo ppid,$format4comm | egrep '^[ \t]+1 rfiod' > /dev/null
        if [ $? -eq 0 ]; then
            echo $ECHOOPT "rfiod already started: "
            [ -n "$ECHO_SUCCESS" ] && $ECHO_SUCCESS "rfiod already started: "
            RETVAL=0
        else
            if [ -n "$SYSCONFIGRFIOD" ]; then
                #
                ## Source the configuration
                #
                . $SYSCONFIGRFIOD
                export DPNS_HOST
                if [ "${RUN_RFIOD}" != "yes" ]; then
                    echo $ECHOOPT "$SYSCONFIGRFIOD says NO: "
                    [ -n "$ECHO_SUCCESS" ] && $ECHO_SUCCESS "$SYSCONFIGRFIOD says NO: "
                    RETVAL=0
                    $ECHO_END
                    exit $RETVAL
                fi
                if [ -n "${ULIMIT_N}" ]; then
                    ulimit -n ${ULIMIT_N}
                fi
            fi
            if [ $RETVAL -eq 0 ]; then
                cd /
                mkdir -p `dirname $RFIOLOGFILE`
                touch $RFIOLOGFILE
                $DAEMON $RFIOD $OPTIONS -f $RFIOLOGFILE
                if [ $? -eq 0 ]; then
                    [ -d $SUBSYSDIR ] && touch $SUBSYS
                    if [ -d $PIDDIR ]; then
                        pid=`ps -eo pid,ppid,$format4comm | grep " 1 rfiod$" | awk '{print $1}'`
                        # The point of $PIDFILE is that it kills only
                        # the master daemon.
                        rm -f $PIDFILE
                        echo $pid > $PIDFILE
                    fi
                    RETVAL=0
                else
                    echo $ECHOOPT "rfiod not started: "
                    [ -n "$FAILURE" ] && $FAILURE "rfiod not started: "
                    RETVAL=1
                fi
            fi
        fi
    fi
    $ECHO_END
    ;;
  stop)
    if [ -f $PIDFILE ]; then
        [ $SILENTSTOP -eq 0 ] && echo $ECHOOPT "Stopping $prog: "
        #
        ## We just attempt to kill the main daemon
        ## Remaining child are allowed to continue transfer up to
        ## the end
        #
        if [ $SILENTSTOP -eq 0 ]; then
            kill -9 `cat $PIDFILE`
        else
            kill -9 `cat $PIDFILE` > /dev/null 2>&1
        fi
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            rm -f $PIDFILE
        fi
    else
        # rfio might have been started by hand
        pid=`ps -eo pid,ppid,$format4comm | grep " 1 rfiod$" | awk '{print $1}'`
        if [ -n "$pid" ]; then
            [ $SILENTSTOP -eq 0 ] && echo $ECHOOPT "Stopping $prog: "
            #
            ## We just attempt to kill the main daemon
            ## Remaining child are allowed to continue transfer up to
            ## the end
            #
            if [ $SILENTSTOP -eq 0 ]; then
                kill -9 $pid
            else
                kill -9 $pid > /dev/null 2>&1
            fi
            RETVAL=$?
        else
            [ $SILENTSTOP -eq 0 ] && echo $ECHOOPT "rfiod already stopped: "
            [ $SILENTSTOP -eq 0 -a -n "$ECHO_SUCCESS" ] && $ECHO_SUCCESS "rfiod already stopped: "
            RETVAL=0
        fi
    fi
    if [ $SILENTSTOP -eq 0 -a $sysname = "Linux" ]; then
        if [ $RETVAL -eq 0 ]; then
            $ECHO_SUCCESS
        else
            $ECHO_FAILURE
        fi
    fi

    [ -d $SUBSYSDIR ] && rm -f $SUBSYS
    [ $SILENTSTOP -eq 0 -a -n "$ECHO_END" ] && $ECHO_END
    #
    ## Basically: if SILENTSTOP is not 0 when we never print something
    ## But if the stop is successful... One might want to see stop: OK
    ## anyway ?
    #
    if [ $SILENTSTOP -ne 0 -a $RETVAL -eq 0 ]; then
        echo $ECHOOPT "Stopping $prog: "
        [ $sysname = "Linux" ] && $ECHO_SUCCESS
        [ -n "$ECHO_END" ] && $ECHO_END
    fi
    ;;
  restart | force-reload)
    $0 stop
    if [ $? -eq 0 -o $SILENTSTOP -eq 0 ]; then
        $0 start
        RETVAL=$?
    else
        #
        ## It is legal to return zero it if was
        ## a conditional restart
        #
        if [ $SILENTSTOP -eq 0 ]; then
            RETVAL=1
        else
            RETVAL=0
        fi
    fi
    ;;
  condrestart | try-restart)
    SILENTSTOP=1
    export SILENTSTOP
    $0 restart
    RETVAL=$?
    ;;
  reload)
    ;;
  status)
    pid=`ps -eo pid,ppid,$format4comm | grep " 1 rfiod$" | awk '{print $1}'`
    if [ -n "$pid" ]; then
        echo $ECHOOPT "rfiod (pid $pid) is running..."
        $ECHO_SUCCESS
        $ECHO_END
        RETVAL=0
    else
        if [ -f $PIDFILE ]; then
            pid=`head -1 $PIDFILE`
            if [ "$pid" != "" ] ; then
                echo $ECHOOPT "rfiod dead but pid file exists"
                $ECHO_FAILURE
                $ECHO_END
                RETVAL=1
            fi
        else
            if [ -f $SUBSYS ]; then
                echo $ECHOOPT "rfiod dead but subsys ($SUBSYS) locked"
                RETVAL=2
            else
                echo $ECHOOPT "rfiod is stopped"
                RETVAL=3
            fi
            $ECHO_FAILURE
            $ECHO_END
        fi
    fi
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart|condrestart}"
    RETVAL=1
    ;;
esac

exit $RETVAL
