#!/bin/sh
# udhcpc script edited by Tim Riker <Tim@Rikers.org>

inipath=/etc/network
RESOLV_CONF="/tmp/resolv.conf"

if [ -f "/tmp/TOS_CONFIG/.default.sys" ]; then
  defaultsys="/tmp/TOS_CONFIG/.default.sys"
else
  defaultsys="/etc/.default.sys"
fi

if [ "$interface" == "docker0" ] || [[ $interface == br* ]]; then
  exit 0
fi

RAND_DD=$(echo -n $RANDOM)
case "$interface" in
eth0)
  RAND3=254
  ;;
eth1)
  RAND3=253
  ;;
eth2)
  RAND3=252
  ;;
wlan0)
  RAND3=250
  ;;
*)
  RAND3=251
  ;;
esac
RAND_IP=169.254.${RAND3}.$(($RAND_DD % 255 + 1))
masksum="/usr/sbin/masksum"

[ -n "$1" ] || {
  echo "Error: should be called from udhcpc"
  exit 1
}

NETMASK="255.255.0.0"
[ -n "$subnet" ] && NETMASK="$subnet"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
TempDir=/var/run/dhcpc
[ ! -d $TempDir ] && mkdir -p $TempDir

numberkey=0
getmetric() {
  local currentdev=$1
  local defaultgw=$(iniparse -c -f ${defaultsys} -s system -k defaultgwdev)
  [ "${currentdev}" = "bond0" ] && {
    numberkey=1
    return 0
  }
  if [ "X${currentdev}" != "X${defaultgw}" ]; then
    numberkey=2
  else
    numberkey=1
  fi
  return 0
}

Resolv_make() {
  local DNS=$1
  local level=$2
  if [ "X${DNS}" = "X" ]; then
    return 1
  else
    echo "Setting nameserver ${DNS} ${level} numberkey ${numberkey}"
    local olddns=$(sed -n ${level}p ${RESOLV_CONF} | awk '{print $2}')
    [ "${olddns}" = "${DNS}" ] && return 0
    sed -i "/${DNS}/d" ${RESOLV_CONF}
    if [ ${numberkey} -eq 1 ]; then
      InsertFile "nameserver ${DNS}" $level
    else
      InsertFile "nameserver ${DNS}" 3
    fi
    sed -i '/^$/d' ${RESOLV_CONF}
    return 0
  fi
}

InsertFile() {
  local content=$1
  local pos=$2
  local rows=$(wc -l ${RESOLV_CONF} | awk '{print $1}')
  if [ $rows -eq 0 ]; then
    echo "${content}" >${RESOLV_CONF}
  elif [ $pos -eq 1 ]; then # first line
    sed -i "1i ${content}" ${RESOLV_CONF}
  elif [ $pos -eq 2 ]; then # 2 line
    sed -i "1a ${content}" ${RESOLV_CONF}
  else
    sed -i "\$a ${content}" ${RESOLV_CONF}
  fi
}

deleteRoute() {
  local interface=$1
  local route_table="tbl_${interface}"
  ip route flush table ${route_table} >/dev/null
  ip rule del table ${route_table} >/dev/null 2>&1
  route -n | grep ${interface} | while read line; do
    local gw=$(echo $line | awk '{print $4}')
    if [ "X${gw}" = "XUG" ]; then
      route del default gw 0.0.0.0 dev ${interface}
    else
      local Destination=$(echo $line | awk '{print $1}')
      local Genmask=$(echo $line | awk '{print $3}')
      route del -net ${Destination} netmask ${Genmask} ${interface}
    fi
  done
}

bondingstatus() {
  local devfilepath="/proc/net/dev"
  local devnmlst="$(awk '$0 ~/:/ && $0 ~/bond/{gsub(/:/,"",$1);print $1}' "$devfilepath" 2>/dev/null)"
  if [ "X${devnmlst}" != "X" ]; then
    echo on
    return 0
  else
    echo off
    return 0
  fi
}

# clear bond slaves
clean_bond_slave() {
  local interface=$1
  echo "${interface}" | egrep -q -E "^bond[0-9]+"
  if [ $? -eq 0 ]; then
    for slave in $(cat /sys/class/net/${interface}/bonding/slaves); do
      deleteRoute $slave
    done
  fi
}

cache=$TempDir/$interface
case "$1" in
deconfig)
  echo "Setting IP address $RAND_IP on $interface"
  ifconfig "$interface" $RAND_IP
  rm -f $cache >/dev/null 2>&1
  ;;

renew | bound)
  if [ -e $cache ]; then
    [ "$(cat $cache)" = "$ip" ] && exit 0
  fi
  echo "$ip" >"$cache"
  route_table="tbl_${interface}"
  echo "${interface}" | egrep -q -E "^bond[0-9]+"
  if [ $? -eq 0 ]; then
    bst=$(bondingstatus)
    [ "X${bst}" = "Xoff" ] && exit 0
    options_slave="0"
  else
    options_slave=$(iniparse -c -f ${inipath} -s ${interface} -k SLAVE)
  fi
  options_mtu=$(iniparse -c -f ${inipath} -s ${interface} -k MTU)
  [ -z "$options_mtu" ] && options_mtu="1500"
  logger -t "DHCP-SCRIPT" "Setting IP address $ip netmask $NETMASK mtu $options_mtu on $interface"
  ifconfig $interface $ip netmask $NETMASK mtu ${options_mtu} $BROADCAST
  MASK="$(${masksum} ${ip} ${NETMASK})"

  getmetric ${interface}
  echo "Deleting routers"
  deleteRoute ${interface}
  if [ "X${options_slave}" = "X0" ]; then
    logger -t "DHCP-SCRIPT" "{ip route add $MASK src $ip dev $interface table main}"
    clean_bond_slave ${interface}
    ip route del ${MASK} table main >/dev/null
    ip route add ${MASK} src ${ip} dev ${interface} table main
    ip route add ${MASK} src ${ip} dev ${interface} table ${route_table}
    if [ -n "$router" ]; then
      for options_gateway in $router; do
        if [ ${numberkey} -eq 1 ]; then
          ip route add default via ${options_gateway} src ${ip} dev ${interface} table main
        fi
        # config eth iproute2
        ip route add default via ${options_gateway} src ${ip} dev ${interface} table ${route_table}
        Resolv_make "${options_gateway}" 2
      done
    fi
    ip rule add from ${ip} table ${route_table}
  fi

  echo "Recreating $RESOLV_CONF"
  key=1
  for i in $dns; do
    echo " Adding DNS server $i"
    #insert dns to /etc/network
    Resolv_make "$i" "$key"
    #if is save the dns...
    olddns=$(iniparse -c -f /etc/network -s "${interface}" -k "DNS${key}")
    if [ "${i}X" = "${olddns}X" ]; then
      continue
    else
      [ $key -le 2 ] && {
        iniparse -a -f /etc/network -s "${interface}" -k "DNS${key}" -v "${i}"
        let key=key+1
      }
    fi
  done
  /usr/sbin/ter_avahi_tool
  service iptable restart >/dev/null 2>&1
  ;;
esac

exit 0
