[AsteriskBrasil] RES: QUEUE - Enviar dados

Leonardo Gomes Figueira sabbathbh.lists em gmail.com
Terça Março 10 09:30:28 BRT 2009


Rodrigo Vian escreveu:
> Oi Ciro, tudo bem?
> 
> Não to falando que não é confiável o queue_log.
> Já pedi ajuda para um pessoal que programa em bash script e teoricamente
> o script está correto... ele funciona por alguns instantes, mas ele se
> perde depois de um tempo em funcionamento...
> 
> Em anexo está meu programa. IMPORTANTE: Tem que rodar como daemon.
> comando para execução do script: ./asterqueue &
> 
> ------------------------------------------------------------------------
> 
> #!/bin/sh
> 
> #Source Library functions
> . /etc/rc.d/init.d/functions
> 
> #Checa se o processo ja esta em execucao
> if [ -f /var/run/asterqueue.pid ]; then 
> 	OLDPID=`head -n 1 /var/run/asterqueue.pid` 
> 	if [ -f /proc/${OLDPID}/cmdline ] && ps -p ${OLDPID} >/dev/null 2>&1; then
> 		echo "Asterqueue ja esta sendo executado..."
> 		exit 1
> 	else 
> 		rm -f /var/run/asterqueue.pid 
> 	fi
> fi 
> 
> #Pega o PID do Processo
> echo "$$" > /var/run/asterqueue.pid
> 
> #Define Local de LOG
> LOGDIR="/var/log/asterisk"
> #Define Local do Arquivo de Log da Fila do Asterisk
> QUEUE_LOG="/var/log/asterisk/queue_log"
> #Define Filas a serem monitoradas
> QUEUEMON="9667"
> 
> CHECK_LAST_LINE=""
> NCALL=0
> 
> [ -f $LOGDIR/asterqueue.log ] || touch $LOGDIR/asterkria.log
> #DEBUG DAS VARIAVEIS - FASE DE TESTE
> [ -f $LOGDIR/debugasterqueue.log ] || touch $LOGDIR/debugasterkria.log
> 
> while [ true ]
> do
> CHECK_QLOG=`tail -n 1 $QUEUE_LOG`
> CHECK_EVENT=`tail -n 1 $QUEUE_LOG | cut -d \| -f 5`
> CHECK_UNIQUEID=`tail -n 1 $QUEUE_LOG | cut -d \| -f 2`
> CHECK_QCID=`tail -n 1 $QUEUE_LOG | cut -d \| -f 7`
> CHECK_TIME=`tail -n 1 $QUEUE_LOG | cut -d \| -f 1`
> 
> if [ "$CHECK_TIME" != "$CHECK_LAST_LINE" ] 
> then
> 	DATE=`date +%Y%m%d-%H%M%S`
> 	echo $DATE-$CHECK_QLOG >> $LOGDIR/asterqueue.log
> 	CHECK_LAST_LINE="$CHECK_TIME"
> 	if [ "$CHECK_EVENT" = "ENTERQUEUE" ]
> 	   then
> 		QUEUES[$NCALL]="$CHECK_UNIQUEID-$CHECK_QCID"
> 		#DEBUG
> 		echo ENTERQUEUE - Variavel QUEUES ${QUEUES[$NCALL]} >> $LOGDIR/debugasterqueue.log
> 		tQL=$[${#QUEUES[*]} - 1]
> 		#DEBUG
>                 echo ENTERQUEUE - Variavel tQL $tQL >> $LOGDIR/debugasterqueue.log
> 		if [ $NCALL = $tQL ]
> 		then
> 		   ((NCALL++))
> 		   #DEBUG
>                    echo ENTERQUEUE   Variavel NCALL++ $NCALL >> $LOGDIR/debugasterqueue.log
> 		else
> 		   NCALL=${#QUEUES[*]}
> 		   #DEBUG
>                    echo ENTERQUEUE - Variavel NCALLQUEUES $NCALL >> $LOGDIR/debugasterqueue.log
> 		fi
> 	fi
> 
> 	if [ "$CHECK_EVENT" = "CONNECT" ]
> 	   then
> 		tQL=${#QUEUES[*]}
> 		#DEBUG
> 		echo CONNECT - Variavel tQL $tQL >> $LOGDIR/debugasterqueue.log
> 		for (( i=0; i<${tQL}; i++ ));
> 		  do
> 			CHECK_QUEUES=`echo ${QUEUES[$i]} | cut -d - -f 1`
> 			#DEBUG
> 			echo CONNECT - Variavel CHECK_QUEUES $CHECK_QUEUES >> $LOGDIR/debugasterqueue.log
> 
> 			if [ "$CHECK_QUEUES" = "$CHECK_UNIQUEID" ]
> 			   then
> 				SRC=`echo ${QUEUES[$i]} | cut -d - -f 2`
> 				#DEBUG
> 				echo CONNECT - Variavel SRC $SRC >> $LOGDIR/debugasterqueue.log
> 				GET_CHANNEL=`rasterisk -rx "core show channels concise" | grep $QUEUE | grep "Bridged Call" | grep $SRC | cut -d ! -f 1`
> 				#DEBUG
> 				echo CONNECT - Variavel GET_CHANNEL $GET_CHANNEL >> $LOGDIR/debugasterqueue.log
> 				echo CONNECT - Variavel CHECKQCID $CHECK_QCID >> $LOGDIR/debugasterqueue.log
> 				DST=`rasterisk -rx "core show channel $GET_CHANNEL" | grep dst | cut -d = -f 2`
> 				echo CONNECT $QUEUE:$SRC-$DST >> $LOGDIR/debugasterqueue.log
> 				NCALL=$i
> 				#DEBUG
> 				echo CONNECT - Variavel NCALL $NCALL  >> $LOGDIR/debugasterqueue.log
> 				break
> 			fi	
> 		  done
> 	fi
> fi
> sleep 1
> done
> 

Shell script é muito bom para determinadas coisas mas para as mais
complicadas...

Pelo que entendi em uma rápida leitura do script a cada 1 segundo seu
script lê a última linha do queue_log. E se o Asterisk gravar mais de 1
evento no intervalo entre as leituras ? Parece que seu script irá perder
eventos.
Além disso, para que executar um asterisk -r -x para obter o canal da
Bridge sendo que o evento CONNECT já informa o canal que atendeu ?

Repito a minha sugestão inicial: um aplicativo/script que leia o arquivo
 recebendo cada linha/evento IGUAL o "tail -f ". Tenho isto funcionando
em Perl gravando em Banco de dados (não posso divulgar pois não é de
minha propriedade).

  Leonardo


Mais detalhes sobre a lista de discussão AsteriskBrasil