[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