#! /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_HOME/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
