#!/bin/bash
#### Multi-purpose port listener invoker.
# Ver. 0.9.1

## Basic setup variables.
# tcpserver path
TCPSERVER=/usr/local/bin/tcpserver

# tcpserver options.
TCPOPT="-HRl0 0"

# Command to run when connection established.
TCPCMD="/usr/local/bin/echo-hello"

# Default port used when LISETN_PORT argument was omitted at runtime.
DEFAULTPORT=23


## Procedures from here.

show_help () {
    cat <<EOM
USAGE: $(basename $0) [-p LISTEN_PORT] {start|stop|list}
where LISTEN_PORT defaults to $DEFAULTPORT.
When action is list, -p is silently ignored.
EOM
    exit 1
}

while [ $# -gt 0 ]; do
    case $1 in
	-p)
	    shift
	    port=$1
	    ;;
	start|stop|list)
	    action=$1
	    ;;
	*)
	    show_help
	    ;;
    esac
    shift
done

port=${port:-$DEFAULTPORT}

echo $port |grep -Eq '^[0-9]+$'
[ $? -ne 0 -o -z "$action" ] && show_help

case $action in
    start)
	$TCPSERVER $TCPOPT $port $TCPCMD &
	exit 0
	;;
    stop)
	pid=$(echo $(ps axw |egrep "tcpserver .* $port " |grep -v grep) |\
	 cut -d " " -f 1)

	if [ -n "$pid" ]; then
	    kill -TERM $pid
	    if [ $? -eq 0 ]; then
		echo "PID:$pid terminated"
		exit 0
	    fi
	fi

	echo "no such tcpserver process"
	exit 1
	;;
    list)
	TCPCMD_ESC=${TCPCMD/\./\\.}

	pid=$(ps axww |egrep "tcpserver .* $TCPCMD_ESC" |grep -v grep |awk '{ print $(NF-1); }')

	echo "Following tcpservers are up:"
	if [ $(echo ${pid[@]} |wc -w) -eq 0 ]; then
	    echo '<none>'
	else
	    for i in ${pid[@]}; do
		echo $i
	    done
	fi

	exit 0
	;;
esac
