[AsteriskBrasil] Discando pela WEB
Bernardo Vieira
bernardo.vieira em terra.com.br
Quarta Julho 12 11:51:12 BRT 2006
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Diogo,
> Na realidade eu estou usando o asterisk-1.0.9 e gostaria de implementar isso
> no site de minha empresa, na intranet para hep-desk, mas acho que no meu
> caso seria interessante o php, né? O que acha?
1) Considere um upgrade... já rolou muita água desde a versão 1.0.9
2) Tanto o script php quanto o perl partem do mesmo princípio, isto é,
uma conexão de telnet à interface de manager do seu *. Você pode,
inclusive fazer a ligação manualmente pelo manager se você quiser testar:
# telnet asterisk.meudominio.com 5038
> Asterisk Call Manager/1.0
> ACTION: LOGIN
> Username: manager
> Secret: senha
>
>
> Response: Success
> Message: Authentication accepted
>
>
> ACTION: ORIGINATE
> Exten: 214
> Context: from-internal
> Priority: 1
> Channel: SIP/401
É basicamente isso que os dois scripts fazem. A diferença básica entre
os dois é que o script em php (bem como o script perl original) desenham
um formulário para você preencher e enviar para iniciar a chamada.
O script que eu te mandei permite que você coloque o comando de discar
em um link, sem formulário, ou seja, você pode colocá-lo na sua página
existente colocando apenas um link normal na sua página.
> Não entendi muito bem o código pearl que você fez,
Realmente eu te mandei o código sem instruções de uso, foi mal. Lá vai:
A) Assumnindo que você tem um servidor rodando apache e perl, você vai
precisar:
1) Perl Net::Telnet
# perl -MCPAN -e 'install Net::Telnet'
2) Perl Net::Netmask
# perl -MCPAN -e 'install Net::Netmask'
B) Salve o arquivo getdial.pl no diretório cgi-bin do seu servidor e
mude suas permissões:
# cp getdial.pl /var/www/cgi-bin
# chown apache:apache /var/www/cgi-bin/getdial.pl
# chmod +x /var/www/cgi-bin/getdial.pl
C) Cadastre um usuario manager para o script no asterisk:
1) Edite o arquivo /etc/asterisk/manager.conf, e cadastre um manager,
neste exemplo eu usei a opção permit para permiter que este usuário só
possa conectar-se da minha rede interna:
# nano /etc/asterisk/manager.conf
[webdial]
secret = senha
deny=
permit=192.168.1.0/24
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
2) Reinicie o asterisk:
# asterisk -rx 'reload'
D) Edite o script para refletir suas opções:
1)
# nano /var/www/cgi-bin/getdial.pl
#
# Configuracoes:
#
$managerHost='127.0.0.1'; # endereco do servidor rodando o Asterisk
$managerPort=5038; # porta da interface de gerenciamento do Asterisk
$managerUser='webdial'; # nome do usuario manager do Asterisk
# TODO: proteger esta senha
$managerSecret='senha'; # senha do manager
$defaultContext='from-internal'; # contexto padrao para a ligacao, pode
ser especificado
# na query string, senao este valor e utilizado
$defaultCID='callerid'; # Caller Id padrao pode ser especificado na
query string
@allowedNetworks= ('192.168.1.0/24'); # lista de redes (clientes) que
podem usar este script
@allwedReferers=('http://192.168.1.1/teste/teste.html'); # lista de
paginas que podem usar este script
Por questões de seguraça, @allowedNetworks e @allowedReferers limitam
o acesso a este script da seguinte forma:
@allowedNetworks é usado para verificar o ip de quem está clicando no
URL, ou seja do cliente, se você sabe que todo mundo que vai utilizar
este link está na sua intranet, coloque a sua máscara de rede nesse
campo, se você quiser liberar todo mundo coloque 0.0.0.0 (não recomendo
por motivos óbvios).
@allowedRefereres é usado para verficar qual página originou a chamada,
evitando assim que por exemplo, eu coloque na minha página um link para
usar o seu asterisk para discar, coloque aqui a lista de páginas que
você vai usar para discar.
E) Crie um link para o script na página que você quer discar:
<a
href="servidor/cgi-bin/getdial.pl?type=SIP&account=401&callerid=Bernardo&context=from-internal&exten=214">SIP/401
para 214</a>
onde:
type= Tipo do ramal que vai originar a ligação (SIP/IAX/ZAP etc)
account= Ramal que vai originar a ligação (401, no exemplo é o meu ramal)
callerid = caller ID para a ligação
context = conexto da ligação (atenção, tem que ser um contexto válido do
asterisk, senão ele cai no contexto default e se não tiver nada neste
contexto o seu asterisk vai ter dor de barriga)
$exten = numero do destinatário (este número vai ser processado no
dialplan do contexto que você especificar)
Voila!
> tipo posso utilizar ele
> no asterisk-1.0.9? Precisarei de pearl instalado no server, né?
1) Não tenho nem idéia, provavelmente sim, você teria que verificar em
qual versão do asterisk apareceu o manager.
2) Sim, mas não necessariamente no servidor do asterisk, basta ter o
perl no servidor web (se forem servidores diferentes)
> Mas é que ainda não estou conseguindo visualizar o código funcionando...
> desculpe a ignorância, mas espero um dia poder colaborar com vocês no que
> puder.
>
> Muito obrigado e um abraço
>
Boa sorte!
>
>> From: Bernardo Vieira <bernardo.vieira em terra.com.br>
>> Reply-To: asteriskbrasil em listas.asteriskbrasil.org
>> To: asteriskbrasil em listas.asteriskbrasil.org
>> Subject: Re: [AsteriskBrasil] Discando pela WEB
>> Date: Mon, 10 Jul 2006 11:14:13 -0300
>>
> Diogo,
> Acho que o que está acontecendo é que o script de php está tentando
> inicializar a ligação no contexto 'default' e se eu não me engano o AAH
> não permite muita coisa nesse contexto. Tente alterar o contexto para
> 'from-internal'. Outra coisa que você pode fazer é, ao invés de
> acompanhar a ligação via CLI, conecte via telnet na porta do manager,
> ele é muito mais detalhado.
>
> Bom, de toda forma, depois que você mandou sua primeira pergunta, eu
> resolvi dar uma olhada no script perl que eu tinha te passado e gostei
> do negócio. Então resolvi brincar com o script e acabei fazendo as
> seguintes alterações:
> 1) O script original desenhava o form com os campos para fazer a ligação
> e passava os parâmetros por POST, ou seja, você não poderia colocar a
> linha de discagem em um link <a href> por exemplo. O script que eu fiz
> funciona com o método GET para que você usar uma url simples para discar.
>
> 2) O script original produzia html, ou seja, para alterar sua aparência
> você teria que modificar o script. A minha versão não produz html
> nenhum, você simplesmente coloca a url em um link e o script te
> redireciona de volta para a mesma página com o status da chamada, ou
> seja, você põe a cara que você quiser na página.
>
> Bom, é isso aí, o script ainda está meio toscão, mas dá para usar, se
> você, ou qualquer um quiser me ajudar no desenvolvimento dele, eu
> ficaria feliz.
>
>
> Diogo Cosito wrote:
>>>> Bernando, boa noite.
>>>> Eu baixei o código php, para discagem pela web, mas não entendi muito
> bem o
>>>> que devo fazer, tipo instalei o código dentro de um servidor web,
> externo ao
>>>> asterisk e liberei no manager.conf para acesso externo, mas não inicia a
>>>> discagem..
>>>> Fiz desta maneira:
>>>> specify the channel (extension) you want to receive the call requests
> with
>>>> #e.g. SIP/XXX, IAX2/XXXX, ZAP/XXXX, etc
>>>> $strChannel = "sip/1000";
>>>>
>>>> #specify the context to make the outgoing call from. By default, AAH
> uses
>>>> from-internal
>>>> #Using from-internal will make you outgoing dialing rules apply
>>>> $strContext = "default";
>>>>
>>>> #specify the amount of time you want to try calling the specified
> channel
>>>> before hangin up
>>>> $strWaitTime = "30";
>>>>
>>>> #specify the priority you wish to place on making this call
>>>> $strPriority = "1";
>>>>
>>>> #specify the maximum amount of retries
>>>> $strMaxRetry = "2"
>>>>
>>>> Mas na CLI do asterisk, não reporta nada.
>>>> Poderia me ajudar?
>>>>
>>>> Muito obrigado
>>>>
>>>> Att
>>>>
>>>> Diogo
>>>>> From: Bernardo Vieira <bernardo.vieira em terra.com.br>
>>>>> Reply-To: asteriskbrasil em listas.asteriskbrasil.org
>>>>> To: wellingtoncs em gmail.com, asteriskbrasil em listas.asteriskbrasil.org
>>>>> Subject: Re: [AsteriskBrasil] Discando pela WEB
>>>>> Date: Fri, 07 Jul 2006 19:18:57 -0300
>>>>>
>>>> Solução em php (você vai ter que mexer no código para alocar
>>>> dinamicamente os dois lados da ligação):
>>>>
> http://www.voipjots.com/2006/02/click-to-call-with-your-asteriskhome.html
>>>> Solução em perl (não mexi com esse aí porque eu prefiro php que perl,
>>>> sim eu sou preguiçoso :P):
>>>> http://www.azxws.com/asterisk/
>>>>
>>>> Wellington Sampaio wrote:
>>>>>>> Olá Pessoa,
>>>>>>>
>>>>>>> Gostaria de saber se você sabem, já configuraram uma
> regra
>>>>>>> como esta:
>>>>>>>
>>>>>>> Eu acesso uma página, digamos que www.asterisk.com.br
>>>>>>> <http://www.asterisk.com.br/>, lá eu entro com o número destinatário
> e
>>>>>>> número destino. O sistema faz uma ligação para o número destinatário
> e
>>>>>>> em seguida liga para o destino. Ele gera uma chamada para os dois
>>>>>>> números, assim colocando eles ativos.
>>>>>>>
>>>>>>> Se alguém tiver alguma idéia de como faço isso, por
> favor,
>>>>>>> me ajudem.
>>>>>>>
>>>>>>> Att
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Wellington Sampaio
>>>>>>>
>>>>>>> wellingtoncs em gmail.com
>>>>>>>
>>>>>>>
>>>>>>>
> ------------------------------------------------------------------------
>>>>>>> _______________________________________________
>>>>>>> LIsta de discussões AsteriskBrasil.org
>>>>>>> AsteriskBrasil em listas.asteriskbrasil.org
>>>>>>> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Acesse o wiki AsteriskBrasil.org:
>>>>>>> http://www.asteriskbrasil.org
> _______________________________________________
> LIsta de discussões AsteriskBrasil.org
> AsteriskBrasil em listas.asteriskbrasil.org
> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
> _______________________________________________
> Acesse o wiki AsteriskBrasil.org:
> http://www.asteriskbrasil.org
>
>>>> _________________________________________________________________
>>>> DOWNLOAD: Emoticons animados 'Copa 2006' para usar no MSN
>>>> http://copa.br.msn.com/extra/emoticons/
>>>> _______________________________________________
>>>> LIsta de discussões AsteriskBrasil.org
>>>> AsteriskBrasil em listas.asteriskbrasil.org
>>>> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>>> _______________________________________________
>>>> Acesse o wiki AsteriskBrasil.org:
>>>> http://www.asteriskbrasil.org
>
#!/usr/bin/perl -w
# getdial.pl
# Copyright (C) 2006 Bernardo Vieira bernardo.vieira em terra.com.br
#
# Script para iniciar uma chamda no Asterisk através de uma
# URL. Recebe parâmetros atraves do metodo get, permitindo
# que seja utilizado em uma tag <a href...>Discar</a>.
#
# Baseado no script TACI - Trivial Asterisk Call Interface v.02
# de Tony Wasson wasson em azxws.com
#
# Certifique-se que ha um handler para extensões inválidas no
# contexto [default] do extensions.conf:
# exten => s,1,Playback(invalid)
use Net::Telnet ();
use Net::Netmask();
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
>>
#
# Configuracoes:
#
>>
$managerHost='127.0.0.1'; # endereco do servidor rodando o Asterisk
$managerPort=5038; # porta da interface de gerenciamento do Asterisk
>>
$managerUser='ususario'; # nome do usuario manager do Asterisk
>>
# TODO: proteger esta senha
$managerSecret='senha'; # senha do manager
>>
$defaultContext='from-internal'; # contexto padrao para a ligacao, pode
ser especificado
# na query string, senao este valor e utilizado
>>
$defaultCID='callerid'; # Caller Id padrao pode ser especificado na query
string
>>
@allowedNetworks= ('192.168.1.0/24'); # lista de redes (clientes) que podem
usar este script
>>
@allwedReferers=('http://192.168.1.1/teste/teste.html'); # lista de paginas
que podem usar este script
>>
>>
#
# Prototipos
#
sub isInNetwork;
sub testIp;
sub testReferer;
>>
# verifica se o cliente esta na lista de clientes autorizados
&testReferer($ENV{HTTP_REFERER}, em allwedReferers) or die "Pagina nao
autorizada a user este script: ", $ENV{HTTP_REFERER};
&testIp($ENV{REMOTE_ADDR}, em allowedNetworks) or die "Cliente nao autorizado
a usar este script: ", $ENV{REMOTE_ADDR};
>>
#
# Parametros
#
my $phonetype = param('type') || "" ;
my $account = param('account') || "";
my $callerid = param('callerid') || $defaultCID;
my $context = param('context') || $defaultContext;
my $exten = param('exten') || "";
my $callid = param('callid') || 0;
>>
>>
# Limpar parametros
if ($exten) {$exten =~ s/([^A-Z0-9a-z\/@\.])//g;}
else {$exten="";}
>>
if ($context) {$context =~ s/([^A-Z0-9a-z\-])//g;}
else {$context="";}
>>
if ($account) {$account =~ s/([^A-Z0-9a-z])//g;}
else {$account="";}
>>
# Testa se a extensao e valida (mais de dois digitos)
# TODO: melhorar o teste
>>
if (not $exten =~ /[0-9][0-9]/) { die "Destino invalido, deve conter pelo
menos 2 numeros!"; };
>>
#print header;
>>
# Abre a conexao ao asterisk...
$tn = new Net::Telnet ( Port => $managerPort,
Prompt => '/.*[\$%#>] $/',
Output_record_separator => '',
Errmode => 'return'
);
>>
$tn->open("$managerHost");
$tn->waitfor('/0\n$/');
$tn->print("ACTION: LOGIN\nUSERNAME: $managerUser\nSECRET:
$managerSecret\n\n");
$tn->waitfor('/Authentication accept*/')
or die "Nao foi possivel conectar ao asterisk: ", $tn->lastline;
>>
# Abre a chamada
$tn->print("ACTION: ORIGINATE\nExten: $exten\nContext: $context\nChannel:
$phonetype/$account\nPriority: 1\nCallerid: $callerid\n\n");
$tn->waitfor('/Event: Newchannel.*/') or die "Nao foi possivel deteminar o
status da chamada: ", $tn>lastline;
$tn->print("Action: LOGOFF\n\n");
>>
# Chamada aceita
# TODO: monitorar melhor a ligacao, mesmo que o numero for invalido o
programa chega aqui.
print "Location: $ENV{HTTP_REFERER}?callid=$callid&status=0\n\n";
exit 0;
>>
>>
>>
sub isInNetwork {
my ($cidr,$ipaddress) = @_;
local $network = new Net::Netmask($cidr);
return $network->match($ipaddress);
}
>>
sub testIp {
my($ip, em allowedNetworks) = @_;
my($matchFound) = 0;
foreach my $network (@allowedNetworks) {
$matchFound = isInNetwork($network,$ip);
if ($matchFound) {
last;
}
}
return $matchFound;
}
>>
sub testReferer{
my($referer, em allowedReferers) = @_;
return scalar(grep(/$referrer/, em allowedReferers));
}
>>
>>
>>
teste
>>
_______________________________________________
LIsta de discussões AsteriskBrasil.org
AsteriskBrasil em listas.asteriskbrasil.org
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>
_______________________________________________
Acesse o wiki AsteriskBrasil.org:
http://www.asteriskbrasil.org
> _________________________________________________________________
> Descubra aqui como mandar Torpedos Messenger!
> http://www.msn.com.br/artigos/maguire/default.asp
> http://www.msn.com.br/artigos/maguire/default.asp
> _______________________________________________
> LIsta de discussões AsteriskBrasil.org
> AsteriskBrasil em listas.asteriskbrasil.org
> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
> _______________________________________________
> Acesse o wiki AsteriskBrasil.org:
> http://www.asteriskbrasil.org
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFEtQxg2QVs8jsa1mQRAgxdAJ4zIu52uMDy4nqruOoZ9HAD8ZukUgCcCqa/
6MtSOnbIffhfYSfhU2gEpII=
=3ted
-----END PGP SIGNATURE-----
Mais detalhes sobre a lista de discussão AsteriskBrasil