AprendiNoLinux
(usa Ubuntu)
Enviado em 26/04/2012 - 20:45h
Falta a lógica do corpo inicial do Script e o loop que vai controlar as fases.
Acho que não falta nenhuma função ou rotina repetida que precise ir para funções.
Agora preciso da lógica escrita, ex:
1 - Quando inicia a máquina ele dispara o serviço ppp
2 - Depois ele carrega o wdial...
3 - etc...
A lógica natural do processo funcionando. Depois vamos para a lógica de falha.
#!/bin/bash
# Script.......: discador3g.sh
# name.........: Roda em background ativando e desativando a conexão 3g
# Author.......: lucasdona
# Co-Authores..: Gatux
# Employees....: @foxbit3r e todos que ajudaram na solução do problema.
# charset......: UTF-8
# endofline....: Linux
# since........: 2012-04-26 13:13 (GMT -03:00)
# license......: GPL 3
# system.......: GNU bash, version 3.x
# version......: alfa 0.4
# more.........: Script vai tentar manter conexão ativa.
#-----------------------------------------------------------------------------#
#set -x # Liga Debug de tudo.
#trap read DEBUG
DEBUG=9 # 0=Inativo 1,2,3,4,5,6,7,8 e 9 ativam o debug.
###############################################################################
# CHANGE LOG
###############################################################################
#-----------------------------------------------------------------------------#
# Alfa 0.4
# ========
# - Removido funções desnecessárias.
# - Alterado funções com novos testes.
# - Falta montar o corpo inicial e o loop de testes.
#-----------------------------------------------------------------------------#
# Alfa 0.3
# ========
# - Novas funções incluídas.
# - Preparação para trabalhar como DAEMON inicializada.
# - Neste momento está fazendo apenas o teste do loop e saída via arquivo.
#-----------------------------------------------------------------------------#
# Alfa 0.2
# ========
# Iniciado reformulação do script ( Gatux )
#-----------------------------------------------------------------------------#
# Alfa 0.1
# ========
# ????-??-?? - Criado script por lucasdona
#-----------------------------------------------------------------------------#
# Área reservada para variáveis globais caso haja necessidade.
#-----------------------------------------------------------------------------#
PROGNAME=$(echo $(basename "$0") | sed 's:.sh::') # Nome do aplicativo.
CONT_PPPD=0 # Contador de tentativas.
#LOCAL_LOG="/tmp/${PROGNAME}.$$" # Arquivo temporário de log desta chamada.
LOCAL_LOG="/etc/discador/discador.log"
OLD_LOG="/etc/discador/old_log_discador.log" # Atenção para permissão no arquivo.
PPPD_FLAG=true # Não sei para que serve.
SLEEP_TIME=3 # Tempo genérico que irá aguardar.
PPPD_RETORNO=false # Variável de retorno do MODEM. true = conectado.
FILE_STOP_LOOP_DISCADOR="/tmp/end_discador3g.txt" # Tira Daemon do ar.
USER_INTERRUPT=13 # Interrupção solicitada pelo usuário.
PSAUX=0 # Usada no retorno de processos que verificam se o modem ok.
CONEC_3G_INICIAL=0 # Momento que ficou sabendo da conexão ON = date "+%s"
QT_PORTAS=3 # Usado para saber se está ou não com energia.
MAX_LOG=50000 # Quantidade máxima de linhas do arquivo de log.
#-----------------------------------------------------------------------------#
# Área reservada para todas as funções que o script irá precisar.
#-----------------------------------------------------------------------------#
function conectar3g()
{
local time_ini time_fim
# Só poderá entrar nesta função caso a conexão tenha morrido.
echo "Conectando wvdial, aguarde..." >> $LOCAL_LOG
time_ini=$(date "+%s") # Marca o tempo que iniciou tentativa.
wvdial $CONEXAO 1>> $LOCAL_LOG 2>&1 & #tenta conectar utilizando o discador wvdial
# Usando wait você vai conseguir pegar o tempo real que vai demorar.
# Se este processo travar tudo, retire o wait.
# Você precisa saber que se ele demora tanto deve ter travado.
# Não tenho como testar esta parte.
wait # Fica aguardando retorno em bg
time_fim=$(date "+%s") # Pega o tempo final.
time_conection=$(($time_fim-$time_ini)) # Tempo que demorou para conectar.
echo "Demorou ${time_conection} segundos para conectar no wvdial..." >> $LOCAL_LOG
}
function TestaPortas()
{
local lc_qtde_portas
# Coleta a quantidade de portas.
lc_qtde_portas=$(ls /dev/ttyU* 2>/dev/null | wc -l 2>/dev/null)
# Força reatualização da qtde de portas.
QT_PORTAS=${lc_qtde_portas}
echo $QT_PORTAS
}
function TestaConexao()
{
local lc_my_conection lc_retorna_status
# Testa retorno de ping.
# Se teste 0 = [DESCONECTADO]
# Função retorna 2 status. [CONECTADO] ou [DESCONECTADO]
lc_my_conection=$(ping -c 2 www.google.com.br | wc -l)
if [ ${lc_my_conection} -gt "0" ]; then
lc_retorna_status="[CONECTADO]"
else
lc_retorna_status="[DESCONECTADO]"
fi
echo $lc_retorna_status
}
function Desconecta3g()
{
: # Força a desconexão do modem 3g
: # Falta a lógica da desconxão.
: # O ideal é que ela execute todas as fases.
: # Igual o que é feito ao ligar a máquina, mas só que ao contrário.
}
function AguardaTimeout()
{
# Configura o tempo e intervalo em que a conexão será testada.
# Se não enviar parâmetro algum, vai usar o valor da variável pública.
# Geralmente vai receber solicitações das funções:
# Conectado, Executando, TestaPPPd, etc...
lc_sleep_time=${1:-"${SLEEP_TIME}"} # Hoje está em 3 segundos.
sleep ${lc_sleep_time}
}
function Conectado()
{
: # Recebe ok que tudo está bem com a conexão.
: # Vai passar por esta função sempre que estiver ok para controlar
: # futuros timeouts de testes.
}
function executando()
{
: # Controla o momento em que está aguardando a finalização dos timeouts.
: # Será neste local que vamos tentar a conexão passando parâmetros.
#
}
function TestaPPPd()
{
local lc_tty lc_tty_retorno
echo "usando porta:" $TTY >> $LOCAL_LOG
# Testando retorno do $TTY
lc_tty=$(pppd /dev/$TTY)
#Aqui tenta resolver meu problema de "modem não respondendo"
# fazendo isso funciona novamente.
# Tenho dúvidas se este processo é eficaz.
if [ ${lc_tty} ]; then
echo "pppd tty iniciado com sucesso" >> $LOCAL_LOG
lc_tty_retorno="[OK]"
else
echo "erro ao iniciar pppd /dev/tty, reiniciar o sistema" >> $LOCAL_LOG
lc_tty_retorno="[OFF]"
fi
echo ${lc_tty_retorno}
function Kill3g()
{
local lc_conection="$1"
# param1 = recebe o nome da conexão que deseja matar.
# Precisa estar rodando em root ou com sudo.
if [ ${lc_conection} == "wvdial" ]; then
echo "Matando processo wvdial" >> $LOCAL_LOG
killall wvdial >> $LOCAL_LOG 2>&1
fi
if [ ${lc_conection} == "pppd" ]; then
echo "Matando processo pppd" >> $LOCAL_LOG
killall pppd 1>> $LOCAL_LOG 2>&1
fi
if [ ${lc_conection} == "avahi-daemon" ]; then
echo "Matando avahi-daemon" >> $LOCAL_LOG
killall -9 avahi-daemon 1>> $LOCAL_LOG 2>&1 #andei matando esse processo tmb, junto com o pppd, daí conectava
fi
if [ ${lc_conection} == "ppp0" ]; then
echo "matando ppp0" >> $LOCAL_LOG
ifconfig ppp0 down 1>> $LOCAL_LOG 2>&1
fi
}
function help_me()
{
: # Envia um choque no note caso a conexão tenha morrido. kkkk brincadeira.
}
function ExecPSaux()
{
# Lida com o carregamento e filtro dos parâmetros dos processos.
local lc_name_processo lc_psaux
# Note que estou usando um processo qualquer. Não consigo simular o seu.
# Geralmente vai usar o nome do serviço, ex: wvdial
lc_psaux=$(ps auxc | grep -i "${lc_name_processo}" | wc -l )
# Retorna 0(zero) se não localizou o processo ativo.
# Não consigo testar esta parte porque não tenho o processo rodando.
if [ $lc_psaux == "1" ]; then
PSAUX=$lc_psaux # Retorno para ser usado no teste de atividade.
fi
# Debug 3 "Valor do lc_psaux: $lc_psaux [F:$FUNCNAME L:$LINENO]"
}
#gera um log para ver o comportamento do discador
function gerar_log()
{
# Toda vez que ele entra no discador ele deixa o arquivo com 100 registros ?
cp /etc/discador/discador.log /etc/discador/discador.log.tmp
sed -i '1,100d' /etc/discador/discador.log.tmp
cat /etc/discador/discador.log.tmp > /etc/discador/discador.log
}
#-----------------------------------------------------------------------------#
# INÍCIO >>> function Debug()
# PARAM:
# 1 - Nível de erro.
# 2 - Grava log ou mensagens para debug (precisa de ajustes)
#-----------------------------------------------------------------------------#
function Debug()
{
#-------------------------------------------------------------------------#
# Só vai mostrar o Debug se for maior que 0.
# Se no programa principal deixar o DEBUG com 1, mensagem de Debug que
# forem do grupo 2 não serão mostradas.
# Caso queira mesmo ver todas as mensagens, configure o DEBUG=9
#-------------------------------------------------------------------------#
DEBUG=${DEBUG:-0} # Caso não exista a variável.
[ "$1" -le ${DEBUG} ] || return
local prefixo arquivar
case "$1" in
1) prefixo="{TEXTO}33[33m-- $*{TEXTO}33[m";;
2) prefixo="{TEXTO}33[32m---- $*{TEXTO}33[m";;
3) prefixo="{TEXTO}33[31m------ $*{TEXTO}33[m";;
4) prefixo="{TEXTO}33[34m------ $*{TEXTO}33[m";;
5) prefixo="{TEXTO}33[41;33;1m---------- $*{TEXTO}33[m";;
*) echo -e "Mensagem não categorizada: {TEXTO}33[41;33;1m$*{TEXTO}33[m"; return;;
esac
shift
if [ "$1" == "DEBUG-" ]; then
set -x # Liga Debug de tudo.
trap read DEBUG # Aguarda comando do usuário [ENTER] para prosseguir.
shift
fi
if [ "$1" == "DEBUG+" ]; then
set +x # Desliga Debug de tudo.
trap "" DEBUG # Desativa necessidade do [ENTER] para prosseguir.
shift
fi
echo -e "$prefixo"
# Recebe parâmetros com os erros.
# 1 - Nível do erro.
# 1 - Mensagens genéricas de localização ("Estou neste local")
# 2 - Mensagens para localizar fluxo ("Entrei no loop")
# 3 - Mensagens com conteúdo de variáveis importantes.
# 4 - Mensagens com conteúdo de variáveis secundárias.
# 5 - Mensagens de conteúdo CRÍTICO e possíveis erros fatais.
# 2 - A sua mensagem digitada na linha do script.
# Você pode digitar várias mensagens.
# Esteja ciente que a saída do Debug irá mostrar todos juntas.
}
#-----------------------------------------------------------------------------#
#FIM >>> function Debug() RETORNA: NADA.
#-----------------------------------------------------------------------------#
function FN_control_c()
{
DEBUG=9
set +x
clear
echo
echo "#################################################"
echo "## Encerrando o DAEMON $(basename "$0") !!!! "
echo "#################################################"
echo
# Preciso gerar o arquivo de trava só para os serviços rodando.
DEBUG=0 # Se quiser saber o que está sendo encerrado deixe com 9.
# Se quiser apagar arquivos, aqui deve receber a função ou comandos.
if [ -f ${FILE_STOP_LOOP_DISCADOR} ]; then
rm ${FILE_STOP_LOOP_DISCADOR}
fi
exit 0
}
#-----------------------------------------------------------------------------#
# FIM da Área reservada às funções do script.
#-----------------------------------------------------------------------------#
#-----------------------------------------------------------------------------#
# Quando quiser encerrar o programa, pressione CTRL+C
#-----------------------------------------------------------------------------#
trap FN_control_c $USER_INTERRUPT TERM INT HUP SIGINT SIGTERM
#-----------------------------------------------------------------------------#
# Não está funcionando. Funções estão quase 100% preparadas.
# Deveremos ter 2 processos em while.
# Abaixo apenas uns exemplos de uso.
# Preciso agora da lógica, sequência escrita.
# Qual a primeira coisa a ser feita ? Qual comando ?
# Está faltando alguma função que ainda não está lá em cima ?
##############################################################################
QT_PORTAS=$(TestaPortas) # Retorna as portas.
Minha_Conexao=$(TestaConexao) # Recebe retorno positivo ou negativo.
# Matar conexões, exemplos. Falta alguma ?
Kill3g "wvdial"
Kill3g "pppd"
Kill3g "avahi-daemon"
Kill3g "ppp0"
##############################################################################
Wish List:
==========
1- Renovar arquivo de log.
2- Medir tempo médio que costuma perder a conexão.
3- Cutucar a conexão para evitar que fique Down por inatividade.
4- Viva o Linux kkk
[quote]
REFORÇANDO:
===========
na linha 73 já tá "modem não respondendo" daí quando tenta a 3a vez que não consegue conexão executa o pppd /dev/ttyUSB2, daí fica nesse loop, encerrando pppd, tentando conexão, não consegue, inicia pppd de novo, não consegue, daí fica pra sempre, mas se eu finalizo o discador, executo pppd /dev/ttyUSB2, aguardo os mesmos segundos que o script, depois tento discar, funciona, ou seja, to fazendo a mesma coisa que o script, só que ele mata o pppd disca e não consegue, eu faço exatamente a mesma coisa que ele e consigo conexão, é aí que nun entra na minha cabeça, se eu consigo ele tmb tinha que conseguir.
Preciso saber todas as fases do discador. Conexão e desconexão. Quais scripts fazem esta tarefa e seus comandos.