[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