123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- #!/bin/echo ERROR: This script needs to be sourced. Please run as .
- # toaster - shell script to start Toaster
- # Copyright (C) 2013-2015 Intel Corp.
- #
- # SPDX-License-Identifier: GPL-2.0-or-later
- #
- HELP="
- Usage: source toaster start|stop [webport=<address:port>] [noweb] [nobuild] [toasterdir]
- Optional arguments:
- [nobuild] Setup the environment for capturing builds with toaster but disable managed builds
- [noweb] Setup the environment for capturing builds with toaster but don't start the web server
- [webport] Set the development server (default: localhost:8000)
- [toasterdir] Set absolute path to be used as TOASTER_DIR (default: BUILDDIR/../)
- "
- custom_extention()
- {
- custom_extension=$BBBASEDIR/lib/toaster/orm/fixtures/custom_toaster_append.sh
- if [ -f $custom_extension ] ; then
- $custom_extension $*
- fi
- }
- databaseCheck()
- {
- retval=0
- # you can always add a superuser later via
- # ../bitbake/lib/toaster/manage.py createsuperuser --username=<ME>
- $MANAGE migrate --noinput || retval=1
- if [ $retval -eq 1 ]; then
- echo "Failed migrations, aborting system start" 1>&2
- return $retval
- fi
- # Make sure that checksettings can pick up any value for TEMPLATECONF
- export TEMPLATECONF
- $MANAGE checksettings --traceback || retval=1
- if [ $retval -eq 1 ]; then
- printf "\nError while checking settings; aborting\n"
- return $retval
- fi
- return $retval
- }
- webserverKillAll()
- {
- local pidfile
- if [ -f ${BUILDDIR}/.toastermain.pid ] ; then
- custom_extention web_stop_postpend
- else
- custom_extention noweb_stop_postpend
- fi
- for pidfile in ${BUILDDIR}/.toastermain.pid ${BUILDDIR}/.runbuilds.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
- 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
- # check the database
- databaseCheck || return 1
- echo "Starting webserver..."
- $MANAGE runserver --noreload "$ADDR_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 "Toaster development webserver started at http://$ADDR_PORT"
- echo -e "\nYou can now run 'bitbake <target>' on the command line and monitor your build in Toaster.\nYou can also use a Toaster project to configure and run a build.\n"
- custom_extention web_start_postpend $ADDR_PORT
- fi
- return $retval
- }
- INSTOPSYSTEM=0
- # define the stop command
- stop_system()
- {
- # prevent reentry
- if [ $INSTOPSYSTEM -eq 1 ]; then return; fi
- INSTOPSYSTEM=1
- webserverKillAll
- # unset exported variables
- unset TOASTER_DIR
- unset BITBAKE_UI
- unset BBBASEDIR
- trap - SIGHUP
- #trap - SIGCHLD
- INSTOPSYSTEM=0
- }
- verify_prereq() {
- # Verify Django version
- reqfile=$(python3 -c "import os; print(os.path.realpath('$BBBASEDIR/toaster-requirements.txt'))")
- exp='s/Django\([><=]\+\)\([^,]\+\),\([><=]\+\)\(.\+\)/'
- # expand version parts to 2 digits to support 1.10.x > 1.8
- # (note:helper functions hard to insert in-line)
- exp=$exp'import sys,django;'
- exp=$exp'version=["%02d" % int(n) for n in django.get_version().split(".")];'
- exp=$exp'vmin=["%02d" % int(n) for n in "\2".split(".")];'
- exp=$exp'vmax=["%02d" % int(n) for n in "\4".split(".")];'
- exp=$exp'sys.exit(not (version \1 vmin and version \3 vmax))'
- exp=$exp'/p'
- if ! sed -n "$exp" $reqfile | python3 - ; then
- req=`grep ^Django $reqfile`
- echo "This program needs $req"
- echo "Please install with pip3 install -r $reqfile"
- 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
- export BBBASEDIR=`dirname $TOASTER`/..
- MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py"
- if [ -z "$OE_ROOT" ]; then
- OE_ROOT=`dirname $TOASTER`/../..
- fi
- # this is the configuraton file we are using for toaster
- # we are using the same logic that oe-setup-builddir uses
- # (based on TEMPLATECONF and .templateconf) to determine
- # which toasterconf.json to use.
- # note: There are a number of relative path assumptions
- # in the local layers that currently make using an arbitrary
- # toasterconf.json difficult.
- . $OE_ROOT/.templateconf
- if [ -n "$TEMPLATECONF" ]; then
- if [ ! -d "$TEMPLATECONF" ]; then
- # Allow TEMPLATECONF=meta-xyz/conf as a shortcut
- if [ -d "$OE_ROOT/$TEMPLATECONF" ]; then
- TEMPLATECONF="$OE_ROOT/$TEMPLATECONF"
- fi
- fi
- fi
- unset OE_ROOT
- WEBSERVER=1
- export TOASTER_BUILDSERVER=1
- ADDR_PORT="localhost:8000"
- TOASTERDIR=`dirname $BUILDDIR`
- unset CMD
- for param in $*; do
- case $param in
- noweb )
- WEBSERVER=0
- ;;
- nobuild )
- TOASTER_BUILDSERVER=0
- ;;
- start )
- CMD=$param
- ;;
- stop )
- CMD=$param
- ;;
- webport=*)
- ADDR_PORT="${param#*=}"
- # Split the addr:port string
- ADDR=`echo $ADDR_PORT | cut -f 1 -d ':'`
- PORT=`echo $ADDR_PORT | cut -f 2 -d ':'`
- # If only a port has been speified then set address to localhost.
- if [ $ADDR = $PORT ] ; then
- ADDR_PORT="localhost:$PORT"
- fi
- ;;
- toasterdir=*)
- TOASTERDIR="${param#*=}"
- ;;
- --help)
- echo "$HELP"
- return 0
- ;;
- *)
- echo "$HELP"
- return 1
- ;;
- esac
- done
- if [ `basename \"$0\"` = `basename \"${TOASTER}\"` ]; then
- echo "Error: This script needs to be sourced. Please run as . $TOASTER"
- return 1
- fi
- verify_prereq || return 1
- # 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
- # 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
- export TOASTER_DIR=$TOASTERDIR
- export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE TOASTER_DIR"
- # Determine the action. If specified by arguments, fine, if not, toggle it
- if [ "$CMD" = "start" ] ; then
- if [ -n "$BBSERVER" ]; then
- echo " Toaster is already running. Exiting..."
- return 1
- fi
- elif [ "$CMD" = "" ]; then
- echo "No command specified"
- echo "$HELP"
- return 1
- fi
- echo "The system will $CMD."
- # Execute the commands
- custom_extention toaster_prepend $CMD $ADDR_PORT
- case $CMD in
- start )
- # check if addr:port is not in use
- if [ "$CMD" == 'start' ]; then
- if [ $WEBSERVER -gt 0 ]; then
- $MANAGE checksocket "$ADDR_PORT" || return 1
- fi
- fi
- # Create configuration file
- conf=${BUILDDIR}/conf/local.conf
- line='INHERIT+="toaster buildhistory"'
- grep -q "$line" $conf || echo $line >> $conf
- if [ $WEBSERVER -eq 0 ] ; then
- # Do not update the database for "noweb" unless
- # it does not yet exist
- if [ ! -f "$TOASTER_DIR/toaster.sqlite" ] ; then
- if ! databaseCheck; then
- echo "Failed ${CMD}."
- return 4
- fi
- fi
- custom_extention noweb_start_postpend $ADDR_PORT
- fi
- if [ $WEBSERVER -gt 0 ] && ! webserverStartAll; then
- echo "Failed ${CMD}."
- return 4
- fi
- export BITBAKE_UI='toasterui'
- if [ $TOASTER_BUILDSERVER -eq 1 ] ; then
- $MANAGE runbuilds \
- </dev/null >>${BUILDDIR}/toaster_runbuilds.log 2>&1 \
- & echo $! >${BUILDDIR}/.runbuilds.pid
- else
- echo "Toaster build server not started."
- fi
- # set fail safe stop system on terminal exit
- trap stop_system SIGHUP
- echo "Successful ${CMD}."
- custom_extention toaster_postpend $CMD $ADDR_PORT
- return 0
- ;;
- stop )
- stop_system
- echo "Successful ${CMD}."
- ;;
- esac
- custom_extention toaster_postpend $CMD $ADDR_PORT
|