#!/bin/sh
#
# Name: tmgr
# Date: 2011-03-08
# Author: Rene Lehfeld
# Copyright 2011, Nokia.
#

# change umask to 0 to solve problems related to LLPD
umask 0

# enable the possibility to get core files of binaries started from this script
ulimit -c unlimited

# Init script information
INIT_NAME="start_script.conf"

OPT_DIR="/opt/trs"
CCS_DIR="/opt/CCS"
OPT_TRSSHAREDLIBS_DIR="/opt/trssharedlibs"
OAM_ROLE_FILE="/ffs/run/trs_data/active/oam_role"
if [ ! -d "${OPT_TRSSHAREDLIBS_DIR}" ]; then
    OPT_TRSSHAREDLIBS_DIR=''
fi

# ---------- Dest Path ------------------

TRS_LIB_DEST="${OPT_TRSSHAREDLIBS_DIR}/usr/lib64"
if [ ! -d "${TRS_LIB_DEST}" ]; then
    TRS_LIB_DEST="${OPT_TRSSHAREDLIBS_DIR}/usr/lib"
fi

TRS_BIN_DEST="${OPT_DIR}/bin"
TRS_ETC_DEST="${OPT_DIR}/etc"
#TRS_CFG_DEST="/ffs/run/config/trs"
TRS_DATA="/ffs/run/trs_data"
TRS_ACT_DEST="${TRS_DATA}/active"
TRS_DB_DEST="${TRS_DATA}/db"
TRS_SIM_DEST="${TRS_DATA}/sim"
TRS_KEYSTR_DEST="${TRS_ACT_DEST}/keystorage"
TRS_LOG_DEST="/ffs/run/logs"
TRS_SRV_DEST="${OPT_DIR}/srv"
STANDBY_DEST="/ffs/stb"
TAUF_CONF="${TRS_ACT_DEST}/tauf_config"
TAUF_SCRIPT="${TRS_BIN_DEST}/tauf/target"
TRS_TA_START="/opt/TA"

# Default runlevel
RUNLEVEL=4

# Symbolic constant from enum
RECOVER_DS=2

# Load init script configuration
[ -f "${TRS_SIM_DEST}/${INIT_NAME}" ] && . "${TRS_SIM_DEST}/${INIT_NAME}"

# Load init script for FSPD startup in TA MODE
[ -f "${TRS_TA_START}/${INIT_NAME}" ] && . "${TRS_TA_START}/${INIT_NAME}"

# Load product specific settings
PRODUCT_SETTINGS="${TRS_ETC_DEST}/product_settings"
[ -f "${PRODUCT_SETTINGS}" ] && . "${PRODUCT_SETTINGS}"

# Load networking script
NETWORKING="${TRS_ETC_DEST}/networking"
[ -f "${NETWORKING}" ] && . "${NETWORKING}"

# Individual Program information
PROGRAM_START="${TRS_BIN_DEST}/ukTmgr"
PROGRAM_STOP="${TRS_BIN_DEST}/ukTmgrKill"
PROGRAM_STATUS="${TRS_BIN_DEST}/ukTmgrShow"
PROGRAM_EEPROM="${TRS_BIN_DEST}/test_hlEeprom"
PROGRAM_ENVINFO="${TRS_BIN_DEST}/test_envInfo"

# Verify programs are installed
test -f $PROGRAM_START || exit 1
test -f $PROGRAM_STOP || exit 1
test -f $PROGRAM_STATUS || exit 1
test -f $PROGRAM_EEPROM || exit 1

export PATH="${TRS_BIN_DEST}:/sbin:/bin:$PATH"
export LD_LIBRARY_PATH="${TRS_LIB_DEST}:${CCS_DIR}:/usr/lib64:/lib64:/lib:$LD_LIBRARY_PATH"

#Flag to receive RpBootUpSwFlag from command line Arguement
rpBootupSwFlagReceived=$2

wait_core_pattern()
{
    case "${BTSOM_SIMULATED}" in
        yes|y|YES|Y)
            # Core pattern will be set up in parallel in
            # CC&S container. In order to be sure that core
            # files will be captured from TRS, TRS software
            # must not be started before core pattern is set
            # up. This small routine guarantees this.
            local PATTERN
            local i
            for i in $(seq 1 20); do
                PATTERN=$(cat /proc/sys/kernel/core_pattern 2>/dev/null)
                if [ "x$PATTERN" != 'xcore' ]; then
                    break
                fi
                sleep 1
            done
            ;;
    esac
}

