#!/bin/sh
# (c) 2013 Intel Corp.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


# This script can be run in two modes.

# When used with "source", from a build directory,
# it enables toaster event logging and starts the bitbake resident server.
# use as:  source toaster [start|stop] [noweb] [noui]

# When it is called as a stand-alone script, it starts just the
# web server, and the building shall be done through the web interface.
# As script, it will not return to the command prompt. Stop with Ctrl-C.

# Helper function to kill a background toaster development server

webserverKillAll()
{
    local pidfile
    for pidfile in ${BUILDDIR}/.toastermain.pid; do
        if [ -f ${pidfile} ]; then
            pid=`cat ${pidfile}`
            while kill -0 $pid 2>/dev/null; do
                kill -SIGTERM -$pid 2>/dev/null
                sleep 1
                # Kill processes if they are still running - may happen in interactive shells
                ps fux | grep "python.*manage.py runserver" | awk '{print $2}' | xargs kill
            done
            rm  ${pidfile}
        fi
    done
}

webserverStartAll()
{
    # do not start if toastermain points to a valid process
    if ! cat "${BUILDDIR}/.toastermain.pid" 2>/dev/null | xargs -I{} kill -0 {} ; then
        retval=1
        rm "${BUILDDIR}/.toastermain.pid"
    fi

    retval=0
    if [ "$TOASTER_MANAGED" '=' '1' ]; then
        python $BBBASEDIR/lib/toaster/manage.py syncdb || retval=1
    else
        python $BBBASEDIR/lib/toaster/manage.py syncdb --noinput || retval=1
    fi
    python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=2
    if [ $retval -eq 1 ]; then
        echo "Failed db sync, stopping system start" 1>&2
    elif [ $retval -eq 2 ]; then
        printf "\nError on migration, trying to recover... \n"
        python $BBBASEDIR/lib/toaster/manage.py migrate orm 0001_initial --fake
        retval=0
        python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=1
    fi
    if [ "$TOASTER_MANAGED" = '1' ]; then
        python $BBBASEDIR/lib/toaster/manage.py migrate bldcontrol || retval=1
        python $BBBASEDIR/lib/toaster/manage.py checksettings  --traceback || retval=1
    fi
    if [ $retval -eq 0 ]; then
        echo "Starting webserver..."
        python $BBBASEDIR/lib/toaster/manage.py runserver "0.0.0.0:$WEB_PORT" </dev/null >>${BUILDDIR}/toaster_web.log 2>&1 & echo $! >${BUILDDIR}/.toastermain.pid
        sleep 1
        if ! cat "${BUILDDIR}/.toastermain.pid" | xargs -I{} kill -0 {} ; then
            retval=1
            rm "${BUILDDIR}/.toastermain.pid"
        else
            echo "Webserver address:  http://0.0.0.0:$WEB_PORT/"
        fi
    fi
    return $retval
}

# Helper functions to add a special configuration file

addtoConfiguration()
{
    file=$1
    shift
    echo "#Created by toaster start script" > ${BUILDDIR}/conf/$file
    for var in "$@"; do echo $var >> ${BUILDDIR}/conf/$file; done
}

INSTOPSYSTEM=0

# define the stop command
stop_system()
{
    # prevent reentry
    if [ $INSTOPSYSTEM -eq 1 ]; then return; fi
    INSTOPSYSTEM=1
    if [ -f ${BUILDDIR}/.toasterui.pid ]; then
        kill `cat ${BUILDDIR}/.toasterui.pid` 2>/dev/null
        rm ${BUILDDIR}/.toasterui.pid
    fi
    BBSERVER=0.0.0.0:-1 bitbake -m
    unset BBSERVER
    webserverKillAll
    # force stop any misbehaving bitbake server
    lsof bitbake.lock | awk '{print $2}' | grep "[0-9]\+" | xargs -n1 -r kill
    trap - SIGHUP
    #trap - SIGCHLD
    INSTOPSYSTEM=0
}

check_pidbyfile() {
    [ -e $1 ] && kill -0 `cat $1` 2>/dev/null
}


