#!/bin/bash
#
#
# claro-3g MD300
#
# Este script foi testado com o modem MD300 Sony Ericsson
#
# Por Daniel Roque
# 2006roque@gmail.com
#
# Atencao!
# 
# Use o escript por sua conta e risco
# este script nao vem com nenhuma garantia
# 
# 
# 
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

########## VARIAVEIS #############
REDEINT='192.168.0.0/24'         #  rede interna, coloque o valor correto caso queira rotear conexao
TENTATIVAS='5'                   #  numero de tentativas antes de desistir, nao deixe em branco
DEVID="0fce:d0cf"                #  Para tentar outros modens utilize o lsusb e descubtra o devid do mesmo e substitua o valor
ESPERA="20"                      #  temo que se deve esperar pelo handshake com o servidor, antes de testar se conectou
CONT='3'                         #  ping count, mantenha um valor entre 1 e 9, utilize maior para sinal mais fraco
DESTINO='200.98.249.120'         #  host de destinho para teste, importante por um ip que responda a ping
DNS='200.169.117.22'             #  dns padrao da claro, mude apenas se souber o que esta fazendo
##################################

versao='0.1.2'
ultimaatualizacao='Qua Mar 25 11:20:51 UTC 2009'

checkdep(){
	rslt=`find /usr/bin/ /sbin/ /bin/ /usr/local/bin/ -name wvdial`
	if [ "$rslt" == '' ];
	then
		echo "Claro-3g --> ERRO: wvdial nao encontrado, instale-o 
             ([debian|ubuntu|big|famelix] -> apt-get install wvdial)"
		cmd='exit 3'
	fi
	rslt=`find /usr/bin/ /sbin/ /bin/ /usr/local/bin/ -name udevd`
	if [ "$rslt" == '' ];
	then
		echo "
Claro-3g --> ERRO: udev nao encontrado, instale-o 
             ([debian|ubuntu|big|famelix] -> apt-get install udev)"
		cmd='exit 3'
	fi
  rslt=`find /usr/bin/ /sbin/ /bin/ /usr/local/bin/ -name udevd`
  if [ "$rslt" == '' ];
  then
    echo "
Claro-3g --> ERRO: udev nao encontrado, instale-o 
             ([debian|ubuntu|big|famelix] -> apt-get install udev)"
    cmd='exit 3'
  fi
  rslt=`find /usr/bin/ /sbin/ /bin/ /usr/local/bin/ -name named`
  rslt=`find /usr/bin/ /sbin/ /bin/ /usr/local/bin/ -name dnsmasq`

  if [ "$rslt" == '' ];
  then
    echo "Claro-3g --> AVISO: algumas vezes o dns destes modens demoram muito para responder,
             eu aconselhor utilizar um dns em sua maquina.
             ([debian|ubuntu|big|famelix] -> apt-get install bind)

             Caso você opte por utilizar um dns em sua maquina, dentro deste script,
             remova o # que precede a linha #nameserver 127.0.0.1 e rode o install
             novamente."
  fi
	$cmd
}

ppp_option(){
sed '{s/\(^.*asyncmap.*\)/#\1/
s/\(^.*mru.*\)/#\1/
s/\(^.*refuse-chap.*\)/#\1/ }' -i /etc/ppp/options
}

install(){
	quem=`whoami`
echo 'Claro-3g, revisao 2 de 08-02-2009
Por Daniel Roque, 2006roque@gmail.com

Este script vem com nenhuma garantia, utilize-o por sua conta e RISCO!

Deseja continuar (s/n):n'
  read resp
  resp=`echo $resp|sed 's/[sSyY]/s/g'`
  if [ "$resp" != 's' ];
  then
    echo 'saindo sem fazer nada.'
    exit 1
  fi
	checkdep;
	if [ "$quem" != 'root' ];
	then
		echo "
Claro-3g --> Voce precisa dos poderes de root para executar este script"
		exit 4
	fi
	rm /etc/init.d/claro-3g 2>/dev/null
	cp claro-3g /etc/init.d/  2>/dev/null
	num='2
3
4
5'
  echo "
Claro-3g --> Desja criar um link para iniciar automaticamente quando pc e iniciado?(s/n):s"
  read resp
  resp=`echo $resp|sed 's/[nN]/n/g'`
  if [ "$resp" != 'n' ];
  then
    echo "
Claro-3g --> Criando links de inicializacao"
	  for i in `echo $num`
	  do
		  cd /etc/rc$i.d/
      echo "/etc/rc$i.d/S99claro-3g"
		  ln -s ../init.d/claro-3g S99claro-3g 2>/dev/null
	  done
  else
    echo "
Claro-3g --> Removendo links de inicializacao, caso exista"
    for i in `echo $num`
    do
      echo "/etc/rc$i.d/S99claro-3g"
      rm -f /etc/rc$i.d/S99claro-3g 2>/dev/null
    done
  fi 
    echo "
Claro-3g --> Configurando ppp"
  ppp_option;
	echo "
Claro-3g --> Utilize /etc/init.d/claro-3g start, ou conecte o modem e reinicie o pc

Boa Sorte!"
}

dodns(){
	#altere as linhas abaixo caso tenha um dns e dominio local
	echo "#domain casa.local
#search casa.local
#nameserver 127.0.0.1
nameserver $DNS
nameserver 200.169.119.22">/etc/resolv.conf
}