fix_core_pattern()
{
    local OPATTERN=$(cat /proc/sys/kernel/core_pattern 2>/dev/null)

    if [ "x$OPATTERN" != 'xcore' ]; then
        local NPATTERN=''

        local OPATTERN_ARRAY=($(echo $OPATTERN))

        local index=0
        local count=${#OPATTERN_ARRAY[@]}
        local PART
        local NAPPEND
        local O_OPTION=''
        local L_OPTION=''

        while [ $index -lt $count ]; do
            PART="${OPATTERN_ARRAY[$index]}"
            NAPPEND=''
            case "$PART" in
                \|*)
                    NAPPEND="|${OPT_DIR}/core-wrapper %e $(echo $PART | cut -c 2-)"
                    ;;
                -k)
                    ;;
                -o)
                    let ++index
                    PART=$(echo "${OPATTERN_ARRAY[$index]}" | sed -e 's/\(\.[^.]*\)$/-trs\1/g')
                    O_OPTION="-o $PART"
                    ;;
                -l)
                    let ++index
                    PART=$(echo "${OPATTERN_ARRAY[$index]}" | sed -e 's/\(\.[^.]*\)$/-trs\1/g')
                    L_OPTION="-l $PART"
                    ;;
                *)
                    NAPPEND=$PART
                    ;;
            esac

            if [ "x$NAPPEND" != 'x' ]; then
                if [ "x$NPATTERN" = 'x' ]; then
                    NPATTERN="$NAPPEND"
                else
                    NPATTERN="$NPATTERN $NAPPEND"
                fi
            fi

            let ++index
        done

        if [ "x$L_OPTION" != 'x' ]; then
            NPATTERN="$NPATTERN $L_OPTION"
        fi
        if [ "x$O_OPTION" != 'x' ]; then
            NPATTERN="$NPATTERN $O_OPTION"
        fi

        if [ "x$NPATTERN" != "x$OPATTERN" ]; then
            echo '########################## original core-pattern ##########################'
            echo $OPATTERN
            echo '########################## trs      core-pattern ##########################'
            echo $NPATTERN >/proc/sys/kernel/core_pattern
            cat /proc/sys/kernel/core_pattern
            echo '###########################################################################'
        fi
    fi
}

check_config()
{
    ## determine program
    ${PROGRAM_ENVINFO} envInfoProductType >/dev/null 2>&1
    case $? in
        1)
            PROGRAM_RC="${TRS_ETC_DIR}/tmgr_start.rc.wcdma"
            PRODUCT_TYPE='FTM'
            ;;
        2)
            PROGRAM_RC="${TRS_ETC_DIR}/tmgr_start.rc.wimax"
            PRODUCT_TYPE='WMX'
            ;;
        3)
            PROGRAM_RC="${TRS_ETC_DIR}/tmgr_start.rc.lte"
            PRODUCT_TYPE='LTE (DCM)'
            ;;
        4)
            PROGRAM_RC="${TRS_ETC_DIR}/tmgr_start.rc.lte"
            PRODUCT_TYPE='LTE (WMP)'
            ;;
        8)
            PROGRAM_RC="${TRS_ETC_DIR}/tmgr_start.rc.singleRan"
            PRODUCT_TYPE='Single RAN'
            ;;
        *)
            # default: WCDMA
            PROGRAM_RC="${TRS_ETC_DIR}/tmgr_start.rc.wcdma"
            PRODUCT_TYPE='FTM'
            ;;
    esac

    # Enable Strongswan patch
    touch /etc/ftm_strongswan_patch

    ## GFr: Detect unit type
    ${PROGRAM_ENVINFO} envInfoUnitType >/dev/null 2>&1
    case $? in
        2)
            PIU_TYPE='FTPB'
            ;;
        3)
            PIU_TYPE='FTEB'
            ;;
        4)
            PIU_TYPE='FTFA'
            ;;
        5)
            PIU_TYPE='FTOA'
            ;;
        6)
            PIU_TYPE='FTCA'
            ;;
        7)
            PIU_TYPE='FTIA'
            ;;
        8)
            PIU_TYPE='FTJA'
            ;;
        9)
            PIU_TYPE='FTHA'  # GFr: added FTHA 07-Feb-2007
            ;;
        10)
            PIU_TYPE='FTYA'  # GFr: added FTYA 28-Aug-2007
            ;;
        11)
            PIU_TYPE='FTIB'  # EBu: added FTIB 17-Jan-2008
            ;;
        12)
            PIU_TYPE='FTLA'
            ;;
        13)
            PIU_TYPE='FTLB'
            ;;
        14)
            PIU_TYPE='FTFB'
            ;;
        15)
            PIU_TYPE='FCTA'
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
        16)
            PIU_TYPE='FCTC'
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
        17)
            PIU_TYPE='FQGA'
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
        18)
            PIU_TYPE='FQBA'
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
        19)
            PIU_TYPE='FCTE'
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
        21)
            PIU_TYPE='FCTF'
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
        *)
            board_type=`cat /etc/boardType`
            echo "***I am $board_type***"
            if [ $board_type = 'fspd' ]; then
                PIU_TYPE='FSPD'
            elif [ $board_type = 'fspn' ]; then
                PIU_TYPE='FSPN'
            elif [ $board_type = 'fqdj' ] || [ $board_type = 'fqda' ] || [ $board_type = 'fqea' ]; then
                PRODUCT_TYPE='FTM'
                PIU_TYPE='FQDJ'
            fi
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct"
            ;;
    esac

    export PIU_TYPE
    export PRODUCT_TYPE
    TMGR_CONDITIONS=$PIU_TYPE

    case "${TEST_ADAPTER}" in
        yes|y|YES|Y)
            PROGRAM_RC="${PROGRAM_RC}.ta"
            ${TRS_BIN_DEST}/secfg_test iptest_ta_enable_ta_mode 1
            ;;
    esac

