#
# 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:
