#!/bin/bash
# AQ
# 20120904

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' \
[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
    /usr/local/bin/reset_modem $devpath

    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" == "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" == "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 "Прервано"

# Создание резервных копий


# Запись значений в файлы
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

if [ ! -f /usr/bin/wvdial.orig ];then
  cp -f /usr/bin/wvdial /usr/bin/wvdial.orig
fi

file="/usr/bin/wvdial"
echo -n > $file
echo "#!/bin/bash" >> $file
echo "# AQ" >> $file
echo "# 20111209" >> $file
echo "" >> $file
echo "on_die()" >> $file
echo "{" >> $file
echo "    logger -t wvdial-replace \"Got TERM signal\"" >> $file
echo "" >> $file
echo "    killall pppd" >> $file
echo "    exit 0" >> $file
echo "}" >> $file
echo "" >> $file
echo "trap 'on_die' TERM" >> $file
echo "" >> $file
echo "COPYS=\`ps ax | grep wvdial | grep bash | wc | awk '{print \$1}'\`" >> $file
echo "if [ \"\$COPYS\" != \"2\" ] ; then" >> $file
echo "    exit 0" >> $file
echo "fi" >> $file
echo "" >> $file
echo "while true ; do" >> $file
echo "    pppdpid=\`pidof pppd\`" >> $file
echo "    if [ \"x\$pppdpid\" == \"x\" ] ; then" >> $file
echo "        logger -t wvdial-replace \"Start PPPD Call\"" >> $file
echo "        pppd call internet" >> $file
echo "    fi" >> $file
echo "    sleep 5" >> $file
echo "    sleep 5" >> $file
echo "    sleep 5" >> $file
echo "    sleep 5" >> $file
echo "    sleep 5" >> $file
echo "    sleep 5" >> $file
echo "done" >> $file
echo "" >> $file
echo "exit 0" >> $file
chmod 0755 $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
