_functions_loaded 2> /dev/null || . "${ROOTACT}/lrr/com/_functions.sh"

. "${ROOTACT}/lrr/failovermgr/check_interface_status"

KONALTEMODEM_CLI="timeout -k 5 30 konaLTEmodem.py"

USE_MMCLI=0
which mmcli > /dev/null 2>&1 && USE_MMCLI=1

switchWwanInterface()
{
    in=$1
    out=$2

    if { [ "$in" != "wwan0" ] || [ "$out" != "wwan1" ]; } && { [ "$in" != "wwan1" ] || [ "$out" != "wwan0" ]; }; then
        return 1
    fi

    sed -i "s/DEFAULT_CELLULAR_NETIF_NAME=\"$in\"/DEFAULT_CELLULAR_NETIF_NAME=\"$out\"/" "${ROOTACT}/lrr/gwmgr/scripts/tekos/gwmgr_netconfig.sh"

    sed -i "s/\"name\": \"$in\"/\"name\": \"$out\"/" "${ROOTACT}/usr/data/lrr/gwmgr/applied.json"
    sed -i "s/\"name\": \"$in\"/\"name\": \"$out\"/" "${ROOTACT}/usr/data/lrr/gwmgr/commited.json"

    sed -i "s/name=$in/name=$out/" "${ROOTACT}/usr/etc/lrr/lrr.ini"
    sed -i "s/principal=$in/principal=$out/" "${ROOTACT}/usr/etc/lrr/ipfailover2.ini"
    sed -i "s/rescue=$in/rescue=$out/" "${ROOTACT}/usr/etc/lrr/ipfailover2.ini"

    rm -f /home/actility/usr/data/lrr/gwmgr/netif_activ

    $ROOTACT/lrr/gwmgr/gwmgr.x --apply < "${ROOTACT}/usr/data/lrr/gwmgr/applied.json"

    /etc/init.d/lrr restart
}

