[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