# # SPDX-License-Identifier: Apache-2.0 # # Copyright (C) 2015, ARM Limited and contributors. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # LISA Shell: the Linux Integrated System Analysis Shell # Setup colors source src/shell/lisa_colors # By default use internal libraries DEVMODE=${DEVMODE:-1} # Get base installation path of LISA export LISA_HOME="$(pwd)" # Run any android scripts before launching android_pre=$LISA_HOME/src/shell/android-pre.sh if [ -f $android_pre ]; then source $android_pre; fi export PYTHONPATH='' export PYTHONPATH=$LISA_HOME/libs/utils:$PYTHONPATH export PYTHONPATH=$LISA_HOME/libs/wlgen:$PYTHONPATH export PYTHONPATH=$LISA_HOME:$PYTHONPATH if [ "x$DEVMODE" == "x1" ]; then export PYTHONPATH=$LISA_HOME/libs/devlib:$PYTHONPATH export PYTHONPATH=$LISA_HOME/libs/trappy:$PYTHONPATH export PYTHONPATH=$LISA_HOME/libs/bart:$PYTHONPATH fi ################################################################################ # Generic LISA Shell commands ################################################################################ # LISA Shell On-Line HELP function lisa-help { clear echo -ne '\E[37;42m' echo " " echo " .:: LISA Shell - HELP On-Line ::. " echo " " echo -ne "$LISASHELL_RESET$LISASHELL_GREEN" cat $LISA_HOME/LisaShell.txt echo -ne "$LISASHELL_DEFAULT" } function lisa-version { echo -ne "$LISASHELL_GREEN" cat <<EOF .:: LISA ($(git describe --all)) Submodules version: $(git submodule status) EOF echo -ne "$LISASHELL_DEFAULT" } ################################################################################ # LISA Update utility functions ################################################################################ function _lisa-update-usage { echo "Usage: lisa-update (CMD)" echo " CMD: what to update (default: all)" echo " all - update lisa and all the external dependencies" echo " submodules - update external dependencies provided by submodules" echo echo "Update submodules (if DEVMODE enabled)" } function _lisa-update-submodules { echo -ne "${LISASHELL_BLUE}" if [ "x$DEVMODE" == "x1" ]; then # Force update existing modules echo echo 'Developer mode ENABLED, updating local libraries...' git submodule sync git submodule update --init echo 'DONE' fi echo -ne "$LISASHELL_DEFAULT" } function _lisa-update-all { echo -ne "${LISASHELL_BLUE}" echo -e "*** Update LISA installation" git update-index -q --refresh ret=$? if [ $ret -ne 0 ]; then echo "LISA internal error: git update-index failed" echo "Please report it: https://github.com/ARM-software/lisa/issues" return $ret fi git diff-index --quiet --ignore-submodules HEAD ret=$? if [ $ret -ne 0 ]; then echo "There are outstanding uncommitted changes." echo "Please, commit your changes or stash them before you can update lisa" return $ret fi curr_commit=$(git rev-parse HEAD) remote_name=$(git remote -v | grep -i ARM-software/lisa | grep -m 1 fetch | awk '{print $1}') if [ -z "$remote_name" ]; then echo "Couldn't find ARM-Software upstream remote, can't automatically update" return 1 fi git merge-base --is-ancestor $curr_commit $remote_name/master ret=$? if [ $ret -ne 0 ]; then echo "You have committed changes that are not part of $remote_name/master" echo "Please move to the master branch before running lisa-update" return $ret fi git pull --ff-only $remote_name master ret=$? if [ $ret -ne 0 ]; then # git pull should have printed some error. Abort and propagate the error code. return $ret fi _lisa-update-submodules echo -ne "$LISASHELL_DEFAULT" } function lisa-update { CMD=${1:-all} echo case "x${CMD^^}" in 'xSUBMODULES') _lisa-update-submodules ;; 'xALL') _lisa-update-all ;; "xHELP"|*) _lisa-update-usage ;; esac echo echo } ################################################################################ # LISA Notebooks utility functions ################################################################################ function _lisa-ipython-usage { echo "Usage: lisa-ipython CMD [NETIF [PORT]]" echo " CMD - IPython Notebooks command (deafult: start)" echo " start start the ipython server" echo " stop stop the ipython server" echo " NETIF - the network interface to start the server on (default: lo)" echo " PORT - the tcp port for the server (default: 8888)" } function _lisa-ipython-start { # Get IP address for the specified interface IPADDR=$(/sbin/ifconfig $NETIF 2>/dev/null | \ awk '/inet / {print $2}' | \ sed 's/addr://') if [ "x$IPADDR" == "x" ]; then echo echo "$NETIF is not a valid network interface" echo echo "Usage: $0 <NETIF>" echo " NETIF - The network interface to start the server on" echo return 1 fi # Setup paths PYDIR="$LISA_HOME/ipynb" LOGFILE="$PYDIR/server.log" PIDFILE="$PYDIR/server.pid" URLFILE="$PYDIR/server.url" # Generate server URL TOKEN=$(cat /dev/urandom | tr -dc 'a-fA-F0-9' | fold -w 48 | head -n 1) URL="http://$IPADDR:$PORT/?token=$TOKEN" # Check if an instance is already running if [ -f "$PIDFILE" ] && pgrep -F $PIDFILE >/dev/null; then echo "Server already running:" echo " " $(cat $URLFILE) xdg-open $(cat $URLFILE) return 1 fi # Start the server bindeed to the specified interface echo echo 'Notebook server configuration:' echo ' URL : ' $URL echo ' Folder : ' $PYDIR echo ' Logfile : ' $LOGFILE echo ' PYTHONPATH : ' echo -e "\t${PYTHONPATH//:/\\n\\t}" cd $PYDIR echo echo -n 'Notebook server task: ' if which ipython >/dev/null; then local cmd=ipython else local cmd=jupyter fi nohup $cmd notebook --ip=$IPADDR --port=$PORT \ --NotebookApp.token=$TOKEN \ >$LOGFILE 2>&1 & echo $! >$PIDFILE echo $URL >$URLFILE cd - >/dev/null } function _lisa-ipython-stop { PYDIR="$LISA_HOME/ipynb" PIDFILE="$PYDIR/server.pid" if [ -f "$PIDFILE" ] && pgrep -F $PIDFILE >/dev/null; then kill $(<$PIDFILE) 2>/dev/null fi rm -f $PIDFILE 2>/dev/null } function lisa-ipython { CMD=${1:-start} if [ "x$2" == "x" -a $USER == "vagrant" -a -e /vagrant/src/shell/lisa_shell ]; then # NETIF not set and we are in a vagrant environment. Default to # eth0 as loopback won't let you connect from your host machine. NETIF="eth0" else NETIF=${2:-lo} fi PORT=${3:-8888} echo case "x${CMD^^}" in 'xSTART') echo "Starting IPython Notebooks..." _lisa-ipython-start $NETIF $PORT ;; 'xSTOP') echo "Stopping IPython Notebooks..." _lisa-ipython-stop ;; "xHELP"|*) _lisa-ipython-usage ;; esac echo echo } function lisa-check-submods { if [ ! -f ./libs/devlib/setup.py ] || [ ! -f ./libs/bart/setup.py ] || [ ! -f ./libs/trappy/setup.py ]; then echo "One or more submodules missing, updating"; lisa-update submodules fi } ################################################################################ # LISA Tests utility functions ################################################################################ function _lisa-test-usage { cat <<EOF Usage: lisa-test [--iterations ITERATIONS] [args] FILE[:CLASS] Run automated tests. Tests can be found under the tests/ directory. --iterations (or -n) sets the number of iterations to use for each workload/target-conf, for tests that support this usage. 0 means use the test's default iteration count. This is a wrapper for the 'nosetests' utility, additional arguments are passed to that tool. Examples: Run all EAS Generic tests: lisa-test tests/eas/generic.py Run RampUp test from EAS Generic suite: lisa-test tests/eas/generic.py:RampUp Run RampUp test from EAS Generic suite, generating an XML test report via nose's XUnit plugin (see nosetests documentation): lisa-test --with-xunit --xunit-file=report.xml tests/eas/generic.py:RampUp Run RampUp test from EAS Generic suite, repeating the workload 10 times and reporting how many times the test run passed: lisa-test --iterations 10 tests/eas/generic.py:RampUp Run EAS Generic suite, repeating each workload 10 times: lisa-test --iterations 10 tests/eas/generic.py EOF } function _lisa-test { nosetests -v --nocapture --nologcapture \ --logging-config=logging.conf \ $* } function lisa-test { local iterations=0 # Means use default - see libs/utils/test.py local extra_args="" echo while [[ $# -gt 0 ]]; do case "$1" in help|-h|--help) _lisa-test-usage return 0 ;; -n|--iterations) iterations="$2" shift ;; *) # Unrecognised args are passed through to nosetests extra_args="$extra_args $1" ;; esac shift done if [ -z "$extra_args" ]; then # No arguments provided, default to "help" _lisa-test-usage return 1 fi (export LISA_TEST_ITERATIONS=$iterations; _lisa-test $extra_args) local retcode=$? echo echo return $retcode } function lisa-report { CMD=${1^^} [ "x$CMD" != "xHELP" ] && CMD=report echo case "x${CMD^^}" in 'xREPORT') ./tools/report.py $* ;; "xHELP"|*) ./tools/report.py --help ;; esac echo echo } ################################################################################ # LISA Shell MAIN ################################################################################ # Setup Shell variables PS1="\[${LISASHELL_BLUE}\][LISAShell \[${LISASHELL_LCYAN}\]\W\[${LISASHELL_BLUE}\]] \> \[${LISASHELL_RESET}\]" # Dump out a nice LISA Shell logo clear # Android post shell initialization script android_post=$LISA_HOME/src/shell/android-post.sh if [ -f $android_post ]; then source $android_post; fi echo -e '\E[37;44m' echo " " echo " .:: LISA Shell ::. " echo " " echo -ne "$LISASHELL_RESET$LISASHELL_BLUE" cat <<EOF Welcome to the Linux Integrated System Analysis SHELL! LISA_HOME : $LISA_HOME PYTHONPATH : EOF echo -e "\t${PYTHONPATH//:/\\n\\t}" if [ "x$DEVMODE" == "x1" ]; then lisa-check-submods cat <<EOF Submodules : EOF git submodule status fi cat <<EOF Type "lisa-help" for on-line help on available commands EOF # Setup default SHELL text color echo -e "$LISASHELL_DEFAULT" # vim: set tabstop=4: