SQL et Log BRMS

A l’heure de SQL services , il peut être opportun de faire des contrôles BRMS par SQL.

Le fichier qui se cache derrière la commande DSPLOGBRM est le fichier QA1ALG ,et il se trouve dans la bibliothèque QUSRBRM.

Une exécution de sauvegarde en BRMS s’appelle un groupe de contrôle. Quand on passe la commande STRBKUBRM on lui indique un groupe de contrôle à exécuter.

Voici comment savoir si une sauvegarde s’est bien passée ?
Vous allez sélectionner la date du contrôle, attention la date et au format numérique sAAMMJJ (s étant à 1 en 2000, à 0 en 1900)
Vous allez sélectionner le job qui est égal au groupe de contrôle, si le travail a un nom différent vous pouvez tester substr(LGMDTA, 1, 10) à la place de LGJOB.
Vous allez choisir les id messages suivants
-BRM1380 début du groupe de contrôle
-BRM1049 Fin normale du groupe de contrôle

Voici 2 exemples de requêtes

en CLP
runsql(‘create table qtemp/ctlgrp as( +
SELECT LGJOB, LGDATE, LGTIME, LGJNBR, LGMID FROM qusrbrm/QA1ALG +
where LGJOB =  »QUOT » and LGDATE = 1200707 +
and LGMID in( »BRM1380 » ,  »BRM1049 »))’) commit(*none)

/* lecture du nombre d’enregistrements */
rtvmbrd file(qtemp/ctlgrp) NBRCURRCD(&nbr)

en RPGLE

exec sql
SELECT count(*) into :NBR FROM qusrbrm/QA1ALG
where LGJOB = ‘QUOT’ and LGDATE = 1200707
and LGMID in(‘BRM1380’ , ‘BRM1049’) ;


Dans les 2 cas, l’interprétation de la variable NBR est la suivante

Si vous avez 0 dans NBR, le groupe de contrôle n’a pas été lancé.
Si vous avez 1 dans NBR, le groupe a été lancer mais il a des erreurs à contrôler.
Si vous avez 2 dans NBR, tout est ok.

Conclusion

On peut facilement ajouter ce contrôle dans une sonde d’un outil de supervision .

Il est également conseillé d’enregistrer un exemple dans les requêtes des utilisateurs de ACS

Vous pouvez également ajuster vos contrôles pour différencier les cas d’anomalie , etc …

Fichier de l’IFS verrouillé

Suite à une sauvegarde, vous avez tous eu un message du genre
CPF3837 Message . . . . : 678999 objets sauvegardés.
4 non sauvegardés.

Faisons une expérience !


1 session sous QSECOFR
verrouillage d’un fichier
chkout ‘/home/QSECOFR/VERSIONODE.TXT’

2 session sous plb
edtf ‘/home/QSECOFR/VERSIONODE.TXT’
on peut éditer mais pas enregistrer
CPFB620 Resource busy.

3 session sous QSECOFR
edtf ‘/home/QSECOFR/VERSIONODE.TXT’
On peut éditer et enregistrer sans problème
Donc le verrouillage est lié à l’utilisateur, le même utilisateur sur une autre session peut accéder au fichier sans restriction

Pour voir ce verrouillage vous pouvez utiliser sur la session 2 par exemple

WRKLNK ‘/home/QSECOFR/VERSIONODE.TXT’
8=Afficher les attributs
Vous constatez que le fichier est bien verrouillé
Verrouillage par . . . . . . . . . . . : QSECOFR Date/heure de verrouillage . . . . . . : 27/07/20 13:58:23

Vous pouvez également utiliser la table fonction QSYS2.IFS_OBJECT_STATISTICS zone CHECKED_OUT

Vous sortez par signoff de la session qui vérouille ce fichier

Vous refaites la commande sur la session 2

WRKLNK ‘/home/QSECOFR/VERSIONODE.TXT’
8=Afficher les attributs
Vous constatez que le fichier est bien verrouillé
Verrouillage par . . . . . . . . . . . : QSECOFR Date/heure de verrouillage . . . . . . : 27/07/20 13:58:23

Conclusion contrairement à un ALCOBJ, le fichier reste verrouillé, même quand le travail est arrêté, le verrouillage est lié uniquement à l’utilisateur

