[SP-pm] Automatizando consulta IBM com Perl ou Expect

Thiago Glauco thiagoglauco at ticursos.net
Wed Mar 27 06:31:53 PDT 2013


Muito bom. Mais uma ferramenta no meu canivete suíço!!!

Em Ter, 2013-03-26 às 13:20 -0300, Frederico Melo escreveu:
> Márcio! Muito obrigado pelas dicas! Mais uma vez sua ajuda está sendo
> muito importante! Vou realizar testes antes de incomodar novamente.
> Obrigado mesmo.
> 
> Frederico
> 
> 2013/3/25 Marcio - Google <marciorp em 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 em 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)\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 em 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 em 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 em 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 em 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 em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer




More information about the SaoPaulo-pm mailing list