#!/bin/sh
# (C) Copyright 2013-present, Skylable Ltd. <info-copyright@skylable.com>
# All Rights Reserved.

ETCDIR="/etc"
CONFIG="$ETCDIR/sxserver/sxsetup.conf"
if [ ! -f "$CONFIG" ]; then
    echo "Not configured. You have to run /usr/sbin/sxsetup first."
    exit 1
fi

if [ ! -r "$CONFIG" ]; then
    echo "No permission to read $CONFIG"
    exit 1
fi
. $CONFIG

if [ -z "$SX_NO_ROOT" -a `id -u` -ne 0 ]; then
    if [ "$SX_PORT" -le 1024 ]; then
        echo "You must be root"
        exit 1
    fi
fi

umask 027

exit_if_running() {
    if [ -r "$2" ]; then
        PID=`cat $2`;
        if kill -0 $PID 2>/dev/null; then
            echo "$1 is already running (PID $PID)!" >&2
	    echo "Please run $0 stop/restart to stop or restart existing services."
            exit 1
        fi
    fi
}

test_running() {
    if [ -r "$2" ]; then
        PID=`cat $2`;
        if kill -0 $PID 2>/dev/null; then
            echo "$1 is running (PID $PID)"
        else
            echo "$1 is NOT running"
	fi
    else
	echo "$1 is NOT running"
    fi
}

wait_pids() {
    for pid in $PIDS; do
        while kill -0 $pid 2>/dev/null; do
	    sleep 1
	done
    done
}

case "$1" in
    start)
        SXLOGDIR=`dirname "$SX_LOG_FILE"`
        mkdir -p "$SX_RUN_DIR" "$SX_LIB_DIR" "$SXLOGDIR"
        test -z "$SX_NO_ROOT" && test -n "$SX_RUN_DIR" && chown -R "$SX_SERVER_USER:$SX_SERVER_GROUP" "$SX_RUN_DIR"
        test -z "$SX_NO_ROOT" && test -n "$SX_LIB_DIR" && chown -R "$SX_SERVER_USER:$SX_SERVER_GROUP" "$SX_LIB_DIR"
        test -z "$SX_NO_ROOT" && test -n "$SXLOGDIR" && chown -R "$SX_SERVER_USER:$SX_SERVER_GROUP" "$SXLOGDIR"
        test -z "$SX_NO_ROOT" && test -n "$SX_DATA_DIR" && chown -R "$SX_SERVER_USER:$SX_SERVER_GROUP" "$SX_DATA_DIR"

        exit_if_running "sx.fcgi" "$SX_RUN_DIR/sxfcgi.pid"
        echo "Starting SX.fcgi"
	if [ "$SX_USE_VALGRIND" = "yes" ]; then
	    valgrind --num-callers=100 --track-origins=yes --max-stackframe=2560000 --log-file=/tmp/sxfcgi.valgrind.log.%p --trace-children=yes --leak-check=full /usr/sbin/sx.fcgi $SX_FCGI_OPTS
	else
	    /usr/sbin/sx.fcgi $SX_FCGI_OPTS
	fi

	if [ $? -ne 0 ]; then
	    echo "ERROR: Failed to start SX.fcgi. Please check the log file $SX_LOG_FILE"
	    exit 1
	fi

        exit_if_running "sxhttpd" "$SX_RUN_DIR/sxhttpd.pid"
        echo "Starting sxhttpd"
	test -z "$SX_HTTPD_OPTS" && SX_HTTPD_OPTS="-c /etc/sxserver/sxhttpd.conf"
	if ! /usr/sbin/nginx $SX_HTTPD_OPTS; then
	    echo "ERROR: Failed to start sxhttpd. Please check the log files at $SXLOGDIR"
	    $0 stop
	    exit 1
	fi

        echo "SX node started successfully"
        ;;

    stop)
        PIDS=
        for pidfile in "$SX_RUN_DIR/sxfcgi.pid" "$SX_RUN_DIR/sxhttpd.pid"; do
            if [ -r $pidfile ]; then
                PID=`cat $pidfile`
                echo "Sending SIGTERM to $PID"
                kill $PID 2>/dev/null
                PIDS="$PIDS $PID"
            fi
        done
        if [ -n "$PIDS" ]; then
            echo "Waiting for $PIDS"
	    wait_pids
        fi
        for pidfile in "$SX_RUN_DIR/sxfcgi.pid" "$SX_RUN_DIR/sxhttpd.pid"; do
            if [ -r $pidfile ]; then
		rm $pidfile
	    fi
	done
        ;;

    restart)
	$0 stop || exit 1
	$0 start || exit 1
	;;

    status)
	echo "--- SX STATUS ---"
        test_running "sx.fcgi" "$SX_RUN_DIR/sxfcgi.pid"
        test_running "sxhttpd" "$SX_RUN_DIR/sxhttpd.pid"
        ;;

    *)
        echo "Usage: $0 <start | stop | restart | status>" >&2 
        exit 1
        ;;
esac
