#!/bin/bash

source $OPENSHIFT_CARTRIDGE_SDK_BASH
source "${OPENSHIFT_PYTHON_DIR}/usr/versions/${OPENSHIFT_PYTHON_VERSION}/lib/create-virtenv"

HTTPD_CFG_FILE=$OPENSHIFT_PYTHON_DIR/etc/conf/httpd_nolog.conf
HTTPD_CFG_DIR=$OPENSHIFT_PYTHON_DIR/etc/conf.d
HTTPD_PASSENV_FILE=$HTTPD_CFG_DIR/passenv.conf
HTTPD_PID_FILE=$OPENSHIFT_PYTHON_DIR/run/httpd.pid

# construct the configuration directives for httpd
HTTPD_CMD_CONF="-C 'Include $HTTPD_CFG_DIR/*.conf' -f $HTTPD_CFG_FILE"
for dir in /etc/openshift/cart.conf.d/httpd{,/python} ; do
    [ -d $dir ] && HTTPD_CMD_CONF="$HTTPD_CMD_CONF -c 'Include $dir/*.conf'"
done

# For backwards compatibility
export APPDIR=$OPENSHIFT_PYTHON_DIR

function start_app() {
    cd "$OPENSHIFT_REPO_DIR"
    nohup python -u app.py > "$OPENSHIFT_PYTHON_DIR/logs/appserver.log" 2>&1 &
    echo $! > $OPENSHIFT_PYTHON_DIR/run/appserver.pid
}

function start_apache() {
    write_httpd_passenv $HTTPD_PASSENV_FILE
    ensure_valid_httpd_process "$HTTPD_PID_FILE" "$HTTPD_CFG_FILE"
    eval "/usr/sbin/httpd $HTTPD_CMD_CONF -k start"
    [ "$?" == "0" ] && wait_for_pid_file $HTTPD_PID_FILE
}

function start() {
    echo "Starting PYTHON cart"
    oo-erb ${OPENSHIFT_PYTHON_DIR}conf/performance.conf.erb.hidden > $HTTPD_CFG_DIR/performance.conf
    if [ -f "$OPENSHIFT_REPO_DIR/app.py" ]
    then
        start_app
    else
        start_apache
    fi
}

function stop_app() {
    if [ -s $OPENSHIFT_PYTHON_DIR/run/appserver.pid ]
    then
        kpid=$(cat $OPENSHIFT_PYTHON_DIR/run/appserver.pid)
        iters=0
        while kill $kpid >/dev/null 2>&1
        do
            iters=$(($iters + 1))
            [ $iters -gt 10 ] && break
            sleep 1
        done
        kill -KILL $kpid >/dev/null 2>&1 || :
        rm -f $OPENSHIFT_PYTHON_DIR/run/appserver.pid
    fi
}

function stop_apache() {
    ensure_valid_httpd_process "$HTTPD_PID_FILE" "$HTTPD_CFG_FILE"
    if [ -f "$HTTPD_PID_FILE" ]; then
        httpd_pid=`cat "$HTTPD_PID_FILE" 2> /dev/null`
        eval "/usr/sbin/httpd $HTTPD_CMD_CONF -k stop"
        wait_for_stop $httpd_pid
    fi
}

function stop() {
    echo "Stopping PYTHON cart"

    # Do both in case the last commit transitioned from one to the
    # other or there was a problem.
    stop_apache
    stop_app
}


function restart() {
   echo "Restarting PYTHON cart"
    if [ -f "$OPENSHIFT_REPO_DIR/app.py" ]
    then
        stop
        start
    else
        stop_app
        oo-erb ${OPENSHIFT_PYTHON_DIR}conf/performance.conf.erb.hidden > $HTTPD_CFG_DIR/performance.conf
        write_httpd_passenv $HTTPD_PASSENV_FILE
        ensure_httpd_restart_succeed "$HTTPD_PID_FILE" "$HTTPD_CFG_FILE"
        eval "/usr/sbin/httpd $HTTPD_CMD_CONF -k restart"
    fi
}

function status() {
    res=0
    if [ -f "$OPENSHIFT_REPO_DIR/app.py" ]
    then
        output=$(curl -s -m 30 http://$OPENSHIFT_PYTHON_IP:$OPENSHIFT_PYTHON_PORT/ &> /dev/null) || res=1
    else
        output=$(curl -s -m 30 http://$OPENSHIFT_PYTHON_IP:$OPENSHIFT_PYTHON_PORT/server-status?auto 2>&1 ) || res=1
    fi
    if [ $res -eq 0 ]
    then
        client_result "Application is running"
        client_result "$output"
    else
        client_result "Application is either stopped or inaccessible"
    fi
}

function reload() {
    echo "Reloading PYTHON cart"
    restart
}

# Clean up any log files
function tidy() {
  client_message "Emptying log dir: $OPENSHIFT_PYTHON_LOG_DIR"
  shopt -s dotglob
  rm -rf $OPENSHIFT_PYTHON_LOG_DIR/*
}

function build() {
    if [ -n "$OPENSHIFT_PYPI_MIRROR_URL" ]; then
        m=$OPENSHIFT_PYPI_MIRROR_URL
        if curl -m 15 -f -s "$m" &>/dev/null
        then
            OPENSHIFT_PYTHON_MIRROR="-i $m"
        fi
    fi

    if force_clean_build_enabled_for_latest_deployment; then
        echo "Force-clean builds are enabled" 1>&2
        rm -rf $VIRTUAL_ENV/*
    fi

    if [ ! -f $VIRTUAL_ENV/bin/python ]; then
      echo "Recreating virtenv" 1>&2
      create-virtenv
    fi

    if [ -f ${OPENSHIFT_REPO_DIR}/requirements.txt ]
    then
        ( cd $OPENSHIFT_REPO_DIR; pip install -r ${OPENSHIFT_REPO_DIR}/requirements.txt $OPENSHIFT_PYTHON_MIRROR )
    fi

    if [ -f ${OPENSHIFT_REPO_DIR}/setup.py ]
    then
        ( cd $OPENSHIFT_REPO_DIR; python ${OPENSHIFT_REPO_DIR}/setup.py develop $OPENSHIFT_PYTHON_MIRROR )
    fi

    relative-virtenv
}

function deploy() {
    relative-virtenv
}

case "$1" in
  start)     start ;;
  stop)      stop ;;
  restart)   restart ;;
  status)    status ;;
  reload)    reload ;;
  tidy)      tidy ;;
  build)     build ;;
  deploy)    deploy ;;
  *)         exit 0
esac