# Check if FSM Module is in slave mode for WCDMA Product type.
    # If so tmgr_start.rc.fsmr3fct.esm is used for tmgr startup.
    local PRODTYPE=`${PROGRAM_ENVINFO} envInfoProductType | head -n 1`
    if [ "x${PRODTYPE}" = "xPROD_WCDMA" ]; then
        if (grep "ESM" "${OAM_ROLE_FILE}" &> /dev/null); then
            PROGRAM_RC="${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct.esm"
        fi
    fi

    if [ "x${PRODTYPE}" = "xPROD_LTE_WMP" ]; then
        sed -i 's/tls/ipcs/g' ${TRS_ETC_DEST}/tmgr_start.rc.fsmr3fct
    fi 

    test -f $PROGRAM_RC || exit 1

    # Print out product type
    echo "Starting on unit $PIU_TYPE for product: $PRODUCT_TYPE"

    # GFr: Check if Datastore is present when DS set to "recover"
    $PROGRAM_EEPROM getDsStartupHandling >/dev/null 2>&1
    if [ $? -eq $RECOVER_DS ]; then
        if [ ! -f "${TRS_DB_DEST}/persist.db" ]; then
            # no Datastore found: force creating default configuration
            $PROGRAM_EEPROM setDsStartupHandling defaultDS >/dev/null 2>&1
        fi
    fi

    if [ ! -f "${TRS_ACT_DEST}/obsai_conf.xml" ]; then
        cp -f "${TRS_SRV_DEST}/obsai_conf.xml" "${TRS_ACT_DEST}/obsai_conf.xml"
        chmod 777 "${TRS_ACT_DEST}/obsai_conf.xml"
    fi

    if [ ! -f "${TRS_ACT_DEST}/swdlBD.xml" ]; then
        VERSION=$(cat "${TRS_SRV_DEST}/targetBD.xml" | grep softwareReleaseVersion|tail -n 1 | FS="\"" awk 'BEGIN { FS = "\"" } ; { print $2 }')
        cp -f "${TRS_SRV_DEST}/targetBD.xml" "${TRS_ACT_DEST}/${VERSION}.xml"
        ln -sf "${VERSION}.xml" "${TRS_ACT_DEST}/swdlBD.xml"
    fi

    if [  -f "${TRS_SIM_DEST}/sma_sft_test.cfg" ];then
        chmod 777 "${TRS_SIM_DEST}/sma_sft_test.cfg"
        cat "${TRS_ETC_DEST}/sma_sft_test.cfg">>"${TRS_SIM_DEST}/sma_sft_test.cfg" >/dev/null 2>&1
        chmod 777 "${TRS_SIM_DEST}/sma_sft_test.cfg"
    fi

    # MT Usage - Copy default SCF file to config path to avoid running Auto-Connection.
    if [ -f "${TRS_ETC_DEST}/MT_SCF_LTE.xml" -o -f "${TRS_ETC_DEST}/MT_SCF_WCDMA.xml" ]; then
        if [ ! -f "$TRS_DB_DEST/persist.db" -a ! -f "$TRS_DB_DEST/config.xml" ]; then
            local PRODTYPE=`${PROGRAM_ENVINFO} envInfoProductType | head -n 1`
            if [ "x${PRODTYPE}" = "xPROD_LTE_WMP" ]; then
                cp -f "${TRS_ETC_DEST}/MT_SCF_LTE.xml" "${TRS_DB_DEST}/config.xml"
                chmod 777 "${TRS_DB_DEST}/config.xml"
            elif [ "x${PRODTYPE}" = "xPROD_WCDMA" ]; then
                cp -f "${TRS_ETC_DEST}/MT_SCF_WCDMA.xml" "${TRS_DB_DEST}/config.xml"
                chmod 777 "${TRS_DB_DEST}/config.xml"
            fi
        fi
    fi

    # RDu: delete persist.db if there is a candidate config file ready for activation
    if [ -f $TRS_ACT_DEST/config.xml -o -f $TRS_ACT_DEST/config_upgrade.xml ]; then
        echo "Found candidate Site Configuration File for activation..."
        echo "Deleting persistency database(s)."
        # delete persist.db and its backup
        rm -f $TRS_DB_DEST/persist.db
        rm -f $TRS_DB_DEST/persist.bak
    fi

    # RDu: delete activated SCF file and corrupt persist.db to prevent reset loop
    if [ -f $TRS_ACT_DEST/config_activated.xml ]; then
        echo "Site Configuration File previously activated... System did not reach READY state!"
        echo "Deleting Site Configuration File(s) and persistency database(s)."
        # delete suspect file
        rm -f $TRS_ACT_DEST/config_activated.xml
        # delete persist.db and its backup
        rm -f $TRS_DB_DEST/persist.db
        rm -f $TRS_DB_DEST/persist.bak
        # restore configuration using backup file
        echo "Restoring configuration using backup file..."
        mv -f $TRS_ACT_DEST/config_backup.xml $TRS_ACT_DEST/config.xml
    fi

    # Copy TAUF config files to config directory if not.
    if [ ! -d $TAUF_CONF ]; then
        mkdir -p $TAUF_CONF
        chmod 644 $TAUF_CONF
    fi
    if [ ! -f $TAUF_CONF/target.hconf ]; then
        cp -f $TRS_ETC_DEST/tauf_target.hconf $TAUF_CONF/target.hconf >/dev/null 2>&1
        chmod 777 $TAUF_CONF/target.hconf >/dev/null 2>&1
    fi

    # Dynamic Support from TAUF
    if [ ! -f $TAUF_CONF/tauf_dynamic.sh -a -f $TAUF_SCRIPT/tauf_dynamic.sh ]; then
        cp -f $TAUF_SCRIPT/tauf_dynamic.sh $TAUF_CONF/tauf_dynamic.sh
        chmod 777 $TAUF_CONF/tauf_dynamic.sh
    fi
    # Get env's at Startup for MT.
    if [ -f $TAUF_SCRIPT/getenv.sh ]; then
        $TAUF_SCRIPT/getenv.sh
    fi

    return 0
}

init_trs_ip_env()
{
    TRS_LMP_IP=192.168.255.129
    if [ -e /tmp/lmp_addr.conf ]; then
        TRS_LMP_IP=`grep TRS_LMP_IP /tmp/lmp_addr.conf |awk -F"=" '{print $2}'`
    fi
    FCT_SYS_IP=192.168.255.1
    if [ -e /tmp/lmp_addr.conf ]; then
        FCT_SYS_IP=`grep FCT_SYS_IP /tmp/lmp_addr.conf |awk -F"=" '{print $2}'`
    fi
    MASTEROM_IP=192.168.255.16
    if [ -e /tmp/lmp_addr.conf ]; then
        MASTEROM_IP=`grep MASTEROM_IP /tmp/lmp_addr.conf |awk -F"=" '{print $2}'`
    fi
}

enable_highway_monitor()
{
    ${TRS_BIN_DEST}/trswStartup_init 2 4
    if [ $? -eq 0 ]; then
        echo "Highway Monitor (eth2) interface enabled."
    else
        echo "Error in enabling Highway Monitor (eth2) interface."
    fi
}

enable_dct_interface()
{
    ${TRS_BIN_DEST}/trswStartup_init 2 5
    if [ $? -eq 0 ]; then
        echo "DCT (eth4) interface enabled."
    else
        echo "Error in enabling DCT (eth4) interface."
    fi
}

enableRioPorts()
{
    local HOST_BIT=`cat /sys/class/rio_adapter/rio0/host_bit`
    local tries
    if [ "$HOST_BIT" -eq 0 ]; then
        let tries=6
        while [ "$(cat /sys/class/rio_adapter/rio0/base_id | cut -c 7-10)" = "ffff" ]; do
            echo "waiting for RIO enumeration ($(cat /sys/class/rio_adapter/rio0/base_id):$(cat /sys/class/rio_adapter/rio0/port_ok))"
            sleep 10
            let --tries
            if [ $tries -lt 0 ]; then
                break
            fi
        done
        if [ "$(cat /sys/class/rio_adapter/rio0/base_id | cut -c 7-10)" = "ffff" ]; then
            echo "!!!!!!!!!!!!!!! RIO enumeration problems ($(cat /sys/class/rio_adapter/rio0/base_id):$(cat /sys/class/rio_adapter/rio0/port_ok)) !!!!!!!!!!!!!!!"
        fi
        # execute rio interface configuration script (BTS PS)
        echo "Execute RIO network setup script (BTS PS)..."
        /etc/rc.d/init.d/common.d/setuprionetwork
        echo "Execute RIO network setup script (BTS PS): DONE"
    fi

    if [ -e /ffs/run/addons/rio-elog.py ]; then
        set -o pipefail

        ret=0
        let i=3

        while [ $i -gt 0 ]; do
            PYTHONHOME=/usr /usr/bin/python /ffs/run/addons/rio-elog.py -p 4 -e1 0x1000 </dev/null
            if [ $ret -eq 0 ]; then
                ret=$?
            fi
            PYTHONHOME=/usr /usr/bin/python /ffs/run/addons/rio-elog.py -p 5 -e1 0x1000 </dev/null
            if [ $ret -eq 0 ]; then
                ret=$?
            fi
            PYTHONHOME=/usr /usr/bin/python /ffs/run/addons/rio-elog.py -p 6 -e1 0x1000 </dev/null
            if [ $ret -eq 0 ]; then
                ret=$?
            fi
            let --i
        done

        if [ $ret -ne 0 ]; then
            echo "####################################################"
            echo "##"
            echo "## disabling of Link Layer Security failed"
            echo "## traffic might not work"
            echo "##"
            echo "####################################################"
        fi
    fi
}

enableRandDPorts()
{
    iptables -w -A PREROUTING -t mangle -i eth4+ -p tcp -m multiport --dport 15001:15006 -j ACCEPT
    iptables -w -A PREROUTING -t mangle -i eth4+ -p tcp -m multiport --dport 15001:15006 -j RETURN
}

