[SP-pm] perl - expect

Frederico Melo fdmmelo at gmail.com
Wed Apr 23 11:54:45 PDT 2014


Oi Hernan, obrigado pelo seu interesse. Na estrutura funcional que você
enviou:

O expect só vai realizar as chamadas para as subs quando o match for
verdadeiro? Ou ele vai executar linha por linha? Desculpe a ignorância...
sorry...Se sim, será que as regex no meu código estão erradas? Por favor me
ajude! Notei que no meu código, ele chama todas as subs, independente do
regex... Será que todas estão retornando true? Obrigado!

Frederico

use Net::SSH2;
use Net::SSH2::Expect;

sub add_user {
my ( $self ) = @_;
 $exp->send("adduser $config->{ user }->{ username }\n");
$exp->expect( 10, [
qr/Enter new UNIX password:/ => sub {
my ($exp, $line) = @_;
print $line;
$exp->send( $config->{ user }->{ password }."\n" );
},
qr|Retype new UNIX password:| => sub {
 my ( $exp, $line ) = @_;
print $line;
$exp->send( $config->{ user }->{ password }."\n" );
 },
qr|Full Name| => sub {
my ( $exp, $line ) = @_;
 print $line;
$exp->send( "\n" );
},
 qr|Room Number| => sub {
my ( $exp, $line ) = @_;
print $line;
 $exp->send( "\n" );
},
qr|Work Phone| => sub {
 my ( $exp, $line ) = @_;
print $line;
$exp->send( "\n" );
 },
qr|Home Phone| => sub {
my ( $exp, $line ) = @_;
 print $line;
$exp->send( "\n" );
},
 qr|Other| => sub {
my ( $exp, $line ) = @_;
print $line;
 $exp->send( "\n" );
},
qr|Is the information correct| => sub {
 my ( $exp, $line ) = @_;
print $line;
$exp->send( "Y\n" );
 },
]);
}

Obrigado,
Frederico


2014-04-22 10:09 GMT-03:00 Hernan Lopes <hernanlopes at gmail.com>:

