PRESENTATION DE L'EMULATEUR VM POUR REXX - V2.21

  SUCCESS STORY  

EVMPR tourne en production 24H/24 7J/7 depuis janvier 2000 chez un de nos clients. Ce qui a permis au client de se débarasser de son VM/CMS.
Les traitements sont plus rapides sous EVMPR (sur pentium II 400Mhz - Windows NT4) que sous VM/CMS (un "VM sous VM" en Facily Management ...) :
Ils durent 3 heures alors qu'ils duraient plus de 10 heures sous VM !
Le client fait une économie de 61 K€/mois (coût mensuel de son VM)


SOMMAIRE

  1. GENERALITES SUR EVMPR
  2. MATERIEL RECOMMANDE
  3. LOGICIELS PRE-REQUIS
  4. COMMANDES VM/CMS TRAITEES PAR EVMPR

    Commandes générales

    Commande GLOBALV Commande EXEC

    Entrées/Sorties

    Généralités Commande ERASE Commande RENAME Commande COPY Commande STATE Commande LISTFILE Commande EXECIO

    Pipes et stages de pipe (filtres)

    Généralités Commande ADDSTREAM Commande ADDPIPE Commande ENDPIPE Commande SELECT Commande OUTPUT Commande READTO Stage DROP Stage TAKE Stage CHANGE Stage LITERAL Stage FANIN

    Commandes reconnues et ignorées

  5. TRAITEMENT DES FICHIERS BINAIRES DANS LES PIPES
  6. INTEGRATION DES PROCEDURES VM/CMS DANS EVMPR

    Intégration du moteur dans les procédures
    Retouches générales des programmes REXX
    Retouches concernant le système de fichiers
    Retouches concernant les pipes
    Retouches concernant les appels au systèmes
    Encapsulation dans un script
  7. INCIDENTS

 

1 - Généralités sur EVMPR

EVMPR est un moteur ou "Runtime" destiné à faire fonctionner des procédures REXX VM/CMS sur plateformes Windows-NT ou UNIX

Il est constitué :

  • d'un 'environnement de commande' matérialisé par une librairie partagée,
  • d'un jeu de commandes simulant certaines fonctionnalités de VM/CMS, matérialisées par des programmes ou des scripts.
  • Pour la plate-forme NT, des programmes gzip et gunzip, (portés et distribués par HHNS sous licence GPL et Zlib)

Sommaire

 

2 - Matériels Recommandés 

Pour Plateformes Windows/NT et LINUX

- CPU Pentium III > 400 Mhz

- Disques de capacité adaptée à la volumétrie des fichiers

Pour Plateformes AIX

- CPU 53P et au delà.

- Disques de capacité adaptée à la volumétrie des fichiers

Sommaire

 

3 - Logiciels Pré-requis

Sur Plate-forme Windows/NT :

  • Windows/NT4 Server US, Service Pack 4 ou 5
  • Ressource Kit NT4
  • Object Rexx IBM for Windows V1.03
  • Services FTP et RSH pour l'automatisation des travaux 

Sur Plate-forme AIX

  • AIX V4.3
  • Object Rexx IBM for AIX V6 

Sur Plate-forme LINUX

  • LINUX 6.x
  • Run time libc5
  • Object Rexx IBM for LINUX

Sommaire

 

4 - Commandes VM/CMS traitées par EVMPR

Commandes générales

 

Commande GLOBALV

  • syntaxe : "GLOBALV SELECT env SETP variable value" "GLOBALV SELECT env GET variable"

  • limitations : dans cette version, l'environnement n'est ni sauvegardé, ni traité.
    Il est simplement simulé pour la durée de la procédure.
  • exemple : "GLOBALV SELECT MYAPPL SETP RETRC" retrc "GLOBALV SELECT MYAPPL GET RETRC"

Sommaire

 

Commande EXEC

  • syntaxe : "EXEC commande arguments"
  • implémentation : Recherche pour chaque élément de la variable système 'PATH' de : - commande.EXEC - commande.REXX - puis par défaut, transmission de la commande au système
  • limitations : celles du système d'exploitation.

Sommaire

 

Entrées/Sorties

Généralités :

Le système de fichier VM/CMS est simulé au mieux :

la notation 'fn ft fm' est acceptée telle quelle dans les commandes directement implémentées, le 'path' traditionnel Windows/Unix tenant lieu de 'filemode' (par defaut : ./ ou .\).

exemples : 'nom extens /path/data'(VM) = '/path/data/nom.extens' (Unix)

'nom extens' (VM) = './nom.extens' (Unix)

Les limitations sont celles du celles du système d'exploitation (métasymboles % ou $, &, ...)

La désignation générique ('*') est acceptée, sauf pour le filemode.