udevrules(){
	if [ ! -e '/etc/udev/rules.d/50-md300modem.rules' ];
	then
		echo "Claro-3g -->Gerando regras para udev e reiniciando udev"
    aspas="'"
		echo '#claro-3g script
ACTION!="add", GOTO="3G_End"
BUS=="usb", SYSFS{idProduct}=="d0cf", SYSFS{idVendor}=="0fce", NAME="modem" PROGRAM="/bin/sh -c '"'"'echo 3 > /sys/%p/device/bConfigurationValue'"'"'
LABEL="3G_End"' >/etc/udev/rules.d/50-md300modem.rules
	fi
  /etc/init.d/hal restart
  /etc/init.d/udev restart
}

wvdialconf(){
	oldconf=`cat /etc/wvdial.conf|sed 's/^/#/g'`
	echo '#claro-3g - nao modifique esta linha
#
# Por Daniel Roque
# 2006roque@gmail.com
#
# Atencao!
# 
# Use o escript claro-3g por sua conta e risco
# este script nÃ£o vem com nenhuma garantia
# 
# 
[Dialer Defaults]
Modem = /dev/ttyACM0
Baud = 460800
Init1 = ATZ
Init2 = AT+cfun=1
Init3 = AT+CGDCONT=1,"IP","bandalarga.claro.com.br"
Area Code =
Automatic Reconnect = yes
Phone = *99***1#
Username = claro
Password = claro
Ask Password = 0
Dial Command = ATDT
Stupid Mode = 0
Compuserve = 0
Force Address =
Idle Seconds = 300
DialMessage1 =
DialMessage2 =
ISDN = 0
Auto DNS = 0
Modem Type = Analog Modem
New PPPD = yes
########## ABAIXO ESTA O CONTEUDO DO VELHO wvdial.conf
########## delete as linhas acima e remova o primeiro #
########## de cada linha para voltar a conf antiga'"
$oldconf" >/etc/wvdial.conf

}

xau_lock(){
rm -f /var/run/claro-3g.pid 2>/dev/null
}

kill_if_running(){
  if [ -e /var/run/claro-3g.pid ];
  then 
    echo "Claro-3g -->Parando script existente e aparentemente rodando"
    pid=`cat /var/run/claro-3g.pid`
    kill -9 $pid 2>/dev/null
    xau_lock;
    echo "Claro-3g -->Feito!"
  fi 
}

start(){
	echo "CLARO-3G - versao $versao de $ultimaatualizacao"
  kill_if_running; 
  echo "$$" >/var/run/claro-3g.pid
	checkdep;
	#checando existencia do modem
 	rslt=`/usr/bin/lsusb |sed -n "/$DEVID/p"` 
	if [ "$rslt" == '' ];
	then
		echo "Claro-3g -->Modem nao encontrado!"
    xau_lock; 
		exit 2
	fi
	echo "Claro-3g -->Modem encontrado"
	#setando regras para o modem caso utilize outro modem as regras podem mudar
	udevrules;
	rslt=`cat /etc/wvdial.conf |sed -n '1p'|sed -n '/claro-3g/p'`
	#checando conf do wvdial
	if [ "$rslt" == '' ];
	then
		echo "Claro-3g -->configurando o wvdial.conf"
		wvdialconf;
	fi
	#verificando se ja esta conectado
	/sbin/ifconfig ppp0
	if [ "$?" == 0 ];
	then
    ping -c $CONT $DESTINO|sed -n '/[123456789] received/p' 2> /dev/null
    rslt="$?"
  else
    rslt=1
	fi
	#tentando por 5 vezes conectar
	tries='1'
	while [ "$rslt" != 0 ] && [ "$tries" -lt $TENTATIVAS ]; 
	do
    /etc/init.d/udev stop 2>/dev/null
    /etc/init.d/udev start 2>/dev/null
		killall -s KILL wvdial 2>/dev/null
		killall -s KILL pppd 2>/dev/null
		wvdial 2>/dev/null &
		echo "Claro-3g -->Tentativa $tries de $TENTATIVAS."
		echo "Claro-3g -->Tentando conectar em $ESPERA segundos"
		sleep $ESPERA
    rmdefroute=`route -n|sed -n 's/  //g;s/  //g;s/\(0.0.0.0\)\(.*\)\(0.0.0.0.*\)/route del default gw \2/p'`
    $rmdefroute
    route add default gw 10.64.64.64 
		ping -c $CONT $DESTINO|sed -n '/[123456789] received/p' 2> /dev/null
    rslt="$?"
		tries=`expr "$tries" + 1`
	done
	echo "Claro-3g -->Conectado!"
	#rotenado conexao para a rede internar, altere a var REDEINT para o valor local da sua rede
  echo "Claro-3g -->rotenado conexao para a rede $REDEINT, altere a variavel REDEINT dentro do script caso isto nao esteja certo."
	/sbin/iptables -t nat -A POSTROUTING -s $REDEINT -j MASQUERADE
	echo 1 >/proc/sys/net/ipv4/ip_forward
	dodns;
}

stop(){
  echo "Claro-3g -->Parar"
  kill_if_running;
	killall -s KILL wvdial 2>/dev/null
	killall -s KILL pppd 2>/dev/null
	iptables -t nat -D POSTROUTING -s $REDEINT -j MASQUERADE 2>/dev/null
	echo 0 >/proc/sys/net/ipv4/ip_forward 
}

case $1 in
	start)
		start;
	;;
	stop)
		stop;
	;;
	restart)
		stop;start
	;;
	install)
		install;
	;;
	*)
		echo 'use claro-3g (start|stop|restart|install)'
		exit 1
	;;
esac


exit 0
