[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