vous pouvez, si vous avez les droits sur le fichier, faire
chkin ‘/home/QSECOFR/VERSIONODE.TXT’ qui déverrouillera le fichier

Attention ce n’est pas ce verrouillage que vous trouvez par la nouvelle vue ifs_object_lock_info

Puisque quand vous faites la requête suivante, vous avez 0 enregistrement

select i.*
from table (
qsys2.ifs_object_lock_info(
path_name => ‘/home/QSECOFR/VERSIONODE.TXT’)
) i;

Prenons maintenant un fichier dont on est sûr qu’il est verrouillé applicativement, ici une log apache

select i.*
from table (
qsys2.ifs_object_lock_info(‘/www/ws_demo/logs/error_log.Q120072700’)) i;

On obtient bien une ligne avec un travail exemple :
778168/QTMHHTTP/WS_DEMO, et des informations sur les différents types et modes de verrouillage

Par contre si vous faites wrklnk ‘/www/ws_demo/logs/error_log.Q120072700’
puis option 8
vous ne voyez pas de verouillage pour ce fichier

et si vous essayez d’éditer ce fichier vous avez le même problème que tout a l’heure, vous ne pourrez pas enregistrer votre modification
CPFB620 Resource busy.

Si vous arrêtez l’instance apache qui verrouille le fichier votre fichier est déverrouillé, vous pouvez le mettre à jour.

En résumé

il y a 2 verouillages:

Un plutôt système, par les commandes CHKIN et CHKOUT que vous voyez dans les attributs du fichier.

Vous pouvez également le voir par la fonction table QSYS2.IFS_OBJECT_STATISTICS

Exemple dans notre cas

SELECT PATH_NAME, OBJECT_OWNER, CHECKED_OUT
FROM TABLE (QSYS2.IFS_OBJECT_STATISTICS(START_PATH_NAME => ‘/home/QSECOFR/VERSIONODE.TXT’) )

Un plutôt applicatif, c’est l’api d’ouverture généralement qui fixera ce verrouillage vous pouvez voir ces verrouillages par l’API QP0LROR ou par la fonction table, qsys2.ifs_object_lock_info

Remarque :

Pour mettre à jour un fichier vous n’êtes pas obligé de verrouiller le fichier, exemple si vous avez 2 EDTF sur le même fichier c’est le dernier qui a raison.
Il est donc conseillé de verrouiller votre fichier, si vous faites des mises à jours dans vos applicatifs.

Conclusion :

Si, suite à une sauvegarde, vous avez un verrouillage sur un fichier commencer par vérifier s’il y a un verrouillage système par WRKLNK ou par la fonction table QSYS2.IFS_OBJECT_STATISTICS c’est la zone CHECKED_OUT
Si c’est le cas faites un CHKIN sur votre fichier pour le libérer !
Si il n’y a pas de verrouillage regardez par la fonction table qsys2.ifs_object_lock_info ou l’api QP0LROR
Si vous trouvez le travail, vous devrez l’arrêter avant votre prochaine sauvegarde.
Mais il est aussi possible que le job ne soit plus actif …

Vous avez intérêt à monitorer votre commande SAV et à analyser les erreurs pour les corriger

Comment filtrer finement FTP ?

Vous connaissez les programmes d’exit

Ce sont des programmes qui vont s’exécuter avant une action sur votre machine.

On les gère par la commande

==>WRKREGINF

On peut ajouter un programme par l’option 8

Prenons l’exemple de FTP

On veut sécuriser les accès FTP

On peut utiliser des fonctions, qui permettent d’utiliser ou d’interdire une fonction.

On peut utiliser un programme d’exit (QIBM_QTMF_SVR_LOGON TCPL0100) qui permet facilement de tracer FTP.

Contrairement à une fonction utilisateur on peut juste tracer pour voir ce qui ce passe, en envoyant un message par exemple

Pour FTP, ça peut ne pas suffire : en effet le langage FTP dispose d’un jeu de commande (GET, PUT , RENAME, DLT , ETC..)

On peut pour cela utiliser les programmes que l’on va associer à la valeur de registre QIBM_QTMF_SERVER_REQ

avec le format VLRQ0100

exemple en CLP

Voici les paramètres que reçoit le programme que vous allez écrire

