#!/bin/sh

### BEGIN INIT INFO
# Provides:          osi-tcpudp
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Should-Start:      iep-network
# Should-Stop:       iep-network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: TCP UDP daemon.
# Description:       TCP UDP daemon.
### END INIT INFO

PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/bin

# ... Trapping errors and
trap_error() {
    logger "Error Occured!"
    exit 1
}

trap trap_error HUP INT ILL ABRT FPE

# ... Check for config file
CONFIG_FILE="/etc/3d-p/osi-tcpudp/osi-tcpudp"
if [ ! -e ${CONFIG_FILE} ]; then
    echo "${CONFIG_FILE} config file not found" >&2
    exit 1
fi

start_instance() { # $1 : index, $2: extra arg
    TCP_UDP_ENABLED=$(eval echo \${"TCP_UDP_ENABLED_${1}"} | tr [A-Z] [a-z] )
    # ... If not enabled, don't do anything
    if ( [ -z ${TCP_UDP_ENABLED} ] || [ ${TCP_UDP_ENABLED} != "yes" ] ) ; then
        return 0;
    fi
    TCP_UDP_HOST_FILE="/etc/3d-p/osi-tcpudp/osi-tcpudp.peers.${1}"
    # ... Get instance variable values
    TCP_UDP_PEOL=$(eval echo \${"TCP_UDP_PEOL_${1}"})
    TCP_UDP_PAUSE=$(eval echo \${"TCP_UDP_PAUSE_${1}"} | tr [A-Z] [a-z] )
    TCP_UDP_OHISERVIP=$(eval echo \${"TCP_UDP_OHISERVIP_${1}"})
    TCP_UDP_OHISERVPORT=$(eval echo \${"TCP_UDP_OHISERVPORT_${1}"})
    TCP_UDP_UDPIP=$(eval echo \${"TCP_UDP_UDPIP_${1}"})
    TCP_UDP_RXUDP=$(eval echo \${"TCP_UDP_RXUDP_${1}"})
    TCP_UDP_TXUDP=$(eval echo \${"TCP_UDP_TXUDP_${1}"})
    TCP_UDP_DIRECTION=$(eval echo \${"TCP_UDP_DIRECTION_${1}"} | tr [A-Z] [a-z] )
    TCP_UDP_KEEP_ALIVE_TIME=$(eval echo \${"TCP_UDP_KEEP_ALIVE_TIME_${1}"})
    TCP_UDP_KEEP_ALIVE_INTERVAL=$(eval echo \${"TCP_UDP_KEEP_ALIVE_INTERVAL_${1}"})
    TCP_UDP_KEEP_ALIVE_COUNT=$(eval echo \${"TCP_UDP_KEEP_ALIVE_COUNT_${1}"})
    TCP_UDP_UDP_PEERS=$(eval echo \${"TCP_UDP_UDP_PEERS_${1}"})
    # ... Setup args for binary
    ARGS="--file ${TCP_UDP_HOST_FILE}"
    if [ "${TCP_UDP_PEOL}" != "" ]; then                ARGS="${ARGS} --peol=${TCP_UDP_PEOL}"; fi
    if [ "${TCP_UDP_PAUSE}" = "Yes" ]; then             ARGS="${ARGS} --pause"; fi
    if [ "${TCP_UDP_OHISERVIP}" != "" ]; then           ARGS="${ARGS} -h ${TCP_UDP_OHISERVIP}"; fi
    if [ "${TCP_UDP_OHISERVPORT}" != "" ]; then         ARGS="${ARGS} -p ${TCP_UDP_OHISERVPORT}"; fi
    if [ "${TCP_UDP_UDPIP}" != "" ]; then               ARGS="${ARGS} --udpip=${TCP_UDP_UDPIP}"; fi
    if [ "${TCP_UDP_RXUDP}" != "" ]; then               ARGS="${ARGS} --rxudp=${TCP_UDP_RXUDP}"; fi
    if [ "${TCP_UDP_TXUDP}" != "" ]; then               ARGS="${ARGS} --txudp=${TCP_UDP_TXUDP}"; fi
    if [ "${TCP_UDP_DIRECTION}" != "" ]; then           ARGS="${ARGS} -D ${TCP_UDP_DIRECTION}"; fi
    if [ "${TCP_UDP_KEEP_ALIVE_TIME}" != "" ]; then     ARGS="${ARGS} -T ${TCP_UDP_KEEP_ALIVE_TIME}"; fi
    if [ "${TCP_UDP_KEEP_ALIVE_INTERVAL}" != "" ]; then ARGS="${ARGS} -I ${TCP_UDP_KEEP_ALIVE_INTERVAL}"; fi
    if [ "${TCP_UDP_KEEP_ALIVE_COUNT}" != "" ]; then    ARGS="${ARGS} -C ${TCP_UDP_KEEP_ALIVE_COUNT}"; fi
    ARGS="${ARGS} ${2}"
    if ! osi_tcpudp ${ARGS} ; then
        echo "Error! Failed to launch: osi_tcpudp ${ARGS}" >&2
        return 1
    fi
    return 0
}