start_syscomRouter()
{
    local syscomRouter="${TRS_BIN_DEST}/syscomRouter"
    local destfilename="${TRS_SIM_DEST}/$1"
    local mrecConfigureSyscom="${TRS_BIN_DEST}/configureSyscom"
    local srcPort=$2
    local defDstPort=$3
    local type=$4
    local dstIp
    local srcIp
    local dstPort

    case "${1}" in
        udpcp.ip)
            local defSrcPort=$srcPort

            if [ -f $destfilename ]; then
                CONTENT=`cat $destfilename`
                mode=` echo $CONTENT | awk '{printf $1}'`
                
                dstIp=`     echo $CONTENT | awk '{printf $1}'`
                dstPort=`   echo $CONTENT | awk '{printf $2}'`
                srcIp=`     echo $CONTENT | awk '{printf $3}'`
                srcPort=`   echo $CONTENT | awk '{printf $4}'`
            fi

            if [ "x$srcIp" = 'x' ]; then
                srcIp=$TRS_LMP_IP
            fi

            if [ "x$dstIp" = 'x' ]; then
                dstIp=$MASTEROM_IP
            fi

            if [ "x$srcPort" = 'x' ]; then
                srcPort=$defSrcPort
            fi

            ${TRS_BIN_DEST}/test_envInfo envInfoIfLMP > /dev/null
            ETH4_5=eth$?
            ${TRS_BIN_DEST}/test_envInfo envInfoIfTRS > /dev/null
            ETH2_3=eth$?
            echo "tmgr: use $ETH2_3 for TRS port and $ETH4_5 for LMP port"

            echo "Disable ${ETH4_5}..."
            ip link set ${ETH4_5} down
            echo "Disable ${ETH4_5}: DONE"

            echo "Configure ${ETH2_3}:1..."
            ip addr flush dev ${ETH2_3} label ${ETH2_3}:1
            ip addr add $srcIp/24 dev ${ETH2_3} label ${ETH2_3}:1
            echo "Configure ${ETH2_3}:1: DONE"
            ;;
        *)
            if [ -f $destfilename ]; then
                CONTENT=`cat $destfilename`
                for LINE in $CONTENT; do
                    case "$LINE" in
                        *:*)
                            dstIp=`  echo -e $LINE | cut -d ':' -f 1`
                            dstPort=`echo -e $LINE | cut -d ':' -f 2`
                            break
                    esac
                done
            fi

            if [ "x$dstIp" = 'x' ]; then
                dstIp=$MASTEROM_IP
            fi

            srcIp=`ip -4 route get "$dstIp" | awk '{where = match($0, /src[[:space:]][[:space:]]*([^[:space:]]*)/, a); if (where) { split (substr($0, RSTART, RLENGTH), a, "[[:space:]][[:space:]]*"); print a[2] } }'`

            if [ "x$srcIp" = 'x' ]; then
                srcIp=$TRS_LMP_IP
            fi
            ;;
    esac

    if [ "x$dstPort" = 'x' ]; then
        dstPort=$defDstPort
    fi

    echo $dstIp
    echo $dstPort
    echo $srcIp

    if [ $1 = udpcp.ip ]; then
            echo "Start syscomRouter in BTSOM_SIMULATED mode with type '$type' ..."
            if [ "$type" != "LSM" ] ; then
                if [ "$type" == "wIPCS" ] ; then
                    local BUILDTYPE=`${PROGRAM_ENVINFO} envInfoIfRP441 | head -n 1`
                    local result=$?
                    echo "result =  $result , value  = $BUILDTYPE"
                    if [ $result -eq 0 ]&& [ "x${BUILDTYPE}" = "xRP441_ENABLED" ] ; then
                        $syscomRouter "${type}Client" "${type}Server" $srcIp $srcPort $dstIp $dstPort UDPCP
                    else
                        $syscomRouter "${type}Server" "${type}Client" $srcIp $srcPort $dstIp $dstPort UDPCP
                    fi
                else
                    $syscomRouter "${type}Server" "${type}Client" $srcIp $srcPort $dstIp $dstPort UDPCP
                fi
            else
                $syscomRouter "${type}Server" "${type}Client" $srcIp $srcPort $dstIp $dstPort UDPCP RetainMsgHdr_YES
            fi
            echo "Start syscomRouter in BTSOM_SIMULATED mode with type '$type': DONE"
    else
        echo "Start syscomRouter in BTSOM_SIMULATED mode with type '$type' ..."
        if [ "$type" != "LSM" ] ; then
            $syscomRouter "${type}Server" "${type}Client" $srcIp $srcPort $dstIp $dstPort UDPCP
        else
            $syscomRouter "${type}Server" "${type}Client" $srcIp $srcPort $dstIp $dstPort UDPCP RetainMsgHdr_YES
        fi
        echo "Start syscomRouter in BTSOM_SIMULATED mode with type '$type': DONE"
    fi
}

is_file_exist()
{
    local udpcpfile="${TRS_SIM_DEST}/$1"
    if [ -e "$udpcpfile" ]; then
        return 1
    fi

    return 0
}

enable_sctp_forward()
{
    is_file_exist SCTP_TEST_ENABLE
    if [ $? -eq 1 ]; then
        echo "SCTP_TEST_ENABLE file exists, START Configuring forward routes"

        local GatewayIp
        case "${TEST_ADAPTER}" in
            yes|y|YES|Y)
                GatewayIp=192.168.253.16
                ;;
            *)
                GatewayIp=192.168.253.19
                ;;
        esac

        if [ ! -z "$SCTP_GATEWAY" ]; then
            GatewayIp=$SCTP_GATEWAY
            echo "Overwriting default SCTP Gateway:$GatewayIp with $SCTP_GATEWAY"
        fi

        ip ru add fwmark 100 lookup 99 prio 20000
        ip ro add t 99 default via $GatewayIp

        echo "Forward route configurations DONE"

        echo "Start configure proc entries for sctp forwarding"

        echo 1 > /proc/sys/net/ipv4/accept_packets_with_local_ipaddr
        echo 1 > /proc/sys/net/ipv4/ip_route_lookup_rt_main

        echo "Configure proc entries for sctp forwarding Done"

    fi
}