restartInterface()
{

INTERFACE=$1

case "$INTERFACE" in
    eth[0-9])
        Log "Restart interface $INTERFACE"
        ETHIPADDR=""
        ITF_CONFIG="$ROOTACT/usr/data/lrr/gwmgr/static_config.${INTERFACE}"
        [ -f "$ITF_CONFIG" ] && . ${ITF_CONFIG}

        ip route del default dev ${INTERFACE} > /dev/null 2>&1
        ip route flush table cache dev ${INTERFACE}
        ip address flush dev ${INTERFACE} > /dev/null 2>&1
        ip link set ${INTERFACE} down > /dev/null 2>&1
        sleep 2
        ip link set dev ${INTERFACE} up > /dev/null 2>&1
        if [ -z "$ETHIPADDR" ]; then
            pkill -f "udhcpc.*${INTERFACE}"
            sleep 1
            udhcpc -R -b -p /var/run/udhcpc.${INTERFACE}.pid -i ${INTERFACE} 2>/dev/null
        else
            ETHNETMASK_CIDR=$(mask2cidr "$ETHNETMASK")
            [ -z "$ETHBROADCAST" ] && ETHBROADCAST="+"
            ip addr add "${ETHIPADDR}/${ETHNETMASK_CIDR}" broadcast ${ETHBROADCAST} dev ${INTERFACE} > /dev/null 2>&1
            ip route add default via "${ETHGATEWAY}" dev ${INTERFACE} > /dev/null 2>&1
        fi
        return 0
        ;;
    wwan[0-9])
        Log "Restart interface $INTERFACE"

        if [ "${INTERFACE}" == "wwan0" ] && ! checkInterfaceStatus wwan0 && checkInterfaceStatus wwan1; then
            switchWwanInterface wwan0 wwan1
            return 0
        elif [ "${INTERFACE}" == "wwan1" ] && ! checkInterfaceStatus wwan1 && checkInterfaceStatus wwan0; then
            switchWwanInterface wwan1 wwan0
            return 0
        fi

        kill $(ps waux | grep udhcpc | awk '/[w]wan/{print $2}')

        APN_ADDR=$(grep LTE_APN "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')
        APN_USER=$(grep LTE_USER "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')
        APN_PASSWORD=$(grep LTE_PASSWORD "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')
        APN_PIN=$(grep LTE_PIN "$ROOTACT/usr/etc/lrr/cellular.ini" | cut -f2 -d'=')

        if [ -n "${APN_ADDR}" ]; then
            NOW=$(date +%s)

            if [ "${USE_MMCLI}" -eq 0 ]; then
                PROFILE_COUNT=$(${KONALTEMODEM_CLI} -c 'AT+CGDCONT?' | grep '^\+CGDCONT' | wc -l)
                CURRENT_APN=$(${KONALTEMODEM_CLI} -c 'AT+CGDCONT?' | grep "\"${APN_ADDR}\"")


                if [ ${PROFILE_COUNT} -eq 0 ] || [ -z "${CURRENT_APN}" ]; then
                    /etc/init.d/wwan0-startup-rc stop
                    sleep 5

                    ${KONALTEMODEM_CLI} -c "AT+CGDCONT=1,\"IP\",\"$APN_ADDR\",\"0.0.0.0\",0,0"

                    if [ -n "${APN_USER}" ] && [ -n "${APN_PASSWORD}" ]; then
                        ${KONALTEMODEM_CLI} -c "AT\$GCPDPP=1,2,\"$APN_PASSWORD\",\"$APN_USER\""
                    fi

                    sleep 5

                    /etc/init.d/wwan0-startup-rc start
                elif [ ${PROFILE_COUNT} -gt 1 ]; then
                    /etc/init.d/wwan0-startup-rc stop
                    sleep 5

                    first_apn_kept=0
                    for p in $(${KONALTEMODEM_CLI} -c 'AT+CGDCONT?' | grep '^\+CGDCONT' | grep "\"${APN_ADDR}\"" | awk -F'[:,]' '/\+CGDCONT/ {print $2}' | xargs); do
                        if [ ${first_apn_kept} -eq 0 ]; then
                            first_apn_kept=1
                        else
                            ${KONALTEMODEM_CLI} -c "AT+CGDCONT=${p}"
                        fi
                    done

                    ${KONALTEMODEM_CLI} -c "AT+CGDCONT=1,\"IP\",\"$APN_ADDR\",\"0.0.0.0\",0,0"

                    if [ -n "${APN_USER}" ] && [ -n "${APN_PASSWORD}" ]; then
                        ${KONALTEMODEM_CLI} -c "AT\$GCPDPP=1,2,\"$APN_PASSWORD\",\"$APN_USER\""
                    fi

                    sleep 5

                    /etc/init.d/wwan0-startup-rc start
                else
                    [ -n "${APN_PIN}" ] && ${KONALTEMODEM_CLI} -c "AT+CPIN=$APN_PIN"

                    [ -e "/dev/cdc-wdm0" ] && qmicli -d /dev/cdc-wdm0 --wds-start-network="${APN_ADDR}" --client-no-release-cid
                    [ -e "/dev/cdc-wdm1" ] && qmicli -d /dev/cdc-wdm1 --wds-start-network="${APN_ADDR}" --client-no-release-cid

                    sleep 5

                    if ! monit status cm-modem | grep -q Monitored; then
                        /etc/init.d/wwan0-startup-rc start
                    fi
                fi

                [ -e "/dev/cdc-wdm0" ] && udhcpc -R -b -p /var/run/udhcpc.wwan0.pid -i wwan0
                [ -e "/dev/cdc-wdm1" ] && udhcpc -R -b -p /var/run/udhcpc.wwan1.pid -i wwan1
            else
                if [ -n "${APN_PIN}" ]; then
                    mmcli -i 0 --pin ${APN_PIN} > /dev/null 2>&1
                    mmcli -i 1 --pin ${APN_PIN} > /dev/null 2>&1
		        fi

                if [ -n "${APN_USER}" ] && [ -n "${APN_PASSWORD}" ]; then
                    mmcli -m 0 --simple-connect="apn=${APN_ADDR},user=${APN_USER},password=${APN_PASSWORD},ip-type=ipv4"
                else
                    mmcli -m 0 --simple-connect="apn=${APN_ADDR},ip-type=ipv4"
                fi

                udhcpc -R -b -p /var/run/udhcpc.wwan0.pid -i wwan0
                sleep 5
            fi
        fi

        return 0
        ;;

    wlan[0-9])
        Log "Restart interface $INTERFACE"
        killall wpa_supplicant
        sleep 1
        ip link set "$INTERFACE" down >/dev/null 2>&1
        sleep 1
        ip link set "$INTERFACE" up >/dev/null 2>&1
        sleep 1
        wpa_supplicant -B -i "$INTERFACE" -c /etc/wpa_supplicant.conf
        sleep 5
        udhcpc -i "$INTERFACE"
        return 0
        ;;
    *)
        Log "Cannot restart interface. Not supported by the script"
        return 1
        ;;
esac
}
