<br><br><div class="gmail_quote">2010/3/13 Otávio Fernandes <span dir="ltr"><<a href="mailto:otaviof@gmail.com">otaviof@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
2010/3/13 jefferson alexandre <<a href="mailto:jefferson.alexandre@gmail.com">jefferson.alexandre@gmail.com</a>>:<br>
<div><div></div><div class="h5">> Bom dia a todos.<br>
> Primeiramente, gostaria de parabenizar aos membros da lista pela educação e<br>
> respeito com os usuários, independente do nível de conhecimento. É legal<br>
> ver que ainda existem listas nacionais que vale a pena frequentar, e esta é<br>
> uma delas. :D<br>
> Recentemente, consegui introduzir o perl no meu ambiente de trabalho,<br>
> criando algumas ferramentas para manutenção e administração de servidores<br>
> Asterisk. (PABX IP Open Source.)<br>
> Eu tenho pouca ou quase nenhuma experiência com programação. No máximo,<br>
> alguns scripts shell que estão sendo devidamente portados/reescritos em<br>
> Perl.<br>
> Eu criei uma rotina para o Asterisk para que, quando um usuário disparar uma<br>
> ligação, meu script ira consultar o numero digitado pelo usuário com uma<br>
> base de dados mysql, e então, mediante resultado, ira passar o controle de<br>
> volta para o asterisk, para que ele complete ou não a ligação. Essa solução<br>
> será instalada em Callcenters de São Paulo para cumprir esta<br>
> lei: <a href="http://www.procon.sp.gov.br/noticia.asp?id=934" target="_blank">http://www.procon.sp.gov.br/noticia.asp?id=934</a><br>
><br>
> O meu problema é, que independente do numero passado pelo asterisk, meu<br>
> script sempre retorna 0 para a função &consulta_banco, e acaba bloqueando a<br>
> ligação.<br>
> Eu acredito que poderia resolver isso comparando o valor de $var em um if,<br>
> mas eu gostaria de entender como resolver isso apenas usando o retorno da<br>
> função, se este for o modo correto de fazer isso.<br>
> Abaixo, o código:<br>
> ++ Begin Code ++<br>
> #!/usr/bin/perl -w<br>
> use DBI();<br>
> use Asterisk::AGI;<br>
> $AGI = new Asterisk::AGI;<br>
> ($database, $host, $user, $pw) = qw( procon 127.0.0.1 usuario senha );<br>
> #Obter numero discado via AGI. Deve retornar algo como (01112345678) ;<br>
> $EXTEN = $AGI->get_variable('EXTEN') ;<br>
><br>
> if ( &consulta_banco($EXTEN) ) {<br>
> #Colocando o valor "1" na variavel FORBIDEN, que será tratada pelo asterisk,<br>
> e imprimindo na tela.<br>
> $AGI->set_variable("FORBIDEN", "1");<br>
> $AGI->verbose("Numero consta na lista do Procon-SP") ;<br>
> }<br>
> else {<br>
> $AGI->set_variable("FORBIDEN", "0") ;<br>
> $AGI->verbose("Executando ligacao para $EXTEN") ;<br>
> }<br>
> #Consultando banco de dados.<br>
> sub consulta_banco {<br>
> $dbh = DBI->connect("DBI:mysql:database=$database;host=$host", $user, $pw )<br>
> || die print $DBI::errstr;<br>
> $dbh->{RaiseError} = 1;<br>
> $sth = $dbh->prepare(" SELECT numero FROM numeros WHERE numero LIKE<br>
> \"%$_[0]%\" ");<br>
> $sth->execute() ;<br>
> }<br>
> ++ End Code ++<br>
> Obrigado,<br>
</div></div><div class="im">> _______________________________________________<br>
> SaoPaulo-pm mailing list<br>
> <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
> <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
</div>Jefferson,<br>
<br>
Em nome da lista eu lhe agradeço pelo elogio, é muito importante para<br>
nós termos este tipo de feedback. Muito obrigado!<br>
<br>
Pelo seu código, fica evidente que você te pouca experiência me<br>
desenvolvimento, mas este é um problema que nós podemos resolver aqui<br>
na lista, é apenas uma questão de tempo.<br>
<br>
Alguns pontos são bastante falhos no seu código, dentre eles:<br>
* "use scrict";<br>
* Uso do DBI diretamente;<br>
* Cuidados com a indentação;<br>
* Não ter testes automatizados (estou supondo isso);<br>
<br>
Segue um exemplo de como ele pode ser melhorado (acredito que ele já<br>
deve até funcionar corretamente agora):<br>
<br>
#!/usr/bin/env perl<br>
<br>
use strict;<br>
use warnings;<br>
<div class="im"><br>
use DBI();<br>
use Asterisk::AGI;<br>
<br>
</div># ---------------------------------------------------------------------------<br>
# Subroutines<br>
# ---------------------------------------------------------------------------<br>
<br>
sub consulta_banco {<br>
my ($number) = @_;<br>
<br>
my $dbh<br>
<div class="im"> = DBI->connect( "DBI:mysql:database=" . $database . ";host=" . $host,<br>
$user, $pw )<br>
</div> or die $!;<br>
$dbh->{RaiseError} = 1;<br>
<br>
my $sth;<br>
eval {<br>
<div class="im"> $sth<br>
= $dbh->prepare( "<br>
SELECT<br>
numero<br>
FROM<br>
numeros<br>
WHERE<br>
</div> numero LIKE \"%$number%\"<br>
" );<br>
<br>
};<br>
die $@ if $@;<br>
<br>
return 0 if ( !$sth );<br>
return 0 if ( !$sth->execute() );<br>
<br>
my $numeros = $sth->fetchrow_hashref;<br>
<br>
$sth->finish();<br>
<br>
return 1 if ( $numeros->{numero} );<br>
return 0;<br>
}<br>
<br>
# ---------------------------------------------------------------------------<br>
# -- Main --<br>
# ---------------------------------------------------------------------------<br>
<br>
my $agi = new Asterisk::AGI;<br>
<br>
my ( $database, $host, $user, $pw ) = qw( procon 127.0.0.1 usuario senha );<br>
<br>
# obter numero discado via AGI, deve retornar algo como (01112345678)<br>
my $exten = $agi->get_variable('EXTEN');<br>
<br>
if ( consulta_banco($exten) ) {<br>
# colocando o valor "4" na variavel FORBIDEN, que será tratada pelo<br>
<div class="im"> # asterisk, e imprimindo na tela.<br>
</div> $agi->set_variable( "FORBIDEN", "1" );<br>
$agi->verbose("Numero consta na lista do Procon-SP");<br>
} else {<br>
$agi->set_variable( "FORBIDEN", "0" );<br>
$agi->verbose("Executando ligacao para $exten");<br>
}<br>
<br>
__END__<br>
<br>
O único problema que impedira do seu script funcionar corretamente,<br>
independente da qualidade, é o uso incorreto da DBI, na função<br>
"consulta_banco" eu coloquei a forma correta de como lidar com ele.<br>
Apenas um exemplo.<br>
<br>
Para melhorar os pontos citados acima, recomendo fortemente as leituras:<br>
<br>
<a href="http://perldoc.perl.org/strict.html" target="_blank">http://perldoc.perl.org/strict.html</a><br>
<a href="http://perldoc.perl.org/warnings.html" target="_blank">http://perldoc.perl.org/warnings.html</a><br>
<a href="http://sao-paulo.pm.org/equinocio/2010/mar/11" target="_blank">http://sao-paulo.pm.org/equinocio/2010/mar/11</a><br>
<a href="http://sao-paulo.pm.org/equinocio/2010/mar/12" target="_blank">http://sao-paulo.pm.org/equinocio/2010/mar/12</a><br>
<a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">http://en.wikipedia.org/wiki/Test-driven_development</a><br>
<a href="http://www.agiledata.org/essays/tdd.html" target="_blank">http://www.agiledata.org/essays/tdd.html</a><br>
<a href="http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm" target="_blank">http://search.cpan.org/~mschwern/Test-Simple-0.94/lib/Test/More.pm</a><br>
<br>
Aproveitando o ensejo, segue dentre os links um artigo do Eden<br>
publicado no Equinócio de Março, o qual é muito completo e vai lhe<br>
ajudar muito.<br>
<br>
um abraço,<br>
<font color="#888888"><br>
--<br>
Otávio Fernandes <otaviof at <a href="http://gmail.com" target="_blank">gmail.com</a>><br>
<a href="http://blog.emresumo.com" target="_blank">http://blog.emresumo.com</a><br>
</font><div><div></div><div class="h5">_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br><div>Jorge, Otávio, obrigado pelas respostas. O programa agora está faz o que ele deve fazer :D </div><div><br></div><div>Otávio, realmente, eu não tenho experiência com desenvolvimento, apenas um ou outro script para resolver problemas na area de Sysadmin. O relacionamento com Perl surgiu depois de eu perder a paciencia com programa que estava sendo escrito em shell. :D</div>
<div><br></div><div>Vou ler os links com calma, e absorver este conhecimento, para poder aplicá-lo nos meus programas. </div><div><br></div><div>Obrigado, </div>