PGM PARM(&APPID &OPID &USRPRF &REMOTEIP &REMOTELEN &OPINFO &OPLEN &OK)
DCL &APPID CHAR 4 / APPLICATION ID, BINARY NUM */
DCL &OPID *CHAR 4 /* OPERATION ID, BINARY NUMBER */
DCL &OPNUM *DEC 4 /* OPERATION ID, USABLE IN CL */
DCL &USRPRF *CHAR 10 /* USER PROFILE USING FTP */
DCL &REMOTEIP *CHAR 251 /* IP ADDRESS */
DCL &REMOTELEN *CHAR 4 /* LENGTH OF PREVIOUS PARAMETER */
DCL &OPINFO *CHAR 251 /* OP SPECIFIC INFORMATION */
DCL &OPLEN *CHAR 4 /* LENGTH OF PREVIOUS PARAMETER */
DCL &OK *CHAR 4 /* CONFIRMATION SIGNAL / / LENGTH DECIMAL */
DCL &RLEN *DEC 10 /* ROUTE LENGTH VALUE AS DECIMAL */
DCL &OLEN *DEC 10 /* LENGTH VALUE IN A DECIMAL FORM/ / ALLOWABLE VALUES FOR OPID FOR FTP CLIENT OR FTP SERVER */
DCL &STR *CHAR 4 VALUE(X’00000000′) /* START FTP */
DCL &MKD *CHAR 4 VALUE(X’00000001′) /* MAKE DIRECTORY */
DCL &RMD *CHAR 4 VALUE(X’00000002′) /* DLT DIRECTORY */
DCL &CD *CHAR 4 VALUE(X’00000003′) /* SET DIRECTORY */
DCL &DIR *CHAR 4 VALUE(X’00000004′) /* LIST DIRECTORY */
DCL &DELE *CHAR 4 VALUE(X’00000005′) /* DELETE FILE */
DCL &GET *CHAR 4 VALUE(X’00000006′) /* SEND FILE */
DCL &PUT *CHAR 4 VALUE(X’00000007′) /* GET FILE */
DCL &REN *CHAR 4 VALUE(X’00000008′) /* RENAME FILE */
DCL &SYS *CHAR 4 VALUE(X’00000009′) /* EXECUTE COMMAND / / ALLOWABLE VALUES FOR OK
DCL &NO CHAR 4 VALUE(X’00000000′) / DISALLOW FTP */
DCL &YES *CHAR 4 VALUE(X’00000001′) /* ALLOW FTP / / CONVERT THE LENGTH PARAMETERS FROM BINARY TO DECIMAL */
CHGVAR &RLEN %BIN(&REMOTELEN)
CHGVAR &OLEN %BIN(&OPLEN)

Les paramètres recus

Vous avez l’utilisateur qui est passé dans la zone &USRPRF
Vous avez l’ordre FTP qui est passé dans la zone &OPID

Avec ces 2 informations vous pouvez autoriser en renvoyant X’00000001′ dans la Variable &OK
ou interdire en renvoyant X’00000000′

par exemple, un profil de type FTP user ne peut pas supprimer !

if cond(&USRPRF = ‘FTPUSR’) THEN(DO)
if cond((&OPID = &DELE) *or (&OPID = &RMD)) THEN(DO)
CHGVAR &OK &NO
ENDDO
ELSE DO
CHGVAR &OK &YES
ENDDO
ENDDO

Vous pouvez encore aller plus loin

Vous avez le paramètre &OPINFO qui contient des informations conplémentaires

Exemple

Interdir le déplacement dans la bibliothèque produit

if cond((&OPID = &CD) *and %SST(&OPINFO 1 &OLEN) *EQ ‘/QSYS.LIB/PRODUIT.LIB’) ) then(do)
CHGVAR &OK &NO
enddo

Conclusions :

Vous pouvez combiner ces 3 informations pour établir un contrôle précis
– L’utilisateur
– La commande FTP
– La ressource
Vous pouvez rendre paramétrable ces validations en créant par exemple un petit fichier qui liste des utilisateurs avec les commandes FTP aux quels ils ont droit .

Remarques

La mise en place de votre programme d’exit ne se substitue pas aux autorisations natives de l’IBM i, un utilisateur interdit à un fichier ne peut pas y accéder …
Vous avez intérêt à passer par une phase d’analyse (qui fait quoi? )
Une fois que vous avez validé qui doit faire quoi , il faut fermer et ouvrir par exception
Votre programme doit être optimisé
Votre programme ne doit pas planter