#!/bin/sh

CONFIG_FILE="/etc/3d-p/osi-tcpudp/osi-tcpudp"

backup() { # $1: file to backup
    if [ -z ${1} ]; then return 1; fi
    if [ ! -f ${1} ]; then return 1; fi
    BACKUPS="${BACKUPS} ${1}"
    /bin/mv ${1} ${1}.b || return 1
    return 0
}

# ... Restore backups on error
error_trap() {
    for f in ${BACKUPS}; do
        /bin/mv ${f}.b ${f}
    done
    exit 1
}
# ... Delete backups on successful exit
at_exit() {
    RC="$?" # ... make sure the proper exit code is returned
    for f in ${BACKUPS}; do
        /bin/rm -f ${f}.b
    done
    exit ${RC}
}
trap error_trap HUP INT ILL ABRT FPE
trap at_exit EXIT

usage() {
    echo ""
    echo "Sets up the config file(s) used by the osi-tcpudp init.d script"
    echo ""
    echo "Usage: ${0} [option]"
    echo ""
    echo "Options:"
    echo "   --force      Sets the config file(s) to default values."
    echo "   --help       Shows this help message."
    exit 0
}

build_peers_file() { # $1 "peer list", $2 peers file name
    IFS_SAV=${IFS}
    IFS=","
    LIST=${1}
    FILE=${2}
    backup ${FILE}
    /bin/echo -n "" > ${FILE} # in case there are no peers, create empty file
    for peer in ${LIST}; do
        /bin/echo ${peer} >> ${FILE}
    done
    IFS=${IFS_SAV}
}

read_peers_file() { # $1: file
    RET=""
    if [ ! -f ${1} ]; then /bin/echo "Error! ${1} does not exist"; return 1; fi
    for peer in `/bin/cat ${1}`; do
        if [ -z ${RET} ]; then
            RET="${peer}"
        else
            RET="${RET},${peer}"
        fi
    done
    return 0
}

# ... Source + backup the config file if it exists
CONFIG_FILE_MODTIME=0
if [ -e ${CONFIG_FILE} ]; then
    . ${CONFIG_FILE}
    CONFIG_FILE_MODTIME=`/usr/bin/stat -c %Y ${CONFIG_FILE}`
    backup ${CONFIG_FILE}
fi

# ... Write top header
TCP_UDP_VERSION=`/bin/cat /usr/share/3d-p/osi-tcpudp/version`
/bin/echo "# Default settings for osi-tcpudp
#
# This file is sourced from /etc/init.d/osi-tcpudp
#
#

TCP_UDP_VERSION=\"${TCP_UDP_VERSION}\"" >> ${CONFIG_FILE}

