[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