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

Marcio - Google marciorp at gmail.com
Mon Jul 9 10:47:23 PDT 2012


Boa tarde,

   Meu nome é Marcio, e trabalho com TI a mais de 20 anos. Já fiz de
tudo um pouco, fui digitador, programador, analista, DBA e por ai vai.
   Não sou mais propriamente programador, apesar de já ter
desenvolvido ativamente em Clipper Autumn 86 até o 5.2, Delphi desde a
primeira versão e por último C#.
   Atualmente sou especialista em telefonia computadorizada,
vulgarmente chamada simplesmente de VoIP. Trabalho com Asterisk em
cima de GNU/Linux, e constantemente uso Perl e Bash para criar rotinas
de manutenção ou integração. Mais nem de longe me considero um
programador Perl, meu conhecimento é muito limitado para isso, apesar
de não ser por falta de vontade, e sim de tempo e foco mesmo.
   Recentemente me deparei com uma situação que precisarei usar Perl
em um nível além dos meus atuais conhecimentos, e estou tento bastante
dificuldade, principalmente por ser um assunto bem restrito e meu
prazo muito curto. Então estou recorrendo a vocês na expectativa de
ter alguma ajuda. Não estou pedindo receita de bolo, apenas um
caminho, e se possível com exemplos, pois consigo assimilar melhor
assim.

   Agora vamos lá!

Preciso criar um programa para navegar (ler e inserir) em um sistema
que roda em Mainframe IBM (x3270(9)). Ele irá simular a interação
humana, conecta no host, espera pela tela, insere dados em
determinadas posições e submete para o host, etc.
Se usar Perl com Windows é moleza com o módulo Win32::HostExplorer, o
problema é que estou usando Linux em modo texto, nada de ambiente
gráfico.
Não achei uma versão do Win32::HostExplorer para Linux, mais achei o
http://x3270.bgp.nu/, mais especificamente o s3270. Instalei e
compilei, rodei o módulo c3270 e funciona perfeito, conectou no host,
montou as telas, entrou dados e tudo mais.
Agora preciso usar o s3270 que é pelo que entendi o módulo para
automação. Só que a documentação é muito fraca e encontrei meia dúzia
de exemplos mais fracos ainda.
Até consegui fazer um script pequeno em Perl (usando um exemplo) que
conecta no host, e faz alguma interação, mais agora esbarrei no
conhecimento limitado de Perl.

O que consegui fazer até agora é isso:

========== INICIO CODIGO ==========
#!/usr/bin/perl

my @s3270 = s3270;

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

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

$in .= "connect(10.1.8.192:23)\n";
$in .= "wait(InputField)\n";
$in .= "String(usertest)\n";
$in .= "wait(InputField)\n";
$in .= "String(passtest)\n";
$in .= "Ascii(0,0,24,80)\n";

# Preciso que $out seja alimentada com o retorno do host, e depois que
eu ler e processar as informações dela, que seja limpa para ser
preenchida em outro ponto novamente.

$in .= "ENTER\n";
$in .= "wait(1, Seconds)\n";
$in .= "wait(Unlock)\n";
$in .= "wait(InputField)\n";
$in .= "String(A4L2)\n";
$in .= "Ascii(0,0,24,80)\n";

# Preciso que $out seja alimentada com o retorno do host, e depois que
eu ler e processar as informações dela, que seja limpa para ser
preenchida em outro ponto novamente.

$in .= "ENTER\n";
$in .= "wait(1, Seconds)\n";
$in .= "wait(Unlock)\n";
$in .= "wait(InputField)\n";
$in .= "MoveCursor(15,9)\n";
$in .= "Ascii(0,0,24,80)\n";
$in .= "String(14)\n";
$in .= "Ascii(0,0,24,80)\n";
$in .= "ENTER\n";
$in .= "wait(1, Seconds)\n";
$in .= "PF(10)\n";
$in .= "wait(1, Seconds)\n";
$in .= "wait(Unlock)\n";
$in .= "wait(InputField)\n";
$in .= "Ascii(0,0,24,80)\n";
$in .= "String(logoff)\n";
$in .= "Ascii(0,0,24,80)\n";
$in .= "ENTER\n";
$in .= "wait(1, Seconds)\n";
$in .= "disconnect\n";
$in .= "quit\n";

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

warn $err if $err;
print $out;
========== FIM CODIGO ==========

O código funciona, pois a variável $out tem tudo o que foi processado
(saída) e os dados (telas) estão certos.
A dificuldade está no fato de que o script é processado como um todo
quando chega à linha "finish $h or die "s3270 returned $?";" e a
variável $out só é alimentada ai. A questão é que cada vez que eu
entro dados eu preciso processar o retorno do host (ler a tela) para
verificar se está tudo certo e ir para a próxima ação.
Para ficar mais fácil de entender, a cada vez que eu mandar a
instrução "Ascii(0,0,24,80)\n" preciso que a variável $out seja
alimentada com tudo o retorno do host até essa ação, para que eu possa
pegar os dados e ver se está tudo certo, depois disso limpar a
variável e continuar até a próxima vez que eu precisar ler o retorno.
Já tentei colocar o "finish ..." no meio e ler a variável de saída,
mais depois do "finish ..." o script é encerrado, independente de eu
enviar as instruções “disconnect” ou “quit”.
A variável de retorno tem as telas que o host retorna (não tem tamanho
fixo), então tenho que sair garimpando no meio os dados que preciso
para saber qual a próxima ação a ser enviada.
Acho que a dificuldade está em saber usar o módulo IPC::Run. Já fui à
página da documentação, mais não entendi muito bem, acho que eu
decorrência da minha limitação em Perl.

Alguém já fez algo parecido? Tem exemplos mais completos que possa me passar?
Ou sabe onde eu possa achar um bom material?
Ou ao invés de usar esse módulo, tem algo mais simples para essa interação?

O cliente usa Mainframe IBM e tem um ERP rodando nele que é acessado
em estações Windows com o Extra!. Tem também outra aplicação em Linux,
feito em várias linguagens, e essa aplicação precisa trocar alguns
dados com o Mainframe. No Windows alguns usuários avançados usam
automação OLE para fazer scripts em Excel e ler dados dele,
funcionando muito bem.

A interface entre os dois aplicativos não existe, assim como o sistema
do Mainframe não tem mais manutenção ou qualquer outra forma de
acesso, não sendo possível mexer nele e ninguém tem acesso ao OS, só a
empresa que faz a manutenção. Assim há um trabalho muito complicado de
ficar atualizando informações entre os dois sistemas, e está gerando
muitos erros. Está fora de cogitação qualquer ideia que tenha que
mexer no Mainframe.

A ideia é que o script Perl navegue pelas telas lendo e inserindo
dados, assim como os scripts em Excel fazem usando a automação OLE do
Extra!.

Pelo que entendi esse s3270 é para isso mesmo, o duro é só saber como usar.

Em tempo, o que estou fazendo é para facilitar a integração do sistema
de telefonia com o CRM.

Agradeço toda ajuda.

Abs,

Marcio.


More information about the SaoPaulo-pm mailing list