#!/bin/bash
# simple filelocking and /tmp race avoid
# keep it all in users home dir.

if [ ! -d $HOME/tmp ]; then
 mkdir $HOME/tmp
fi
touch $HOME/tmp/`whoami`
ANSFILE=$HOME/tmp/`whoami`
READFILE=$HOME/tmp/.about.$$
REREAD=./main_config
BACKTITLE="Euro 3G  -  Collegamento VPN"

SYSTEM_INFO_FILE=/var/www/html/system_info

export ETHDEV=eth0:1

configure_connection()
{

if [ -z "$NOT_DHCP" -o "$NOT_DHCP" == 0 ] ; then
  /opt/euro-beta/config_internet_dhcp
else
  ifconfig $ETHDEV $STATIC_IP up
  route del default
  route del default
  route add default gw $STATIC_GW
  echo nameserver $STATIC_DNS >/etc/resolv.conf
fi
}

check_connection()
{
{
DONE=0
(
#  ping -w2 -c3 -i0.2 -n 8.8.8.8 &
#  ping -w2 -c3 -i0.2 -n intranet.spintec.com &
#  ping -w2 -c3 -i0.2 -n www.google.com &
  ping -c1 -n 8.8.8.8 &
  ping -c1 -n intranet.spintec.com &
  ping -c1 -n www.google.com &
  ( sleep 2.5; echo Network is unreachable ) &
) |
while [ $DONE = 0 ] && read X
do
#  echo got: $X >> /tmp/log.txt
  if  echo $X | grep -q '^64 bytes from'
  then
    DONE=1
    echo OK
    return
  elif echo $X | grep -q 'Network is unreachable'
  then
#	echo returning >>/tmp/log.txt
    return 
  fi
done
#echo done >>/tmp/log.txt
} 2>/dev/null
}

check_vps_connection()
{
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
}



connect_vpn()
{

  killall openvpn
  echo "Controllo di connessione ...." > /tmp/vpn_connect.log
  CONNECTED=`check_connection`
 # echo "returned $CONNECTED" >>/tmp/log.txt
  if [ "$CONNECTED" ] ; then
    echo "Gia' configurato" >> /tmp/vpn_connect.log
  else
    if [ -z "$NOT_DHCP" -o "$NOT_DHCP" == 0 ] ; then
      echo "Assegnazione IP in corso ....." >> /tmp/vpn_connect.log
    fi
    configure_connection >> /tmp/vpn_connect.log
    IP=`ifconfig | awk "/$ETHDEV"' / {e=1} e && /inet addr/ {print $2; exit}' | sed s/addr://`
    if [ ! $IP ]
    then
      echo "Errore di assegnazione IP"  >> /tmp/vpn_connect.log
      echo ""  >> /tmp/vpn_connect.log
      echo "Impossibile stabilire collegamento VPN" >> /tmp/vpn_connect.log
      RETVAL=1
      return
    fi
    GW=`route -n | awk '/^0\.0\.0\.0/ {print $2}'`
    echo "IP locale e' $IP, gateway $GW" >> /tmp/vpn_connect.log
  fi
  VPN_IP=`echo $VPN_SERVER | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' || host $VPN_SERVER | awk '/has address/ {print $4}'`
  if [ ! $VPN_IP ]
  then
    echo "Impossibile trovare l'indirizzo IP del server." >> /tmp/vpn_connect.log
    echo ""  >> /tmp/vpn_connect.log
    echo "Impossibile stabilire collegamento VPN" >> /tmp/vpn_connect.log
    RETVAL=1
    return
  fi
  echo "IP del server e' $VPN_IP"  >> /tmp/vpn_connect.log
  echo "Inizializzazione del VPN in corso ....." >> /tmp/vpn_connect.log
  if [ $VPN_TCPIP == 1 ] ; then
    SERVER_IP=10.0.2.1
    openvpn --config /etc/openvpn/client.conf --proto tcp-client --remote $VPN_SERVER 5505 --daemon
  else
    SERVER_IP=10.0.1.1
    openvpn --config /etc/openvpn/client.conf --proto udp --remote $VPN_SERVER 5502 --daemon
  fi
  sleep 2
  for ((T=0; T<8; T++))
  do
    echo "Verifica del collegamento VPN in corso ....." >> /tmp/vpn_connect.log
    if ping -q -c5 $SERVER_IP > /dev/null 2>&1 ; then
      echo ""  >> /tmp/vpn_connect.log
      echo "Collegamento VPN stabilito con successo" >> /tmp/vpn_connect.log
      SPINKEY_NR=`./systools/spinkey`
      if [ $SPINKEY_NR -ne 0 ]
      then 
        echo "Numero di licenza del Euro3G [SpinKey]: $SPINKEY_NR" >> /tmp/vpn_connect.log
      fi
      echo ""  >> /tmp/vpn_connect.log

      start_vps_connection
      RETVAL=0
      return
    fi
  done
  echo ""  >> /tmp/vpn_connect.log
  echo "Impossibile stabilire collegamento VPN" >> /tmp/vpn_connect.log
  killall openvpn
  RETVAL=1
  return
}

