#!/bin/sh
. /etc/kerbynet.conf
if [ "$DEBUG" = 0 ]; then
  ERROUT=/dev/null
else
  ERROUT="$DBGFILE"
fi
#ERROUT="$DBGFILE"
#echo "$0 was run with args: $@" >> $ERROUT 2>&1
#
# (C) PROTONYX 2009
#
MASTERCONF="/etc/protonyx.conf"
# Load master.conf
. $MASTERCONF
#
# Load treloProxy conf
. $LOADTRELOCONF
#
# Source ifcfg-eth0 to find out if we are in Bridge Mode
. /etc/sysconfig/network-scripts/ifcfg-eth0
if [ "${COMBOXBRIDGE}" == "yes" ]; then
  if [ "${COMBOXBRIDGETEMPLATE}" == "CLIENT" ]; then
    BRIDGEMODECLIENT="yes"
    XENOS_IP="${COMBOXBRIDGEXENOSIP}"
    MOREXENOSIPS="${COMBOXBRIDGEMOREXENOSIPS}"
  fi
fi
#
CONFIG=$REGISTER/system/net/nb/Gateways
cd $CONFIG
#
#
#
# Checks if FO_CHAIN exists and if a jump to FO_CHAIN exists in the OUTPUT chain
# anything that doesn't exist is created
#
#function checkFOchains {
#  # does the chain exist?
#  unset EXISTS
#  iptables -L "$FO_CHAIN" -t mangle && EXISTS=$?
#  # if it doesn't exist, create it
#  if [ "$EXISTS" != "0" ]; then
#    echo "DOESN'T EXIST: $FO_CHAIN"
#    #
#    #creating FO_CHAIN
#    iptables -N "$FO_CHAIN" -t mangle
#    #
#    #Inserting default rules
#    iptables -F "$FO_CHAIN" -t mangle
#    iptables -A "$FO_CHAIN" -t mangle -j MARK --set-mark "$DNS_PREFERRED_MARK"
#    iptables -A "$FO_CHAIN" -t mangle -j ACCEPT
#  fi
#  # does the jump to the chain exist in OUTPUT?
#  if ! iptables -t mangle -L OUTPUT -n | grep "$FO_CHAIN" ; then
#    # exei mpei to connmark? an oxi perimene na mpei
#    if ! iptables -L OUTPUT -t mangle | grep CONNMARK ; then
#      #mallon den xreiazetai afou tha mpoune ola telika apo to postboot meta pou tha exei mpei to connmark
#      #iptables -I OUTPUT 1 -t mangle -p tcp -s "$TRELOPROXY_IP" --sport "$DYNSPORT" --dport 80 -j "$FO_CHAIN"
#      # ok mhn to bazeis akoma perimene to post boot pou tha trekseis manually
#      :
#    else
#      CONNMARK_LINE=`iptables -L OUTPUT -t mangle --line-numbers | grep CONNMARK | awk {'print $1'}`
#      FO_LINE=$((CONNMARK_LINE+1))
#      iptables -I OUTPUT $FO_LINE -t mangle -p tcp -s "$INET_IP" --sport "$DYNSRCPORT" --dport "$DYNDSTPORT" -j "$FO_CHAIN"
#    fi
#  fi  
#}
##
#echo *********nbs00
if [ "`cat $REGISTER/system/net/nb/Enabled 2>>$ERROUT`" != yes ] ; then
  ip ro del default 2>>$ERROUT
  #echo *********nbs01
  rm -f "$TMPSTATUS"/ActiveGW
  $SCRIPTS/routerconfig
  $SCRIPTS/setpppgw any
  exit 0
