[AsteriskBrasil] Identificar IP no plano de discagem e senha

Junior Polegato - Asterisk asterisk em juniorpolegato.com.br
Terça Setembro 28 15:30:54 BRT 2010


Em 27-09-2010 17:51, Rodrigo Vian escreveu:
> Outra sugestão... rs
> [ramal-externo]
> exten => _12XX,1,Goto(contextogeral,${EXTEN},1) ; para seus ramais 
> internos
> exten => _0800X.,1,Goto(contextogeral,${EXTEN},1) ; para 0800 já que é 
> gratuito
> exten => _ZXXXXXXXX,1,NoOp(Ramal Externo ${CALLERID(num)} solicitando 
> ligação local)
> exten => _ZXXXXXXXX,n,Set(REDELOCAL="192.168")
> exten => _ZXXXXXXXX,n,Agi(check_ip_sip,${CALLERID(num)}) ; AQUI 
> PRECISARIA DESENVOLVER O AGI. O RETORNO DO AGI SERIA A VARIÃVEL ${REDESIP}
> exten => _ZXXXXXXXX,n,GotoIf($["${REDELOCAL}"="${REDESIP}"]?local)
> exten => _ZXXXXXXXX,n,Authenticate(/pin-sip.txt)
> exten => _ZXXXXXXXX,n(local),Goto(contextogeral,${EXTEN},1)
>
> Dica pro AGI
> REDESIP poderia ser filtrada por:
> PRI_OCT = rasterisk -rx "sip show peer 5001" | grep "Addr->IP" | cut 
> -d : -f 2 | cut -d\  -f 2 | cut -d \. -f 1 ; primeiro octeto
> SEC_OCT= rasterisk -rx "sip show peer 5001" | grep "Addr->IP" | cut -d 
> : -f 2 | cut -d\  -f 2 | cut -d \. -f 2 ; segundo octeto
> REDESIP= $PRI_OCT . $SEC_OCT
> OBS: O campo "*Addr->IP*" mostra o ip que está conectado ao ramal.

Olá,

         Isso é o que eu tinha pensado, mas de uma forma até mais 
simples com System(), onde minha rede local é 10.10.10.xxx e ramais 
menores que 10 a 99, menores que 100:

[autenticar]
exten => _X.,1,GotoIf($[${EXTEN} < 100]?ramais,${EXTEN},1)
exten => _X.,n,System(rasterisk -x "sip show peer ${CALLERID(num)}"|grep 
"^  Addr->IP     : 10\.10\.10\." 1>/dev/null 2>&1)
exten => _X.,n,GotoIf($[${SYSTEMSTATUS} = SUCCESS]?saida,${EXTEN},1)
exten => _X.,n,Answer
exten => _X.,n,Wait(1)
exten => _X.,n,Authenticate(<senha>)
exten => _X.,n,Goto(saida,${EXTEN},1)

         O problema aqui é que existe uma certa demora para se ter a 
resposta e um degrauzinho no processamento.

         Resolvi hackear o código do sip.c e descobri que o IP do socket 
fica armazenado na variável addr dentro da estrutura do peer e tem uma 
função chamada SIPPEER (  ${SIPPEER(ramal:ip)}  e  ramal  = 
${CALLERID(num)} ) que salta ao olhos o conteúdo de cada variável tal 
como mostrado pelo "sip show peer", encontrado na linha 11.860 do 
1.4.21.2 do Debian Lenny.

          Assim minha solução final:

[autenticar]
exten => _X.,1,GotoIf($[${EXTEN} < 100]?ramais,${EXTEN},1)
exten => _X.,n,Set(REDE="10.10.10.")
exten => _X.,n,Set(IP=${SIPPEER(${CALLERID(num)}:ip)})
exten => _X.,n,Set(IP_REDE=${IP:0:${LEN(${REDE})}})
exten => _X.,n,GotoIf($["${IP_REDE}" = "${REDE}"]?saida,${EXTEN},1)
exten => _X.,n,Answer
exten => _X.,n,Wait(1)
exten => _X.,n,Authenticate(<senha>)
exten => _X.,n,Goto(saida,${EXTEN},1)

         Encontrei a documentação do SIPPEER no VoIP-Info: 
http://www.voip-info.org/wiki/index.php?page=Asterisk+func+sippeer


[]'s
             Junior Polegato


-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20100928/b54a1800/attachment-0001.htm 


Mais detalhes sobre a lista de discussão AsteriskBrasil