[SP-pm] Perl para automação em acesso a x3270 IBM

Eden Cardim edencardim at gmail.com
Fri Jul 13 06:09:11 PDT 2012


>>>>> "Marcio" == Marcio  <- Google <marciorp em gmail.com>> writes:

    Marcio> Olá o código ai, é o mesmo exemplo só que usando o IPC::Run. Por
    Marcio> desencargo, rodei os dois agora a pouco novamente, e mesma coisa. Com
    Marcio> o Expect dá erro, e com o IPC:Run não.

    Marcio> #!/usr/bin/perl

    Marcio> my @s3270 = s3270;

    Marcio> use IPC::Run qw( start pump finish timeout );
    Marcio> $IPCRUNDEBUG=details;

    Marcio> my $h = start \@s3270, \$in, \$out, \$err, timeout( 100 );

    Marcio> $in .= "connect(10.1.8.192:23)\n";
    Marcio> $in .= "wait(InputField)\n";

    Marcio> finish $h or die "s3270 returned $?";

    Marcio> warn $err if $err;
    Marcio> print $out;

Não tem como isso estar funcionando porque o start() não faz IO, ele só
inicia os processos, os comandos que você mandou no $in não vão ser
todos enviados pro s3270 até você rodar pump().

    Marcio> Saída no terminal:

    Marcio> U U U C(10.1.8.192) I 4 43 80 0 0 0x0 0.167
    Marcio> ok
    Marcio> U F U C(10.1.8.192) I 4 24 80 15 34 0x0 -
    Marcio> ok

Como você sabe que essa é a sequência correta? Onde está a resposta ao
"wait(InputField)"?

    Marcio> Na verdade não sou especialista também, mais ele processa
    Marcio> cada linha como um comando individual, e no exemplo ai o
    Marcio> primeiro é para conectar no host.

"Ele" quem?

    Marcio> Quando eu rodo ele no modo interativo, onde vou digitando os
    Marcio> comando, no final de cada linha teclo <ENTER> e ele processa
    Marcio> o comando.

Não é porque funciona assim no modo interativo que vai necessariamente
funcionar assim no modo de scripting.

    Marcio> No script o \n faz a função de teclar o <ENTER> no modo
    Marcio> interativo.

Não necessariamente, olha isso:
http://x3270.bgp.nu/s3270-man.html#NVT-ANSI-Mode

Você precisa descobrir se o <ENTER> no modo interativo é realmente
equivalente ao \n no modo de scripting.

    Marcio> Então, isso que não entendi. Se o retorno não casar com nenhuma
    Marcio> expressão ele vai cair aqui, mais só depois de ocorrer o timeout, ou
    Marcio> seja, mesmo que ocorra algum retorno, ele só vai processar depois de
    Marcio> 100 segundos (ou o que eu definir). É isso? Se for, volta a pergunta,
    Marcio> tem como colocar uma expressão default que seja processada antes do
    Marcio> timeout se nenhuma das outras casar?

E como a biblioteca vai saber que nenhuma expressão casou, se ainda não
passou o timeout? Pode ser que a sequência esperada ainda esteja por vir
no stream de dados. Então não faz sentido ter uma "expressão default".

    Marcio> É que fico até constrangido fazendo perguntas tão banais a
    Marcio> mestres ... :-) Brinco com microcontroladores (eletrônica)
    Marcio> por hobby, e a coisa mais difícil e conseguir ajuda de algum
    Marcio> expert/engenheiro nos fóruns especializados da areá. Os kras
    Marcio> se consideram superiores, e nunca foram aprendizes e tiveram
    Marcio> dúvidas.

Se o teu problema fosse banal eu já tinha te mandado um RTFM. :)

    Marcio> Então, para mim o TN3270 não tem muito mistério ou o que
    Marcio> mexer, pois quando eu conecto eu já caio em uma tela da
    Marcio> aplicação e a partir dai é digitar usuário/senha e ir
    Marcio> selecionando opções no menus e depois digitando e lendo
    Marcio> dados. Eu não uso comandos e outros recursos. Quando conecto
    Marcio> pelo s3270 no modo interativo ou mesmo o c3270, eu consigo
    Marcio> fazer todas as operações necessárias.

Lamento, mas não é tão trivial assim, o mistério é que o que você vê na
tela do emulador de terminal não é necessariamente o que passou pelo
stream de dados, senão você não precisaria de um emulador, era só
conectar direto via telnet. E eu não sei até que ponto o s3270
não-interativo manipula esses dados pra te entregar. Boa parte desse
problema é que tem outros fatores em cena e não tenho como diagnosticar
a resposta vinda do servidor. Pode ser um problema de codificação de
caracteres (aposto que esse IBM está usando EBCDIC, que é um inferno),
pode ser um problema de buffering, pode ser algum detalhe na forma como
o s3270 está sendo invocado, etc. etc.

A forma mais objetiva de resolver isso é saber o que esperar do terminal
em termos de dados brutos e avaliar as possibilidades quando você não
obtiver o que espera.

    Marcio>  Outro detalhes é que o exemplo com o IPC::Run funcionou,
    Marcio> então não pode ser alguns detalhe do Expect?

Não, não funcionou, é que você ainda não tá usando direito. :)

-- 
Eden Cardim
+55 11 9644 8225


More information about the SaoPaulo-pm mailing list