#----MAIN----
# ... process command
case "${1}" in
start)
#     mkdir -p /tmp/3d-p
#     VERSION="`cat /usr/share/3d-p/osi-tcpudp/version`"
#     XML_FILE="/etc/3d-p/osi-tcpudp/osi-tcpudp_${VERSION}.xml"
#     ln -sf ${XML_FILE} /tmp/3d-p/osi-tcpudp_${VERSION}.xml

    . ${CONFIG_FILE}
    for i in `seq 0 3`; do
        TCP_UDP_PID_FILE="/var/run/osi-tcpudp.${i}.pid"
        if [ -e ${TCP_UDP_PID_FILE} ]; then
            if [ ! -e /proc/`cat ${TCP_UDP_PID_FILE}` ]; then
                logger "Removing obsolete ${TCP_UDP_PID_FILE}"
                if ! rm ${TCP_UDP_PID_FILE}; then
                    echo "Error! Failed to remove ${TCP_UDP_PID_FILE}" >&2
                    exit 1
                fi
            else
                echo "Error! osi-tcpudp.${i} is already running" >&2
                exit 1
            fi
        fi
        logger "Starting osi-tcpudp instance ${i}..."
        if ! start_instance ${i} "--pidfile=${TCP_UDP_PID_FILE}"; then
            echo "Error! Failed to start instance ${i}" >&2
            ${0} stop 2> /dev/null
            exit 1
        fi
        echo -e "\rosi-tcpudp[${i}] started."
    done;
	;;
debug)
    if ! start_instance 0 -d; then
        echo "Error! Failed to start instance 0 in debug mode" >&2
        exit 1
    fi
	;;
stop)
    RET=0
    for i in `seq 0 3`; do
        TCP_UDP_PID_FILE="/var/run/osi-tcpudp.${i}.pid"
        if [ -e ${TCP_UDP_PID_FILE} ]; then
            logger "Killing osi-tcpudp with pid=`cat ${TCP_UDP_PID_FILE}`"
            PID=`cat ${TCP_UDP_PID_FILE}`
            if ! kill -TERM ${PID}; then
                logger "Warning! Failed to kill osi-tcpudp with pid=${PID}" >&2
            fi
        fi
        if [ -e ${TCP_UDP_PID_FILE} ]; then
            logger "Removing ${TCP_UDP_PID_FILE}"
            if ! rm -f ${TCP_UDP_PID_FILE}; then
                echo "Error! Failed to remove ${TCP_UDP_PID_FILE}" >&2
                RET=1
            fi
        fi
        echo -e "\rosi-tcpudp[${i}] stopped."
    done
    exit ${RET}
    ;;
restart|force-reload)
    if ! ${0} stop; then
        echo "Error! Command failed: ${0} stop" >&2
        exit 1
    elif ! ${0} start; then
        echo "Error! Command failed: ${0} start" >&2
        ${0} stop 2> /dev/null
        exit 1
    fi
    ;;
get_all)
    cat ${CONFIG_FILE}
    ;;
*)
     echo "Usage: /etc/init.d/osi-tcpudp {start|stop|restart|debug}" >&2
     exit 1
     ;;
esac
exit 0
