Files
poky/bitbake/bin/toaster
Alexandru DAMIAN 6c294f0a2e bitbake: toaster: add two-stage commit startup logic
Toaster start script lunches multiple process components
of the toaster system.

This patch adds logic into the startup script to
safely fail startup and do proper cleanup on any error
that may happen during system start.

Bitbake needs to return 0 if it will successfully lunches
the server-mode.

(Bitbake rev: f43d284e7ae752049711d8215a6020bee6966d45)

Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2014-01-07 13:03:05 +00:00

5.9 KiB
Executable File

#!/bin/bash

(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 enables toaster event logging and

starts bitbake resident server

use as: source toaster [start|stop]

Helper function to kill a background toaster development server

function webserverKillAll() { local pidfile for pidfile in ${BUILDDIR}/.toastermain.pid; do if [ -f ${pidfile} ]; then while kill -0 $(< ${pidfile}) 2>/dev/null; do kill -SIGTERM -$(< ${pidfile}) 2>/dev/null sleep 1; done; rm ${pidfile} fi done }

function webserverStartAll() { retval=0 python $BBBASEDIR/lib/toaster/manage.py syncdb || retval=1 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 echo -e "\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 [ $retval -eq 0 ]; then python $BBBASEDIR/lib/toaster/manage.py runserver 0.0.0.0:8000 </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" fi fi return $retval }

Helper functions to add a special configuration file

function addtoConfiguration() { echo "#Created by toaster start script" > ${BUILDDIR}/conf/$2 echo $1 >> ${BUILDDIR}/conf/$2 }

define the stop command

function stop_system() { if [ -f ${BUILDDIR}/.toasterui.pid ]; then kill $(< ${BUILDDIR}/.toasterui.pid ) rm ${BUILDDIR}/.toasterui.pid fi BBSERVER=localhost:8200 bitbake -m unset BBSERVER webserverKillAll # force stop any misbehaving bitbake server lsof bitbake.lock | awk '{print $2}' | grep "[0-9]+" | xargs -n1 -r kill }

We make sure we're running in the current shell and in a good environment

if [ -z "$ZSH_NAME" ] && [ basename \"$0\" = basename \"$BASH_SOURCE\" ]; then echo "Error: This script needs to be sourced. Please run as 'source toaster [start|stop]'" 1>&2; exit 1 fi

if [ -z "$BUILDDIR" ] || [ -z which bitbake ]; then echo "Error: Build environment is not setup or bitbake is not in path." 1>&2; return 2 fi

BBBASEDIR=dirname ${BASH_SOURCE}/..

Verify prerequisites

if ! echo "import django; print (1,5) == django.VERSION[0:2]" | python 2>/dev/null | grep True >/dev/null; then echo -e "This program needs Django 1.5. Please install with\n\nsudo pip install django==1.5" return 2 fi

if ! echo "import south; print [0,8,4] == map(int,south.version.split("."))" | python 2>/dev/null | grep True >/dev/null; then echo -e "This program needs South 0.8.4. Please install with\n\nsudo pip install south==0.8.4" return 2 fi

Determine the action. If specified by arguments, fine, if not, toggle it

if [ "x$1" == "xstart" ] || [ "x$1" == "xstop" ]; then CMD="$1" else if [ -z "$BBSERVER" ]; then CMD="start" else CMD="stop" fi; fi

NOTOASTERUI=0 for param in $*; do case $param in noui ) NOTOASTERUI=1 ;; esac done

echo "The system will $CMD."

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

lock=1 if [ -e $BUILDDIR/bitbake.lock ]; then (flock -n 200 ) 200<$BUILDDIR/bitbake.lock || lock=0 fi

if [ ${CMD} == "start" ] && ( [ $lock -eq 0 ] || [ -e $BUILDDIR/.toastermain.pid ] ); then echo "Error: bitbake lock state error. System is already on." 2>&1 return 3 elif [ ${CMD} == "stop" ] && ( [ $lock -eq 1 ] || ! [ -e $BUILDDIR/.toastermain.pid ] ) ; then echo "Error: bitbake lock state error. Trying to stop a stopped system ? If you think the system is hanged up, you can try to manually stop system with the commands

BBSERVER=localhost:8200 bitbake -m

and

webserverKillAll

" 2>&1 return 3 fi

Execute the commands

case $CMD in start ) start_success=1 addtoConfiguration "INHERIT+="toaster buildhistory"" toaster.conf if ! webserverStartAll; then echo "Failed ${CMD}." return 4 fi unset BBSERVER bitbake --postread conf/toaster.conf --server-only -t xmlrpc -B localhost:8200 if [ $? -ne 0 ]; then start_success=0 echo "Bitbake server start failed" else export BBSERVER=localhost:8200 if [ $NOTOASTERUI == 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}." else # failed start, do stop stop_system echo "Failed ${CMD}." fi ;; stop ) stop_system trap '' SIGHUP echo "Successful ${CMD}." ;; esac