[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