notify_chldexit() {
    if [ $NOTOASTERUI -eq 0 ]; then
        check_pidbyfile ${BUILDDIR}/.toasterui.pid && return
        stop_system
    fi
}


verify_prereq() {
    # Verify prerequisites

    if ! echo "import django; print (1,) == django.VERSION[0:1] and django.VERSION[1:2][0] in (6,)" | python 2>/dev/null | grep True >/dev/null; then
        printf "This program needs Django 1.6. Please install with\n\npip install django==1.6\n"
        return 2
    fi

    if ! echo "import south; print reduce(lambda x, y: 2 if x==2 else 0 if x == 0 else y, map(lambda x: 1+cmp(x[1]-x[0],0), zip([0,8,4], map(int,south.__version__.split(\".\"))))) > 0" | python 2>/dev/null | grep True >/dev/null; then
        printf "This program needs South 0.8.4. Please install with\n\npip install south==0.8.4\n"
        return 2
    fi
    return 0
}


# read command line parameters
if [ -n "$BASH_SOURCE" ] ; then
    TOASTER=${BASH_SOURCE}
elif [ -n "$ZSH_NAME" ] ; then
    TOASTER=${(%):-%x}
else
    TOASTER=$0
fi

BBBASEDIR=`dirname $TOASTER`/..

RUNNING=0

NOTOASTERUI=0
WEBSERVER=1
TOASTER_BRBE=""
WEB_PORT="8000"
NOBROWSER=0

for param in $*; do
    case $param in
    noui )
            NOTOASTERUI=1
    ;;
    noweb )
            WEBSERVER=0
    ;;
    nobrowser )
            NOBROWSER=1
    ;;
    brbe=* )
            TOASTER_BRBE=$'\n'"TOASTER_BRBE=\""${param#*=}"\""
    ;;
    webport=*)
            WEB_PORT="${param#*=}"
    esac
done

[ -n "${BASH_SOURCE}" ] && SRCFILE=${BASH_SOURCE} || SRCFILE=$_

if [ `basename \"$0\"` = `basename \"${SRCFILE}\"` ]; then
    # We are called as standalone. We refuse to run in a build environment - we need the interactive mode for that.
    # Start just the web server, point the web browser to the interface, and start any Django services.

    if ! verify_prereq; then
        echo "Error: Could not verify that the needed dependencies are installed. Please use virtualenv and pip to install dependencies listed in toaster-requirements.txt" 1>&2
        exit 1
    fi

    if [ -n "$BUILDDIR" ]; then
        printf "Error: It looks like you sourced oe-init-build-env. Toaster cannot start in build mode from an oe-core build environment.\n You should be starting Toaster from a new terminal window." 1>&2
        exit 1
    fi

    # Define a fake builddir where only the pid files are actually created. No real builds will take place here.
    BUILDDIR=/tmp/toaster_$$
    if [ -d "$BUILDDIR" ]; then
        echo "Previous toaster run directory $BUILDDIR found, cowardly refusing to start. Please remove the directory when that toaster instance is over" 2>&1
        exit 1
    fi

    mkdir -p "$BUILDDIR"

    RUNNING=1
    trap_ctrlc() {
        echo "** Stopping system"
        webserverKillAll
        RUNNING=0
    }

    do_cleanup() {
        find "$BUILDDIR" -type f | xargs rm
        rmdir "$BUILDDIR"
    }
    cleanup() {
        if grep -ir error "$BUILDDIR" >/dev/null; then
            if grep -irn "That port is already in use" "$BUILDDIR"; then
                echo "You can use the \"webport=PORTNUMBER\" parameter to start Toaster on a different port (port $WEB_PORT is already in use)"
                do_cleanup
            else
                printf "\nErrors found in the Toaster log files present in '$BUILDDIR'. Directory will not be cleaned.\n Please review the errors and notify toaster@yoctoproject.org or submit a bug https://bugzilla.yoctoproject.org/enter_bug.cgi?product=Toaster"
            fi
        else
            echo "No errors found, removing the run directory '$BUILDDIR'"
            do_cleanup
        fi
    }
    TOASTER_MANAGED=1
    export TOASTER_MANAGED=1
    if [ $WEBSERVER -gt 0 ] && ! webserverStartAll; then
        echo "Failed to start the web server, stopping" 1>&2
        cleanup
        exit 1
    fi
    if [ $WEBSERVER -gt 0 ] && [ $NOBROWSER -eq 0 ]  ; then
        echo "Starting browser..."
        xdg-open http://127.0.0.1:$WEB_PORT/ >/dev/null 2>&1 &
    fi
    trap trap_ctrlc 2
    echo "Toaster is now running. You can stop it with Ctrl-C"
    while [ $RUNNING -gt 0 ]; do
        python $BBBASEDIR/lib/toaster/manage.py runbuilds 2>&1 | tee -a "$BUILDDIR/toaster.log"
        sleep 1
    done
    cleanup
    echo "**** Exit"
    exit 0
