#!/bin/bash
# AQ
# 20150518

CHAT=`which chat`
unset Modems
declare -a Modems[0]

function get_operator {
declare -a gsmids=(\
[25001]='MTS' \
[25099]='BEELINE' \
[25002]='MEGAFON' \
[25017]='UTEL' \
[25020]='TELE2' \
[25016]='NTK' \
[25019]='ALTAYSV' \
[25035]='MOTIV' \
[25012]='BWC' \
[25005]='ETK' \
[40101]='BEELINE-KZ' \
[28401]='MTEL' \
[28403]='VIVACOM' \
[28405]='GLOBUL' \
[51502]='GLOBE' \
[51503]='SMART' \
[51505]='SUN' \
[40177]='NEO' \
[40102]='KCELL' \
[25007]='SMARTS' \
[28010]='MTN' \
[25039]='VOLGOGSM' \
[25003]='TATINCOM' \
[42403]='DU' \
[42402]='ETISALAT' \
[40107]='ALTEL' \
[22610]='ORANGERO' \
[22601]='VODAFONERO' \
[22603]='COSMOTE' \
);
NNGSM="0"
local gsmid="`$CHAT -v -e -t 2 "" "AT+CIMI" "OK" 2>&1 < $devpath >$devpath`"
gsmid=`echo $gsmid | sed -n "s/.*\([0-9]\{5\}\)[0-9]\{10\}.*/\1/p"`
gsm=${gsmids[$gsmid]};
logger -t gprsconfig "$gsm"
if [ -z "$gsm" ]; then gsm="$gsmid";NNGSM="1";return 1; fi
return 0
}

rm -rf /etc/ppp/peers/ppp* > /dev/null 2>&1

echo "Scanning COM ports"
logger -t gprsconfig "Scanning COM ports"

serports=`cat /proc/tty/driver/serial|grep -v " uart:unknown "| grep uart |\
    awk '{print $1}'|sed -n 's/\([0-9]\)\+.*/ttyS\1/p'`

