#!/bin/sh
# This is a NetworkManager dispatcher / networkd-dispatcher script to
# notify the combox manager when the managed interface IP details
# are configured

export LC_ALL=C

# For NetworkManager consider only up/down events
[ $# -ge 2 ] && [ "$2" != "up" ] && exit 0

function cdr2mask ()
{
   # Number of args to shift, 255..255, first non-255 byte, zeroes
   set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
   [ $1 -gt 1 ] && shift $1 || shift
   echo ${1-0}.${2-0}.${3-0}.${4-0}
}

doLOG=1
doDEBUG=1
#
MANAGER_TIMEOUT=60
#
LOG=/root/dispatcher.log
IFACESCONF="/opt/manager/running/input/common/comboxInterfaceDetails-1.conf"
#
function loginfo() {
  if [ $doLOG -eq 1 ]; then
    DATE=`date`
    echo -e "[$DATE] INFO[$$] - $1" >> $LOG
  fi
}

function logdebug() {
  if [ $doLOG -eq 1 ]; then
    if [ $doDEBUG -eq 1 ]; then
      DATE=`date`
      echo -e "[$DATE]DEBUG[$$] - $1" >> $LOG
    fi
  fi
}

function logwarn() {
  if [ $doLOG -eq 1 ]; then
    DATE=`date`
    echo -e "[$DATE] WARN[$$] - $1" >> $LOG
  fi
}

function notify_manager() {
  echo -n "$MSG" > $REQUESTFILE
  COUNT=0
  while [ -e $REQUESTFILE ]; do
    #echo -----notifying manager---- >> $LOG
    logdebug "-----notifying manager----"
    echo -n "$MSG" > /dev/udp/127.0.0.1/54321
    if [ ${COUNT} -ge ${MANAGER_TIMEOUT} ]; then
      #echo "failed to notify manager due to timeout of ${MANAGER_TIMEOUT} seconds" >> $LOG
      logwarn "failed to notify manager due to timeout of ${MANAGER_TIMEOUT} seconds"
      break
    fi
    COUNT=$(( $COUNT + 1 ))
    sleep 1
  done
  #echo -----done notifying manager-----
  logdebug "-----done notifying manager-----"
}

function getModemFromIface() {
  IFACE=$1
  MODEMLIST=$(mmcli -L|grep "/Modem/"|awk '{ print $1 }')
  for MODEM in $MODEMLIST; do
    #echo MODEM:${MODEM}
    mmcli -m $MODEM|grep -q "$IFACE (net)"
    if [ $? -eq 0 ]; then
      echo ${MODEM}
      break
    fi
  done
}

function getBearerFromIfaceAndModem() {
  IFACE="$1"
  MODEM="$2"
  BEARERSLIST=$(mmcli -m $MODEM -K|grep modem.generic.bearers.value|awk '{ print $NF }')
  for BEAR in $BEARERSLIST; do
    mmcli -b $BEAR|grep -q "interface: $IFACE"
    if [ $? -eq 0 ]; then
      echo ${BEAR}
      break
    fi
  done
}

#
#DATE=$(date)
loginfo "HEY! NetworkManager dispatcher captured an \"up\" connection event for interface $1\nNow, let's get the new IP address details for this interface and forward them to our manager"
IFACE=$1
# find the modem path
MODEM=$(getModemFromIface $IFACE)
# find the bearer path
#BEARER_ID=$(mmcli -m $MODEM|grep Bearers|awk '{ print $NF }')
BEARER_ID=$(getBearerFromIfaceAndModem $IFACE $MODEM)
#BEARER_ID=$(mmcli -m $MODEM|grep Bearer|grep -v initial|awk '{ print $NF }')
# remove single quotes
eval BEARER_ID=$BEARER_ID
ALLDETAILS=$(mmcli -b $BEARER_ID)
IP=$(echo "$ALLDETAILS"|grep address|awk '{ print $NF }')
eval IP=$IP
GW=$(echo "$ALLDETAILS"|grep gateway|awk '{ print $NF }')
eval GW=$GW
PREFIX=$(echo "$ALLDETAILS"|grep prefix|awk '{ print $NF }')
eval PREFIX=$PREFIX
MASK=$(cdr2mask $PREFIX)
#echo "Ok, here you go: NIC:$1, IP:$IP, MASK=$MASK, GATEWAY:$GW" >> $LOGFILE
loginfo "Requesting manager to set up interface:$IFACE with IP:$IP mask:$MASK gw:$GW"
MSG="DHCP,$IFACE,$IP,$MASK,$GW"
REQUESTFILE="/dev/shm/dhcpConfigurationRequest-$IFACE"
notify_manager

exit 0
