#!/bin/bash
# AQ
# 20120321

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' \
[28010]='MTN' \
[25007]='SMARTS' \
[25003]='TATINCOM' \
);
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 "Сканируем COM порты"
logger -t gprsconfig "Сканируем COM порты"

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

    logger -t gprsconfig "Устанавливаем параметры для порта $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 "Пробуем искать на скорости 9600. Устанавливаем параметры для порта $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 нет модема ($?)"
	      echo " Нет модема "
	    else
	      logger -t gprsconfig "$devpath (9600) НАЙДЕН МОДЕМ ($?)"
	      echo " Найден модем "
	      get_operator;
		 if [ "$NNGSM" == "0" ]; then
		    Modems[${#Modems[*]}]="$port $gsm 9600";
		 else 
		    echo "Неизвестный провайдер $gsm на $devpath "
		 fi
	    fi
    else
	logger -t gprsconfig "$devpath (115200) НАЙДЕН МОДЕМ ($?)"
        echo " Найден модем "
	get_operator;
	  if [ "$NNGSM" == "0" ]; then
	    Modems[${#Modems[*]}]="$port $gsm 115200";
	  else 
	    echo "Неизвестный провайдер $gsm на $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 "Устанавливаем параметры для порта $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 "Пробуем искать на скорости 9600. Устанавливаем параметры для порта $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 нет модема ($?)"
	      echo " Нет модема "
	    else
	      logger -t gprsconfig "$devpath (9600) НАЙДЕН МОДЕМ ($?)"
	      echo " Найден модем "
	      get_operator;
		 if [ "$NNGSM" == "0" ]; then
		    Modems[${#Modems[*]}]="$port $gsm 9600";
		 else 
		    echo "Неизвестный провайдер $gsm на $devpath "
		 fi
	    fi
    else
	logger -t gprsconfig "$devpath (115200) НАЙДЕН МОДЕМ ($?)"
        echo " Найден модем "
	get_operator;
	  if [ "$NNGSM" == "0" ]; then
	    Modems[${#Modems[*]}]="$port $gsm 115200";
	  else 
	    echo "Неизвестный провайдер $gsm на $devpath "
	  fi
    fi
done

echo "Сканируем USB порты"
logger -t gprsconfig "Сканируем USB порты"

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 "Неизвестный провайдер $gsm на $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 "Неизвестный провайдер $gsm на $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 "Неизвестный провайдер $gsm на $devpath "
    fi
done

if [ ${#Modems[*]} -eq 0 ]; then
    echo ""
    echo "Модемы не найдены"
    echo ""
    sleep 5;
    exit 1;
fi

echo
echo "Найдены порты:"
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 " Введите номер используемого модема";
	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"

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=""
        PAPPASSWORD=""
        DEVICE="ppp0"
        INIT="internet.globe.com.ph"
fi

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

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

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

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

echo "Новые настройки"

if [ "$NAME" == "не указано" ];
then
    error "Не указан оператор"
fi

echo "Имя провайдера: $NAME"

if [ ! -z $INIT2 ];
then
echo "Выберите строку нинициализации для этого подключения:"
echo "1 - $INIT"
echo "2 - $INIT2"
read WHICH_INIT

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

echo "Строка инициализации: $INIT"

MODEMPORT=$devpath
echo "Порт модема: $MODEMPORT"

MTU="1000"

echo "Всё верно? (y/n)                     "
read CONFIRM
[ "$CONFIRM" == "y" ] || error "Прервано"

# Создание резервных копий
cp -f /root/.wvdial.conf /root/.wvdial.conf.bak

# Запись значений в файлы
file="/root/.wvdial.conf"
echo -n > $file
echo "[Dialer Defaults]" >> $file
echo "Modem = $MODEMPORT" >> $file
echo "ISDN = off" >> $file
echo "Modem Type = Analog Modem" >> $file
echo "Baud = $LINESPEED" >> $file
echo "Init = ATZ" >> $file
echo "Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0" >> $file
echo "Init3 = AT+CGDCONT=1,\"IP\",\"$INIT\"" >> $file
echo "Init4 = " >> $file
echo "Init5 = " >> $file
echo "Init6 = " >> $file
echo "Init7 = " >> $file
echo "Init8 = " >> $file
echo "Init9 = " >> $file
echo "Phone = *99***1#" >> $file
echo "Phone1 = " >> $file
echo "Phone2 = " >> $file
echo "Phone3 = " >> $file
echo "Phone4 = " >> $file
echo "Dial Prefix = " >> $file
echo "Dial Attempts = 2" >> $file
echo "Dial Command = ATM1L3DT" >> $file
echo "Ask Password = off" >> $file
echo "Password = $PAPPASSWORD" >> $file
echo "Username = $PAPNAME" >> $file
echo "Auto Reconnect = off" >> $file
echo "Abort on Busy = off" >> $file
echo "Carrier Check = on" >> $file
echo "Check Def Route = on" >> $file
echo "Abort on No Dialtone = on" >> $file
echo "Stupid Mode = off" >> $file
echo "Idle Seconds = 0" >> $file
echo "Auto DNS = on" >> $file

chmod 0644 $file
chown 0.0 $file

# Прописываем пользователя
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