Sommaire

 

Commande ERASE

  • syntaxe : "ERASE fn ft fm"
  • limitations : celles du système d'exploitation.
  • exemples :
    "ERASE AB* *CD* /path/data " (Unix)
    "ERASE AB* *CD* U:\path\data" (Windows)

Sommaire

  

Commande RENAME

  • syntaxe : "RENAME fn1 ft1 fm fn2 ft2 fm"
  • abbrev. : "REN"
  • limitations : celles du systŠme d'exploitation.
  • exemples :
    "REN ABC DEF /path/data UVW = =" (Unix)
    "REN ABC DEF /path/data = -DEF =" (Unix)
    "REN ABC DEF U:\path\data XYZ = =" (Windows)
    "REN ABC DEF U:\path\data = DEF2 =" (Windows)

 

Sommaire

 

Commande COPY

  • syntaxe : "COPY fn1 ft1 fm1 fn2 ft2 fm2"
  • limitations : celles du systŠme d'exploitation.
  • exemples :
    "COPY ABC DEF /path/data UVW = =" (Unix)
    "COPY ABC DEF /path/data = = /tmp" (Unix)
    "COPY ABC DEF U:\path\data XYZ = = " (Windows)
    "COPY ABC DEF U:\path\data = = V:\tmp" (Windows)

Sommaire

 

Commande STATE

  • syntaxe : "STATE fn ft fm"
  • limitations : pas de caractères génériques dans le filemode
  • exemples :
    "STATE ABC DEF /path/data" (Unix)
    "STATE *ABC* * /path/data" (Unix)
    "STATE ABC DEF U:\path\data" (Windows)
    "STATE *ABC* * U:\path\data" (Windows)
    if rc = 28 then ... /* n'existe pas */

 

Sommaire

 

Commande LISTFILE

  • syntaxe : "LISTFILE fn ft fm [( ALL/DATE/LABEL STACK/LIFO ]"
  • abbrev. : "LISTF"
  • limitations : celles du système d'exploitation.
  • exemples :
  • "LISTF ABC DEF /path/data ( ALL STACK" (Unix)

    "LISTF ABC DEF U:\path\data (DATE LIFO" (Windows)

Sommaire

 

