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

Marcio - Google marciorp at gmail.com
Sat Apr 13 15:36:15 PDT 2013


Frederico, isso é uma missão para o Mestre Eden ... :-)
Abs,
Marcio.


Em 10 de abril de 2013 11:40, Frederico Melo <fdmmelo em 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 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
>
>


-- 

[...]'s

Marcio
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130413/9a9cf393/attachment-0001.html>


More information about the SaoPaulo-pm mailing list