[SP-pm] Perl para automação em acesso a x3270 IBM
Eden Cardim
edencardim at gmail.com
Tue Jul 10 05:35:17 PDT 2012
>>>>> "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?
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.
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.
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.
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;
}])
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.
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 :)
--
Eden Cardim
+55 11 9644 8225
Insolide TI Ltda.
More information about the SaoPaulo-pm
mailing list