[Cascavel-pm] Controle de processo em perl

kleber payback em oi.com.br
Quarta Maio 14 12:00:38 PDT 2008


OK Luis .............. mais uma vez agradeço sua atenção.

Você entendeu corretamente.
O perl faz a interface entre o cliente e o aplicativo cobol.
Sobre suas indagações informo-lhe que :
- Toda crítica realizada pelo javascript é também realizada no servidor ( 
cobol )
   portanto existe redundância na função de validação de dados.
- Não sei se o cobol lê e grava na entrada padrão do sistema ( vou pesquisar 
este
   assunto ) entretanto já escrevi mais de 100 scripts em perl e gostaria de 
preservá-lo
   na medida do possível )
   Nesta oportunidade cabe salientar que o ambiente sistêmico é 
multi-usuário porém
   a execução é mono-tarefa ( existem mais de 100 rotinas que podem ser 
executada
   simultaneamente porém cada rotina deve ser executada uma de cada vez ).
   Para cada programa cobol existe um script perl que captura os dados 
fornecidos pelo
   usuário para processamento pelo cobol.
   Os dados capturados são gravados em um diretório específico e único no 
qual o
   programa cobol o processará. ( pôr exemplo , o usuário ao cadastrar um
   departamento , acionará uma rotina perl que reside em 
c:/payback/tabelas/depto ,
   que captura os dados fornecidos pelo usuário no formulário , grava o 
arquivo de
   dados no diretório c:/payback/tabelas/depto , executa o programa cobol 
que dá
   manutenção nesta base de dados e gera um arquivo html para enviar ao 
usuário o
  status do processamento.
- A título de exemplificação estou enviando-lhe em anexo dois arquivos :
  1) index.plx - Este scritp perl é o primeiro a ser executado pelo sistema 
( autentica o
                       usuário ) e sua  codificação está mais ou menos 
padrão com as demais
                       rotinas perl do sistema.
                       Nota - como disse possuo pouca experiência em perl
  2) idxrauto.js - Estando o usuário autorizado , o cobol gera este arquivo 
de
                         autorização que será  encaminhado , pela rotina 
perl , ao solicitante.

Nota - Todas as rotinas que escevi em perl estão funcionando corretamente e 
não
           apresentam problemas.
           O meu temor esta na forma como individualizei a execução das 
rotinas em perl
           ( ver script em anexo index.plx ) .
           Me parece uma solução frágil ??????????????????

Um grande abraço , kleber



----- Original Message ----- 
From: "Luis Motta Campos" <luismottacampos em yahoo.co.uk>
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Sent: Wednesday, May 14, 2008 1:51 PM
Subject: Re: [Cascavel-pm] Controle de processo em perl


kleber wrote:
> Ok Mota , Agradeço sua atenção.

"Motta", por favor. Mas não precisa ser tão formal. O pessoal aqui me
chama "champs" ou "Luis".

> Vou tentar descrever meu problema.

OK, boa tentativa. :) Isso vai precisar de mais um ou dois emails, mas
eu tenho certeza de que, trabalhando juntos, a gente pode resolver depressa.

O que eu entendi do seu problema até agora:

1. Você está usando Perl como uma "linguagem de cola", para conectar um
programa na "baixa plataforma" com um sistema cobol (na "alta plataforma").

2. O sistema cobol conhece credenciais de usuários, permissões de acesso
a sistemas e autorizações de acesso para cada um destes sistemas. Você
não nomeou nenhum dos sistemas, mas é fácil presumir que você está
oferecendo uma "interface web" para os sistemas que existem no Cobol.

3. A forma como o sistema cobol funciona requer que você gere um arquivo
e o passe como parametro na chamada de system() que executa para chamar
o Cobol; O sistema Perl precisa gerar arquivos diferentes para cada
invocação do sistema, ou o cobol "troca" as permissões de acesso dos
usuários que você está consultando na "alta plataforma".

4. Depois que o Cobol termina de executar, ele gera um arquivo HTML
sobre o "status do processamento".

Por favor me confirme que isso que eu entendi é o que você falou.

Agora, as minhas perguntas e observações:

A. Eu gostaria de saber se o programa cobol pode ser invocado para ler
da entrada padrão (STDIN) e escrever na saída padrão (STDOUT). Isso é
possível? Assim, a gente pode fazer o Perl não precisar gerar arquivos,
mais.

B. Eu gostaria que você me explicasse qual é o conteúdo do HTML gerado
pelo Cobol, e o que você faz com ele - não precisa detalhe, eu quero
apenas entender o mecanismo e ter uma idéia sobre os dados que você
espera de volta.

C. Você deve saber (por que eu já estou careca de dizer) que Javascript
não é feito para validar dados de sistemas sérios (assim como todas as
outras tecnologias que rodam no cliente): um cliente "esperto" pode
"burlar" o Javascript e você vai receber lixo.

Javascript pode ajudar a entrada de dados (mudando campos para o
usuário, ou verificando coisa simples, como se algum campo obrigatório
está vazio), mas nunca deve ser usado como ferramenta de validação de
dados de entrada. Eu recomendo que você escreva a tua validação de dados
de entrada em Perl, usando o módulo Params::Validate:

http://search.cpan.org/~drolsky/Params-Validate-0.91/lib/Params/Validate.pm

D. Para resolver o teu problema de criar arquivos com nomes iguais ou
parecidos, eu recomendo que você use o File::Temp:

http://search.cpan.org/~tjenness/File-Temp-0.20/Temp.pm

E escreva alguma coisa assim:

#!perl
use strict;
use warnings;
use File::Temp ();
use IO::Handle;

sub grava_arquivo_entrada_cobol {
   my @dados = @_;
   my $tmp = File::Temp->new;
   $tmp->print( q{ Imprima seus dados com } );
   $tmp->print( q{ $tmp->print() até ter tudo } );
   $tmp->print( q{ o que você precisa no arquivo temporário. } );
   $tmp->flush; # garante que os dados estão gravados no arquivo
   return $tmp;
}

# Para obter o nome do arquivo:

my @dados = valida_dados( coleta_dados_do_formulario() );
my $arquivo = grava_arquivo_entrada_cobol( @dados );
my $nome_arquivo = $arquivo->filename;
# ...

E. Eu observei que você está usando o pior de todos os métodos de chamar
um programa externo, o system(). E você não deve estar verificando erros
de maneira apropriada - system é complexo, e é sempre muito difícil
verificar se uma chamada aconteceu com sucesso ou falha.

Eu posso sugerir algumas alternativas, e dar o método correto "de
bandeja" para você chamar system() sem susto:

E.1. (Alternativa) open() para chamar processos:

Se o teu processo externo aceita receber dados via entrada padrão
(STDIN) e tem uma opção para garantir que os dados que ele produzir (no
seu caso, o HTML) vão ser enviados para a saída padrão (STDOUT), então
você pode usar open() para abrir processos, com a vantagem de que o
open() vai tratar da comunicação. Isso quer dizer que você não precisa
mais criar arquivos, nem usar o esqueminha de arquivos temporários que
eu te indiquei em (D).

Isso depende do que você me responder em (A), e (B). Assim, eu vou
deixar os detalhes para mais tarde.

E.2. Chamada de System com verificação de erros, conforme descrita na
documentação da função system() (o comando "perldoc -f system",
executado a partir do seu shell te traz a documentação nos sistemas
operacionais que eu uso).

   sub chama_cobol {
     my ( $arquivo_entrada, $arquivo_saída ) = @_;
     # mude este array para ficar com a cara
     # e o jeito do comando que você quer.
     my @comando = 'cobol', 'programa.cobol',
         $arquivo_entrada, $arquivo_$saida;

     # executa o comando cobol
     system( @comando ) == 0
         or die qq{Merda na execução do comando "@comando": $?};

     # Confere se tudo correu bem:
     if( $? == -1 ){
         die qq{Falha na execução: $!.};
     }elsif( $? & 127 ) {
         die sprintf q{Processo filho morreu com sinal %d, %s coredump.},
             ($? & 127),  ($? & 128) ? 'com' : 'sem';
     }else{
         die sprintf q{Processo saiu com resultado %d.}, $? >> 8;
     }

     return 1; # sucesso!
   }

> Espero ter descrito com mais clareza minha necessidade.

Como você pode ver, valeu à pena escrever ;)

> Nota - Minha capacidade de programação em perl é modesta. Estou me
orientando pelo livro PERL COMO PROGRAMAR - DEITEL.

Você escolheu o pior de todos os livros, do pior de todos os autores. O
pessoal da lista vai te indicar outros livros, em portugues. O que eu
posso te recomendar é que você persista em aprender mais, mas estude
inglês, e recorra à (farta, bem-feita) documentação existente nesta língua.

Ainda não está completo, mas eu estou quase enxergando a solução
perfeita do seu problema aqui ;) espero que isso te ajude.

Ah! Você me deve uma cerveja ;^) - por favor aparece no encontro social
dos São Paulo Perl Mongers, neste sábado, se você estiver nas
proximidades. Eu vou gostar de te encontrar em pessoa.

Putamplexos!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}

_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm

-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : Index.plx
Tipo  : application/octet-stream
Tam   : 4753 bytes
Descr.: não disponível
Url   : http://mail.pm.org/pipermail/cascavel-pm/attachments/20080514/4e77cc2d/attachment.obj 
-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : IDXRAUTO.JS
Tipo  : application/octet-stream
Tam   : 6664 bytes
Descr.: não disponível
Url   : http://mail.pm.org/pipermail/cascavel-pm/attachments/20080514/4e77cc2d/attachment-0001.obj 


Mais detalhes sobre a lista de discussão Cascavel-pm