blob: 37cc0c3e08aa13022ceac34321778f1e39fc97cb [file] [log] [blame]
#
# 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: