#!/bin/bash

# Copyright 2015 Open Networking Foundation (ONF)
#
# Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
# the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
# or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
#
#     TestON is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 2 of the License, or
#     (at your option) any later version.
#
#     TestON is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with TestON.  If not, see <http://www.gnu.org/licenses/>.

# -----------------------------------------------------------------------------
# This script will kill any TestON, ssh, and Mininet sessions that are running.
# -----------------------------------------------------------------------------

# TODO: Add help to this file, and some more options?
#       Maybe kill/uninstall ONOS?
sudo kill -9 `ps -ef | grep "./cli.py" | grep -v grep | awk '{print $2}'` &> /dev/null
sudo kill -9 `ps -ef | grep "bin/teston" | grep -v grep | awk '{print $2}'` &> /dev/null
sudo kill -9 `ps -ef | grep "/usr/bin/ssh" | grep -v grep | awk '{print $2}'` &> /dev/null
sudo kill -9 `ps ax | grep '[p]ython -m SimpleHTTPServer 8000' | awk '{print $1}'` &> /dev/null
sudo kill -9 `ps ax | grep 'kubectl' | awk '{print $2}'` &> /dev/null

export user=${ONOS_USER:-$USER}
if [[ -z "${OCN}" ]]; then
    echo "Mininet cleanup skipped because OCN is not defined"
else
    ssh $user@$OCN """
    sudo killall -9 dhclient dhcpd zebra bgpd vrrpd bird
    sudo mn -c
    sudo pkill -f mn.pid
    """
fi

# Restore persistent firewall rules
if [ "$1" = "-f" ]; then

    OCIS=( $(env | sed -ne 's:OC[0-9]\{1,\}=\(.*\):\1 :g p' | sort -k1) )
    if [ -z "$OCIS" ]; then
      printf "no ONOS nodes set in your cell, Don't know where to look" >&2 && exit 0
    fi

    # TODO: Make the file configurable
    for i in ${OCIS[@]}; do
        echo "Restoring iptables rules on ${i}"
        ssh sdn@$i "sudo iptables -F"
        ssh sdn@$i "sudo iptables-restore < /etc/iptables/rules.v4"
        echo "Restoring ip6tables rules on ${i}"
        ssh sdn@$i "sudo ip6tables -F"
        ssh sdn@$i "sudo ip6tables-restore < /etc/iptables/rules.v6"
    done
elif [ "$1" = "-d" ]; then
    docker stop $(docker ps -aq)
fi
