Criando AGI no Asterisk com PHP-AGI

    Tue, Sep 20 2016
      

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.

Criando o script AGI 

  • Baixe o PHPAgi e descompacte-o dentro da pasta /var/lib/asterisk/agi-bin
  • Crie o arquivo bloqueio.php dentro da pasta /var/lib/asterisk/agi-bin 
$ touch /var/lib/asterisk/agi-bin/bloqueio.php
  • Agora insira o seguinte conteúdo:
#!/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.

Acessando o AGI no extensions.conf e tratando o retorno

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.

 


Profile

Fabricio S Costa

Analista de Sistemas formado pelo Centro de Ensino Superior de Juiz de Fora (CESJF), com especializações em Business Intelligence (BI) e Telecom é desenvolvedor em diversas linguagens e entusiasta de software livre.