| #!/bin/bash |
| # ----------------------------------------------------------------------------- |
| # Starts or interacts with mininet in a remote screen session. |
| # ----------------------------------------------------------------------------- |
| |
| [ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1 |
| . $ONOS_ROOT/tools/build/envDefaults |
| |
| export MAX_WAIT=${ONOS_MN_TIMEOUT:-90} |
| |
| cmd="$1" && shift |
| log="screenlog.0" |
| remote="$ONOS_USER@$OCN" |
| remote_scp="$ONOS_USER@[$OCN]" |
| screenversion=$(ssh $remote screen -v | sed -n -e 's/^Screen version \([0-9]*\.[0-9]*\).*$/\1/p') |
| # note: Screen version check for >4.04 may be inaccurate - The only sure thing is that v4.01 |
| # requires logname to NOT be given while in v4.05 it is optional (as long as -L is the |
| # last parameter on the command line). |
| [[ $screenversion > "4.04" ]] && screenlog=$log |
| [[ $screenversion > "4.05" ]] && screenlog="-Logfile $log" |
| mininet="ssh -t -t $remote screen -L $screenlog -S mininet" |
| |
| case $cmd in |
| send) |
| $mininet -X "stuff \"$@\\n\"" 2>/dev/null |
| ;; |
| |
| sendAndExpect) |
| cmd="" |
| for a in $*; do shift; if [ "$a" = "--expect" ]; then break; fi; cmd="$cmd $a"; done |
| $mininet -X "stuff \"$cmd\\n\"" 2>/dev/null |
| onos-mininet expect "$@" |
| ;; |
| |
| wait) |
| ssh $remote " |
| let count=0 |
| sleep 1 && while test ! -f $log; do if test \$count -ge $MAX_WAIT; then exit 1; fi; sleep 1; let count=count+1; done |
| while ! (tail -n1 $log | egrep -q '^[ ]*[0]*mininet>'); do if [ \$count -ge $MAX_WAIT ]; then exit 1; fi; sleep 1; done |
| sleep ${1-:1} |
| " |
| ;; |
| |
| expect) |
| aux=/tmp/mininet.$$.log |
| ssh $remote " |
| sleep 1 |
| if [ ! -f $log ]; then exit 1; fi; |
| let count=0 |
| while ! (tail -n1 $log | egrep -q '^[ ]*[0]*mininet>'); do if test \$count -ge $MAX_WAIT; then exit 1; fi; sleep 1; let count=count+1; done |
| tac $log | awk '{ print \$0; } /^[ ]*[0]*mininet>/ { if (on) { exit 0; } on=1; }' | tac > $aux |
| cat $aux |
| set -x |
| egrep \"$@\" $aux |
| " |
| ;; |
| |
| attach) |
| $mininet -x |
| ;; |
| |
| start) |
| ssh $remote "rm -f $log; echo logfile flush 1 > ~/.screenrc" |
| ( |
| $mininet "$@" |
| scp $remote_scp:$log /tmp/mininet.log |
| ssh $remote rm -f $log |
| ) & |
| ;; |
| |
| stop) |
| $mininet -X "stuff \"^C\\n\"" 2>/dev/null && \ |
| $mininet -X "stuff \"^C\\n\"" 2>/dev/null && \ |
| $mininet -X "stuff \"exit\\n\"" 2>/dev/null |
| ssh -t -t $remote sudo mn -c |
| |
| ;; |
| cleanup) |
| ssh -t -t $remote sudo mn -c |
| ssh -t -t $remote "screen -list | grep mininet | cut -d. -f1 | tr -d '\t' | xargs kill -9; screen -wipe; exit 0" |
| ;; |
| esac |