[SP-pm] Perl para automação em acesso a x3270 IBM
Eden Cardim
edencardim at gmail.com
Thu Jul 12 06:30:50 PDT 2012
>>>>> "Marcio" == Marcio <- Google <marciorp em gmail.com>> writes:
Marcio> Olá Prof. Eden,
Marcio> Montei esse primeiro exemplo, tipo "Olá mundo!", mais esbarrei em um
Marcio> erro que não consigo resolver.
Marcio> #!/usr/bin/perl
Marcio> use strict;
Marcio> use warnings;
Marcio> use Expect;
Marcio> my $exp = Expect->spawn('s3270');
Marcio> $exp->log_file('/home/marcio/teste3.log');
Marcio> my $cmd1 = "connect(10.1.8.192:23)\n";
Marcio> $cmd1 .= "wait(InputField)\n";
Marcio> $exp->send($cmd1);
Marcio> $exp->expect(100, [qr/.{1920}/ => sub {
Marcio> my($self) = @_;
Marcio> print $self->match;
Marcio> exp_continue;
Marcio> },
Marcio> timeout => sub { die 'o sistema parou de responder' }
Marcio> ]
Marcio> )
Marcio> Roda certinho, pelo menos não dá erro nenhum, o problema é que como se
Marcio> no lugar do "\n" no final dos comandos, ele trocasse por "^M", e ai dá
Marcio> erro no s3270. No mesmo exemplo usando o IPC::Run não acontece isso.
Tem certeza que é o *mesmo* exemplo? Posta aí pra gente ver. Esses "^M"
são da codificação do seu terminal local. Se fosse um problema pro s3270
você não veria nada no output.
Marcio> Veja a saída no terminal:
Marcio> connect(10.1.8.192:23)^M
Marcio> wait(InputField)^M
Marcio> L U U N N 4 24 80 0 0 0x0 0.024^M
Marcio> error^M
Marcio> data: Wait: Not connected^M
Marcio> L U U N N 4 24 80 0 0 0x0 -^M
Marcio> error^M
Marcio> E o arquivo de log (/home/marcio/teste3.log):
Marcio> connect(10.1.8.192:23)^M
Marcio> wait(InputField)^M
Marcio> L U U N N 4 24 80 0 0 0x0 0.026
Marcio> error
Marcio> data: Wait: Not connected
Marcio> L U U N N 4 24 80 0 0 0x0 -
Marcio> error
Marcio> Tem alguma ideia?
Bom, é difícil depurar à distância asssim. Me parece que o erro não tem
nada a ver com o \n, o que está acontecendo é que o terminal do outro
lado está esperando mais input e você não está fornencendo, por isso dá
erro. Eu não entendo nada de TN3270 mas geralmente esses terminais mais
antigos precisam negociar o encerramento da conexão.
Marcio> Em tempo, essa expressão (qr/.{1920}/) pega o retorno com
Marcio> 1920 caracteres. Vou colocar várias expressões, agora como
Marcio> faço uma tipo "default", se não casar com nenhuma das
Marcio> anteriores cai nessa última?
Sim, e já está aí no exemplo: é o timeout => sub {} faz isso. Essa
subroutina roda se passar o tempo que você especificou (nesse caso, 100
segundos) e a saída não casar com nenhuma das expressões.
Marcio> Desculpe a lerdeza, mais é que como disse não sou
Marcio> programador, tó quebrando um galho para resolver um problema
Marcio> do meu sistema Asterisk.
Não precisa se desculpar em todos os posts, nós já entendemos ;)
O problema agora tem mais a ver com o entendimento do funcionamento do
TN3270 do que com programação. A única referência a respeito disso que
eu encontrei foi isso aqui: http://ibm.co/PSEH13
Boa sorte
--
Eden Cardim
+55 11 9644 8225
More information about the SaoPaulo-pm
mailing list