mirror of
https://git.yoctoproject.org/poky
synced 2026-02-08 18:02:12 +01:00
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>
204 lines
5.9 KiB
Bash
Executable File
204 lines
5.9 KiB
Bash
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
|
|
|
|
|