[SP-pm] Automatizando consulta IBM com Perl ou Expect

Frederico Melo fdmmelo at gmail.com
Tue Mar 12 05:05:51 PDT 2013


Thiago,
O Márcio teve a mesma necessidade que eu tenho atualmente. Penso em
desenvolver algo como ele pois, o acesso ao mainframe que possuo é através
de aplicações como o QWS3270. Apesar do acesso ser via Telnet, o mainframe
me retorna uma série de caracteres e menus onde navego através de teclas
como PF1, PF2, etc... Minha necessidade é estabelecer a conexão, navegar no
servidor e buscar alguns dados e armazená-los em banco. O servidor
mainframe não retorna prompt para comandos. Toda navegação é feita através
de menus pré-estabelecidos e teclas com funções associadas. A navegação
deve ser feita (imagino), através de posicionamento de strings dentro da
tela (ex.: posição para login->Userid  coluna 20, linha 160, campo com 8
caracteres). Veja exemplo do print da tela do QWS3270:

 EMXXYY
 EEEEEEE  MM     MM  BBBBBBB   RRRRRRR    EEEEEEEE    SSSSSS      AAAAAAAA
 EE       MMM   MMM  BB    BB  RR    RR   EE        SS      SS   AA      AA
 EE       MM MMM MM  BB    BB  RR    RR   EE        SS           AA      AA
 EEEEE    MM  M  MM  BBBBBB    RRRRRRR    EEEEEEEE    SSSSSS     AAAAAAAAAA
 EE       MM     MM  BB        RR   RR    EE                SS   AA      AA
 EE       MM     MM  BB        RR    RR   EE        SS      SS   AA      AA
 EEEEEEE  MM     MM  BB        RR     RR  EEEEEEEE    SSSSSS     AA      AA


  ACESSO AOS SERVICOS DO IBM                                Data....:
12.03.13
                                                            Hora....:
08.50.59
  Identifique-se fornecendo:                                Terminal:
XXX393939

  Userid ..............               Voce e' responsavel pelos atos
praticados
  Senha ...............               com  o seu  codigo  de usuario,
portanto
  Codigo do servico....               para a  sua seguranca,   NAO FORNECA
SUA
  Grupo ...............               SENHA PARA NINGUEM.
  Nova Senha ..........

  Atencao: Em caso de problema telefone para XXX DA SUA LOCALIDADE ou
  PF 1=Help     (xxx)xxx ou 0800-xxx ( HELP-DESK )


Márcio,
Li alguns posts antigos onde você e Eden evoluíram muito sobre o expect, o
s3270 e a manipulação dos dados. Sou muito cru no perl, no s3270 e no
expect. Se você puder me passar o que você desenvolveu me ajudaria muito.
Eu utilizaria como exemplo e tentaria customizar por aqui, dentro da minha
necessidade.

Estou realmente precisando de ajuda ainda mais por estar envolvido em
outros projetos e com pouco tempo para pesquisa. Toda a ajuda de vocês é
muito válida! Agradeço já!

Abraços,
Fred


2013/3/9 thiago glauco sanchez <thiagoglauco at ticursos.net>

