#!/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/X11:/usr/games:/usr/local/bin:/root/bin
SYSTEM_INFO_FILE=/var/www/html/system_info

E3G_VPS_DOMAIN="e3g.spintec.com"
export ETHDEV=eth0:1
SPINKEY_NR=0
REM_SETUP_ACTIVATION=""
#PROGRESS_INDICATOR_LOCKFILE=/tmp/vps_progress_indicator
#
#
#progress_dot_loop()
#{
#  {
#    while [ -f $PROGRESS_INDICATOR_LOCKFILE ]
#    do
#      echo -n "."
#      sleep 1.5
#    done
#  } &
#}   

check_permanent_remote_access()
{

  VPN_TCPIP=`./systools/get_eurodb_config_val UseVPN_TCPIP`
  if [ $VPN_TCPIP == 1 ] ; then
    SERVER_IP=10.0.2.1
    IFACE_CHECK=' 10.0.2'
  else
    SERVER_IP=10.0.1.1
    IFACE_CHECK=' 10.0.1'
  fi

  if ! ifconfig | grep -q $IFACE_CHECK || ! nc -w 3  $SERVER_IP 60000 2>&1 | grep -q SpinTec
  then
    ./systools/remote_server_connect >/dev/null 2>&1 &
  fi

}


configure_connection()
{

NOT_DHCP=`./systools/get_eurodb_config_val AdslConnectionStaticIP`
if [ -z "$NOT_DHCP" -o "$NOT_DHCP" == 0 ] ; then
  /opt/euro-beta/config_internet_dhcp
else
  IP=`./systools/get_eurodb_config_val AdslConnectionIP`
  GW=`./systools/get_eurodb_config_val AdslConnectionGW`
  DNS=`./systools/get_eurodb_config_val AdslConnectionDNS`
  ifconfig $ETHDEV $IP up
  route del default
  route add default gw $GW
  echo nameserver $DNS >/etc/resolv.conf
fi
}


update_system_info()
{
  SYSTEM_NAME=`./systools/get_system_name`
  SPINKEY_NR=`./systools/spinkey`
  EURO3G_VER=`cat /opt/euro-beta/last_update.info | cut -d' ' -f3 | cut -d'<' -f1`
  OS_VERSION=`cat /etc/issue | cut -d'\' -f 1 | cut -d' ' -f 1-3 | tr '\n' ' '`
  echo "SystemName=$SYSTEM_NAME" >$SYSTEM_INFO_FILE
  echo "SpinKeyNr=$SPINKEY_NR" >>$SYSTEM_INFO_FILE
  echo "Euro3GVersion=$EURO3G_VER" >>$SYSTEM_INFO_FILE
  echo "LinuxVersion=$OS_VERSION" >>$SYSTEM_INFO_FILE
  if [ -n "$REM_SETUP_ACTIVATION" ]
  then
    echo "RemoteSetupKey=$REM_SETUP_ACTIVATION" >>$SYSTEM_INFO_FILE
  fi
}

start_connection()
{

  for ovpn_pid in `ps auxw | grep openvpn | grep "vps_client.conf" | awk '{ print $2 }'`
  do 
    kill -9 $ovpn_pid
  done
  sleep 0.5
  if [ "$1" == "SETUP" ]
  then
#    echo ""
#    echo -n "Attivazione del collegamento con SpinTec proxy in corso ....."
    echo "Attivazione del collegamento con SpinTec proxy in corso ....."
  fi
  SYSTEM_NAME=`./systools/get_system_name`
  SPINKEY_NR=`./systools/spinkey`
  echo "SystemName=$SYSTEM_NAME" >$SYSTEM_INFO_FILE
  echo "SpinKeyNr=$SPINKEY_NR" >>$SYSTEM_INFO_FILE
  [ $SPINKEY_NR ] || SPINKEY_NR=0
#  if [ $SPINKEY_NR -eq 0 ]
#  then
#    return
#  fi
  
  openvpn --config /etc/openvpn/vps_client.conf --proto udp --remote H${SPINKEY_NR}.$E3G_VPS_DOMAIN 5502 --float --daemon openvpn_vps
  echo " Staring Openvpn [openvpn --config /etc/openvpn/vps_client.conf --proto udp --remote H${SPINKEY_NR}.$E3G_VPS_DOMAIN 5502 --float --daemon]" >> /tmp/vps.log
  CNT=0
  while [ $CNT -lt 9 ]
  do                                                                                                                                                                           
    if [ "$1" == "SETUP" ]
    then
#      echo ""
#      echo -n "Verifica del collegamento con SpinTec proxy in corso ....." 
      echo "Verifica del collegamento con SpinTec proxy in corso ....." 
    fi
    CONNECTED=`check_connection 17`
    if [ "$CONNECTED" == "OK" ] 
    then                                                                                                                          
      if [ "$1" == "SETUP" ]
      then
#        rm -f $PROGRESS_INDICATOR_LOCKFILE
#        echo ""
        echo "Collegamento con SpinTec proxy stabilito con successo." 
      fi
      if [ -f /tmp/remote_connection_active ]
      then 
        ./systools/remote_access register > /dev/null 2>&1
      fi
      break;
    fi
    CNT=$(( $CNT + 1 ))
  done
  if [ $CNT -eq 5 ]
  then
    if [ "$1" == "SETUP" ]
    then
#      rm -f $PROGRESS_INDICATOR_LOCKFILE
#      echo ""
      echo "Impossibile stabilire collegamento con SpinTec proxy."
    fi
  fi
#  rm -f $PROGRESS_INDICATOR_LOCKFILE
}


