#!/bin/sh
#
# Startup script for JBoss
# JPackage Project <http://www.jpackage.org/>
# $Id$

# chkconfig: - 86 11
# description: JBoss EJB Container
# config: /etc/jboss.conf
# pidfile: /var/run/jboss.pid

### BEGIN INIT INFO
# Provides: jboss
# Required-Start: $local_fs $network
# Short-Description: JBoss EJB Container
### END INIT INFO

# Source LSB function library.
[ -f /lib/lsb/init-functions ] && . /lib/lsb/init-functions

# Get config.
. /etc/jboss.conf

# Set some essential variables
JBOSS_BINDIR="$JBOSS_HOME/bin"

LOCKFILE=/var/lock/subsys/jboss
PIDFILE=/var/run/jboss.pid
TMPDIR=/var/cache/jboss

# Functions
start ()
{
    if [ ! -f $LOCKFILE ]; then
        # Check that JBOSS_USER exists
        if [ -z "$JBOSS_USER" ]; then
            echo "User \$JBOSS_USER is not defined..."
            RETVAL=1
            return $RETVAL
	else
	    id $JBOSS_USER | grep uid= > /dev/null 2>&1
	    if [ $? -ne 0 ]; then
                echo "User $JBOSS_USER does not exist..."
                RETVAL=1
                return $RETVAL
	    fi
        fi

        echo "Starting jboss: "

        touch $LOCKFILE

        # Reset log to make sure we don't read old start message below
        mkdir -p $JBOSS_HOME/server/$JBOSS_CONFIGURATION/log
        > $JBOSS_HOME/server/$JBOSS_CONFIGURATION/log/server.log

        chown -R $JBOSS_USER:$JBOSS_USER \
            $JBOSS_HOME/server/$JBOSS_CONFIGURATION/db \
            $JBOSS_HOME/server/$JBOSS_CONFIGURATION/log \
            $JBOSS_HOME/server/$JBOSS_CONFIGURATION/log/server.log \
            $TMPDIR/$JBOSS_CONFIGURATION \
            > /dev/null 2>&1

        export JAVA_HOME JAVACMD JAVA_OPTS JBOSS_CONFIGURATION \
            JBOSS_OPTIONS JBOSS_CLASSPATH JAVAC_JAR PROFILER JETTY_PORT \
            JETTY_PORT_SSL JETTY_PORT_AJP

        if [ -f /lib/lsb/init-functions ]; then
        initlog -q -c "su $JBOSS_USER -s /bin/sh -c \"cd $TMPDIR/$JBOSS_CONFIGURATION && sh $JBOSS_BINDIR/run.sh -c $JBOSS_CONFIGURATION $JBOSS_OPTIONS\"" &
        else
        su $JBOSS_USER -c "cd $TMPDIR/$JBOSS_CONFIGURATION && sh $JBOSS_BINDIR/run.sh -c $JBOSS_CONFIGURATION $JBOSS_OPTIONS" &
        fi

        sleep=0
        RETVAL=1
        while [ $sleep -lt 180 -a $RETVAL -eq 1 ]; do
            sleep 10
            sleep=`expr $sleep + 10`
            grep -q MicroKernel $JBOSS_HOME/server/$JBOSS_CONFIGURATION/log/server.log > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                RETVAL=0
            fi
        done
        # Uncomment if JBoss doesn't deploy everything in time
        #sleep 60
        if [ -f /lib/lsb/init-functions ]; then
        [ $RETVAL -eq 0 ] && log_success_msg "jboss startup" || ( log_failure_msg "jboss startup" && rm -f $LOCKFILE )
        echo ""
        else
        [ $RETVAL -eq 0 ] && echo "jboss startup succeeded" || ( echo "jboss startup failed" && rm -f $LOCKFILE )
        fi
    else
        echo "lockfile for jboss already exists..."
        RETVAL=1
    fi
    return $RETVAL
}

stop ()
{
    echo -n "Shutting down jboss: "

    # Don't stop it if it's not running..
    status > /dev/null 2>&1
    if [ $? -eq 3 ]; then
        if [ -f /lib/lsb/init-functions ]; then
        log_success_msg "jboss shutdown"
        echo ""
        else
        echo "jboss shutdown succeeded"
        fi
        return 0
    fi

    export JAVA_HOME JAVACMD JAVA_OPTS JBOSS_CONFIGURATION JBOSS_OPTIONS \
        JBOSS_CLASSPATH JAVAC_JAR PROFILER JETTY_PORT JETTY_PORT_SSL \
        JETTY_PORT_AJP

    if [ -f /lib/lsb/init-functions ]; then
    initlog -q -c "su $JBOSS_USER -s /bin/sh -c \"sh $JBOSS_BINDIR/shutdown.sh -S $JBOSS_SHUTDOWN_OPTIONS\"" &
    else
    su $JBOSS_USER -c "sh $JBOSS_BINDIR/shutdown.sh -S $JBOSS_SHUTDOWN_OPTIONS" &
    fi

    # Sleep every 10 seconds for up to 180 seconds, and check to see if
    # jboss is still running
    sleep=10
    RETVAL=1
    while [ $sleep -lt 180 -a $RETVAL -eq 1 ]; do
        sleep 5
        sleep=`expr $sleep + 10`
        pslist=$( ps -af | grep java | grep $JBOSS_USER | awk '{print $2}' | tr '\n' ' ' | sed -e s/\ $// )
        [ -z "$pslist" ]
        if [ $? -eq 0 ]; then
            RETVAL=0
        fi
    done
    if [ -f /lib/lsb/init-functions ]; then
    [ $RETVAL -eq 0 ] && ( log_success_msg "jboss shutdown" && rm -f $LOCKFILE ) || log_failure_msg "jboss shutdown"
    echo ""
    else
    [ $RETVAL -eq 0 ] && ( echo "jboss shutdown succeeded" && rm -f $LOCKFILE ) || echo "jboss shutdown failed"
    fi
    return $RETVAL
}

status ()
{
    pslist=$( ps -af | grep java | grep $JBOSS_USER | awk '{print $2}' | tr '\n' ' ' | sed -e s/\ $// )
    if [ -n "$pslist" ]; then
        echo "jboss (pid $pslist) is running"
        return 0
    fi
    if [ -f $PIDFILE ]; then
        echo "jboss dead but pid file exists"
        return 1
    fi
    if [ -f $LOCKFILE ]; then
        echo "jboss dead but subsys locked"
        return 2
    fi
    echo "jboss is stopped"
    return 3
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        RETVAL=$?
        ;;
    restart|reload|force-reload)
        stop
        start
        ;;
    condrestart)
        if [ -f $LOCKFILE ]; then
            restart
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
        exit 1
esac

exit $RETVAL
