#!/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
    # you can always add a superuser later via
    # python bitbake/lib/toaster/manage.py python manage.py createsuperuser --username=<ME>
    python $BBBASEDIR/lib/toaster/manage.py syncdb --noinput || retval=1

    python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=2

    if [ $retval -eq 1 ]; then
        echo "Failed db sync, aborting system start" 1>&2
        return $retval
    fi

    python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=1

    if [ $retval -eq 1 ]; then
        printf "\nError on orm migration, rolling back...\n"
        python $BBBASEDIR/lib/toaster/manage.py migrate orm 0001_initial --fake
        return $retval
    fi

    python $BBBASEDIR/lib/toaster/manage.py migrate bldcontrol || retval=1

    if [ $retval -eq 1 ]; then
        printf "\nError on bldcontrol migration, rolling back...\n"
        python $BBBASEDIR/lib/toaster/manage.py migrate bldcontrol 0001_initial --fake
        return $retval
    fi

    if [ "$TOASTER_MANAGED" = '1' ]; then
        python $BBBASEDIR/lib/toaster/manage.py checksettings --traceback || retval=1
    fi

    if [ $retval -eq 1 ]; then
        printf "\nError while checking settings; aborting\n"
        return $retval
    fi

    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

    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

[ `basename \"$0\"` = `basename \"${TOASTER}\"` ] && TOASTER_MANAGED=1

BBBASEDIR=`dirname $TOASTER`/..

RUNNING=0

NOTOASTERUI=0
WEBSERVER=1
TOASTER_BRBE=""
if [ "$WEB_PORT" = "" ]; then
    WEB_PORT="8000"
fi
# this is the configuraton file we are using for toaster
# note default is assuming yocto. Override this if you are
# running in a pure OE environment and use the toasterconf.json
# in meta/conf/toasterconf.json
# note: for future there are a number of relative path assumptions
# in the local layers that currently prevent using an arbitrary
# toasterconf.json
if [ "$TOASTER_CONF" = "" ]; then
    TOASTER_CONF="$(dirname $TOASTER)/../../meta-yocto/conf/toasterconf.json"
    export TOASTER_CONF=$(python -c "import os; print os.path.realpath('$TOASTER_CONF')")
fi
if [ ! -f $TOASTER_CONF ]; then
    echo "$TOASTER_CONF configuration file not found. set TOASTER_CONF to specify a path"
    [ "$TOASTER_MANAGED" = '1' ] && exit 1 || return 1
fi
# this defines the dir toaster will use for
# 1) clones of layers (in _toaster_clones )
# 2) the build dir (in build)
# 3) the sqlite db if that is being used.
# 4) pid's we need to clean up on exit/shutdown
# note: for future. in order to make this an arbitrary directory, we need to
# make sure that the toaster.sqlite file doesn't default to `pwd` like it currently does.
export TOASTER_DIR=`pwd`


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

if [ "$TOASTER_MANAGED" = '1' ]; 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.\n" 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
    }
    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