fi
MODE=`cat $REGISTER/system/net/nb/Mode 2>>$ERROUT`
function CheckDefault {
 cGW="$1"
 cN=`echo $cGW | wc -w`
 [ "$cN" -eq 0 ] && return 1
 if [ "$cN" -eq 1 ] ; then
   [ "`cat $cGW/Enabled 2>>$ERROUT`" != yes -o -r "$TMPSTATUS"/Gateways/$cGW/Fault ] && return 1
   cINTERFACE=`cat $cGW/Interface 2>>$ERROUT`
   cIP=`cat $cGW/IP 2>>$ERROUT`
   if [ -n "$cIP" ] ; then
     if ip ro | grep ^default | grep -v metric | grep -q -w "via $cIP" ; then
       return 0
     else
       return 1
     fi
   else
     if ip ro | grep ^default | grep -v metric | grep -w -v via | grep -q -w "dev $cINTERFACE" ; then
       return 0
     else
       return 1
     fi
   fi
 else
  return 1
 fi

}
GW=`ls -d ?? 2>>$ERROUT`
RULES=""
CHANGE=""
#echo "checkPoint-0 CHANGE=empty" >> $ERROUT 2>&1
MAX=0
N=0
NEEDTORUNUPD_NBGWPRIO=0
for G in $GW ; do
  PREV_ACTIVEGW=`cat "$TMPSTATUS"/ActiveGW 2>>$ERROUT`
  STATUSDIR="$TMPSTATUS"/Gateways/$G
  ##PROTONYX-NEO-Part1
  #EXISTED=1
  if [ ! -d "$STATUSDIR" ]; then
    #EXISTED=0
    mkdir -p $STATUSDIR 2>>$ERROUT
    touch "$STATUSDIR/Fault"
  fi
  ##NEO-Part1-END
  #mkdir -p $STATUSDIR 2>>$ERROUT
  ##PROTONYX-NEO-Part2
  #if [ "$EXISTED" -eq 0 ]; then
  #  touch "$STATUSDIR/Fault"
  #fi
  ##NEO-Part2-END

  #
  # PROTONYX CUSTOMIA
  #
  DESC=`cat $G/Description 2>>$ERROUT`
  NOBAL=1
  if [ "`echo $DESC |grep 'NOBALANCE' 2>>$ERROUT`" == "" ] ; then
    #     echo "EP!!!" >> /DB/sda4/tmp/nb_setnexthop.log
    NOBAL=0        
  fi
  #else
    #
    # PROTONYX CUSTOMIA: An to G einai o treloProxy check for FO_CHAIN
    #
    #checkFOchains
  #fi
  if [ "`cat $G/Enabled 2>>$ERROUT`" = yes -a ! -r $STATUSDIR/Fault ] && ip ro sh ta 1$G |grep -q ^default ; then
    INTERFACE=`cat $G/Interface 2>>$ERROUT`
    IP=`cat $G/IP 2>>$ERROUT`
    DEVICE=`cat $G/Device 2>>$ERROUT`
    WEIGHT=`cat $G/Weight 2>>$ERROUT`
    if [ -n "$IP" ] ; then
      if [ -n "$DEVICE" ]; then
	TMP="nexthop via $IP dev $DEVICE weight $WEIGHT realm 1$G"
      else
        TMP="nexthop via $IP weight $WEIGHT realm 1$G"
      fi
      X="$IP"
      NOVIA="xxx"
      #PROTONYX_START 20131108
      #if ! ip ro sh | grep -w "via $IP" | grep -w -q "weight $WEIGHT" ; then
      if ! ip ro sh | grep -w "via $IP" | grep -w -q "realm 1$G" ; then
	if [ "$NOBAL" = 0 ]; then
      #PROTONYX_END 20131108
          CHANGE=yes
	  #echo "checkPoint-1 CHANGE=yes" >> $ERROUT 2>&1
	  #echo "RUNTIMES: IP=#$IP#, WEIGHT=#$WEIGHT# G=#$G# STATUSDIR=$STATUSDIR"
      #PROTONYX_START 20131108
	fi
      #PROTONYX_END 20131108
      fi
    else
      TMP="nexthop dev $INTERFACE weight $WEIGHT realm 1$G"
      X="$INTERFACE"
      NOVIA="via"
      if ! ip ro sh | grep -v via | grep -w -q "$TMP" ; then
        CHANGE=yes
	#echo "checkPoint-2 CHANGE=yes" >> $ERROUT 2>&1
      fi
    fi
#PROTONYX_START 20131108
    #N=$((N+1))
    if [ "$NOBAL" = 0 ]; then
      N=$((N+1))
    fi
