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

Frederico Melo fdmmelo at gmail.com
Wed Mar 13 10:59:08 PDT 2013


Oi Márcio,

Obrigado pela atenção. Eu peguei alguns daqueles códigos e rodei no meu
servidor.. Não consegui entender pelos códigos como passo o usuário e a
senha para ele se logar no IBM então, parei nesse ponto. Não cheguei a
testar mais do que isto. Como estou desenvolvendo dois sistemas em
paralelo, fiquei sobrecarregado com outra demanda e não pude evoluir. Se
puder me ajudar, agradeço mesmo!

Obrigado!

2013/3/12 Marcio - Google <marciorp at gmail.com>

> Você já usou aqueles códigos/exemplos?
> Qual foi o resultado?
> Em 12/03/2013 08:06, "Frederico Melo" <fdmmelo at gmail.com> escreveu:
>
> 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
>>>
>>
>>
>> =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/20130313/5a18c81d/attachment-0001.html>


More information about the SaoPaulo-pm mailing list