xref: /openbmc/openbmc/poky/bitbake/bin/toaster (revision 1a4b7ee2)
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