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


_______________________________________________
KHOMP: qualidade em placas de E1, GSM, FXS e FXO para Asterisk. 
- Hardware com alta disponibilidade de recursos e qualidade KHOMP
- Suporte técnico local qualificado e gratuito 
Conheça a linha completa de produtos KHOMP em www.khomp.com.br
_______________________________________________
Temos tudo para seu projeto VoIP com Asterisk!
Descontos especiais para assinantes da AsteriskBrasil.org.
Registre-se e receba um cupom exclusivo de desconto!
Acesse agora www.voipmania.com.br
______________________________________________
Lista de discussões AsteriskBrasil.org
[email protected]
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
______________________________________________
Para remover seu email desta lista, basta enviar um email em branco para 
[email protected]

Responder a