start_vps_connection()
{

  for ovpn_pid in `ps auxw | grep openvpn | grep "vps_client.conf" | awk '{ print $2 }'`
  do 
    kill $ovpn_pid
  done
  sleep 0.5
  echo "Attivazione del collegamento con SpinTec proxy in corso ....." >> /tmp/vpn_connect.log
  echo "SystemName=$SYSTEM_NAME" >$SYSTEM_INFO_FILE
  echo "SpinKeyNr=$SPINKEY_NR" >>$SYSTEM_INFO_FILE
  [ $SPINKEY_NR ] || SPINKEY_NR=0
  openvpn --config /etc/openvpn/vps_client.conf --proto udp --remote $SPINKEY_NR.e3g.spintec.com 5502 --float --daemon
  echo " Staring Openvpn [openvpn --config /etc/openvpn/vps_client.conf --proto udp --remote $SPINKEY_NR.e3g.spintec.com 5502 --float --daemon]" >> /tmp/vps.log
  CNT=0
  while [ $CNT -lt 4 ]
  do                                                                                                                                                                           
    echo "Verifica del collegamento con SpinTec proxy in corso ....." >> /tmp/vpn_connect.log
    CONNECTED=`check_vps_connection 7`
    if [ "$CONNECTED" ] 
    then                                                                                                                          
      echo ""  >> /tmp/vpn_connect.log
      echo "Collegamento con SpinTec proxy stabilito con successo." >> /tmp/vpn_connect.log
      echo ""  >> /tmp/vpn_connect.log
      if [ $SPINKEY_NR -eq 0 ]
      then 
        PORT_OFFSET=`ifconfig | grep 'inet addr:10.1' |tr '.' ' '| awk '{ print 5000+(256*$4+$5-2)/4 }' | tail -1`
        echo "SpinTec proxy ID : $PORT_OFFSET" >> /tmp/vpn_connect.log
      fi
      break;
    fi
    CNT=$(( $CNT + 1 ))
  done
  if [ $CNT -eq 5 ]
  then
    echo "Impossibile stabilire collegamento con SpinTec proxy." >> /tmp/vpn_connect.log
  fi
}



CURDIR=`pwd`
cd /opt/euro-beta

VPN_SERVER=`./systools/get_eurodb_config_val VPNServer`
VPN_TCPIP=`./systools/get_eurodb_config_val UseVPN_TCPIP`
STATIC_IP=`./systools/get_eurodb_config_val AdslConnectionIP`
STATIC_GW=`./systools/get_eurodb_config_val AdslConnectionGW`
STATIC_DNS=`./systools/get_eurodb_config_val AdslConnectionDNS`
SYSTEM_NAME=`./systools/get_eurodb_config_val ModemSystemName`

# Check destination server

dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--inputbox "Server VPN" 8 50 $VPN_SERVER 2>$ANSFILE
	
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
VPN_SERVER=`cat $ANSFILE`

# Check protocol

if [ $VPN_TCPIP == 1 ] ; then
  PROTO_UDP="Off"
  PROTO_TCP="On"
else
  PROTO_UDP="On"
  PROTO_TCP="Off"
fi

dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--radiolist "Protocollo" 10 75 2 UDP    "Piu' performante ma a volte bloccato dai firewall" $PROTO_UDP \
				       TCP/IP "Piu' sensibile alla qualita' del collegamento" $PROTO_TCP 2>$ANSFILE 

RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
ANSWER=`cat $ANSFILE`

if [ ".$ANSWER." == ".UDP." ] ; then
  VPN_TCPIP=0
else
  VPN_TCPIP=1
fi

# Check IP configuration

NOT_DHCP=`./systools/get_eurodb_config_val AdslConnectionStaticIP`
if [ -z "$NOT_DHCP" -o "$NOT_DHCP" == 0 ] ; then
  IP_DHCP="On"
  IP_STATIC="Off"
else
  IP_DHCP="Off"
  IP_STATIC="On"
fi

dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--radiolist "IP Locale" 10 75 2 DHCP    "Ottenuto in automatico dal server DHCP" $IP_DHCP \
				      Statico "Specificato manualmente" $IP_STATIC 2>$ANSFILE 

RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
ANSWER=`cat $ANSFILE`

if [ ".$ANSWER." == ".DHCP." ] ; then
  NOT_DHCP=0
else
  NOT_DHCP=1

dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--inputbox "Nome del sistema" 8 50 $SYSTEM_NAME 2>$ANSFILE

RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
SYSTEM_NAME=`cat $ANSFILE`


dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--inputbox "Indirizzo IP locale" 8 50 $STATIC_IP 2>$ANSFILE
	
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
STATIC_IP=`cat $ANSFILE`
  
dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--inputbox "Gateway predefinito" 8 50 $STATIC_GW 2>$ANSFILE
	
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
STATIC_GW=`cat $ANSFILE`

dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Parametri del collegamento" \
	--inputbox "Server DNS" 8 50 $STATIC_DNS 2>$ANSFILE
	
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
  exit
fi
STATIC_DNS=`cat $ANSFILE`
    
fi


rm /tmp/vpn_connect.log
touch /tmp/vpn_connect.log

export STATIC_DNS STATIC_GW STATIC_IP VPN_SERVER VPN_TCPIP NOT_DHCP

connect_vpn 2>/dev/null &

dialog  --begin 8 8 --backtitle "$BACKTITLE" \
        --title "Collegamento VPN" \
	--tailbox /tmp/vpn_connect.log 22 75 2>/dev/null



SYSTEM_INFO_FILE=/var/www/html/system_info
  echo "SystemName=$SYSTEM_NAME" >$SYSTEM_INFO_FILE
  echo "SpinKeyNr=$SPINKEY_NR" >>$SYSTEM_INFO_FILE