> Esse exp_continue pode estar te atrapalhando, tenta comentar ele.
>
> Tenta o seguinte:
>
>
> $exp->expect(
> $timeout,
> [
>
> qr/username: /i,
> sub {
> my $self = shift;
> $self->send("$username\n");
> ///exp_continue;
>
> }
> ,
> qr/password: /i,
> sub {
> my $self = shift;
> $self->send("$password\n");
> ///exp_continue;
> }
> ]
> );
>
>
>
>
> Segue um exemplo funcional:
>
> use Net::SSH2;
> use Net::SSH2::Expect;
>
> sub add_user {
> my ( $self ) = @_;
>  $exp->send("adduser $config->{ user }->{ username }\n");
> $exp->expect( 10, [
> qr/Enter new UNIX password:/ => sub {
> my ($exp, $line) = @_;
> print $line;
> $exp->send( $config->{ user }->{ password }."\n" );
> },
> qr|Retype new UNIX password:| => sub {
>  my ( $exp, $line ) = @_;
> print $line;
> $exp->send( $config->{ user }->{ password }."\n" );
>  },
> qr|Full Name| => sub {
> my ( $exp, $line ) = @_;
>  print $line;
> $exp->send( "\n" );
> },
>  qr|Room Number| => sub {
> my ( $exp, $line ) = @_;
> print $line;
>  $exp->send( "\n" );
> },
> qr|Work Phone| => sub {
>  my ( $exp, $line ) = @_;
> print $line;
> $exp->send( "\n" );
>  },
> qr|Home Phone| => sub {
> my ( $exp, $line ) = @_;
>  print $line;
> $exp->send( "\n" );
> },
>  qr|Other| => sub {
> my ( $exp, $line ) = @_;
> print $line;
>  $exp->send( "\n" );
> },
> qr|Is the information correct| => sub {
>  my ( $exp, $line ) = @_;
> print $line;
> $exp->send( "Y\n" );
>  },
> ]);
> }
>
>
>
> 2014-04-22 9:57 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>
>> Pessoal,
>>
>> Obrigado pelo interesse. Dando prosseguimento, e espero esclarecer
>> melhor, tenho a seguinte situação:
>>
>> Como o Márcio havia dito, estou acessando um mainframe IBM pelo perl e
>> expect. O retorno que recebo do IBM são prints da sua tela, em texto puro e
>> o perl/expect participa dessa integração analisando essas telas.
>>
>> No meu caso, após conectar com o servidor e navegar até a tela onde devo
>> tomar uma decisão, posso receber uma das seguintes telas, uma única vez:
>>
>> 1 - primeiro caso:
>>
>>  SELECIONE 'D' P/DETALHES
>>   ADABAS11                   *** SUBSISTEMA DETALHES
>> ***                    ADAB11
>>   10/02/2014                     CONSULTA DE ORDEM
>> 09:07:30
>>   ORDEM  : 00ABC / AAAA
>> Pag    1
>>  OP ITEM             ORDEM
>>   _ DETALHES          CASAS DOMES
>>
>>
>>
>>
>>
>>
>>
>>
>>  Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
>>                                            -PAG  +PAG
>> VOLTA
>>
>> 2 - segundo caso:
>>
>>
>>   ADABAS11                   *** SUBSISTEMA DETALHES
>> ***                    ADAB11
>>   10/02/2014                     CONSULTA DE ORDEM
>> 09:11:30
>>   ORDEM  : 00DEF / AAAA
>> Pag    1
>>
>>  -------------------------------------------------------------------------------
>>
>>  OBJETIVO
>>  DA ORDEM.....:   ADICIONAR INFORMAÇÕES
>>
>>
>>
>>
>>  REGISTRO DO
>>  AUTOR:   112200  FULANO DE TAL
>>
>>
>>
>>  Data Descr.:   02/01/2014
>>  Hora Descr.:   11:22:55
>>
>>
>>
>>
>>  Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
>>  CONT
>> VOLTA
>>
>> Então, quando o expect lê esse print, que é um texto puro carregado na
>> tela (ou na memória) procuro pelas strings que necessito analisar e chamo
>> uma subrotina específica para cada caso.
>> Ex.:
>>
>> Para o caso 1, procuro pela string "SELECIONE" e disparo a sub normal();
>> Para o caso 2, procuro pela string "OBJETIVO" e disparo a sub obj();
>>
>> Cada sub por sua vez, executará uma série de comandos distintos de
>> integração com o IBM. Quando executo o perl/expect isoladamente para cada
>> caso, tudo funciona conforme o esperado. O meu problema começa quando crio
>> um único perl, com a estrutura abaixo (fiz isso baseando na documentação do
>> expect - http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod):
>>
>> $exp->expect(2,
>>               [ qr/\s+SELECIONE(.+)/ => \&normal()],
>>               [ qr/\s+OBJETIVO(.+)/ => \&obj()],
>>               [ qr/USUARIO nao autorizado/ => \&cancela()],
>>
>>               [ timeout => \&cancela() ],
>>               );
>>
>> Que deveria executar, no meu leigo entendimento apenas uma chamada de
>> subrotina para cada caso de match acima. O que está acontecendo é que o
>> exp/perl está chamando todas as sub acima, independente do match.
>>
>>
>> Alguém saberia me explicar como funciona a estrutura abaixo, copiada da
>> página do expect? Como ela funciona? Vejam  o que diz a documentação:
>>
>> Furthermore, patterns can now be specified as array refs containing
>> [$regexp, sub { ...}, @optional_subprams] . When the pattern matches, the
>> subroutine is called with parameters ($matched_expect_obj,
>> @optional_subparms). The subroutine can return the symbol `exp_continue' to
>> continue the expect matching with timeout starting anew or return the
>> symbol `exp_continue_timeout' for continuing expect without resetting the
>> timeout count.
>>
>>  $exp->expect($timeout,
>>               [ qr/username: /i, sub { my $self = shift;
>>                                        $self->send("$username\n");
>>                                        exp_continue; }],
>>               [ qr/password: /i, sub { my $self = shift;
>>                                        $self->send("$password\n");
>>                                        exp_continue; }],
>>               $shell_prompt);
>>
>> Essa estrutura chamará todas as sub na sequência? O que devo fazer para
>> ajustar meu código? Onde estou errando? Como adequar as estruturas acima
>> para chamar apenas uma sub rotina dependendo do match da string?
>>
>>
>> Desde já agradeço,
>> Muito obrigado,
>> Atte.,
>> Frederico
>>
>>
>> 2014-04-19 22:35 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>>
>> Monges mestres! Obrigado pelo apoio e atenção! Estou com acesso restrito
>>> e, assim que der retorno com detalhes.
>>>
>>> Márcio, espero que vc melhore! Realmente você havia iniciado esse tema
>>> de integração há algum tempo e foi por ele que iniciei meu projeto.
>>> Obrigado pelo apoio! O Eden tb ajudou demais! Agora tou emperrado...
>>>
>>> Atte,
>>> Frederico
>>>
>>>
>>> On Thursday, April 17, 2014, Tiago Peczenyj <tiago.peczenyj at gmail.com>
>>> wrote:
>>>
>>>> se o cara vai ler da stdin ( e estamos admitindo que o cara fez um pipe
>>>> para o script ) ok, mas o Expect te dá apenas a opção de controlar o
>>>> timeout com processo como também é bidirecional.
>>>>
>>>> sem saber mais detalhes fica impossivel ajudar.
>>>>
>>>> 2014-04-17 17:33 GMT-03:00 Daniel de Oliveira Mantovani <
>>>> daniel.oliveira.mantovani at gmail.com>:
>>>>
>>>> Oxi, você pode fazer isso sem usar expected....
>>>>
>>>> given(<STDIN>) {
>>>>
>>>> }
>>>>
>>>> 2014-04-17 17:31 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>>>> > Oi Daniel,
>>>> >
>>>> > Preciso do expect pois vou interagir com o servidor. E analiso o que
>>>> esse
>>>> > servidor escreve em uma tela para tomar a decisão do próximo passo...
>>>> >
>>>> > A estrutura que você sugeriu é legal mas, acho que só interagindo
>>>> dentro do
>>>> > perl.
>>>> >
>>>> > Obrigado,
>>>> >
>>>> >
>>>> > 2014-04-17 17:17 GMT-03:00 Daniel de Oliveira Mantovani
>>>> > <daniel.oliveira.mantovani at gmail.com>:
>>>> >
>>>> >> Porque você quer usar expected ? (Seja lá o que esse método que você
>>>> >> não especificou de onda venha faz).
>>>> >>
>>>> >>            given ($text) {
>>>> >>                obj() when /OBJETIVO/;
>>>> >>                consulta() when /CONSULTA/;
>>>> >>            }
>>>> >>
>>>> >> 2014-04-17 17:01 GMT-03:00 Tiago Peczenyj <tiago.peczenyj at gmail.com
>>>> >:
>>>> >> > nunca usei assim mas baseado neste documento:
>>>> >> >
>>>> >> > http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod
>>>> >> >
>>>> >> > vc teria que usar o exp_continue no fim de cada subrotina.
>>>> >> >
>>>> >> >
>>>> >> > 2014-04-17 16:58 GMT-03:00 Frederico Melo <fdmmelo at gmail.com>:
>>>> >> >>
>>>> >> >> Monges! Socorro!
>>>> >> >> Sou bem limitado na programação em perl mas estou evoluindo com o
>>>> >> >> tempo.
>>>> >> >> Então desculpem pelas minhas dúvidas que para vocês, pode ser
>>>> muito
>>>> >> >> simples...
>>>> >> >>
>>>> >> >> Bom, estou utilizando expect com perl e analiso alguns outputs de
>>>> um
>>>> >> >> servidor, em forma texto, que devo analisar e, dependendo da
>>>> ocorrência
>>>> >> >> de
>>>> >> >> uma string, devo disparar uma determinada sub-rotina para
>>>> tratativas
>>>> >> >> específicas.
>>>> >> >>
>>>> >> >> Ex.: se aparecer a string CONSULTA, devo disparar a subrotina
>>>> >> >> consulta()
>>>> >> >> Se aparecer a string OBJETIVO, devo disparar a subrotina obj() e
>>>> assim
>>>> >> >> por
>>>> >> >> diante.
>>>> >> >>
>>>> >> >> O output do servidor é verificado pelo expect e, no momento que
>>>> devo
>>>> >> >> tomar
>>>> >> >> a decisão, a tela do output é apenas uma, com apenas uma das
>>>> >> >> ocorrências
>>>> >> >> abaixo.
>>>> >> >>
>>>> >> >> Para verificar isso, estruturei o código .pl assim:
>>>> >> >>
>>>> >> >> $exp->expect(2,
>>>> >> >>
>>>> >> >>               [ qr/SELECIONE/ => \&select()],
>>>> >> >>
>>>> >> >>               [ qr/OBJETIVO/ => \&obj()],
>>>> >> >>
>>>> >> >>               [ qr/AGUARDE/ => \&sai_6()],
>>>> >> >>
>>>> >> >>               [ qr/CONSULTA/ => \&consulta()],
>>>> >> >>
>>>> >> >>               [ timeout => \&cancela() ],
>>>> >> >>
>>>> >> >>               );
>>>> >> >>
>>>> >> >> Ou seja, no meu entendimento limitado, quero que o expect dispare
>>>> uma
>>>> >> >> das
>>>> >> >> subs acima dependendo da string que ele encontrar no output do
>>>> >> >> servidor.
>>>> >> >>
>>>> >> >> Acredito que a estrutura acima, que parece uma matriz (desculpem a
>>>> >> >> ignorância), vai executar TODAS as subs independente do conteúdo
>>>> do
>>>> >> >> output
>>>> >> >> do servidor.
>>>> >> >>
>>>> >> >> O que está acontecendo é que o expect ou o perl só dispara a
>>>> primeira
>>>> >> >> sub... select()... independente da string encontrada...
>>>> >> >>
>>>> >> >> Sei que a condição para encontrar as strings funcionam pois, fiz
>>>> um
>>>> >> >> perl
>>>> >> >> com expect para cada condição acima e, quando rodo
>>>> individualmente cada
>>>> >> >> .pl,
>>>> >> >> funciona certo... o que estou errando? Como devo fazer o que
>>>> preciso?
>>>> >> >>
>>>> >> >> Por favor, ajude
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Tiago B. Peczenyj
>>>> Linux User #405772
>>>>
>>>> http://about.me/peczenyj
>>>>
>>>
>>
>> =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/20140423/6fcd0940/attachment-0001.html>


More information about the SaoPaulo-pm mailing list