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

Marcio - Google marciorp at gmail.com
Mon Mar 25 14:25:56 PDT 2013


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
>
>
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130325/4f9c3a8e/attachment.html>


More information about the SaoPaulo-pm mailing list