Em diversos momentos em que estamos configurando um servidor Asterisk, necessitamos validar dados rapidamente para permitir ao usuário alguma funcionalidade importante.
O AGI é uma excelente opção que simplifica o dialplan (arquivo extensions.conf), e facilita muito o entendimento e manutenção das regras de discagem.
Neste tutorial vamos criar um AGI simples para bloquear ramais no Asterisk, não permitindo que realizem discagens.
Será um exemplo utilizando o framework php-agi que pode ser baixado em phpagi.sourceforge.net ou através do sourceforge.
$ touch /var/lib/asterisk/agi-bin/bloqueio.php
#!/usr/bin/php
<?php
require_once('phpagi/phpagi.php');
$agi=new AGI();
$ramal=$argv[1];
/**
* Aqui vamos colocar o array contendo os ramais que DEVEM SER
* BLOQUEADOS
*/
$invalidos = array(
'2121',
'6000',
'3030',
);
/**
* "PERMITIR" pode ser acessada no extensions.conf através da variável
* ${PERMITIR} e ela conterá o valor yes ou no
*/
$permitir = in_array($ramal, $invalidos) ? 'no' : 'yes';
$agi->set_variable("PERMITIR", $permitir);
exit();
?>
No exemplo acima estamos definindo um array de ramais inválidos, insira na lista os ramais que deverão ser bloqueados no momento da discagem, não se esqueça das aspas simples e da vírgula como no modelo 'RAMAL', .
Logo após a alimentação do array estamos realizando uma validação para saber se o ramal está ou não presente nele, a resposta da validação é inserida na variável ${PERMITIR} que pode ser acessada dentro do extensions.conf.
Abra o arquivo /etc/asterisk/extensions.conf e insira a chamada de bloqueio no contexto e regra que deseja tratar. No exemplo abaixo os ramais contidos no array do bloqueio.php não podem realizar nenhum tipo de discagem dentro do contexto [from-internal].
[from-internal]
exten => _X.,1,Answer()
exten => _X.,n,AGI(bloqueio.php,${CALLERID(num)})
exten => _X.,n,Gosubif($["${PERMITIR}"="yes"]?permite:bloqueia)
exten => _X.,n(bloqueia),NoOp(Ramal bloqueado)
exten => _X.,n,Hangup()
exten => _X.,n(permite),NoOp(Ramal liberado)
exten => _X.,n,Dial(khomp/b0/${EXTEN})
exten => _X.,n,Hangup()
Ajuste o AGI para o seu ambiente e crie novos modelos para as suas particularidades.