#PROTONYX_END 20131108
    # if [ -r /DB/sda4/tmp/nb_setnexthop.log ] ; then
    #    touch /DB/sda4/tmp/nb_setnexthop.log
    # fi
    #DESC=`cat $G/Description 2>>$ERROUT`
    # echo $DESC >> /DB/sda4/tmp/nb_setnexthop.log
    
    #
    # PROTONYX CUSTOMIA
    #
    #NOBAL=0
    #if [ "`echo $DESC |grep 'NOBALANCE' 2>>$ERROUT`" == "" ] ; then
    #     echo "EP!!!" >> /DB/sda4/tmp/nb_setnexthop.log
	#NOBAL=1        
    if [ "$NOBAL" = 0 ]; then
      NEXTHOP="$NEXTHOP $TMP"
    fi
	# echo $TMP
    # else
	# echo "EP!!!!!!!!!!"
    #fi
    ACTIVEGW="$ACTIVEGW $G"
    if ! [ -r $STATUSDIR/Rule ] ; then
      ip rule add fwmark 1$G ta 1$G && touch $STATUSDIR/Rule
      # PROTONYX BRIDGE MODE RULE GIA NA DOYLEVEI O NETBALANCER STO BRIDGE MODE
      if [ "1${G}" -ne 105 ]; then 
        if [ "${BRIDGEMODECLIENT}" == "yes" ]; then
	  #PROSOXH AYTO DEN DOYLEVE OTAN EKANES SERVICE NETWORK RESTART 'H RESTART TON BALANCER GIATI PRWTA EIXE KANEI ip ro flush ta 1xx
	  #THISIFACE=`ip ro sh ta 1$G|grep "^default"|awk '{ printf $5 }'`
	  THISIFACE=`/opt/protonyx-scripts/getIfaceFromGWnum.sh "$G"`
	  if [ -n "$THISIFACE" ]; then
	    # GIA NA DEIXNEI TO REAL INTERFACE NAME STA SINGLE-WAN comBOX
	    THISIFACE=`echo "${THISIFACE}"|awk '{ print $1 }'`
	    for ANIPADDR in ${XENOS_IP} ${MOREXENOSIPS}; do
	      ip rule add to "${ANIPADDR}" iif "${THISIFACE}" fwmark 1$G ta main
            done
            #ip rule add to "${XENOS_IP}" iif "${THISIFACE}" fwmark 1$G ta main
	    #if [ -n "${MOREXENOSIPS}" ]; then
	    #  for ANIPADDR in ${MOREXENOSIPS}; do
	    #	ip rule add to "${ANIPADDR}" iif "${THISIFACE}" fwmark 1$G ta main
	    #  done
	    #fi
	  fi
        fi
      else
        /opt/protonyx-scripts/addtuniprules.sh
      fi
      #
      # PROTONYX
      # stop running this for every GW please. once if needed is fine
      #$SCRIPTPATH/upd_nbgwprio.sh
      NEEDTORUNUPD_NBGWPRIO=1
      #if [ $NOBAL = 1 ]; then
      #  DNSMARK=1"$G"
        #iptables -F "$FO_CHAIN" -t mangle
        #iptables -A "$FO_CHAIN" -t mangle -j MARK --set-mark "$DNSMARK"
        #iptables -A "$FO_CHAIN" -t mangle -j ACCEPT
      #fi
      #
    fi
    if [ $MAX -lt $WEIGHT ] ;then
      MAX=$WEIGHT
      FTHOP=$TMP
      XMAX=$X
      NOVIAMAX=$NOVIA
      FTACTIVEGW=$G
    fi
  else
    if [ -r $STATUSDIR/Rule ] ; then
      ip rule del fwmark 1$G ta 1$G && rm -f $STATUSDIR/Rule
      # PROTONYX BRIDGE MODE RULE GIA NA DOYLEVEI O NETBALANCER STO BRIDGE MODE
      if [ "1${G}" -ne 105 ]; then
        if [ "${BRIDGEMODECLIENT}" == "yes" ]; then
	  #PROSOXH AYTO DEN DOYLEVE OTAN EKANES SERVICE NETWORK RESTART 'H RESTART TON BALANCER GIATI PRWTA EIXE KANEI ip ro flush ta 1xx
	  #THISIFACE=`ip ro sh ta 1$G|grep "^default"|awk '{ printf $5 }'`
          #PROSOXH AYTO DOYLEVE ME RESTART TOY NETBALANCER ALLA DEN TA SBHNEIME SERVICE NETWORK RESTART GIATI DEN EXEI OYTE IP TO INTERFACE KAN
	  #THISIFACE=`/opt/protonyx-scripts/getIfaceFromGWnum.sh "$G"`
          #if [ -n "$THISIFACE" ]; then
          #  ip rule del to "${XENOS_IP}" iif "${THISIFACE}" fwmark 1$G ta main
          #fi
	  # PROSOXH AYTH TH FORA THA KANW DELETE OLA TA IP RULES POY EXOYNE AYTO TO fwmark
	  while true
	  do
	    HEXMARK=`printf '%x' "1${G}"`
	    ip ru|grep -q "fwmark 0x${HEXMARK}";DOITAGAIN=$?
	    if [ "$DOITAGAIN" -eq 0 ]; then
	      ip ru del fwmark "0x${HEXMARK}"
	    else
	      break;
	    fi
	  done
        fi
      else
        /opt/protonyx-scripts/deltuniprules.sh
      fi
      #
      # PROTONYX
      # stop running this for every GW please. once if needed is fine
      #$SCRIPTPATH/upd_nbgwprio.sh
      NEEDTORUNUPD_NBGWPRIO=1

      #if [ $NOBAL = 1 ]; then
        #DNSMARK=1"$G"
        #iptables -F "$FO_CHAIN" -t mangle
        #iptables -A "$FO_CHAIN" -t mangle -j MARK --set-mark "$DNS_PREFERRED_MARK"
        #iptables -A "$FO_CHAIN" -t mangle -j ACCEPT
      #fi
      #
    fi
  fi
