[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