#! /bin/bash
# -----------------------------------------------------------------------------
# init.d script to run ONOS
#
# This provides the core for an ONOS service in a variety of System V/init.d
# compatible environments. It can also be invoked directly.
# It reads configuration options from $ONOS_HOME/options
# -----------------------------------------------------------------------------
### BEGIN INIT INFO
# Provides:          onos
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: ONOS network operating system
# Description:       ONOS is a network operating system for controlling SDN networks, designed for high availablility, performance, and scale out.
### END INIT INFO


ONOS_HOME=${ONOS_HOME:-/opt/onos}
[ -f $ONOS_HOME/options ] && . $ONOS_HOME/options
ONOS_USER=${ONOS_USER:-root}
ONOS_GROUP=${ONOS_GROUP:-$ONOS_USER}
ONOS_OPTS=${ONOS_OPTS:-server}

start () {
    # Fix permissions and symlinks
    mkdir -p $ONOS_HOME/var 2>/dev/null && chown $ONOS_USER:$ONOS_GROUP $ONOS_HOME/var
    mkdir -p $ONOS_HOME/config 2>/dev/null && chown $ONOS_USER:$ONOS_GROUP $ONOS_HOME/config
    mkdir -p $ONOS_HOME/apps 2>/dev/null && chown -R $ONOS_USER:$ONOS_GROUP $ONOS_HOME/apps
    [ ! -h $ONOS_OME/karaf ] && ln -s /opt/onos/apache-karaf* $ONOS_HOME/karaf || :
    [ ! -h $ONOS_HOME/log ] && ln -s $ONOS_HOME/karaf/data/log $ONOS_HOME/log || :
    # Start ONOS if it's not already running
    if ! status >/dev/null; then
        echo "Starting ONOS"
        startonos $ONOS_HOME/bin/onos-service $ONOS_OPTS
    else
        echo "ONOS/karaf is already running"
    fi
}

startonos () {
    cmd=$1
    shift
    # Start ONOS as a daemon
    if test -f /lib/lsb/init-functions; then
        . /lib/lsb/init-functions
    else
        . /etc/init.d/functions && true
    fi

    if type daemon 2>/dev/null| grep -i function >/dev/null 2>&1; then
        # Use 'daemon' function if available
        # Shell metacharacters are passed as arguments to daemon
        daemon --user $ONOS_USER $cmd $* \
            \>$ONOS_HOME/var/stdout.log 2\>$ONOS_HOME/var/stderr.log \&
    elif type start-stop-daemon >/dev/null 2>&1; then
        # Use start-stop-daemon if available
        # Warning! Running as root can overwrite any linked log file.
        start-stop-daemon --signal INT --start --chuid $ONOS_USER \
            --background --exec $cmd -- $* \
            >$ONOS_HOME/var/stdout.log 2>$ONOS_HOME/var/stderr.log
    else
        # Fall back to using sudo
        # Warning! Running as root can overwrite any linked log file.
        # preserve Env, background, non-interactive, user $ONOS_USER
        sudo -E -b -n -u $ONOS_USER $cmd $* \
            >$ONOS_HOME/var/stdout.log 2>$ONOS_HOME/var/stderr.log
    fi
}

stop () {
    if status >/dev/null; then
        echo "Stopping ONOS"
        $ONOS_HOME/karaf/bin/stop
        # Wait until karaf claims not to be running
        while status >/dev/null; do echo -n .; sleep 1; done
    else
        echo "ONOS/karaf is not running"
    fi
}

restart () {
        stop
        sleep 2  # Bogus hack since karaf stop doesn't work ;-(
        start
}

status () {
    # karaf status returns 0 if running, 1 if not
    if [ `id -u` == 0 ]; then
        # Avoid creating data dir as root
        sudo -n -u $ONOS_USER $ONOS_HOME/karaf/bin/status
    else
        $ONOS_HOME/karaf/bin/status
    fi
}

case $1 in
    start)
        start
        ;;
    stop | force-stop)
        stop
        ;;
    restart)
        shift
        restart "$@"
        ;;
    status)
        status
        exit $?
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}" >&2
        exit 1
        ;;
esac

exit 0
