#!/usr/bin/bash

# Source the general functions for is_true() and is_false():
. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f ../network ] && . ../network

unset REALDEVICE
if [ "$1" = --realdevice ] ; then
    REALDEVICE=$2
    shift 2
fi

CONFIG=$1
source_config

[ -z "$REALDEVICE" ] && REALDEVICE=$DEVICE

# PROTONYX POINT BRIDGE MODE RULES#
if [ "${COMBOXBRIDGE}" == "yes" ]; then
    if [ "${COMBOXBRIDGETEMPLATE}" == "SERVER" ]; then
       echo "APPLYING BRIDGEMODE ROUTES. COMBOXBRIDGETEMPLATE=${COMBOXBRIDGETEMPLATE}, COMBOXBRIDGEFAKEIP=${COMBOXBRIDGEFAKEIP}"
        MYGWNETWORK=`ipcalc -n "${GATEWAY}" "${NETMASK}"|sed 's/NETWORK=//g'`
        MYPREFIX=`ipcalc -p "${GATEWAY}" "${NETMASK}"|sed 's/PREFIX=//g'`
       echo "The vars I will use: IPADDR=${IPADDR}, GATEWAY=${GATEWAY}, NETMASK=${NETMASK}, MYGWNETWORK=${MYGWNETWORK}, MYPREFIX=${MYPREFIX}"
#echo Checkpoint - 05
       # this rule may already be in place as it refers to the tun0 interface
       # it should. by means of route-tun0
       #ip ro add "${IPADDR}" dev tun0
#echo Checkpoint - 06
       ip ro add "${MYGWNETWORK}"/"${MYPREFIX}" dev eth0
       ip neigh add proxy "${IPADDR}" dev eth0
       if [ -n "${MOREIPS}" ]; then
               for ANIPADDR in ${MOREIPS}; do
                       #route-tun0 takes care of this
                       #ip ro add "${ANIPADDR}" dev tun0
                       ip neigh add proxy "${ANIPADDR}" dev eth0
               done
       fi
#echo Checkpoint - 08
       ip ro add default via "${GATEWAY}" dev eth0
    elif [ "${COMBOXBRIDGETEMPLATE}" == "CLIENT" ]; then
        echo "APPLYING BRIDGEMODE ROUTES. COMBOXBRIDGETEMPLATE=${COMBOXBRIDGETEMPLATE}, COMBOXBRIDGEDCGWIP=${COMBOXBRIDGEDCGWIP}, COMBOXBRIDGEXENOSIP=${COMBOXBRIDGEXENOSIP}, COMBOXBRIDGEMOREXENOSIPS=${COMBOXBRIDGEMOREXENOSIPS}, COMBOXBRIDGEXENOSNETMASK=${COMBOXBRIDGEXENOSNETMASK}"
        #MYDCGWNETWORK=`ipcalc -n "${COMBOXBRIDGEDCGWIP}" "${COMBOXBRIDGEXENOSNETMASK}"|sed 's/NETWORK=//g'`
        #MYDCPREFIX=`ipcalc -p "${COMBOXBRIDGEDCGWIP}" "${COMBOXBRIDGEXENOSNETMASK}"|sed 's/PREFIX=//g'`
        #echo "The vars I will use: MYDCGWNETWORK=${MYDCGWNETWORK}, MYDCPREFIX=${MYDCPREFIX}"
	# this rule may already be in place as it refers to the tun0 interface
       #ip ro add "${MYDCGWNETWORK}"/"${MYDCPREFIX}" dev tun0
       ip ro add "${COMBOXBRIDGEXENOSIP}"/32 dev eth0
        if [ -n "${COMBOXBRIDGEMOREXENOSIPS}" ]; then
                for ANIPADDR in ${COMBOXBRIDGEMOREXENOSIPS}; do
                        ip ro add "${ANIPADDR}"/32 dev eth0
                done
        fi
       #ip neigh add proxy "${MYDCGWNETWORK}"/"${MYDCPREFIX}" dev eth0
       echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
    fi
elif [ "${DEVICE}" == "eth0" ]; then
  echo 0 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
fi
# PROTONYX POINT END #

if is_false "$ISALIAS"; then
    /etc/sysconfig/network-scripts/ifup-aliases ${DEVICE} ${CONFIG}
fi

if ! is_true "$NOROUTESET"; then
    /etc/sysconfig/network-scripts/ifup-routes ${REALDEVICE} ${DEVNAME}
fi