Commande EXECIO

  • syntaxe pour fonction DISKR : "EXECIO n|* DISKR fn ft fm" "EXECIO n|* DISKR fn ft fm [( LIFO ]" "EXECIO n|* DISKR fn ft fm ( STEM stname]" "EXECIO 1 DISKR fn ft fm ( VAR varname]"
  • syntaxe pour fonction DISKW : "EXECIO n|* DISKW fn ft fm" "EXECIO n|* DISKW fn ft fm ( STEM stname]" "EXECIO 1 DISKW fn ft fm ( VAR varname]" "EXECIO 1 DISKW fn ft fm ( CONST xxxxxx"
  • syntaxe pour fonction CP : "EXECIO n|* CP ( [STACK | LIFO | FIFO ] CONST xxxxxx ..."
  • limitations : Pour cette version, les fichiers sont des textes ascii, le binaire n'est pas traité La simulation des commandes CP se fait par transmission de la commande telle quelle au système, puis par insertion du résultat (standard output) dans la stack.
  • exemples : EXECIO 5 DISKR fn1 ft1 fm1 ( STEM S1." EXECIO 1 DISKR fn1 ft1 fm1 ( VAR VVV" EXECIO * DISKR fn1 ft1 fm1 EXECIO * DISKW fn2 ft2 fm2 EXECIO * DISKW fn2 ft2 fm2 ( STEM S1. EXECIO 1 DISKW fn2 ft2 fm2 ( VAR vvv EXECIO 1 DISKW fn3 ft3 fm3 ( CONST ceci est un literal EXECIO * CP ( CONST dir /o EXECIO * CP ( LIFO CONST grep aaa /tmp/ffff.eeeee EXECIO * CP ( CONST df -v

Sommaire

 

Pipes et stages de pipe (filtres)

Généralités :

Le 'PIPE' VM/CMS est implémenté dans EVMPR par l'équivalent sur les systèmes Unix et Windows :

chaque stage du pipe est un filtre qui lit ses données sur l'entrée standard (stdin), et les écrit sur la sortie standard (stdout).

D'où la possibilité de remplacer un stage VM/CMS manquant par son équivalent sous Unix ou Windows, en général présent dans le système, ou facilement réalisable.

Lorsque ces stages sont des procédure REXX, on les invoque par :

"rexx stage.REXX [arguments ...".

 

Commande PIPE

  • syntaxe: "PIPE < fn1 ft1 fm1 | stage1 | stage2 ... | > fn2 ft2 fm2" "PIPE | STEM XXX. | ...." "PIPE | VAR VVV | ...." "PIPE < fn1 ft1 fm1 | stage1 | stage2 ... | STEM XXX." "PIPE < fn1 ft1 fm1 | stage1 | stage2 ... | VAR VVV"
  • limitations : les syntaxes ci-dessus sont les seules accept‚es.
  • voir la liste des stages fournis avec EVMPR ci-aprés.
  • exemples :

"PIPE < ABCDE DATA | take 1 | VAR abcde_data"

"PIPE <" fn ft fm "| drop 1 | STEM abc."

"PIPE < ABC DATA | rexx prog1.rex ( opt1 | > ABC LOGFILE"

 

Sommaire

 

Commande ADDSTREAM

  • syntaxe : "ADDSTREAM OUTPUT alias"
  • limitations : le sens INPUT n'est pas impl‚ment‚ dans cette version.
  • exemple : voir la commande SELECT ci-dessous.

Sommaire

 

Commande ADDPIPE

  • syntaxe : "ADDPIPE *.OUTPUT.alias: | > fn ft fm"
  • limitations :

le sens INPUT n'est pas implémenté dans cette version.

Le fichier ('fn ft fm') est associé à l'alias et ouvert en sortie.

Sommaire

 

Commande ENDPIPE

  • syntaxe : "ENDPIPE alias"
  • limitations : fermeture immédiate et définitive du fichier associé à l'alias.

Sommaire

 

Commande SELECT

  • syntaxe : "SELECT OUTPUT alias"
  • limitations : le sens INPUT n'est pas implémenté dans cette version.
  • Le fichier associé à 'alias' devient le fichier courant en sortie pour la commande OUTPUT.
  • exemple :

"ADDSTREAM OUTPUT sortie"

"ADDPIPE *.OUTPUT.sortie : | > F123456 RESULT ."

"SELECT OUTPUT sortie"

"OUTPUT 1ere ligne du fichier F123456.RESULT"

...

"ENDPIPE sortie"

 

Sommaire

 

Commande OUTPUT

  • syntaxe : "OUTPUT" expression
  • limitations :

Par défaut (pas de 'SELECT' préalable), l'écriture se fait sur la sortie standard;

Un 'newline' est ajouté à l'expression à écrire.

Possibilité de binaire (voir la commande 'SET MODE' ci-après)

Sommaire

 

Commande READTO

  • syntaxe : "READTO variable"
  • limitations :

Dans cette version, la lecture se fait toujours sur l'entrée standard, par ligne de texte;

Possibilité de binaire (voir la commande 'SET MODE' ci-après)

  • exemple :

do forever

"READTO ligne"

if rc <> 0 then leave /* fin de fichier sur stdin */

...

end

Sommaire

 

Stage DROP

  • syntaxe : "PIPE < ... | DROP n | ..."
  • limitations : ce stage n'a de sens que piur les entrees standard en mode texte.
  • exemple : voir 'Exemple complet de Pipe" ci-apr‚s

Sommaire

 

Stage TAKE

  • syntaxe : "PIPE < ... | TAKE n | ..."
  • limitations : ce stage n'a de sens que pour les entrées standard en mode texte.
  • exemple : voir 'Exemple complet de Pipe" ci-après

Sommaire

 

Stage CHANGE

  • syntaxe 1 : "PIPE < ... | CHANGE -x hh-hh | ..."
  • limitations : La notation hh-hh indique 2 caractères en hexadécimal
  • syntaxe 2 : "PIPE < ... | CHANGE [(col1-col2) /scr1/tgt1/ [/src2/tgt2/ ...]"
  • limitations : La notation /src/tgt/ n'accepte que des chaines ASCII
  • exemples : "PIPE <" filein "| change -x 00-20 | >" fileout /* Zero Bin. en espaces */ "PIPE <" filein "| change /ALBERT/ANATOLE/ | >" fileout "PIPE <" filein "| change (28-30) /A1/B4/ /A2/B5/ | >" fileout

Sommaire

 

Stage LITERAL

  • syntaxe : 'PIPE < ... | LITERAL "'expression'" | ...' 'PIPE | LITERAL -n "'expression'" | ...'
  • limitations : Le flag -n indique qu'il n'y a rien en entrée de pipe RESPECTER SCRUPULEUSEMENT LES APOSTROPHES ET LES GUILLEMETS

  • exemples : 'PIPE <' filein '| literal "constante en tête de résultat" | >' fileout 'PIPE | literal -n " constante en tête de résultat " | >' fileout 'PIPE | literal -n "'right('Etat n.' n, 72)'" | >' fileout

Sommaire

 

Stage FANIN

  • Ce stage simule 'au mieux' la fusion des pipes multiples de VM/CMS Il fusionne un ou plusieurs fichiers avec l'entrée standard
  • syntaxe : 'PIPE < ... | FANIN fn1 ft1 fm1 fn2 ft2 fm2 ... | ...' 'PIPE < ... | FANIN -r fn1 ft1 fm1 fn2 ft2 fm2 ... | ...'
  • limitations : Le flag -r indique que le ou les fichiers passés en paramètres sont écrits AVANT le flot en entrée standard.
  • exemples : 'PIPE <' filein '| fanin' wfile '| >' fileout /* filein, puis wfile */ 'PIPE <' filein '| fanin -r wfile '| >' fileout /* wfile, puis filein */

Sommaire

 

Commandes reconnues et ignorées :

  • SET (sauf SET SYSIN/SYSOUT)
  • MAKEBUF
  • DESBUF
  • DROPBUF


5 - Traitement des fichiers Binaires dans les Pipes

Il est possible de traiter les entrées/sorties d'un stage sous forme de fichiers binaires (pas de newline).

Pour cela, on les considère comme des données de type 'VARIABLE NON BLOQUE' (RECFM V), au format IBM Standard.

Les commandes 'SET SYSIN' et 'SET SYSOUT', pseudo-commandes VM/CMS traitées par EVMPR, permettent de traiter ce type de données.

Sommaire

 

Commandes SET SYSIN et SET SYSOUT

  • syntaxe : 'SET SYSIN/SYSOUT RECFM=ff' [LRECL=nnn si F ou FB]
  • limitations : Les RECFM suivants sont reconnus dans cette version :
    • RECFM=V pour le variable non bloqué "EBCDIC"
    • RECFM=VB pour le variable bloqué "EBCDIC"
    • RECFM=F pour le fixe non bloqué "EBCDIC"
    • RECFM=FB pour le fixe bloqué "EBCDIC" (= F)
    • RECFM=T pour les fichiers "ASCII" (valeur par défaut)"
  • exemple :

"SET SYSIN RECFM=V"

do forever

"READTO Z" /* lecture en variable non bloqué, sans newline */

if rc <> = 0 then leave

"OUTPUT Z" /* ecriture en mode texte, avec newline */

end

 

Sommaire

 

6 - Intégration des procedures VM/CMS dans EVMPR 

Intégration du moteur dans les procédures

On intègre le moteur dans chaque procédure EXEC ou REXX par les 2 commandes suivantes, en tête de procédure :*

 

"rxsubcom register CMS orxcms orxcms"

address CMS

 

Retouches générales des programmes REXX

1) changer l'opérateur "^=" par "<>" ('non égal')

2) changer les 'say ...' des stages REXX par "EXEC NENU ..." (sinon, ils se mélangent au flot de sortie).

3) éliminer les 'trace ?i' dans les stages REXX (sinon , ils se mélangent au flot de sortie).

 

Retouches concernant le système de fichiers

4) éliminer ou changer le symbole '$' dans les noms de fichiers (Unix)

5) éliminer ou changer le symbole '%' dans les noms de fichiers (Windows)

6) Changer la valeur des 'FileMode' par un chemin valide dans les noms de fichiers VM/CMS

 

Retouches concernant les pipes

7) revoir les stages des pipes, les remplacer par un équivalent selon la plate-forme.