# ... For each instance
for i in `/usr/bin/seq 0 3`; do
    PEERS_FILE_MODTIME=0
    PEERS_FILE="/etc/3d-p/osi-tcpudp/osi-tcpudp.peers.${i}"
    if [ -e ${PEERS_FILE} ] ; then
        PEERS_FILE_MODTIME=`/usr/bin/stat -c %Y ${PEERS_FILE}`
    fi

    # ... If the peer list in the peer file is newer than the config file,
    #     it must prevail (unless EXPORT_TCP_UDP_UDP_PEERS_${i} is defined...)
    unset PEERS_IN_FILE
    if [ ${PEERS_FILE_MODTIME} -gt ${CONFIG_FILE_MODTIME} ]; then
        read_peers_file ${PEERS_FILE}
        PEERS_IN_FILE=${RET}
    fi

    # ... Define default parameters
    DFLT_TCP_UDP_ENABLED="No"
    DFLT_TCP_UDP_PEOL=""
    DFLT_TCP_UDP_PAUSE="No"
    DFLT_TCP_UDP_OHISERVIP="127.0.0.1"
    DFLT_TCP_UDP_OHISERVPORT=$(( 3996 + ${i} ))
    DFLT_TCP_UDP_UDPIP=""
    DFLT_TCP_UDP_RXUDP=$(( 3996 + ${i} ))
    DFLT_TCP_UDP_TXUDP=$(( 4000 + ${i} ))
    DFLT_TCP_UDP_DIRECTION="tcp2udp"
    DFLT_TCP_UDP_KEEP_ALIVE_TIME="10"
    DFLT_TCP_UDP_KEEP_ALIVE_INTERVAL="5"
    DFLT_TCP_UDP_KEEP_ALIVE_COUNT="3"
    DFLT_TCP_UDP_UDP_PEERS=""

    # ... Handle command line directive
    case $1 in
        "--help")
            usage
        ;;
        "--force")  # Force default values and write to config file
            TCP_UDP_ENABLED="${DFLT_TCP_UDP_ENABLED}"
            TCP_UDP_PEOL="${DFLT_TCP_UDP_PEOL}"
            TCP_UDP_PAUSE="${DFLT_TCP_UDP_PAUSE}"
            TCP_UDP_OHISERVIP="${DFLT_TCP_UDP_OHISERVIP}"
            TCP_UDP_OHISERVPORT="${DFLT_TCP_UDP_OHISERVPORT}"
            TCP_UDP_UDPIP="${DFLT_TCP_UDP_UDPIP}"
            TCP_UDP_RXUDP="${DFLT_TCP_UDP_RXUDP}"
            TCP_UDP_TXUDP="${DFLT_TCP_UDP_TXUDP}"
            TCP_UDP_DIRECTION="${DFLT_TCP_UDP_DIRECTION}"
            TCP_UDP_KEEP_ALIVE_TIME="${DFLT_TCP_UDP_KEEP_ALIVE_TIME}"
            TCP_UDP_KEEP_ALIVE_INTERVAL="${DFLT_TCP_UDP_KEEP_ALIVE_INTERVAL}"
            TCP_UDP_KEEP_ALIVE_COUNT="${DFLT_TCP_UDP_KEEP_ALIVE_COUNT}"
            TCP_UDP_UDP_PEERS="${DFLT_TCP_UDP_UDP_PEERS}"
        ;;
        *) # VARIABLE = Newest Value (if exists) OR Config File Value (if exists) OR Default Value
            TCP_UDP_ENABLED="$(eval /bin/echo \${EXPORT_TCP_UDP_ENABLED_${i}-\${TCP_UDP_ENABLED_${i}-${DFLT_TCP_UDP_ENABLED}}})"
            TCP_UDP_PEOL="$(eval /bin/echo \${EXPORT_TCP_UDP_PEOL_${i}-\${TCP_UDP_PEOL_${i}-${DFLT_TCP_UDP_PEOL}}})"
            TCP_UDP_PAUSE="$(eval /bin/echo \${EXPORT_TCP_UDP_PAUSE_${i}-\${TCP_UDP_PAUSE_${i}-${DFLT_TCP_UDP_PAUSE}}})"
            TCP_UDP_OHISERVIP="$(eval /bin/echo \${EXPORT_TCP_UDP_OHISERVIP_${i}-\${TCP_UDP_OHISERVIP_${i}-${DFLT_TCP_UDP_OHISERVIP}}})"
            TCP_UDP_OHISERVPORT="$(eval /bin/echo \${EXPORT_TCP_UDP_OHISERVPORT_${i}-\${TCP_UDP_OHISERVPORT_${i}-${DFLT_TCP_UDP_OHISERVPORT}}})"
            TCP_UDP_UDPIP="$(eval /bin/echo \${EXPORT_TCP_UDP_UDPIP_${i}-\${TCP_UDP_UDPIP_${i}-${DFLT_TCP_UDP_UDPIP}}})"
            TCP_UDP_RXUDP="$(eval /bin/echo \${EXPORT_TCP_UDP_RXUDP_${i}-\${TCP_UDP_RXUDP_${i}-${DFLT_TCP_UDP_RXUDP}}})"
            TCP_UDP_TXUDP="$(eval /bin/echo \${EXPORT_TCP_UDP_TXUDP_${i}-\${TCP_UDP_TXUDP_${i}-${DFLT_TCP_UDP_TXUDP}}})"
            TCP_UDP_DIRECTION="$(eval /bin/echo \${EXPORT_TCP_UDP_DIRECTION_${i}-\${TCP_UDP_DIRECTION_${i}-${DFLT_TCP_UDP_DIRECTION}}})"
            TCP_UDP_KEEP_ALIVE_TIME="$(eval /bin/echo \${EXPORT_TCP_UDP_KEEP_ALIVE_TIME_${i}-\${TCP_UDP_KEEP_ALIVE_TIME_${i}-${DFLT_TCP_UDP_KEEP_ALIVE_TIME}}})"
            TCP_UDP_KEEP_ALIVE_INTERVAL="$(eval /bin/echo \${EXPORT_TCP_UDP_KEEP_ALIVE_INTERVAL_${i}-\${TCP_UDP_KEEP_ALIVE_INTERVAL_${i}-${DFLT_TCP_UDP_KEEP_ALIVE_INTERVAL}}})"
            TCP_UDP_KEEP_ALIVE_COUNT="$(eval /bin/echo \${EXPORT_TCP_UDP_KEEP_ALIVE_COUNT_${i}-\${TCP_UDP_KEEP_ALIVE_COUNT_${i}-${DFLT_TCP_UDP_KEEP_ALIVE_COUNT}}})"
            TCP_UDP_UDP_PEERS="$(eval /bin/echo \${EXPORT_TCP_UDP_UDP_PEERS_${i}-\${PEERS_IN_FILE-\${TCP_UDP_UDP_PEERS_${i}-${DFLT_TCP_UDP_UDP_PEERS}}}})"
        ;;
    esac
    # ... Get new version
    /bin/echo "TCP_UDP_ENABLED_${i}=\"${TCP_UDP_ENABLED}\"
    TCP_UDP_PEOL_${i}=\"${TCP_UDP_PEOL}\"
    TCP_UDP_PAUSE_${i}=\"${TCP_UDP_PAUSE}\"
    TCP_UDP_OHISERVIP_${i}=\"${TCP_UDP_OHISERVIP}\"
    TCP_UDP_OHISERVPORT_${i}=\"${TCP_UDP_OHISERVPORT}\"
    TCP_UDP_UDPIP_${i}=\"${TCP_UDP_UDPIP}\"
    TCP_UDP_RXUDP_${i}=\"${TCP_UDP_RXUDP}\"
    TCP_UDP_TXUDP_${i}=\"${TCP_UDP_TXUDP}\"
    TCP_UDP_DIRECTION_${i}=\"${TCP_UDP_DIRECTION}\"
    TCP_UDP_KEEP_ALIVE_TIME_${i}=\"${TCP_UDP_KEEP_ALIVE_TIME}\"
    TCP_UDP_KEEP_ALIVE_INTERVAL_${i}=\"${TCP_UDP_KEEP_ALIVE_INTERVAL}\"
    TCP_UDP_KEEP_ALIVE_COUNT_${i}=\"${TCP_UDP_KEEP_ALIVE_COUNT}\"
    TCP_UDP_UDP_PEERS_${i}=\"${TCP_UDP_UDP_PEERS}\"
    " >> ${CONFIG_FILE}
    build_peers_file "${TCP_UDP_UDP_PEERS}" "${PEERS_FILE}"
done

# ... Generate the XML file
if [ -f /usr/sbin/osi-tcpudp-xml ]; then
    export XML_DESCRIPTION_VERSION="`/bin/cat /usr/share/3d-p/osi-tcpudp/version`"
    XML_FILE="/etc/3d-p/osi-tcpudp/osi-tcpudp_${XML_DESCRIPTION_VERSION}.xml"
    backup ${XML_FILE}
    if ! /usr/sbin/osi-tcpudp-xml > ${XML_FILE}; then
        /bin/echo "Error! Command failed: /usr/sbin/osi-tcpudp-xml" >&2
        error_trap
    fi
fi

exit 0