if ! is_false "${PEERDNS}" || is_true "${RESOLV_MODS}"; then
    # Obtain the DNS entries when using PPP if necessary:
    [ -n "${MS_DNS1}" ] && DNS1="${MS_DNS1}"
    [ -n "${MS_DNS2}" ] && DNS2="${MS_DNS2}"

    # Remove duplicate DNS entries and shift them, if necessary:
    update_DNS_entries

    # Determine what regexp we should use (for testing below):
    if   [ -n "${DNS3}" ]; then
        grep_regexp="[^#]?nameserver[[:space:]]+${DNS1}[^#]?nameserver[[:space:]]+${DNS2}[^#]?nameserver[[:space:]]+${DNS3}"
    elif [ -n "${DNS2}" ]; then
        grep_regexp="[^#]?nameserver[[:space:]]+${DNS1}[^#]?nameserver[[:space:]]+${DNS2}"
    elif [ -n "${DNS1}" ]; then
        grep_regexp="[^#]?nameserver[[:space:]]+${DNS1}"
    else
        # No DNS entries used at all ->> match everything.
        grep_regexp=".*"
    fi

    # Test if the search field needs updating, or
    # if the nameserver entries order should be updated:
    if [ -n "${DOMAIN}" ] && ! grep -q "^search.*${DOMAIN}.*$" /etc/resolv.conf ||
        ! tr --delete '\n' < /etc/resolv.conf | grep -E -q "${grep_regexp}"; then

        if tmp_file=$(mktemp); then
            search_str=''

            while read line; do
                case ${line} in

                    # Skip nameserver entries when at least one DNS option was given
                    # (at this stage we know that we have to update all the nameserver
                    # enries anyway -- see below), or copy them if we are changing just
                    # the 'search' field in /etc/resolv.conf:
                    nameserver*)
                        if [[ "${grep_regexp}" != ".*" ]]; then
                            continue
                        else
                            echo "${line}" >> "${tmp_file}"
                        fi
                        ;;

                    domain* | search*)
                        if [ -n "${DOMAIN}" ]; then
                            read search value < <(echo ${line})
                            search_str+=" ${value}"
                        else
                            echo "${line}" >> "${tmp_file}"
                        fi
                        ;;

                    # Keep the rest of the /etc/resolv.conf as it was:
                    *)
                        echo "${line}" >> "${tmp_file}"
                        ;;
                esac
            done < /etc/resolv.conf

            # Insert the domain into 'search' field:
            if [ -n "${DOMAIN}" ]; then
                echo "search ${DOMAIN}${search_str}" >> "${tmp_file}"
            fi

            # Add the requested nameserver entries:
            [ -n "${DNS1}" ] && echo "nameserver ${DNS1}" >> "${tmp_file}"
            [ -n "${DNS2}" ] && echo "nameserver ${DNS2}" >> "${tmp_file}"
            [ -n "${DNS3}" ] && echo "nameserver ${DNS3}" >> "${tmp_file}"

            # Backup resolv.conf only if it doesn't exist already:
            ! [ -f /etc/resolv.conf.save ] && cp -af /etc/resolv.conf /etc/resolv.conf.save

            # Maintain permissions, but set umask in case it doesn't exist:
            umask_old=$(umask)
            umask 022

            # Update the resolv.conf:
            change_resolv_conf "${tmp_file}"

            rm -f "${tmp_file}"
            umask ${umask_old}
            unset tmp_file search_str umask_old
        else
            net_log $"/etc/resolv.conf was not updated: failed to create temporary file" 'err' 'ifup-post'
        fi
    fi

    unset grep_regexp
fi

# don't set hostname on ppp/slip connections
if [ "$2" = "boot" -a \
        "${DEVICE}" != lo -a \
        "${DEVICETYPE}" != "ppp" -a \
        "${DEVICETYPE}" != "slip" ]; then
    if need_hostname; then
        IPADDR=$(LANG=C ip -o -4 addr ls dev ${DEVICE} | awk '{ print $4 ; exit }')
        eval $(/bin/ipcalc --silent --hostname ${IPADDR} ; echo "status=$?")
        if [ "$status" = "0" ]; then
            set_hostname $HOSTNAME
        fi
    fi
fi

# Set firewall ZONE for this device (empty ZONE means default):
if [ "${REALDEVICE}" != "lo" ]; then
    dbus-send --print-reply --system --dest=org.fedoraproject.FirewallD1 \
              /org/fedoraproject/FirewallD1 \
              org.fedoraproject.FirewallD1.zone.changeZoneOfInterface \
              string:"${ZONE}" string:"${DEVICE}" \
              > /dev/null 2>&1
fi

if [ -x /sbin/ifup-local ]; then
    /sbin/ifup-local ${DEVICE}
fi

exit 0
