#! /bin/bash

# Change this accordingly
ONOS_HOME=${ONOS_HOME:-${HOME}/ONOS}
script_name="topology_rest.py"

#######################
WEBDIR=${ONOS_HOME}/web
restscript=${WEBDIR}/$script_name
LOGDIR=${ONOS_LOGDIR:-${ONOS_HOME}/onos-logs}
REST_LOG="${LOGDIR}/rest.`hostname`.log"
#######################

dokill() {
    for cpid in $(ps -o pid= --ppid $1)
    do 
        dokill $cpid
    done
    echo "killing: $(ps -p $1 -o cmd=)"
    kill -9 $1 > /dev/null 2>&1
}


function lotate {
    logfile=$1
    nr_max=${2:-10}
    if [ -f $logfile ]; then
	for i in `seq $(expr $nr_max - 1) -1 1`; do
	    if [ -f ${logfile}.${i} ]; then
		mv -f ${logfile}.${i} ${logfile}.`expr $i + 1`
	    fi
	done
	mv $logfile $logfile.1
    fi
}

function stop {
    pids=`ps -edalf |grep ${script_name} | grep python | grep -v grep | awk '{print $4}'`
    for p in ${pids}; do
	if [ x$p != "x" ]; then
            dokill $p
#	    sudo kill -KILL $p
#	    echo "Killed existing prosess (pid: $p)"
	fi
    done
}

function status {
    nr_process=`ps -edalf |grep ${script_name} | grep python | grep -v grep | wc -l` 
    if [ ${nr_process} != 0 ] ; then
      echo "rest server is running"
    else
      echo "rest server is not running"
    fi
}

function start {
    lotate $REST_LOG 10 
    cd $WEBDIR
    # Make log dir for iperf log files
    if [ ! -d  log ]; then
      mkdir log
    fi
    $restscript > $REST_LOG 2>&1 &
}

case "$1" in
  start)
    stop
    sleep 2
    start 
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  *)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
