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

Frederico Melo fdmmelo at gmail.com
Tue Mar 26 09:20:10 PDT 2013


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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130326/8c004fd0/attachment-0001.html>


More information about the SaoPaulo-pm mailing list