#!/bin/sh
#
# WebKit application server
# part of Webware for Python
# www.webwareforpython.org
#
# /etc/init.d/webkit
#
# Generic init.d shell start script for Unix
#
# Note: You will find more sophisticated start scripts
# for various Unix flavors in the StartScripts folder.
#

# START LOCAL CONFIGURATION

# If you store this script in your Webware working directory
# and create a symlink to it as /etc/init.d/webkit_appname,
# it will try to guess your configuration parameters. You can
# make changes either directly here or you can also override
# the configuration in the Launch.py script.

# The name of your Webware application:
APP_NAME=`basename "$0"`

# The location of the start sript:
if [ -h "$0" ]; then
    # Get the target file if start script is given as a link:
    START_SCRIPT=`echo "import os;p='$0'
while os.path.islink(p):
    p = os.path.join(os.path.dirname(p), os.readlink(p))
print p" | python`
else
    START_SCRIPT="$0"
fi

# The working directory or path to WebKit:
WORK_DIR=`dirname "$START_SCRIPT"`
# Make sure to have the absolute path:
test -d "$WORK_DIR" || exit 5
WORK_DIR=`cd "$WORK_DIR" 2>/dev/null && pwd`

# The app server launch script:
APP_SERVER="$WORK_DIR/AppServer"
test -x "$APP_SERVER" || exit 5

# The WebKit app server log file
# (you can set this in Launch.py as well):
#LOG_FILE="/var/log/$APP_NAME.log"
LOG_FILE="$WORK_DIR/Logs/webkit.log"
# Use this extension if you want to move the last log away
# (also consider using logrotate or something similar):
LOG_OLD=".old"

# The app server process id file
# (you can set this in Launch.py as well):
#PID_FILE="/var/run/$APP_NAME.pid"
PID_FILE="$WORK_DIR/webkit.pid"

# The user to run the app server
# (you can set this in Launch.py as well).
# If undefined, it will be the user
# running the start script (usually root).
# You should use a low-privilege account,
# like the work dir owner, wwwrun or nobody.
# This will use the owner of the AppServer script:
WEBWARE_USER=`echo "import os,pwd;
print pwd.getpwuid(os.stat('$APP_SERVER')[4])[0]" | python`

# Unset the following variable if you want to store the
# pid and log files as the user running the start script
# (usually root) or set it if you want these files to be
# written after switching to the WEBWARE_USER.
LAUNCH_AS_WEBWARE="yes"

# Additional options -u or -O to be passed on to Python:
PYTHONOPTS=
# Additional libraries to be included in the Python path:
PYTHONPATH=
export PYTHONPATH

# END LOCAL CONFIGURATION

case "$1" in
    start)
    printf "Starting $APP_NAME ... "
    # Keep backup of last log file:
    if [ "$LOG_OLD" -a -f "$LOG_FILE" ]; then
        if [ -s "$LOG_FILE" ]; then
            mv -f "$LOG_FILE" "$LOG_FILE$LOG_OLD"
        else
            rm -f "$LOG_FILE"
        fi
    fi
    # Check if the server is already running:
    if [ -f "$PID_FILE" ] ; then
        PID=`cat "$PID_FILE"`
        if [ "$PID" ]; then
            # Check on the command line if it is really our pid file
            # (MacOs has only "command", SunOS has only "args"):
            if (ps -o command= -p $PID 2>/dev/null \
                    || ps -o args= -p $PID 2>/dev/null) \
                    | grep -q " -i $PID_FILE "; then
                echo "already running"
                exit 0
            fi
        fi
        rm -f "$PID_FILE"
    fi
    if [ -z "$WEBWARE_USER" -o "$WEBWARE_USER" = "$USER" ]; then
        "$APP_SERVER" $PYTHONOPTS -i "$PID_FILE" \
            -d "$WORK_DIR" -o "$LOG_FILE" > /dev/null &
    else
        if [ "$LAUNCH_AS_WEBWARE" ]; then
            # Switch user first, then create pid and log files:
            CMD="\"$APP_SERVER\" $PYTHONOPTS"
            CMD="$CMD -i \"$PID_FILE\" -d \"$WORK_DIR\" -o \"$LOG_FILE\""
            su $WEBWARE_USER -c "$CMD" > /dev/null &
        else
            # Create pid and log files first, then switch user:
            "$APP_SERVER" $PYTHONOPTS -i "$PID_FILE" \
                -d "$WORK_DIR" -u $WEBWARE_USER >> "$LOG_FILE" 2>&1 &
        fi
    fi
    echo "done"
    ;;
    stop)
    printf "Stopping $APP_NAME ... "
    if [ -f "$PID_FILE" ] ; then
        PID=`cat "$PID_FILE"`
        if [ "$PID" ]; then
            if (ps -o command= -p $PID 2>/dev/null \
                    || ps -o args= -p $PID 2>/dev/null) \
                    | grep -q " -i $PID_FILE "; then
                if kill $PID > /dev/null 2>&1 ; then
                    echo "done"
                else
                    echo "error"
                    echo "Could not kill process $PID named in $PID_FILE"
                    exit 1
                fi
            else
                echo "not running (removing stale pid file)"
            fi
        else
            echo "not running (removing empty pid file)"
        fi
        rm -f "$PID_FILE"
    else
        echo "not running"
    fi
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac
