Vous voulez savoir si une commande est utilisée, il y a plusieurs solutions en voici une basée sur les
programme d’exit qui est assez simple
Il existe un programme d’exit QIBM_QCA_CHG_COMMAND
Pour ajouter votre programme vous avez une commande ADDEXITPGM
ADDEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND) +
FORMAT(CHGC0100) +
PGMNBR(1) +
PGM(VOTREBIB/HSTCMD) +
TEXT('Tracer une commande') +
PGMDTA('RSTLIB QSYS')
Vous devrez lui indiquer dans la paramètre PGMDTA la commande qualifiée à tracer
exemple :
‘STRDBG QSYS’
Les données reçues sont sur le format CHGC0100 qui vous donne le découpage du buffer reçu par votre programme
Vous pouvez faire un programme générique qui va loguer l’utilisation d’une commande, vous pouvez en mettre plusieurs et la prise en compte est immédiate
Voici le source en clle du programme HSTCMD
PGM PARM(&ExitInfo &NewString &Newlength)
DCL &Class *CHAR 10
DCL &OffsetDec *DEC (7 0)
DCL &CmdLenDec *DEC (7 0)
DCL &ExitInfo *CHAR 2000 /* CHGC0100 interface data */
/* Input parameters */
DCL &ExitPoint *CHAR 20 /* Exit Point name */
DCL &ExitFormat *CHAR 8 /* Exit Point Format */
DCL &CmdName *CHAR 10 /* Command name being executed */
DCL &CmdLib *CHAR 10 /* Command Library */
DCL &Change *CHAR 1 /* Change allowed? 1=yes 0=no */
DCL &Prompt *CHAR 1 /* Prompt requested? 1=yes 0=no */
DCL &Filler *CHAR 2 /* Reserved by IBM */
DCL &Offset *CHAR 4 /* Offset to command string */
DCL &CmdLength *CHAR 4 /* Command string length */
DCL &CmdString *CHAR 2000 /* Command String */
/* Output Parameters */
DCL &NewString *CHAR 2000 /* Replace with this command */
DCL &NewLength *CHAR 4 /* Length of new command */
/* 0 = no new command */
DCL &JOB *CHAR 10
DCL &USR *CHAR 10
DCL &NBR *CHAR 6
MONMSG CPF0000 EXEC(GOTO ERROR)
/* découpage du paramètre reçu */
CHGVAR &ExitPoint %SST(&ExitInfo 1 20)
CHGVAR &ExitFormat %SST(&ExitInfo 21 8)
CHGVAR &CmdName %SST(&ExitInfo 29 10)
CHGVAR &CmdLib %SST(&ExitInfo 39 10)
CHGVAR &Change %SST(&ExitInfo 49 1)
CHGVAR &Prompt %SST(&ExitInfo 50 1)
CHGVAR &Filler %SST(&ExitInfo 51 2)
CHGVAR &Offset %SST(&ExitInfo 53 4)
CHGVAR &CmdLength %SST(&ExitInfo 57 4)
CHGVAR &CmdLenDec %BIN(&Cmdlength)
CHGVAR &OffsetDec (%BIN(&Offset) + 1) /* Set offset */
CHGVAR &CmdString %SST(&ExitInfo &OffsetDec &CmdLenDec)
/* Extraction du travail */
RTVJOBA JOB(&JOB) USER(&USR) NBR(&NBR)
/* envoi message à qsysopr */
SNDUSRMSG MSG(&job *tcat '/' *tcat &usr *tcat +
'/' *tcat &nbr *bcat %sst(&CmdString 1 +
100) ) MSGTYPE(*INFO) TOUSR(*SYSOPR)
/* passage de la commande sans transformation */
chgvar &NewString &CmdString
chgvar &NewLength &CmdLength
ERROR:
return
ENDPGM
Remarque :
Vous n’avez pas besoin de mettre en place des audits et tout est dynamique
Vous pouvez transformer une commande ou la remplacer par une autre
Pour voir les commandes que vous tracez
==> WRKREGINF QIBM_QCA_CHG_COMMAND
Exemple :
Les commandes qui commencent par DLT, je remplace par un message suppression refusée pour certain utilisateurs
Rappel :
Un programme d’exit doit être simple et ne pas planter !