blob: ecf66fa51f27bbdd1456cefb6468dc579b76aadc [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001#!/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