[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