for port in $serports; do
    devpath=/dev/$port
    /usr/local/bin/reset_modem $devpath

    logger -t gprsconfig "Setting parameters for the port $devpath"
    stty -F $devpath raw -hup cread clocal -crtscts -parenb iexten echoe echok 115200
    $CHAT -v -t 1 '' '\K' < $devpath > $devpath

    echo -n $devpath "=>"
    $CHAT -v -t 2 '' 'AT' 'OK' <$devpath >$devpath
    if [ $? -gt 0 ]; then
	logger -t gprsconfig "Trying to search at speed 9600. Setting parameters for the port $devpath"
	stty -F $devpath raw -hup cread clocal -crtscts -parenb iexten echoe echok 9600
	$CHAT -v -t 1 '' '\K' < $devpath > $devpath
	$CHAT -v -t 2 '' 'AT' 'OK' <$devpath >$devpath
	    if [ $? -gt 0 ]; then
	      logger -t gprsconfig "$devpath no modem ($?)"
	      echo " no modem "
	    else
	      logger -t gprsconfig "$devpath (9600) FOUND MODEM ($?)"
	      echo " FOUND MODEM "
	      get_operator;
		 if [ "$NNGSM" == "0" ]; then
		    Modems[${#Modems[*]}]="$port $gsm 9600";
		 else 
		    echo "Unknown provider $gsm on $devpath "
		 fi
	    fi
    else
	logger -t gprsconfig "$devpath (115200) FOUND MODEM ($?)"
        echo " FOUND MODEM "
	get_operator;
	  if [ "$NNGSM" == "0" ]; then
	    Modems[${#Modems[*]}]="$port $gsm 115200";
	  else 
	    echo "Unknown provider $gsm on $devpath "
	  fi
    fi
done

unset devpath;
for devpath in `ls /dev/ttyD* 2>/dev/null`; do
	port=`echo $devpath | sed "s/\/dev\///"`
	logger -t gprsconfig "Setting parameters for the port $devpath"
	stty -F $devpath raw -hup cread clocal -crtscts -parenb iexten echoe echok 115200
	$CHAT -v -t 1 '' '\K' < $devpath > $devpath

    echo -n $devpath "=>"
    $CHAT -v -t 2 '' 'AT' 'OK' <$devpath >$devpath
    if [ $? -gt 0 ]; then
	logger -t gprsconfig "Trying to search at speed 9600. Setting parameters for the port $devpath"
	stty -F $devpath raw -hup cread clocal -crtscts -parenb iexten echoe echok 9600
	$CHAT -v -t 1 '' '\K' < $devpath > $devpath
	$CHAT -v -t 2 '' 'AT' 'OK' <$devpath >$devpath
	    if [ $? -gt 0 ]; then
	      logger -t gprsconfig "$devpath no modem ($?)"
	      echo " no modem "
	    else
	      logger -t gprsconfig "$devpath (9600) FOUND MODEM ($?)"
	      echo " FOUND MODEM "
	      get_operator;
		 if [ "$NNGSM" == "0" ]; then
		    Modems[${#Modems[*]}]="$port $gsm 9600";
		 else 
		    echo "Unknown provider $gsm on $devpath "
		 fi
	    fi
    else
	logger -t gprsconfig "$devpath (115200) FOUND MODEM ($?)"
        echo " FOUND MODEM "
	get_operator;
	  if [ "$NNGSM" == "0" ]; then
	    Modems[${#Modems[*]}]="$port $gsm 115200";
	  else 
	    echo "Unknown provider $gsm on $devpath "
	  fi
    fi
done

echo "Scanning USB ports"
logger -t gprsconfig "Scanning USB ports"

unset devpath;
for devpath in `ls /dev/gsmmodem* 2>/dev/null`; do
    get_operator;
    if [ "$NNGSM" == "0" ]; then
      devpath=`echo $devpath | sed -n 's/\/dev\/\(.*\)/\1/p'`
      Modems[${#Modems[*]}]="$devpath $gsm 115200";
    else
      echo "Unknown provider $gsm on $devpath "
    fi
done

unset devpath;
for devpath in `ls /dev/ttyACM* 2>/dev/null`; do
    get_operator;
    if [ "$NNGSM" == "0" ]; then
      devpath=`echo $devpath | sed -n 's/\/dev\/\(.*\)/\1/p'`
      Modems[${#Modems[*]}]="$devpath $gsm 115200";
    else 
      echo "Unknown provider $gsm on $devpath "
    fi
done

unset devpath;
for devpath in `ls /dev/ttyUSB* 2>/dev/null`; do
    get_operator;
    if [ "$NNGSM" == "0" ]; then
      devpath=`echo $devpath | sed -n 's/\/dev\/\(.*\)/\1/p'`
      Modems[${#Modems[*]}]="$devpath $gsm 115200";
    else 
      echo "Unknown provider $gsm on $devpath "
    fi
done

if [ ${#Modems[*]} -eq 0 ]; then
    echo ""
    echo "Modem not found"
    echo ""
    sleep 5;
    exit 1;
fi

echo
echo "Detected ports:"
for (( i=0; i<${#Modems[*]}; i++ )) do
    if [ -z "$choices" ]; then
        choices="${Modems[$i]}"
    else
        choices="$choices;${Modems[$i]}"
    fi
done

if [ -z "${Modems[1]}" ]; then
	choice="${Modems[0]}"
	echo "1) $choice"
else
	echo " Enter the number of the modem used";
	IFS=';'
	select choice in $choices; do
	if [ -n "$choice" ]; then break; fi
	done
	unset IFS;
fi

devname=`echo $choice | awk '{print $1}'`
opsos=`echo $choice | awk '{print $2}'`
LINESPEED=`echo $choice | awk '{print $3}'`

unset devpath;
devpath=/dev/$devname

unset ports
declare -a ports
echo "GPRS setup"

function error() {
	echo "  $@"
	exit 1
}

if [ "$opsos" == "BEELINE" ];
then 
	NAME="beeline"
	PAPNAME="beeline"
	PAPPASSWORD="beeline"
	DEVICE="ppp0"
	INIT="internet.beeline.ru"
	INIT2="home.beeline.ru"
fi

if [ "$opsos" == "MTS" ];
then 
	NAME="mts"
	PAPNAME="mts"
	PAPPASSWORD="mts"
	DEVICE="ppp0"
	INIT="internet.mts.ru"
fi

if [ "$opsos" == "MEGAFON" ];
then 
	NAME="megafon"
	PAPNAME="gdata"
	PAPPASSWORD="gdata"
	DEVICE="ppp0"
	INIT="internet"
fi

if [ "$opsos" == "ETK" ];
then 
	NAME="etk"
	PAPNAME="etk"
	PAPPASSWORD="etk"
	DEVICE="ppp0"
	INIT="internet.etk.ru"
fi

if [ "$opsos" == "BEELINE-KZ" ];
then 
	NAME="beeline-kz"
	PAPNAME='@internet.beeline'
	PAPPASSWORD="beeline"
	DEVICE="ppp0"
	INIT="internet.beeline.kz"
fi

if [ "$opsos" == "KCELL" ];
then 
	NAME="kcell"
	PAPNAME='@internet.beeline'
	PAPPASSWORD="beeline"
	DEVICE="ppp0"
	INIT="internet"
fi

if [ "$opsos" == "NEO" ];
then 
	NAME="neo"
	PAPNAME='@internet.beeline'
	PAPPASSWORD="beeline"
	DEVICE="ppp0"
	INIT="internet"
fi

if [ "$opsos" == "NTK" ];
then 
	NAME="ntk"
	PAPNAME="ntc"
	PAPPASSWORD="ntc"
	DEVICE="ppp0"
	INIT="internet.ntc"
fi

if [ "$opsos" == "ALTAYSV" ];
then 
	NAME="altaysv"
	PAPNAME="gdata"
	PAPPASSWORD="gdata"
	DEVICE="ppp0"
	INIT="internet.altaysv.ru"
fi

if [ "$opsos" == "BWC" ];
then
        NAME="uuss"
        PAPNAME="gdata"
        PAPPASSWORD="gdata"
        DEVICE="ppp0"
        INIT="inet.bwc.ru"
fi

if [ "$opsos" == "MOTIV" ];
then
        NAME="motiv"
        PAPNAME="moviv"
        PAPPASSWORD="motiv"
        DEVICE="ppp0"
        INIT="inet.ycc.ru"
fi

if [ "$opsos" == "TELE2" ];
then 
	NAME="tele2"
	PAPNAME="gdata"
	PAPPASSWORD="gdata"
	DEVICE="ppp0"
	INIT="internet.tele2.ru"
fi

if [ "$opsos" == "MTEL" ];
then 
        NAME="mtel"
        PAPNAME="mtel"
        PAPPASSWORD="mtel"
        DEVICE="ppp0"
        INIT="inet-gprs.mtel.bg"
fi

if [ "$opsos" == "VIVACOM" ];
then 
        NAME="vivacom"
        PAPNAME="VIVACOM"
        PAPPASSWORD="VIVACOM"
        DEVICE="ppp0"
        INIT="internet.vivacom.bg"
fi

if [ "$opsos" == "GLOBUL" ];
then 
        NAME="globul"
        PAPNAME="globul"
        PAPPASSWORD="globul"
        DEVICE="ppp0"
        INIT="internet.globul.bg"
fi

if [ "$opsos" == "GLOBE" ];
then 
        NAME="globe"
        PAPNAME="none"
        PAPPASSWORD="none"
        DEVICE="ppp0"
        INIT="internet.globe.com.ph"
fi

if [ "$opsos" == "SMART" ];
then 
        NAME="smart"
        PAPNAME="none"
        PAPPASSWORD="none"
        DEVICE="ppp0"
        INIT="SMARTBRO"
fi

if [ "$opsos" == "SMARTS" ];
then
        NAME="smatrs"
        PAPNAME="smarts"
        PAPPASSWORD="smarts"
        DEVICE="ppp0"
        INIT="internet.smarts.ru"
fi

if [ "$opsos" == "MTN" ];
then
        NAME="mtn"
        PAPNAME="wap"
        PAPPASSWORD="wap"
        DEVICE="ppp0"
        INIT="internet"
fi

if [ "$opsos" == "VOLGOGSM" ];
then
        NAME="volgogsm"
        PAPNAME="volgo"
        PAPPASSWORD="volgo"
        DEVICE="ppp0"
        INIT="internet.volgogsm.ru"
fi

if [ "$opsos" == "TATINCOM" ];
then
        NAME="tatincom"
        PAPNAME="tatincom"
        PAPPASSWORD="tatincom"
        DEVICE="ppp0"
        INIT="internet.tatincom.ru"
fi

if [ "$opsos" == "DU" ];
then
        NAME="none"
        PAPNAME="none"
        PAPPASSWORD="none"
        DEVICE="ppp0"
        INIT="du"
fi

if [ "$opsos" == "ETISALAT" ];
then
        NAME="none"
        PAPNAME="none"
        PAPPASSWORD="none"
        DEVICE="ppp0"
        INIT="etisalat.ae"
fi

if [ "$opsos" == "ALTEL" ];
then
        NAME="altel"
        PAPNAME="altel"
        PAPPASSWORD="altel"
        DEVICE="ppp0"
        INIT="internet"
fi

if [ "$opsos" == "ORANGERO" ];
then
        NAME="orange"
        PAPNAME="orange"
        PAPPASSWORD="orange"
        DEVICE="ppp0"
        INIT="internet"
fi

if [ "$opsos" == "VODAFONERO" ];
then
        NAME="vodafone"
        PAPNAME="vodafone"
        PAPPASSWORD="vodafone"
        DEVICE="ppp0"
        INIT="internet.vodafone.ro"
fi

if [ "$opsos" == "COSMOTE" ];
then
        NAME="cosmote"
        PAPNAME="cosmote"
        PAPPASSWORD="cosmote"
        DEVICE="ppp0"
        INIT=""
fi

#echo "New parameters"

if [ "$NAME" == "not specified" ];
then
    error "No operator specified"
fi

echo "Provider name: $NAME"

if [ ! -z $INIT2 ];
then
echo "Select the initialization string for this connection:"
echo "1 - $INIT"
echo "2 - $INIT2"
read WHICH_INIT

if [ "$WHICH_INIT" == "2" ];then
  INIT=$INIT2
fi
fi

echo "init: $INIT"

MODEMPORT=$devpath
echo "порт: $MODEMPORT"

MTU="576"

echo "All right? (y/n)                     "
read CONFIRM
[ "$CONFIRM" == "y" ] || error "Abort"

# Backup Creation


# Writing values to files
file="/etc/ppp/peers/internet"
echo -n > $file
echo "hide-password" >> $file
echo "$MODEMPORT" >> $file
echo "$LINESPEED" >> $file
echo "user \"$PAPNAME\"" >> $file
echo "connect \"/usr/sbin/chat -v -f /etc/ppp/peers/chat\"" >> $file
chmod 0644 $file
chown 0.0 $file

file="/etc/ppp/peers/chat"
echo -n > $file
echo "TIMEOUT 45" >> $file
echo "ABORT \"NO CARRIER\"" >> $file
echo "ABORT ERROR" >> $file
echo "\"\" AT+CSQ" >> $file
echo "OK ATE1" >> $file
echo "OK AT+CGDCONT=1,\"IP\",\"$INIT\"" >> $file
echo "OK ATD*99***1#" >> $file
echo "CONNECT \c" >> $file
chmod 0644 $file
chown 0.0 $file

# We register user
PAPAUTHFILE="/etc/ppp/pap-secrets"
TMP="/tmp/rc.$RANDOM"

if [ "$PAPNAME" != "" ];
then
	res=`grep $PAPNAME $PAPAUTHFILE`
	if [ "x$res" == "x" ] ; then
		echo "$PAPNAME	*	$PAPPASSWORD" >> $PAPAUTHFILE
	else
		sed "/$PAPNAME/d" $PAPAUTHFILE > $TMP
		mv -f $TMP $PAPAUTHFILE
		echo "$PAPNAME	*	$PAPPASSWORD" >> $PAPAUTHFILE
	fi
fi
chown 0.0  $PAPAUTHFILE
chmod 0600 $PAPAUTHFILE