8) revoir les pipes multiples (x:fanin), les diviser en 2 pipes distincts, l'un produisant un workfile, l'autre intégrant le workfile par 'fanin'.

9) ne pas oublier de remplacer les stages REXX par 'rexx nom_du_stage.REXX'

Retouches concernant les appels au systèmes

10) préfixer les commandes au système par ADDRESS CMD (Windows) ou ADDRESS bash (LINUX) ou ADDRESS ksh (AIX)

11) Veiller à 'escaper' les caractères magique et métasymboles dans ces commandes (UNIX)

Encapsulation dans un script

12) Les scripts (.cmd ou .sh) permettent de lancer facilement la procédure principale (en général un .EXEC) d'une application.

Ils construisent quelques variables d'environnement ( fn ft fm ) et invoquent la procédure principale par 'rexx Nom_Procedure.EXEC arguments'

Sommaire

 

 

7 - Incidents Fréquents 

1) Syntaxe : l'opérateur '^=' … remplacer par <>

2) fichiers non traités : filename/filetype > 8 car., filemode = 'A' ou 'B' ...

4) Syntaxe au niveau des commande système :

  • vérifier les transformations 'fn ft fm' -> 'fm/fn.ft'
  • 'escaper' les métasymboles UNIX par un \ : $,[],*,?,() ...

Pour plus d'information, contactez-nous.