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

Frederico Melo fdmmelo at gmail.com
Wed Apr 3 13:28:53 PDT 2013


Oi Márcio, tudo bem?

Cara, desculpa amolar novamente mas, estou frustrado... Infelizmente não
entendi bem a manipulação dos dados dentro da "stringona" que a função
ascii do expect retorna... no seu post anterior, entendi a lógia onde você
dispara uma sub para cada comando que você deseja e acho isso realmente
interessante. Não entendi bem o uso da expressão regular dentro do expect
- "qr", "(.+)" - interagindo com o perl... Você pode me ajudar? Veja o que
estou fazendo e o retorno que tenho do ascii do expect:

1 - naveguei na boa dentro do IBM e cheguei na tela onde preciso capturar
os dados. O retorno do ascii do expect apresentará uma tela assim:

data:    APLY0050                   *** SUBSISTEMA APL
***                    APL
data:    02/04/2013                    DESCRICAO DA
FICHA                       16:30:08
data:    FICHA  : ABCDE / CPF
data:
-------------------------------------------------------------------------------
data:
data:   OBJETIVO
data:   DA FICHA.....:   ORDEM VERIFICA CPF
data:                  URGENTE.
data:
data:
data:
data:   REGISTRO DO
data:   AUTOR:   XX4053  NOME DO AUTOR
data:
data:
data:
data:   Data Descr.:   02/04/2013
data:   Hora Descr.:   10:12:13
data:
data:
data:
data:
Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
data:
CONT
VOLTA

2 - preciso capturar e armazenar em variável (para posterior tratativa
literária e armazenamento em banco) o trecho logo no começo das primeiras
linhas, após "FICHA  :" ou seja, o valor que procuro é ABCDE / CPF.

3 - baseando no seu exemplo, desculpe novamente minha ignorância mas não
entendi a parte das expressões regulares, fiz algo assim no meu código:

<code>...

$exp->send($cmd1); # envia sequência de comandos para chegar na tela acima
$exp->expect(10, [
                 #qr/resposta cmd1: (.+)/ => sub {
                  *qr/resposta cmd1: FICHA  :/ => sub {*
                           my $self = shift;
                           my($resposta) = $self->match_list;

                           #Aqui você guarda a informação no banco de dados
ou qualquer outro processamento
                           print "\n\nresposta ficha=$resposta\n\n";

### imprimi na tela para ver mas, não apresentou nada!!!!
### nem a parte de texto "resposta  ficha=" SOCORRO!!! Será que nem entrou
na sub ???

                              # 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>


Acho que meu erro está relacionado com a falta de entedimento das
tratativas 1 - "qr/" e 2 - "(.+)". Por favor Márcio, se puder me ajudar,
mais uma vez serei grato.

Um abraço,
Frederico






2013/3/27 Thiago Glauco <thiagoglauco at ticursos.net>

> 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 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> 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 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
> >                          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
> >                  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
> >          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
> >  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
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130403/ae28571c/attachment-0001.html>


More information about the SaoPaulo-pm mailing list