enable_secure_filetransfer_for_simulated_btsom()
{
    local SFT_CFG_FILE="${TRS_SIM_DEST}/sma_sft_test.cfg"

    if [ ! -s "${SFT_CFG_FILE}" ]; then
        mkdir -m 0775 -p "${TRS_ACT_SIM_DIR}"
        touch "${SFT_CFG_FILE}"
    fi

    local IPADDRESS=`ip -4 addr show eth1 label eth1 | awk '$1~/^inet/{print $2}' | awk -F/ '{print $1}'`

    /bin/cat "${SFT_CFG_FILE}" | /bin/sed -e "s#^\\(TRS_PRIVATE_IP:\\).*#\\1${IPADDRESS}#g" > "${SFT_CFG_FILE}.tmp"
    /bin/mv "${SFT_CFG_FILE}.tmp" "${SFT_CFG_FILE}"

    if ! grep -q -E '^TRS_PRIVATE_IP:' "${SFT_CFG_FILE}"; then
        echo "TRS_PRIVATE_IP:${IPADDRESS}" >> "${SFT_CFG_FILE}"
    fi
    if ! grep -q -E '^BTSOM_TFTP_SERV_IP:' "${SFT_CFG_FILE}"; then
        echo "BTSOM_TFTP_SERV_IP:$MASTEROM_IP" >> "${SFT_CFG_FILE}"
    fi

    chmod 664 "${SFT_CFG_FILE}"
}

add_RpBootUpSw_Flag()
{
    if [ "$rpBootupSwFlagReceived" = "trsw.isRpBootUpSw=yes" ];then
        sed -i 's/Nma\ trsw.isRpBootUpSw=no$/Nma\ trsw.isRpBootUpSw=yes/' $PROGRAM_RC
    else
        sed -i 's/Nma\ trsw.isRpBootUpSw=yes$/Nma\ trsw.isRpBootUpSw=no/' $PROGRAM_RC
    fi
}

add_Watchdog_Flag()
{
    local BUILDTYPE=`${PROGRAM_ENVINFO} envInfoIfRP441 | head -n 1`
    local result=$?
    echo "result =  $result , value  = $BUILDTYPE"
    if [ $result -eq 0 ]&& [ "x${BUILDTYPE}" = "xRP441_ENABLED" ] ; then
        sed -i 's/ukTmgrMon -s -m 30$/ukTmgrMon -s -m 30 -w 60/' $PROGRAM_RC
    else
        sed -i 's/ukTmgrMon -s -m 30 -w 60$/ukTmgrMon -s -m 30/' $PROGRAM_RC
    fi
}

start_tmgr()
{
    init_trs_ip_env

    export LOCAL_INADDR=127.0.0.1
    local syscomRouter="${TRS_BIN_DEST}/syscomRouter"
    local forwardSyscom="${TRS_BIN_DEST}/forwardSyscom"
    local PRODTYPE=`${PROGRAM_ENVINFO} envInfoProductType | head -n 1`
    echo "Start TRS based Applications for unit $PIU_TYPE"

    local is_btsomsimulated=0
    local is_testadapter=0

    case "${TEST_ADAPTER}" in
        yes|y|YES|Y)
            case "${TEST_ADAPTER_WAIT_DUT}" in
                no|n|NO|N)
                    ;;
                *)
                    #is_testadapter=1
                    ;;
            esac
            if [ "x${TEST_ADAPTER}" != 'x' ]; then
                export TEST_ADAPTER
            fi
            is_file_exist udpcp.ip
            if [ $? -eq 0 ]; then
                echo "udpcp.ip config file not exist, syscomRouter not started"
            else
                start_syscomRouter udpcp.ip 9012 9012 wIPCS >${TRS_LOG_DEST}/IpcsBridge.logs 2>&1 </dev/null
            fi
            # Start the RP1 forwarding apps on the TA
            #$forwardSyscom TA oamCmnTrs TA rp1Btsom  >${TRS_LOG_DEST}/rp1FwdStartup.logs 2>&1 </dev/null
            #$forwardSyscom TA rp1Trsw TRSW rp1Trsw  >>${TRS_LOG_DEST}/rp1FwdStartup.logs 2>&1 </dev/null
            #start_syscomRouter soap.ip 13300 13001 RP1 >${TRS_LOG_DEST}/Rp1Bridge.logs 2>&1 </dev/null
            echo "Started RP1 forwarding apps for TA.. Done"
            ;;
        *)
            # run the syscomRouter for RP1 and LicenseManagement
            case "${BTSOM_SIMULATED}" in
                yes|y|YES|Y)
                    export BTSOM_SIMULATED
                    #is_btsomsimulated=1

                    fix_core_pattern

                    enable_secure_filetransfer_for_simulated_btsom

                    start_syscomRouter soap.ip 13300 13001 RP1 >${TRS_LOG_DEST}/Rp1Bridge.logs     2>&1 </dev/null
                    start_syscomRouter nmap.ip 13061 13060 LSM >${TRS_LOG_DEST}/LicenseBridge.logs 2>&1 </dev/null
                    ${OPT_DIR}/trs_ntpd.sh start

                    # create /ffs/stb
                    mkdir -p $STANDBY_DEST

                    ;;
                *)
                    if [ -e "${TRS_SIM_DEST}/Rp1Peer.conf" ]; then
                        rm -f "${TRS_SIM_DEST}/Rp1Peer.conf"
                    fi
            esac
            ;;
    esac

    enable_sctp_forward

    local syncargs=''
    local syncdevice

    syncdevice="${FTIF_IF}"
    export FTIF_IF
    export TMGR_SYNC_PEER_IP="192.168.255.53"
    if [ $is_btsomsimulated -ne 0 ]; then
        syncargs=' -M'
    else
        export TMGR_SYNC_LOCAL_IP="192.168.255.54"
        export TMGR_SYNC_DEV=$syncdevice
    fi

    if [ $is_testadapter -ne 0 ]; then
        syncargs=' -S'
        export TMGR_SYNC_LOCAL_IP="192.168.253.19"
        export TMGR_SYNC_PEER_IP="192.168.253.16"
        export TMGR_SYNC_DEV="rio0m0"
    fi

    # check for existence of script before trying to run it
    if [ -f "${TRS_BIN_DEST}/init_board.sh" ]; then
        #Bino/Krishna
        #Added for Trs Crash handler initialization
        ${TRS_BIN_DEST}/init_board.sh &
        disown %+
    fi

    add_RpBootUpSw_Flag

    add_Watchdog_Flag

    # start task manager, don't return
    local command="$PROGRAM_START -F -C $TMGR_CONDITIONS $syncargs -s 6 -c 0 -f 0 -m 1 -l $RUNLEVEL $PROGRAM_RC"

    NFSINTERFACE=$(check_nfsboot)
    if [ "x${NFSINTERFACE}" != 'x' ]; then
        export NFSINTERFACE
    fi

    if [ "x${TEST_ADAPTER}" != 'x' ]; then
        export TEST_ADAPTER
    fi

    exec $command </dev/null
}