fi


if ! verify_prereq; then
    echo "Error: Could not verify that the needed dependencies are installed. Please use virtualenv and pip to install dependencies listed in toaster-requirements.txt" 1>&2
    return 1
fi


# We make sure we're running in the current shell and in a good environment
if [ -z "$BUILDDIR" ] ||  ! which bitbake >/dev/null 2>&1 ; then
    echo "Error: Build environment is not setup or bitbake is not in path." 1>&2
    return 2
fi


# Determine the action. If specified by arguments, fine, if not, toggle it
if [ "$1" = 'start' ] || [ "$1" = 'stop' ]; then
    CMD="$1"
else
    if [ -z "$BBSERVER" ]; then
        CMD="start"
    else
        CMD="stop"
    fi
fi

echo "The system will $CMD."

# Make sure it's safe to run by checking bitbake lock

lock=1
if [ -e $BUILDDIR/bitbake.lock ]; then
    python -c "import fcntl; fcntl.flock(open(\"$BUILDDIR/bitbake.lock\"), fcntl.LOCK_EX|fcntl.LOCK_NB)" 2>/dev/null || lock=0
fi

if [ ${CMD} = 'start' ] && [ $lock -eq 0 ]; then
    echo "Error: bitbake lock state error. File locks show that the system is on." 1>&2
    echo "Please wait for the current build to finish, stop and then start the system again." 1>&2
    return 3
fi

if [ ${CMD} = 'start' ] && [ -e $BUILDDIR/.toastermain.pid ] && kill -0 `cat $BUILDDIR/.toastermain.pid`; then
    echo "Warning: bitbake appears to be dead, but the Toaster web server is running. Something fishy is going on." 1>&2
    echo "Cleaning up the web server to start from a clean slate."
    webserverKillAll
fi


# Execute the commands

case $CMD in
    start )
        start_success=1
        addtoConfiguration toaster.conf "INHERIT+=\"toaster buildhistory\"" $TOASTER_BRBE
        if [ $WEBSERVER -gt 0 ] && ! webserverStartAll; then
            echo "Failed ${CMD}."
            return 4
        fi
        unset BBSERVER
        PREREAD=""
        if [ -e ${BUILDDIR}/conf/toaster-pre.conf ]; then
            rm ${BUILDDIR}/conf/toaster-pre.conf
        fi
        bitbake $PREREAD --postread conf/toaster.conf --server-only -t xmlrpc -B 0.0.0.0:0
        if [ $? -ne 0 ]; then
            start_success=0
            echo "Bitbake server start failed"
        else
            export BBSERVER=0.0.0.0:-1
            if [ $NOTOASTERUI -eq 0 ]; then        # we start the TOASTERUI only if not inhibited
                bitbake --observe-only -u toasterui >>${BUILDDIR}/toaster_ui.log 2>&1 & echo $! >${BUILDDIR}/.toasterui.pid
            fi
        fi
        if [ $start_success -eq 1 ]; then
            # set fail safe stop system on terminal exit
            trap stop_system SIGHUP
            echo "Successful ${CMD}."
            return 0
        else
            # failed start, do stop
            stop_system
            echo "Failed ${CMD}."
            return 1
        fi
        # stop system on terminal exit
        set -o monitor
        trap stop_system SIGHUP
        #trap notify_chldexit SIGCHLD
    ;;
    stop )
        stop_system
        echo "Successful ${CMD}."
    ;;
esac

