Eu assisti uma palestra da IBM em a uns 3 ou 4 anos atrás sobre
utilização de Rexx para navegar em transações de aplicações em mainframe
e mapear os resultados para web services escritos em Java.
Talvez seja interessante dar uma olhada no Rexx para este fim, mas eu
não tenho nenhuma referência para dar.
[]'s
Em 13-04-2013 19:36, Marcio - Google escreveu:
Frederico, isso é uma missão para o Mestre Eden ... :-)
Abs,
Marcio.
Em 10 de abril de 2013 11:40, Frederico Melo <fdmm...@gmail.com
<mailto:fdmm...@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 <marci...@gmail.com
<mailto:marci...@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 <fdmm...@gmail.com
<mailto:fdmm...@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
<http://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 <marci...@gmail.com
<mailto:marci...@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@pm.org
<mailto:SaoPaulo-pm@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@pm.org
<mailto:SaoPaulo-pm@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@pm.org
<mailto:SaoPaulo-pm@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@pm.org
<mailto:SaoPaulo-pm@pm.org>
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
--
[...]'s
Marcio
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: SaoPaulo-pm@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@pm.org
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer