#!/bin/sh

# Script that starts the ns-slapd server.
# Exit status can be:
#       0: Server started successfully
#       1: Server could not be started
#       2: Server already running

libpath_add() {
    [ -z "$1" ] && return
    LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$1
}

# Starts a single instance
start_instance() {
    # The first argument is the server ID.  Anything
    # after that is an argument to ns-slapd.
    SERV_ID=$1
    shift

    # source env. for this instance
    if [ -f /etc/sysconfig/dirsrv-$SERV_ID ] ; then
        . /etc/sysconfig/dirsrv-$SERV_ID
    else
        echo Instance $SERV_ID not found.
        return 1
    fi

    prefix="$DS_ROOT"

    libpath_add "$prefix$SERVER_DIR"
    libpath_add "$prefix"
    libpath_add "$prefix/usr/lib64"
    libpath_add ""
    libpath_add "$prefix/usr/lib64"

    export LD_LIBRARY_PATH
    SHLIB_PATH=$LD_LIBRARY_PATH
    export SHLIB_PATH

    DS_CONFIG_DIR=$CONFIG_DIR
    export DS_CONFIG_DIR
    PIDFILE=$RUN_DIR/$PRODUCT_NAME-$SERV_ID.pid
    STARTPIDFILE=$RUN_DIR/$PRODUCT_NAME-$SERV_ID.startpid
    if test -f $STARTPIDFILE ; then
        PID=`cat $STARTPIDFILE`
        if kill -0 $PID > /dev/null 2>&1 ; then
            echo There is an ns-slapd process already running: $PID
            return 2;
        else
            rm -f $STARTPIDFILE
        fi
    fi
    if test -f $PIDFILE ; then
        PID=`cat $PIDFILE`
        if kill -0 $PID > /dev/null 2>&1 ; then
            echo There is an ns-slapd running: $PID
            return 2;
        else
            rm -f $PIDFILE
        fi
    fi
    cd $SERVERBIN_DIR; ./ns-slapd -D $CONFIG_DIR -i $PIDFILE -w $STARTPIDFILE "$@"
    if [ $? -ne 0 ]; then
        return 1
    fi

    loop_counter=1
    # wait for 10 seconds for the start pid file to appear
    max_count=${STARTPID_TIME:-10}
    while test $loop_counter -le $max_count; do
        loop_counter=`expr $loop_counter + 1`
        if test ! -f $STARTPIDFILE ; then
            sleep 1;
        else
            PID=`cat $STARTPIDFILE`
        fi
    done
    if test ! -f $STARTPIDFILE ; then
        echo Server failed to start !!! Please check errors log for problems
        return 1
    fi
    loop_counter=1
    # wait for 10 minutes (600 times 1 seconds)
    max_count=${PID_TIME:-600}
    while test $loop_counter -le $max_count; do
        loop_counter=`expr $loop_counter + 1`
        if test ! -f $PIDFILE ; then
            if kill -0 $PID > /dev/null 2>&1 ; then
                sleep 1
        else
            echo Server failed to start !!! Please check errors log for problems
            return 1
        fi
        else
            PID=`cat $PIDFILE`
            rm -f $STARTPIDFILE
            return 0;
        fi
    done
    echo Server not running!! Failed to start ns-slapd process.  Please check the errors log for problems.
    return 1
}

# source env. for all instances
[ -f /etc/sysconfig/dirsrv ] && . /etc/sysconfig/dirsrv

if [ "$#" -eq 0 ]; then
    # We're starting all instances.
    ret=0
    for i in /etc/sysconfig/dirsrv-*; do
        inst=`echo $i | sed -e 's,/etc/sysconfig/dirsrv-,,g'`
        echo Starting instance \"$inst\"
        start_instance $inst
        if [ "$?" -ne 0 ]; then
            ret=$?
        fi
    done
    exit $ret
else
    # We're starting a single instance.
    start_instance $*
    exit $?
fi