check_internet()
{
  TOUT=$1

INTERNET_OK=0
while [ $INTERNET_OK -eq 0 -a $TOUT -gt 0 ]
do
  if ping -c 1 -W 1 intranet.spintec.com > /dev/null 2>&1
  then
    INTERNET_OK=1
  fi
  if ping -c 1 -W 1 8.8.8.8 > /dev/null 2>&1
  then
    INTERNET_OK=1
  fi
  if ping -c 1 -W 1 google.com > /dev/null 2>&1
  then
    INTERNET_OK=1
  fi
  sleep 1
  TOUT=$((TOUT-1))
done
  echo $INTERNET_OK
}



check_connection()
{


NOT_DHCP=`./systools/get_eurodb_config_val AdslConnectionStaticIP`
ADSL_IP=`./systools/get_eurodb_config_val AdslConnectionIP`

if [ "$NOT_DHCP" == "1" -a `ifconfig | grep "$ADSL_IP" | wc -l` != 1 ]
then 
  echo "Indirizzo IP Statico non corrisponde ..."
  return
fi
TOUT=$1
{
DONE=0
(
  ping -c1 -n 10.1.0.1 &
  ( sleep $TOUT; echo Network is unreachable ) &
) |
while [ $DONE = 0 ] && read X
do
  if  echo $X | grep -q '^64 bytes from'
  then
    DONE=1
    echo OK
    return
  elif echo $X | grep -q 'Network is unreachable'
  then
    return 
  fi
done
} 2>/dev/null
}


cd /opt/euro-beta

touch /tmp/current_datetime

if [ -f e3g_setup_appliance ]
then
  CHECK_CONN_TOUT=7
#  if [ `grep '8.8.8.8' /etc/resolv.conf | wc -l` -eq 0 ]
#  then
#    cp /etc/resolv.conf /etc/resolv.conf.old
#    echo "nameserver 8.8.8.8" > /etc/resolv.conf
#    cat /etc/resolv.conf.old >> /etc/resolv.conf
#    rm /etc/resolv.conf.old
#  fi
  CONNECTED=`check_connection $CHECK_CONN_TOUT`
  if [ "$CONNECTED" =="OK" ]
  then
    exit 0
  else
    INTERNET_OK=`check_internet $CHECK_CONN_TOUT`
    if [ "$INTERNET_OK" == "0" ]
    then
      configure_connection
    fi
  fi
  exit 0
fi

echo `date`": Checking VPS connection Entry as ["`whoami`"]" >> /tmp/vps.log

VPS_DISABLED=`./systools/get_eurodb_config_val SpinTecVPSConnectionDisabled`
REM_SETUP_ACTIVATION=`./systools/get_eurodb_config_val RemoteSetupActivation`
X2GO_CHECK=0

if [ -n "$REM_SETUP_ACTIVATION" ]
then
  if [ ! -f /tmp/pending_rem_access_activation -o /tmp/pending_rem_access_activation -ot /tmp/current_datetime  ]
  then
    SPINKEY_ERR=`./systools/get_eurodb_config_val SpinKeyError`
    SPINKEY_SERNR=`./systools/get_eurodb_config_val SpinKeySerNr`
    REM_ACC_SERNR=`echo $REM_SETUP_ACTIVATION | cut -d' ' -f1`
    if [ "$SPINKEY_ERR" -eq 0 -a "$SPINKEY_SERNR" == "$REM_ACC_SERNR" ]
    then
      VPS_DISABLED=0
      REM_SETUP_ACTIVATION=`echo $REM_SETUP_ACTIVATION | cut -d' ' -f2`
#      touch -d"now + 120 seconds" /tmp/pending_rem_access_activation
      check_permanent_remote_access
#      rm /tmp/pending_rem_access_activation
# x2go setup
#      wget -q -O /tmp/x2g 'http://intranet.spintec.com/remote_access/cust_client_list.php?cmd=pubkey&spinkey='$SPINKEY_SERNR
      X2GO_CHECK=1
    fi
  fi
fi

