[SP-pm] Automatizando consulta IBM com Perl ou Expect
Alceu Rodrigues de Freitas Junior
glasswalk3r at yahoo.com.br
Sun Apr 14 05:17:40 PDT 2013
Eu assisti uma palestra da IBM em a uns 3 ou 4 anos atrás sobre
utilização de Rexx para navegar em transações de aplicações em mainframe
e mapear os resultados para web services escritos em Java.
Talvez seja interessante dar uma olhada no Rexx para este fim, mas eu
não tenho nenhuma referência para dar.
[]'s
Em 13-04-2013 19:36, Marcio - Google escreveu:
> Frederico, isso é uma missão para o Mestre Eden ... :-)
> Abs,
> Marcio.
>
>
> Em 10 de abril de 2013 11:40, Frederico Melo <fdmmelo at gmail.com
> <mailto:fdmmelo at gmail.com>> escreveu:
>
>
> Fala Márcio!
> Consegui avançar com a ajuda de vocês! Mas ainda preciso de algumas
> dicas. Realmente não tenho os conhecimentos necessários no perl e no
> expect para avançar ainda mais. Fiquei preso em uma situação onde
> preciso capturar mais de um dado na tela que a função ascii do s3270
> retorna pelo expect. Li e reli suas dicas e as do Eden mas, não
> consigo ir além... Acredito que o problema aqui é no meu
> entendimento das funções, das subs e nas rotinas dentro do expect.
>
> O ascii retorna a seguinte string:
>
> data:
> data: APLNC000 *** SUBSISTEMA APL
> *** MMM2D000
> data: 09/04/2013 CONSULTA DE
> LOCALIDADES 15:46:09
> data:
> data: SIGLA.........: XYZ *NUMERO DO COD.: 0DD*
> data:
> data: *LOCALIDADE....: XISYPSZE*
> data:
> data: MUNICIPIO.....: XISYPS
> data:
> data:
> data:
> data: CONCES: CONCESSOR
> data:
> data: CODIGO DA TOT.: DD
> data:
> data:
> data:
> data:
> data:
> data: ESTA LOCALIDADE E' ABERTA
> data:
> data:
> data:
>
> Na tela acima, gostaria de pegar os dados LOCALIDADE e guardar em
> $loc e NUMERO DO COD, guardar em $cod
> Meu código, está da seguinte maneira:
>
> <code>
>
> $exp->send($cmd1);
> $exp->expect(5, [
>
> qr/data:\s+*LOCALIDADE*(.+)/ => sub {
> my $self = shift;
> my($rr1) = $self->match;
> my $rp="";
> $loc=$rr1;
> $loc = substr($rr1,6,55);
> $loc =~ s/\s//g;
> print "\n\n$loc\n\n";
>
> exp_continue; # manda continuar
> },
> qr/data:\s+(.+)*NUMERO*\s+(.+)/ => sub {
> my $self = shift;
> my($cod) = $self->match;
> print "\ncod=xxx$codxxx\n";
>
> exp_continue;
> },
>
> # quantas expressões você quiser/precisar
>
> timeout => sub { die 'o sistema parou de
> responder' }
> ]
> );
>
> <code>
>
> O primeiro print funciona ok e tenho o retorno correto de $loc mas,
> o segundo print para $cod não funciona e não traz nada. Posso fazer
> as subs acima? A variável $self é especial do perl? O shift que usei
> na primeira regex vai afetar a segunda chamada para regex? Realmente
> me falta conhecimento para entender. Por favor, me ajude. Obrigado
> novamente pela sua atenção.
>
> Abcs,
> Frederico
>
>
> 2013/3/25 Marcio - Google <marciorp at gmail.com
> <mailto:marciorp at gmail.com>>
>
> Fala Frederico,
>
> Vamos lá. Na própria thread o Eden da ótimos exemplos, vou
> reproduzi-los aqui e tentar explicar.
>
> O primeiro que usei foi esse aqui:
>
> <code>
> $exp->send(cmd1$); ##To enviando o comando
>
> $exp->expect(100, [qr/.{1920}/ => sub {
> my($self) = @_;
> print $self->match;
> }
> ]
> );
> <code>
>
> Como você mesmo disse, a tela tem 80x24, ou sejam 1920
> caracteres, o que inclui espaços.
> $exp->expect( ##Lê o retorno
> O primeiro parâmetro é o timeout
> O segundo é uma regex, que nesse caso espera 1920 caracteres. Se
> receber isso, vai executar a sub e a sua "tela" vai estar na
> variável $self. Ai você tem que garimpar os dados nessa
> "stringona", tipo, copiar pedaços dela que contenham os dados
> que você quer.
>
>
> Bom, depois passei para outro mais refinado:
>
> <code>
> $exp->send($cmd1);
> $exp->expect(100, [
> qr/resposta cmd1: (.+)/ => sub {
> my $self
> = shift;
>
> #
> $resposta vai ter o que casou com (.+) - Aqui você coloca algo
> que você esteja esperando
> #
> Digamos que a informação que você querer seja precedida de
> <Nome:>, então é isso que você está esperando
>
> my($resposta) = $self->match_list;
>
> # Aqui
> você guarda a informação no banco de dados ou qualquer outro
> processamento
>
> # enviar
> segundo comando, para pegar outra informação, p.e.
>
> $self->send($cmd2);
>
>
> exp_continue; # manda continuar
> },
> qr/resposta cmd2: (.+)/ => sub {
> my $self
> = shift;
>
> my($resposta) = $self->match_list;
>
> # etc...
>
>
> exp_continue;
> },
>
> # quantas expressões você quiser/precisar
>
> timeout => sub { die 'o sistema parou de
> responder' }
> ]
> );
> <code>
>
> Nesse caso ai você vai esperar por expressões especificas, e
> cada vez que elas coincidirem o código da sub será processado.
> Eu pelo menos acabei achando mais fácil assim do que pegar uma
> "stringona" e ficar procurando dados dentro dela.
>
> Pra cada vez que você enviar ($exp->send()) você precisa
> processar o retorno ($exp->expect()).
> O retorno é sempre uma string ou timeout. Você só tem que
> escolher como quer processar essa string.
>
> Se tiver mais dúvidas vai postando que vamos tentando ajudar.
>
> [...]´s
>
> Marcio
>
> Em 25 de março de 2013 16:13, Frederico Melo <fdmmelo at gmail.com
> <mailto:fdmmelo at gmail.com>> escreveu:
>
> Oi Márcio, tudo bem?
>
> Voltei! Então... após várias tentativas, debugs e
> verificação de logs, consegui navegar pelo servidor IBM
> através do Perl com Expect. Muito legal mesmo! Obrigado
> pelas dicas iniciais! Agora, cheguei na fase de capturar
> algumas informações e gravá-las em banco de dados.
>
> Vejo nos arquivos de logs o resultado da função ascii do
> s3270. Como faço para pegar alguns dados (não é o print da
> tela 0,0,24,80 completo) e armazeno em banco? Pelo Perl e
> Expect isso é possível de ser feito no mesmo tempo que
> navega-se pelas telas do MainFrame IBM?
>
> Hoje meu código é algo assim:
>
>
> #!/usr/bin/perl
>
> my @s3270 = s3270;
>
> use strict;
> use warnings;
> use Expect;
>
>
> my $exp = Expect->spawn('s3270');
>
> $exp->log_file('teste.log');
>
> my $cmd1 = "connect(12.234.123.3:23
> <http://12.234.123.3:23>)\n";
> $cmd1 .= "wait(InputField)\n";
> $cmd1 .= "String(username)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "wait(InputField)\n";
> $cmd1 .= "String(password)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "wait(InputField)\n";
> $cmd1 .= "String(APL)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "wait(InputField)\n";
> $cmd1 .= "String(CODAPL)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "pf(3)\n"; #TELA INCIAL APL -> VAI PARA CONSULTAS
> $cmd1 .= "wait(InputField)\n";
> $cmd1 .= "String(14)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "wait(InputField)\n";
> $cmd1 .= "String(01)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "String(ordemserv12tt)\n";
> $cmd1 .= "Enter()\n";
> $cmd1 .= "Ascii(0,0,24,80)\n";
>
> Neste ponto, tenho a tela impressa em memória e no log. Como
> faço, nessa etapa, para capturar alguns dados e armazená-los
> em banco? Não tenho dificuldades em utilizar DBD ou DBI no
> perl, minha dificuldade é interagir o perl com os retornos
> do s3270 e expect. Seria possível me auxiliar? Já agradeço
> pelo precioso apoio1
>
> Obrigado novamente!
> Frederico
>
>
> 2013/3/21 Marcio - Google <marciorp at gmail.com
> <mailto:marciorp at gmail.com>>
>
> Tiago, nesse caso não. A função "string" é do s3270, e
> ele entende tudo de forma literal. Também tropecei nisso.
>
> Frederico, isso. Se não me engano, para "entrar" o
> comando é ENTER.
> Se não funcionar posta novamente que vou ver com fiz.
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> <mailto:SaoPaulo-pm at pm.org>
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> <mailto:SaoPaulo-pm at pm.org>
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> <mailto:SaoPaulo-pm at pm.org>
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> <mailto:SaoPaulo-pm at pm.org>
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
>
>
> --
>
> [...]'s
>
> Marcio
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
More information about the SaoPaulo-pm
mailing list