Eu assisti uma palestra da IBM em a uns 3 ou 4 anos atrás sobre utilização de Rexx para navegar em transações de aplicações em mainframe e mapear os resultados para web services escritos em Java.

Talvez seja interessante dar uma olhada no Rexx para este fim, mas eu não tenho nenhuma referência para dar.

[]'s

Em 13-04-2013 19:36, Marcio - Google escreveu:
Frederico, isso é uma missão para o Mestre Eden ... :-)
Abs,
Marcio.


Em 10 de abril de 2013 11:40, Frederico Melo <fdmm...@gmail.com
<mailto:fdmm...@gmail.com>> escreveu:


    Fala Márcio!
    Consegui avançar com a ajuda de vocês! Mas ainda preciso de algumas
    dicas. Realmente não tenho os conhecimentos necessários no perl e no
    expect para avançar ainda mais. Fiquei preso em uma situação onde
    preciso capturar mais de um dado na tela que a função ascii do s3270
    retorna pelo expect. Li e reli suas dicas e as do Eden mas, não
    consigo ir além... Acredito que o problema aqui é no meu
    entendimento das funções, das subs e nas rotinas dentro do expect.

    O ascii retorna a seguinte string:

    data:
    data:         APLNC000             *** SUBSISTEMA APL
    ***               MMM2D000
    data:         09/04/2013           CONSULTA DE
    LOCALIDADES              15:46:09
    data:
    data:        SIGLA.........: XYZ *NUMERO DO COD.: 0DD*
    data:
    data: *LOCALIDADE....: XISYPSZE*
    data:
    data:        MUNICIPIO.....: XISYPS
    data:
    data:
    data:
    data:        CONCES: CONCESSOR
    data:
    data:        CODIGO DA TOT.: DD
    data:
    data:
    data:
    data:
    data:
    data:                        ESTA LOCALIDADE E' ABERTA
    data:
    data:
    data:

    Na tela acima, gostaria de pegar os dados LOCALIDADE e guardar em
    $loc e NUMERO DO COD, guardar em $cod
    Meu código, está da seguinte maneira:

    <code>

    $exp->send($cmd1);
    $exp->expect(5, [

                     qr/data:\s+*LOCALIDADE*(.+)/ => sub {
                                   my $self = shift;
                                   my($rr1) = $self->match;
                                   my $rp="";
                                   $loc=$rr1;
                                   $loc = substr($rr1,6,55);
                                   $loc =~ s/\s//g;
                                   print "\n\n$loc\n\n";

                                   exp_continue; # manda continuar
                                                       },
                    qr/data:\s+(.+)*NUMERO*\s+(.+)/ => sub {
                                   my $self = shift;
                                   my($cod) = $self->match;
                                   print "\ncod=xxx$codxxx\n";

                                   exp_continue;
                                                      },

                        # quantas expressões você quiser/precisar

                        timeout => sub { die 'o sistema parou de
    responder' }
                       ]
                 );

    <code>

    O primeiro print funciona ok e tenho o retorno correto de $loc mas,
    o segundo print para $cod não funciona e não traz nada. Posso fazer
    as subs acima? A variável $self é especial do perl? O shift que usei
    na primeira regex vai afetar a segunda chamada para regex? Realmente
    me falta conhecimento para entender. Por favor, me ajude. Obrigado
    novamente pela sua atenção.

    Abcs,
    Frederico


    2013/3/25 Marcio - Google <marci...@gmail.com
    <mailto:marci...@gmail.com>>

        Fala Frederico,

        Vamos lá. Na própria thread o Eden da ótimos exemplos, vou
        reproduzi-los aqui e tentar explicar.

        O primeiro que usei foi esse aqui:

        <code>
        $exp->send(cmd1$); ##To enviando o comando

        $exp->expect(100, [qr/.{1920}/ => sub {
                                                   my($self) = @_;
                                                   print $self->match;
                                               }
                           ]
                     );
        <code>

        Como você mesmo disse, a tela tem 80x24, ou sejam 1920
        caracteres, o que inclui espaços.
        $exp->expect( ##Lê o retorno
        O primeiro parâmetro é o timeout
        O segundo é uma regex, que nesse caso espera 1920 caracteres. Se
        receber isso, vai executar a sub e a sua "tela" vai estar na
        variável $self. Ai você tem que garimpar os dados nessa
        "stringona", tipo, copiar pedaços dela que contenham os dados
        que você quer.


        Bom, depois passei para outro mais refinado:

        <code>
          $exp->send($cmd1);
          $exp->expect(100, [
                             qr/resposta cmd1: (.+)/ => sub {
                                                                my $self
        = shift;

                                                                #
        $resposta vai ter o que casou com (.+) - Aqui você coloca algo
        que você esteja esperando
                                                                #
        Digamos que a informação que você querer seja precedida de
        <Nome:>, então é isso que você está esperando

          my($resposta) = $self->match_list;

                                                                # Aqui
        você guarda a informação no banco de dados ou qualquer outro
        processamento

                                                                # enviar
        segundo comando, para pegar outra informação, p.e.

          $self->send($cmd2);


          exp_continue; # manda continuar
                                                            },
                             qr/resposta cmd2: (.+)/ => sub {
                                                                my $self
        = shift;

          my($resposta) = $self->match_list;

                                                                # etc...


          exp_continue;
                                                            },

                             # quantas expressões você quiser/precisar

                             timeout => sub { die 'o sistema parou de
        responder' }
                            ]
                      );
        <code>

        Nesse caso ai você vai esperar por expressões especificas, e
        cada vez que elas coincidirem o código da sub será processado.
        Eu pelo menos acabei achando mais fácil assim do que pegar uma
        "stringona" e ficar procurando dados dentro dela.

        Pra cada vez que você enviar ($exp->send()) você precisa
        processar o retorno ($exp->expect()).
        O retorno é sempre uma string ou timeout. Você só tem que
        escolher como quer processar essa string.

        Se tiver mais dúvidas vai postando que vamos tentando ajudar.

        [...]´s

        Marcio

        Em 25 de março de 2013 16:13, Frederico Melo <fdmm...@gmail.com
        <mailto:fdmm...@gmail.com>> escreveu:

            Oi Márcio, tudo bem?

            Voltei! Então... após várias tentativas, debugs e
            verificação de logs, consegui navegar pelo servidor IBM
            através do Perl com Expect. Muito legal mesmo! Obrigado
            pelas dicas iniciais! Agora, cheguei na fase de capturar
            algumas informações e gravá-las em banco de dados.

            Vejo nos arquivos de logs o resultado da função ascii do
            s3270. Como faço para pegar alguns dados (não é o print da
            tela 0,0,24,80 completo) e armazeno em banco? Pelo Perl e
            Expect isso é possível de ser feito no mesmo tempo que
            navega-se pelas telas do MainFrame IBM?

            Hoje meu código é algo assim:


            #!/usr/bin/perl

            my @s3270 = s3270;

            use strict;
            use warnings;
            use Expect;


            my $exp = Expect->spawn('s3270');

            $exp->log_file('teste.log');

            my $cmd1 = "connect(12.234.123.3:23
            <http://12.234.123.3:23>)\n";
            $cmd1 .= "wait(InputField)\n";
            $cmd1 .= "String(username)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "wait(InputField)\n";
            $cmd1 .= "String(password)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "wait(InputField)\n";
            $cmd1 .= "String(APL)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "wait(InputField)\n";
            $cmd1 .= "String(CODAPL)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "pf(3)\n"; #TELA INCIAL APL -> VAI PARA CONSULTAS
            $cmd1 .= "wait(InputField)\n";
            $cmd1 .= "String(14)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "wait(InputField)\n";
            $cmd1 .= "String(01)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "String(ordemserv12tt)\n";
            $cmd1 .= "Enter()\n";
            $cmd1 .= "Ascii(0,0,24,80)\n";

            Neste ponto, tenho a tela impressa em memória e no log. Como
            faço, nessa etapa, para capturar alguns dados e armazená-los
            em banco? Não tenho dificuldades em utilizar DBD ou DBI no
            perl, minha dificuldade é interagir o perl com os retornos
            do s3270 e expect. Seria possível me auxiliar? Já agradeço
            pelo precioso apoio1

            Obrigado novamente!
            Frederico


            2013/3/21 Marcio - Google <marci...@gmail.com
            <mailto:marci...@gmail.com>>

                Tiago, nesse caso não. A função "string" é do s3270, e
                ele entende tudo de forma literal. Também tropecei nisso.

                Frederico, isso. Se não me engano, para "entrar" o
                comando é ENTER.
                Se não funcionar posta novamente que vou ver com fiz.


                =begin disclaimer
                    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
                  SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org
                <mailto:SaoPaulo-pm@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@pm.org
            <mailto:SaoPaulo-pm@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@pm.org
        <mailto:SaoPaulo-pm@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@pm.org
    <mailto:SaoPaulo-pm@pm.org>
      L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
    =end disclaimer




--

[...]'s

Marcio


=begin disclaimer
    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
  SaoPaulo-pm mailing list: SaoPaulo-pm@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@pm.org
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a