done
#
# PROTONYX
#
if [ $NEEDTORUNUPD_NBGWPRIO -eq 1 ]; then
  $SCRIPTPATH/upd_nbgwprio.sh
fi
if [ "$MODE" != FO ] ; then
  if [ $N -eq 1 ] ; then
    if ip ro sh | grep default | grep -v metric | grep -v "$NOVIA" |grep -q -w "$X" ; then
      CHANGE=""
      #echo "checkPoint-3 CHANGE=empty" >> $ERROUT 2>&1
    fi
    ip ro sh | grep -q nexthop && CHANGE=yes #&& echo "checkPoint-4 CHANGE=yes" >> $ERROUT 2>&1
  else
    if [ -z "$CHANGE" -a "$N" -gt 0 ] ; then
      [ "`ip ro sh | grep nexthop |wc -l`" -eq "$N" ] || CHANGE=yes #&& echo "checkPoint-5 CHANGE=yes" >> $ERROUT 2>&1 && echo "RUNTIMES: IP=#$IP#, WEIGHT=#$WEIGHT# G=#$G# STATUSDIR=#$STATUSDIR# N=#$N#"
    fi
  fi
else
  CHANGE=""
  #echo "checkPoint-6 CHANGE=empty" >> $ERROUT 2>&1
  NEXTHOP=$FTHOP
  if [ -n "$NEXTHOP" ] ; then
    if [ "`ip ro sh | grep nexthop |wc -l`" -gt 0 ] ; then
      CHANGE=yes
      #echo "checkPoint-7 CHANGE=yes" >> $ERROUT 2>&1
    else
      if ! ip ro sh | grep default | grep -v metric | grep -v "$NOVIAMAX" | grep -q -w "$XMAX" ; then
        if ! CheckDefault "$PREV_ACTIVEGW" ; then
          CHANGE=yes
	  #echo "checkPoint-8 CHANGE=yes" >> $ERROUT 2>&1
        else
          PREV_WEIGHT=`cat $PREV_ACTIVEGW/Weight 2>>$ERROUT`
          [ "$PREV_WEIGHT" -eq "$MAX" ] || CHANGE=yes #&& echo "checkPoint-9 CHANGE=yes" >> $ERROUT 2>&1
        fi
      fi
    fi
  fi
  ACTIVEGW=$FTACTIVEGW
fi
if [ "$CHANGE" = yes ] ; then
  ip ro del default 2>>$ERROUT
  #/usr/latest/ip ro add default $NEXTHOP
  #echo nexthop:$NEXTHOP >>$ERROUT
  ip ro add default $NEXTHOP
  ip ro del default ta 99 2>>$ERROUT
  ip ro add ta 99 default $NEXTHOP
  echo $ACTIVEGW > "$TMPSTATUS"/ActiveGW
  logger -t NetBalancer "Default Route has been changed: $NEXTHOP"
  #echo goddammit >> $ERROUT
else
  if [ -z "$NEXTHOP" ] ; then
    if [ "`cat $PREV_ACTIVEGW/Enabled 2>>$ERROUT`" = no ] ; then 
      ip ro del default 2>>$ERROUT
    fi
    rm -f "$TMPSTATUS"/ActiveGW
  fi
fi
exit 0