> Entendi. Dei uma pesquisada. De acordo com o IETF o TN3270 tem
> diferenças do tty padrão:
>
> "3270 display terminal data differs from traditional display terminal
>    data in that it is block mode and uses EBCDIC instead of ASCII
>    character representation. These two differences are the primary
>    reason for the differentiation of TN3270 from standard Telnet in this
>    document."
>
> Então,
> Expect->spawn('s3270' , @parameters) deve funcionar como no exemplo do
> e-mail anterior.
>
> De qualquer forma acho que isso pode te ajudar:
>
>
> http://www.linuxquestions.org/questions/linux-software-2/how-do-i-use-s3270-x3270-for-scripting-767067/
>
>
> espero ter ajudado.
> abraços
> Thiago Glauco
>
> On Sat, 2013-03-09 at 16:38 -0400, Marcio - Google wrote:
> > Thiago, o que estou te dizendo é que com cliente telnet comum você não
> > conecta no mainframe, pelo menos eu não consegui. Por isso que fui
> > atrás de outro cliente.
> > Acho que o Eden sabe explicar o motivo.
> >
> > Em 09/03/2013 16:09, "thiago glauco sanchez"
> > <thiagoglauco at ticursos.net> escreveu:
> >         A interação humana no expect é usada por pattern match:
> >
> >             $exp->expect($timeout,
> >                          [ timeout => \&report_timeout ],
> >                          [ qr/pattern/ => \&handle_pattern],
> >                         );
> >
> >         Ex:
> >         #efetua login
> >         my @parameters = ('host')
> >         Expect->spawn('telenet' , @parameters)
> >             $exp->expect($timeout,
> >                 [ qr/username/ => sub { my $self = shift;
> >                                         $self->send('usuario\n');
> >                                         return 'exp_continue'}],
> >                 [qr/password/ => sub { my $self = shift;
> >                                         $self->send('password\n');
> >                                         return 'exp_continue'} ],
> >                 'bash$');
> >
> >
> >         #agora você está no servidor e pode enviar comandos:
> >         $exp->send("comando1\n")
> >
> >         #e definir ações conforme padrões de texto da saída do
> >         comando.
> >         $exp->expect($timeout,
> >                 [ qr/pattern1/ => sub { my $self = shift;
> >                                         ...ação 1
> >                                         ...isso é uma sub.
> >                                         ..você pode fazer qualquer
> >         coisa aqui}],
> >                 [qr/pattern2/ => sub { my $self = shift;
> >                                         ...ação 2} ],
> >                 'bash$');
> >         #e fazer o mesmo para n comandos.
> >         $exp->send("comando2\n")
> >
> >         No Net::Telnet você pode verificar o array de saída para
> >         decidir a ação
> >         a ser tomada:
> >
> >         #conecta
> >         my $telnet = Net::Telnet->new( Host => "Servidor",
> >                                        Prompt => '/fulano#/');
> >         $telnet->login('usuario','senha');
> >
> >         #verifica se o diretório dir1 existe e muda o pwd
> >         #para dir1. Se dir1 não existir sera criado'
> >         my @saida = $telnet->cmd('ls -a');
> >         if ('dir1' ~~ @saida) {
> >                 $telnet->cmd( 'cd dir1/');}
> >         else {
> >                 $telnet->cmd( 'mkdir dir1' );
> >                 $telnet->cmd( 'cd dir1/' ); }
> >
> >         espero ter ajudado.
> >
> >         abraços.
> >         thiago glauco
> >
> >
> >         On Sat, 2013-03-09 at 13:16 -0400, Marcio - Google wrote:
> >         > Sim, mais a conexão e o ponto menos relevante nesse caso. O
> >         problema é
> >         > simular a interação e tratar "mapa de caracteres".
> >         > Na verdade, nos primeiros testes que fiz, tentei conectar
> >         com o
> >         > cliente de telnet padrão, e não funciona. Tem que ser um
> >         cliente
> >         > próprio, que no caso eu usei o s3270.
> >         >
> >         > Em 09/03/2013 13:09, "thiago glauco sanchez"
> >         > <thiagoglauco at ticursos.net> escreveu:
> >         >         Humm...Se é para fazer telnet eu usaria o
> >         Net::Telnet em vez
> >         >         do Expect.
> >         >         Algumas vezes eu utilizei o Expect e ele é um pouco
> >         mais
> >         >         demorado por
> >         >         que utiliza o processo externo do telnet. No
> >         Net::Telnet, é
> >         >         criado o
> >         >         cliente dentro do processo de sua aplicação. Mais
> >         rápido e
> >         >         seguro.
> >         >
> >         >         On Thu, 2013-03-07 at 14:33 -0300, Frederico Melo
> >         wrote:
> >         >         > Sr(a)s., Obrigado pela disponibilidade de alguns
> >         com os
> >         >         quais
> >         >         > conversei *em paralelo* e me orientaram a postar
> >         aqui...
> >         >         Segue abaixo
> >         >         > um resumo da minha dor de cabeça:
> >         >         >
> >         >         > Chamo-me Frederico, tenho alguns conhecimentos em
> >         PHP, Perl,
> >         >         MySQL e
> >         >         > Linux. Aqui na empresa, trabalho com
> >         desenvolvimento e até o
> >         >         momento
> >         >         > não tive problemas mas, surgiu um projeto que
> >         estou
> >         >         responsável onde
> >         >         > será necessário coletar uma série de informações
> >         em um
> >         >         mainframe IBM,
> >         >         > processá-las e armazená-las em MySQL. Apresentarei
> >         os dados
> >         >         em HTML.
> >         >         > Então, gostaria muito de uma orientação para:
> >         >         >
> >         >         > 1 - com um servidor Linux sem interface gráfica,
> >         acessar o
> >         >         servidor
> >         >         > IBM através de telnet na porta 23;
> >         >         > 2 - capturar alguns dados nesse IBM e armazená-los
> >         em MySQL
> >         >         > 3 - após capturar os dados, devo escrever alguns
> >         comandos no
> >         >         IBM ou
> >         >         > seja, o programa deve ser de mão-dupla (lê e
> >         escrever no IBM
> >         >         > utilizando usuário conhecido nesse ambiente);
> >         >         > 4 - toda interface existente para o IBM é feita
> >         por
> >         >         aplicativos no
> >         >         > Windows (Winsock 3270 Telnet, QWS3270)
> >         >         > 5 - tenho instalado no servidor Linux expect, php,
> >         perl,
> >         >         mysql
> >         >         >
> >         >         > Penso em desenvolver algo com perl, expect, s3270
> >         etc mas,
> >         >         > sinceramente não sei qual a melhor solução.
> >         >         > Tenho facilidade em aprender sozinho mas, preciso
> >         de um
> >         >         exemplo
> >         >         > inicial onde eu possa testar e verificar o
> >         resultado do que
> >         >         está sendo
> >         >         > feito. À partir daí, customizo e tento
> >         implementar.
> >         >         >
> >         >         > No momento, estou CEGO caminhando em um terreno
> >         novo, sem
> >         >         saber muito
> >         >         > bem por onde começar...
> >         >         > Não tenho muita familiaridade com o Expect, nem
> >         com o s3270.
> >         >         Socorro e
> >         >         > desculpem-me pela minha ignorância!
> >         >         >
> >         >         > Aprecio muito qualquer ajuda para eu começar.
> >         >         > Obrigado!
> >         >         >
> >         >         > Frederico
> >         >         > =begin disclaimer
> >         >         >    Sao Paulo Perl Mongers:
> >         http://sao-paulo.pm.org/
> >         >         >  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> >         >         >
> >          L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> >         >         > =end disclaimer
> >         >
> >         >
> >         >         =begin disclaimer
> >         >            Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> >         >          SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> >         >          L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> >         >         =end disclaimer
> >         > =begin disclaimer
> >         >    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> >         >  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> >         >  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> >         > =end disclaimer
> >
> >
> >         =begin disclaimer
> >            Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> >          SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> >          L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> >         =end disclaimer
> > =begin disclaimer
> >    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> >  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
> >  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> > =end disclaimer
>
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130312/bdcc45df/attachment-0001.html>


More information about the SaoPaulo-pm mailing list