blob: ecf66fa51f27bbdd1456cefb6468dc579b76aadc [file] [log] [blame]
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001#!/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.
Patrick Williamsc124f4f2015-09-15 14:41:29 -05006
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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050018# along with this program. If not, see http://www.gnu.org/licenses/.
Patrick Williamsc124f4f2015-09-15 14:41:29 -050019
Patrick Williamsc0f7c042017-02-23 20:41:17 -060020HELP="
Brad Bishop5dd7cbb2018-09-05 22:26:40 -070021Usage: source toaster start|stop [webport=<address:port>] [noweb] [nobuild] [toasterdir]
Patrick Williamsc0f7c042017-02-23 20:41:17 -060022 Optional arguments:
Brad Bishopd7bf8c12018-02-25 22:55:05 -050023 [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
Patrick Williamsc0f7c042017-02-23 20:41:17 -060025 [webport] Set the development server (default: localhost:8000)
Brad Bishop5dd7cbb2018-09-05 22:26:40 -070026 [toasterdir] Set absolute path to be used as TOASTER_DIR (default: BUILDDIR/../)
Patrick Williamsc0f7c042017-02-23 20:41:17 -060027"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050028
Brad Bishopd7bf8c12018-02-25 22:55:05 -050029custom_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
Brad Bishop6e60e8b2018-02-01 10:27:11 -050037databaseCheck()
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
Patrick Williamsc124f4f2015-09-15 14:41:29 -050060webserverKillAll()
61{
62 local pidfile
Brad Bishopd7bf8c12018-02-25 22:55:05 -050063 if [ -f ${BUILDDIR}/.toastermain.pid ] ; then
64 custom_extention web_stop_postpend
65 else
66 custom_extention noweb_stop_postpend
67 fi
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050068 for pidfile in ${BUILDDIR}/.toastermain.pid ${BUILDDIR}/.runbuilds.pid; do
Patrick Williamsc124f4f2015-09-15 14:41:29 -050069 if [ -f ${pidfile} ]; then
70 pid=`cat ${pidfile}`
71 while kill -0 $pid 2>/dev/null; do
Brad Bishop316dfdd2018-06-25 12:45:53 -040072 kill -SIGTERM $pid 2>/dev/null
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073 sleep 1
Patrick Williamsc124f4f2015-09-15 14:41:29 -050074 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
Patrick Williamsf1e5d692016-03-30 15:21:19 -050089
Brad Bishop6e60e8b2018-02-01 10:27:11 -050090 # check the database
91 databaseCheck || return 1
Patrick Williamsf1e5d692016-03-30 15:21:19 -050092
93 echo "Starting webserver..."
94
Brad Bishop316dfdd2018-06-25 12:45:53 -040095 $MANAGE runserver --noreload "$ADDR_PORT" \
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050096 </dev/null >>${BUILDDIR}/toaster_web.log 2>&1 \
97 & echo $! >${BUILDDIR}/.toastermain.pid
Patrick Williamsf1e5d692016-03-30 15:21:19 -050098
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
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600105 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"
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500107 custom_extention web_start_postpend $ADDR_PORT
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500108 fi
109
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500110 return $retval
111}
112
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500113INSTOPSYSTEM=0
114
115# define the stop command
116stop_system()
117{
118 # prevent reentry
119 if [ $INSTOPSYSTEM -eq 1 ]; then return; fi
120 INSTOPSYSTEM=1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500121 webserverKillAll
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500122 # unset exported variables
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500123 unset TOASTER_DIR
124 unset BITBAKE_UI
125 unset BBBASEDIR
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500126 trap - SIGHUP
127 #trap - SIGCHLD
128 INSTOPSYSTEM=0
129}
130
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500131verify_prereq() {
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500132 # Verify Django version
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600133 reqfile=$(python3 -c "import os; print(os.path.realpath('$BBBASEDIR/toaster-requirements.txt'))")
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500134 exp='s/Django\([><=]\+\)\([^,]\+\),\([><=]\+\)\(.\+\)/'
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500135 # 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'
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600143 if ! sed -n "$exp" $reqfile | python3 - ; then
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500144 req=`grep ^Django $reqfile`
145 echo "This program needs $req"
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500146 echo "Please install with pip3 install -r $reqfile"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500147 return 2
148 fi
149
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500150 return 0
151}
152
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500153# 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500162export BBBASEDIR=`dirname $TOASTER`/..
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600163MANAGE="python3 $BBBASEDIR/lib/toaster/manage.py"
Brad Bishopc4ea0752018-11-15 14:30:15 -0800164if [ -z "$OE_ROOT" ]; then
165 OE_ROOT=`dirname $TOASTER`/../..
166fi
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500167
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500168# this is the configuraton file we are using for toaster
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500169# 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
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600176. $OE_ROOT/.templateconf
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500177if [ -n "$TEMPLATECONF" ]; then
178 if [ ! -d "$TEMPLATECONF" ]; then
179 # Allow TEMPLATECONF=meta-xyz/conf as a shortcut
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600180 if [ -d "$OE_ROOT/$TEMPLATECONF" ]; then
181 TEMPLATECONF="$OE_ROOT/$TEMPLATECONF"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500182 fi
183 fi
184fi
185
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600186unset OE_ROOT
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500187
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500188
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500189WEBSERVER=1
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500190export TOASTER_BUILDSERVER=1
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600191ADDR_PORT="localhost:8000"
Brad Bishop5dd7cbb2018-09-05 22:26:40 -0700192TOASTERDIR=`dirname $BUILDDIR`
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500193unset CMD
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500194for param in $*; do
195 case $param in
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500196 noweb )
197 WEBSERVER=0
198 ;;
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500199 nobuild )
200 TOASTER_BUILDSERVER=0
201 ;;
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500202 start )
203 CMD=$param
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500204 ;;
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500205 stop )
206 CMD=$param
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500207 ;;
208 webport=*)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600209 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 ;;
Brad Bishop5dd7cbb2018-09-05 22:26:40 -0700218 toasterdir=*)
219 TOASTERDIR="${param#*=}"
220 ;;
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600221 --help)
222 echo "$HELP"
223 return 0
224 ;;
225 *)
226 echo "$HELP"
227 return 1
228 ;;
229
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500230 esac
231done
232
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500233if [ `basename \"$0\"` = `basename \"${TOASTER}\"` ]; then
234 echo "Error: This script needs to be sourced. Please run as . $TOASTER"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500235 return 1
236fi
237
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500238verify_prereq || return 1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500239
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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500246# 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
Brad Bishop5dd7cbb2018-09-05 22:26:40 -0700251export TOASTER_DIR=$TOASTERDIR
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500252export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE TOASTER_DIR"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500253
254# Determine the action. If specified by arguments, fine, if not, toggle it
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500255if [ "$CMD" = "start" ] ; then
256 if [ -n "$BBSERVER" ]; then
257 echo " Toaster is already running. Exiting..."
258 return 1
259fi
260elif [ "$CMD" = "" ]; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600261 echo "No command specified"
262 echo "$HELP"
263 return 1
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500264fi
265
266echo "The system will $CMD."
267
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500268# Execute the commands
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500269custom_extention toaster_prepend $CMD $ADDR_PORT
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500270
271case $CMD in
272 start )
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500273 # check if addr:port is not in use
274 if [ "$CMD" == 'start' ]; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600275 if [ $WEBSERVER -gt 0 ]; then
276 $MANAGE checksocket "$ADDR_PORT" || return 1
277 fi
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500278 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
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500285 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}."
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500291 return 4
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500292 fi
293 fi
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500294 custom_extention noweb_start_postpend $ADDR_PORT
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500295 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500296 if [ $WEBSERVER -gt 0 ] && ! webserverStartAll; then
297 echo "Failed ${CMD}."
298 return 4
299 fi
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500300 export BITBAKE_UI='toasterui'
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500301 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
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500308
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500309 # set fail safe stop system on terminal exit
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500310 trap stop_system SIGHUP
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500311 echo "Successful ${CMD}."
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500312 custom_extention toaster_postpend $CMD $ADDR_PORT
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500313 return 0
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500314 ;;
315 stop )
316 stop_system
317 echo "Successful ${CMD}."
318 ;;
319esac
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500320custom_extention toaster_postpend $CMD $ADDR_PORT
321