create_pipe()
{
    local use_console=0

    case "${TEST_ADAPTER}" in
        yes|y|YES|Y)
            use_console=1
            ;;
    esac

    case "${BTSOM_SIMULATED}" in
        yes|y|YES|Y)
            use_console=1
            ;;
    esac

    local without_tee
    if which tee >/dev/null 2>&1; then
        without_tee=0
    else
        without_tee=1
    fi

    local without_console
    if [ -c /dev/console ] && echo 2>/dev/null >/dev/console; then
        without_console=0
    else
        without_console=1
    fi

    if [ $use_console -ne 0 ]; then
        # lower kernel print level
        printk=$(cat /proc/sys/kernel/printk|awk '{print $1}')
        if [ "$printk" -gt 3 ]; then
            echo 3 > /proc/sys/kernel/printk
        fi

        # workaround crashing vsftpd
        #killall -q -9 vsftpd > /dev/null 2>&1 || echo "VSFTP was not running"
        #(while true; do vsftpd; echo "VSFTP terminated"; done) &
        #disown %+
    fi

    local pipe_end
    if [ $use_console -ne 0 ] && [ $without_tee -eq 0 ] && [ $without_console -eq 0 ]; then
        pipe_end='tee -a /dev/console'
    else
        pipe_end='cat'
    fi

    /bin/rm -f /tmp/ukTmgr_pipe
    /usr/bin/mkfifo -m 0600 /tmp/ukTmgr_pipe

    ($pipe_end < /tmp/ukTmgr_pipe 2>&1 | logger -t TRS_SW/tmgr) >/dev/null 2>&1 </dev/null &
    disown %+
}

main()
{
    enableRioPorts

    if [ "x${START_TRSSW}" = 'x' ]; then
        START_TRSSW=yes
    fi

    case "${START_TRSSW}" in
        yes|y|YES|Y)
            check_config

            if [ "$PIU_TYPE" = "FCTE" ]; then
                # Enable Highway-Monitor(eth2) interface for build-1 H/W
                enable_highway_monitor
                # Enable DCT (eth4) interface for build-1 H/W
                enable_dct_interface
                # Enable TCP ports in the range 15001:15006
                enableRandDPorts
            fi

            start_tmgr
            ;;
        *)
            # LTE 1266 - Trigger watchdog in notrsw mode
            ${TRS_BIN_DEST}/ukTmgrMon -s -m 30 -w 60 -D
            exec ${TRS_BIN_DEST}/ukTmgrListenOnCardReady </dev/null
            ;;
    esac
}

wait_core_pattern

create_pipe

main >/tmp/ukTmgr_pipe 2>&1
