1#!/bin/echo ERROR: This script needs to be sourced. Please run as . 2 3# toaster - shell script to start Toaster 4 5# Copyright (C) 2013-2015 Intel Corp. 6 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see http://www.gnu.org/licenses/. 19 20HELP=" 21Usage: source toaster start|stop [webport=<address:port>] [noweb] [nobuild] [toasterdir] 22 Optional arguments: 23 [nobuild] Setup the environment for capturing builds with toaster but disable managed builds 24 [noweb] Setup the environment for capturing builds with toaster but don't start the web server 25 [webport] Set the development server (default: localhost:8000) 26 [toasterdir] Set absolute path to be used as TOASTER_DIR (default: BUILDDIR/../) 27" 28 29custom_extention() 30{ 31 custom_extension=$BBBASEDIR/lib/toaster/orm/fixtures/custom_toaster_append.sh 32 if [ -f $custom_extension ] ; then 33 $custom_extension $* 34 fi 35} 36 37databaseCheck() 38{ 39 retval=0 40 # you can always add a superuser later via 41 # ../bitbake/lib/toaster/manage.py createsuperuser --username=<ME> 42 $MANAGE migrate --noinput || retval=1 43 44 if [ $retval -eq 1 ]; then 45 echo "Failed migrations, aborting system start" 1>&2 46 return $retval 47 fi 48 # Make sure that checksettings can pick up any value for TEMPLATECONF 49 export TEMPLATECONF 50 $MANAGE checksettings --traceback || retval=1 51 52 if [ $retval -eq 1 ]; then 53 printf "\nError while checking settings; aborting\n" 54 return $retval 55 fi 56 57 return $retval 58} 59 60webserverKillAll() 61{ 62 local pidfile 63 if [ -f ${BUILDDIR}/.toastermain.pid ] ; then 64 custom_extention web_stop_postpend 65 else 66 custom_extention noweb_stop_postpend 67 fi 68 for pidfile in ${BUILDDIR}/.toastermain.pid ${BUILDDIR}/.runbuilds.pid; do 69 if [ -f ${pidfile} ]; then 70 pid=`cat ${pidfile}` 71 while kill -0 $pid 2>/dev/null; do 72 kill -SIGTERM $pid 2>/dev/null 73 sleep 1 74 done 75 rm ${pidfile} 76 fi 77 done 78} 79 80webserverStartAll() 81{ 82 # do not start if toastermain points to a valid process 83 if ! cat "${BUILDDIR}/.toastermain.pid" 2>/dev/null | xargs -I{} kill -0 {} ; then 84 retval=1 85 rm "${BUILDDIR}/.toastermain.pid" 86 fi 87 88 retval=0 89 90 # check the database 91 databaseCheck || return 1 92 93 echo "Starting webserver..." 94 95 $MANAGE runserver --noreload "$ADDR_PORT" \ 96 </dev/null >>${BUILDDIR}/toaster_web.log 2>&1 \ 97 & echo $! >${BUILDDIR}/.toastermain.pid 98 99 sleep 1 100 101 if ! cat "${BUILDDIR}/.toastermain.pid" | xargs -I{} kill -0 {} ; then 102 retval=1 103 rm "${BUILDDIR}/.toastermain.pid" 104 else 105 echo "Toaster development webserver started at http://$ADDR_PORT" 106 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" 107 custom_extention web_start_postpend $ADDR_PORT 108 fi 109 110 return $retval 111} 112 113INSTOPSYSTEM=0 114 115# define the stop command 116stop_system() 117{ 118 # prevent reentry 119 if [ $INSTOPSYSTEM -eq 1 ]; then return; fi 120 INSTOPSYSTEM=1 121 webserverKillAll 122 # unset exported variables 123 unset TOASTER_DIR 124 unset BITBAKE_UI 125 unset BBBASEDIR 126 trap - SIGHUP 127 #trap - SIGCHLD 128 INSTOPSYSTEM=0 129} 130 131verify_prereq() { 132 # Verify Django version 133 reqfile=$(python3 -c "import os; print(os.path.realpath('$BBBASEDIR/toaster-requirements.txt'))") 134 exp='s/Django\([><=]\+\)\([^,]\+\),\([><=]\+\)\(.\+\)/' 135 # expand version parts to 2 digits to support 1.10.x > 1.8 136 # (note:helper functions hard to insert in-line) 137 exp=$exp'import sys,django;' 138 exp=$exp'version=["%02d" % int(n) for n in django.get_version().split(".")];' 139 exp=$exp'vmin=["%02d" % int(n) for n in "\2".split(".")];' 140 exp=$exp'vmax=["%02d" % int(n) for n in "\4".split(".")];' 141 exp=$exp'sys.exit(not (version \1 vmin and version \3 vmax))' 142 exp=$exp'/p' 143 if ! sed -n "$exp" $reqfile | python3 - ; then 144 req=`grep ^Django $reqfile` 145 echo "This program needs $req" 146 echo "Please install with pip3 install -r $reqfile" 147 return 2 148 fi 149 150 return 0 151} 152 153# read command line parameters 154if [ -n "$BASH_SOURCE" ] ; then 155 TOASTER=${BASH_SOURCE} 156elif [ -n "$ZSH_NAME" ] ; then 157 TOASTER=${(%):-%x} 158else 159 TOASTER=$0 160fi 161 162export BBBASEDIR=`dirname $TOASTER`/.. 163MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py" 164if [ -z "$OE_ROOT" ]; then 165 OE_ROOT=`dirname $TOASTER`/../.. 166fi 167 168# this is the configuraton file we are using for toaster 169# we are using the same logic that oe-setup-builddir uses 170# (based on TEMPLATECONF and .templateconf) to determine 171# which toasterconf.json to use. 172# note: There are a number of relative path assumptions 173# in the local layers that currently make using an arbitrary 174# toasterconf.json difficult. 175 176. $OE_ROOT/.templateconf 177if [ -n "$TEMPLATECONF" ]; then 178 if [ ! -d "$TEMPLATECONF" ]; then 179 # Allow TEMPLATECONF=meta-xyz/conf as a shortcut 180 if [ -d "$OE_ROOT/$TEMPLATECONF" ]; then 181 TEMPLATECONF="$OE_ROOT/$TEMPLATECONF" 182 fi 183 fi 184fi 185 186unset OE_ROOT 187 188 189WEBSERVER=1 190export TOASTER_BUILDSERVER=1 191ADDR_PORT="localhost:8000" 192TOASTERDIR=`dirname $BUILDDIR` 193unset CMD 194for param in $*; do 195 case $param in 196 noweb ) 197 WEBSERVER=0 198 ;; 199 nobuild ) 200 TOASTER_BUILDSERVER=0 201 ;; 202 start ) 203 CMD=$param 204 ;; 205 stop ) 206 CMD=$param 207 ;; 208 webport=*) 209 ADDR_PORT="${param#*=}" 210 # Split the addr:port string 211 ADDR=`echo $ADDR_PORT | cut -f 1 -d ':'` 212 PORT=`echo $ADDR_PORT | cut -f 2 -d ':'` 213 # If only a port has been speified then set address to localhost. 214 if [ $ADDR = $PORT ] ; then 215 ADDR_PORT="localhost:$PORT" 216 fi 217 ;; 218 toasterdir=*) 219 TOASTERDIR="${param#*=}" 220 ;; 221 --help) 222 echo "$HELP" 223 return 0 224 ;; 225 *) 226 echo "$HELP" 227 return 1 228 ;; 229 230 esac 231done 232 233if [ `basename \"$0\"` = `basename \"${TOASTER}\"` ]; then 234 echo "Error: This script needs to be sourced. Please run as . $TOASTER" 235 return 1 236fi 237 238verify_prereq || return 1 239 240# We make sure we're running in the current shell and in a good environment 241if [ -z "$BUILDDIR" ] || ! which bitbake >/dev/null 2>&1 ; then 242 echo "Error: Build environment is not setup or bitbake is not in path." 1>&2 243 return 2 244fi 245 246# this defines the dir toaster will use for 247# 1) clones of layers (in _toaster_clones ) 248# 2) the build dir (in build) 249# 3) the sqlite db if that is being used. 250# 4) pid's we need to clean up on exit/shutdown 251export TOASTER_DIR=$TOASTERDIR 252export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE TOASTER_DIR" 253 254# Determine the action. If specified by arguments, fine, if not, toggle it 255if [ "$CMD" = "start" ] ; then 256 if [ -n "$BBSERVER" ]; then 257 echo " Toaster is already running. Exiting..." 258 return 1 259fi 260elif [ "$CMD" = "" ]; then 261 echo "No command specified" 262 echo "$HELP" 263 return 1 264fi 265 266echo "The system will $CMD." 267 268# Execute the commands 269custom_extention toaster_prepend $CMD $ADDR_PORT 270 271case $CMD in 272 start ) 273 # check if addr:port is not in use 274 if [ "$CMD" == 'start' ]; then 275 if [ $WEBSERVER -gt 0 ]; then 276 $MANAGE checksocket "$ADDR_PORT" || return 1 277 fi 278 fi 279 280 # Create configuration file 281 conf=${BUILDDIR}/conf/local.conf 282 line='INHERIT+="toaster buildhistory"' 283 grep -q "$line" $conf || echo $line >> $conf 284 285 if [ $WEBSERVER -eq 0 ] ; then 286 # Do not update the database for "noweb" unless 287 # it does not yet exist 288 if [ ! -f "$TOASTER_DIR/toaster.sqlite" ] ; then 289 if ! databaseCheck; then 290 echo "Failed ${CMD}." 291 return 4 292 fi 293 fi 294 custom_extention noweb_start_postpend $ADDR_PORT 295 fi 296 if [ $WEBSERVER -gt 0 ] && ! webserverStartAll; then 297 echo "Failed ${CMD}." 298 return 4 299 fi 300 export BITBAKE_UI='toasterui' 301 if [ $TOASTER_BUILDSERVER -eq 1 ] ; then 302 $MANAGE runbuilds \ 303 </dev/null >>${BUILDDIR}/toaster_runbuilds.log 2>&1 \ 304 & echo $! >${BUILDDIR}/.runbuilds.pid 305 else 306 echo "Toaster build server not started." 307 fi 308 309 # set fail safe stop system on terminal exit 310 trap stop_system SIGHUP 311 echo "Successful ${CMD}." 312 custom_extention toaster_postpend $CMD $ADDR_PORT 313 return 0 314 ;; 315 stop ) 316 stop_system 317 echo "Successful ${CMD}." 318 ;; 319esac 320custom_extention toaster_postpend $CMD $ADDR_PORT 321 322