[SP-pm] Perl para automação em acesso a x3270 IBM

Marcio - Google marciorp at gmail.com
Tue Jul 10 18:44:02 PDT 2012


Em 10 de julho de 2012 08:35, Eden Cardim <edencardim em gmail.com> escreveu:
>>>>>> "Marcio" == Marcio  <- Google <marciorp em gmail.com>> writes:
>
>     Marcio> Olá Eden, obrigado!
>     Marcio> Sim, eu vi as páginas e foi nelas que aprendi os comandos de script
>     Marcio> desse apl. A minha dificuldade está com Perl mesmo.
>
>     Marcio> Pois é, como respondi ao Nelson, não consegui usar o pump (pump $h
>     Marcio> until $out =~ /\Gvalor esperado/) porque não sei o que esperar de
>     Marcio> retorno, pode ser qualquer coisa. Tenho que pegar tudo que voltou e
>     Marcio> analisar. Ai acho que entra as expressões regulares.
>
> Se você não sabe, manda um comando de cada vez e imprima o resultado da
> saída. Aliás, você não tinha falado que executou todos os comandos e
> conseguiu a saída mas que precisava tomar decisões no meio do caminho?

Sim, cada vez que "submeter" um sequencia de dados, preciso analisar o
retorno e tomar decisões.

>
>     Marcio> Quanto ao Expect, desculpa, mais como disse meu conhecimento de Perl é
>     Marcio> bastante limitado, então qual a diferença do IPC::Run e do Expect e
>     Marcio> porque esse é melhor?
>
> Já expliquei no outro post, o IPC::Run não é preparado para interagir
> com terminais, ele é apenas uma interface pras funções de IO padrão do
> perl. Já o Expect foi desenvolvido especificamente pra essa tarefa de
> automatizar interação humana e em particular com terminais, ele tem uma
> máquina de estados e já abstrai esses detalhes (como ter que executar
> pump, tratar a saída etc.) que você customiza para emular um humano
> interagindo com o terminal.

Ah, agora entendi ... :-)

>
>     Marcio> Sobre o código com o Expect, não entendi bem.
>
> Lê a documentação, é bem vasta e tem mais exemplos. Vai experimentando e
> postando as dúvidas aqui. Mas faça o que fizer, *não use IPC::Run*, é
> muito baixo-nível e só vai te dar dor de cabeça pra esse caso. O expect
> é a ferramenta padrão pra esse tipo de caso desde sempre.

Certo, já estou montando um código de teste com as dicas que me passou.

>
>     Marcio> Se eu tiver 50 comandos vou ter que "encadear" 50 subs?
>
> As subs não estão "encadeadas", elas são invocadas quando a saída do
> comando casar com a expressão regular equivalente, é uma máquina de
> estados. Você não precisa necessariamente ter uma sub pra cada comando
> do s3270 só precisa ter uma pra cada decisão que a simulação de
> interação irá tomar.  Mas, basicamente, sim, você pode "encadear" 50
> subrotinas ou pode fazer usando uma estrutura de ifs aninhados ou gotos
> e contratar um psiquiatra.
>

Psiquiatra é caro ... vou ficar com a primeira opção ... rsrs

>     Marcio> O outro detalhe é que não sei o que esperar de volta, não tem como
>     Marcio> saber, tenho que pegar tudo que voltar. A única coisa que sei é que o
>     Marcio> tamanho do retorno é de no mínimo 1920 caracteres (espaços, números e
>     Marcio> letras).
>
> Sabe sim, é só enviar o resultado pra saída e analisar.
>
> Usando o expect, você começa usando uma regex genérica, o código a
> seguir, por exemplo, conecta e pega os próximos 1920 caracteres do
> stream de dados:
>
> $exp->send("connect(10.1.8.192:23)\n");
> $exp->expect(100, [qr/.{1920}/ => sub {
>   my($self) = @_;
>   print $self->match;
> }])
>

Certo, agora entendi.

> Aí você analisa o resultado e vai restringindo a regex pra casar com
> resultados mais específicos. Assim, se houver algum erro inesperado com
> a interação, você corre menos risco de ter um cliente chamado "Error
> XPTO" no CRM.

Ah, achei a origem desses clientes então.

>
>     Marcio> Imaginei algo assim:
>
>     Marcio> 1. Conecta
>
> $exp->send($connect_cmd)
> $exp->expect([
>
>     Marcio> 2. Verifica o retorno para saber se conectou e como
>     Marcio> 3. Envia o primeiro comando
>
>   qr/connected as (.+)/, # lê e verifica o retorno
>   sub {
>     my($self) = @_;
>     $self->send($cmd1); # envia o primeiro comando
>     exp_continue;
>   }
>
>     Marcio> 4. Lê o retorno
>     Marcio> 5. Chama a função que trata retorno passando como parâmetro o conteúdo
>     Marcio> do retorno
>     Marcio> 6. Envia o segundo comando
>
>   qr/valor esperado do retorno/, # verifica o retorno
>   sub {
>     my($self) = @_;
>     my $retorno = $self->match; # valor do retorno
>
>     # tratar retorno aqui
>
>     $self->send($cmd2);
>     exp_continue; # enviar segundo comando
>   }
>
>     Marcio> 7. Lê o retorno
>     Marcio> 8. Chama a mesma função que trata retorno passando como parâmetro o
>     Marcio> conteúdo do retorno
>     Marcio> ...
>     Marcio> 100. Desconecta e encerra.
>
>   # etc...
>
>   ]);
>   $exp->soft_close;
>
>     Marcio> A função que trata o retorno irá varrer a string a procura de
>     Marcio> informações e erros, e dependendo disso, executar outros comandos,
>     Marcio> gravar informações no banco de dados e etc.
>
> É exatamente isso que os exemplos com expect fazem.
>
>     Marcio> Sei que isso é uma gambiarra pronta para explodir, mais o cliente não
>     Marcio> vai trocar o sistema legado que roda a 30 anos sem uma única parada. E
>     Marcio> a minha é a menor de todas, você precisa ver o que o povo faz com
>     Marcio> Excel e VBScript usando automação.
>     Marcio> Alguns módulos já foram para SAP, mais o grosso está no Mainframe, que
>     Marcio> pelo que ouvi falar deve ficar no ar por pelo menos mais 10 anos.
>     Marcio> Eu sou só um grãozinho de areia na TI deles, mexo só com a parte de
>     Marcio> telefonia computadorizada. A TI deles tem mais de 250 pessoas, e eu
>     Marcio> não tenho poder nem de sugestão em relação a sistemas, só mexo com a
>     Marcio> minha área e sou terceirizado ... mais ou menos assim: manda quem
>     Marcio> pode, obedece quem tem juízo ... :-)
>
> E qual cabeça vai rolar quando isso explodir? As 250 ou só a sua? Boa
> sorte :)

Só umas 100 ... dos tios acima dos 50quentão ... a minha não tá no
meio ... heheheheh

>
> --
> Eden Cardim
> +55 11 9644 8225
> Insolide TI Ltda.

Muito obrigado pela aula. Vou montar um bom exemplo e se surgir
dúvidas vou pedir socorro.

Abs,

Marcio

> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer



-- 

[...]'s

Marcio


More information about the SaoPaulo-pm mailing list