if [ "$1" != "SETUP" -a "$VPS_DISABLED" == 1 ] ; then
   echo " VPS Connection disabled in Setup. Exitting ...." >> /tmp/vps.log
   exit 0
fi


if [ ! -f /tmp/pending_vps_activation -o /tmp/pending_vps_activation -ot /tmp/current_datetime  ]
then

  echo " Testing connection status ...." >> /tmp/vps.log

  ACT_SPINKEY_NR=`./systools/spinkey`
  SYS_SPINKEY_NR=`grep SpinKeyNr $SYSTEM_INFO_FILE | cut -d'=' -f2`
  if [ "$SYS_SPINKEY_NR" != "$ACT_SPINKEY_NR" ]
  then
    update_system_info
    ./systools/close_vps_vpn
    sleep 3
  else
    ACT_EURO3G_VER=`cat /opt/euro-beta/last_update.info | cut -d' ' -f3 | cut -d'<' -f1`
    ACT_OS_VERSION=`cat /etc/issue | cut -d'\' -f 1 | cut -d' ' -f 1-3 | tr '\n' ' '`
    SYS_EURO3G_VER=`grep Euro3GVersion $SYSTEM_INFO_FILE | cut -d'=' -f2`
    SYS_OS_VERSION=`grep LinuxVersion $SYSTEM_INFO_FILE | cut -d'=' -f2`
    SYS_REMSETUP_ACTIVATION=`grep RemoteSetupHash $SYSTEM_INFO_FILE | cut -d'=' -f2`  
    if [ "$SYS_EURO3G_VER" != "$ACT_EURO3G_VER" -o "$SYS_OS_VERSION" != "$ACT_OS_VERSION" -o "$SYS_REMSETUP_ACTIVATION" != "$REM_SETUP_ACTIVATION" ]
    then
      update_system_info
    fi
  fi

  CHECK_CONN_TOUT=12
  if [ "$1" == "SETUP" ]
  then
#    touch $PROGRESS_INDICATOR_LOCKFILE
#    progress_dot_loop     
    CHECK_CONN_TOUT=7
  fi
  CONNECTED=`check_connection $CHECK_CONN_TOUT`
  if [ "$CONNECTED" == "OK" ] && ! curl -m 5 -s http://10.1.0.1/e3g_vpn_check_file | grep -q 03141340012
  then 
    CONNECTED=""
    ./systools/close_vps_vpn
    sleep 3
  fi     
  if [ "$CONNECTED" == "OK" ] ; then
#    PORT_OFFSET=`ifconfig | grep 'inet addr:10.1' |tr '.' ' '| awk '{ print 5000+(256*$4+$5-2)/4 }' | tail -1`
#    echo $PORT_OFFSET > /tmp/vps_demo_port
    echo " Active connection found . Exitting...." >> /tmp/vps.log
    if [ "$1" == "SETUP" ]
    then
#      rm -f $PROGRESS_INDICATOR_LOCKFILE
#      echo ""
      echo "Collegamento con SpinTec proxy gia' attivo." 
    fi
    exit 0
  else
    if [ "$CONNECTED" != "OK" ]
    then
      configure_connection
    fi

    INTERNET_OK=`check_internet $CHECK_CONN_TOUT`
    if [ "$INTERNET_OK" == "1" ]
    then
       echo " internet ok but vpn to vps fail ...." >> /tmp/vps.log
       touch -d"now + 40 seconds" /tmp/pending_vps_activation
    else
      echo " No pending connection found ...." >> /tmp/vps.log
      touch -d"now + 120 seconds" /tmp/pending_vps_activation
    fi
    if [ "$INTERNET_OK" == "0" ]
    then
      configure_connection
    fi
    start_connection $1
    PORT_OFFSET=`ifconfig | egrep 'inet (addr:)?10\.1' |tr '.' ' '| awk '{ print 5000+(256*$4+$5-2)/4 }' | tail -1`
    if [ "$SPINKEY_NR" == "0" ]
    then
      echo $PORT_OFFSET > /tmp/vps_demo_port
    else
      rm -f /tmp/vps_demo_port
    fi
    if [ "$X2GO_CHECK" -eq 1 ]
    then
      wget -q -O /tmp/x2g 'http://10.1.0.1/e3g_services/remote_access/cust_client_list.php?cmd=pubkey&spinkey='$SPINKEY_SERNR
      if grep -qv ERROR /tmp/x2g
      then 
        perl -n -i.bak -e 'print unless m/remotesetup@x2g/' /home/remotesetup/.ssh/authorized_keys
        cat /tmp/x2g >> /home/remotesetup/.ssh/authorized_keys
      fi
    fi
    rm /tmp/pending_vps_activation
  fi

fi
#rm -f /tmp/current_datetime
#rm -f $PROGRESS_INDICATOR_LOCKFILE
                                                                                                                   
exit 0
