Interrogation SQL des tables système
Le passage de commandes shell est tout à fait possible dans les programmes de CL (langage de contrôle sur IBM i) via
QSH CMD(&maCommande)
. Si dans une session QSH(STRQSH)
l’état des logs s’affiche, nous n’avons pas ces retours quand les commandes shell sont passées via un programme CL.
plus d’informations sur le shell QSH sous IBM i : LE SHELL INTERPRETER
Contexte
Les deux écrans suivants permettent de tester l’authentification à Github (plateforme de versionnage du code, de contrôle et de collaboration ) ; ce travail servira d’exemple à notre article :
- Commandes manuelles, dans une session QSH avec les logs (en rouge)
- Commande automatisée dans un programme CL, sans retour de logs
Il existe tout de même un moyen pour récupérer les logs d’une commande shell passée via un programme CL ; l’interrogation des tables système par requête SQL.
Principe
Par un programme CL, les commandes QSH sont soumises dans un travail via SBMJOB
Plusieurs paramètres sont nécessaires :
- la commande QSH (ici
&QSH
)
- le travail doit être identifiable par un nom
&JOBNAME
, une bibliotheque&LIB
, une file de travail&JOBQ
, une file de sortie&OUTQ
et un utilisateur&USER
; que l’on peut déclarer de cette manière
- l’instant t de l’exécution
&TIMESTAMP
Ce sont ces paramètres qui alimentent notre requête SQL, et nous permettent de trouver les logs.
VUE qsys2.output_queue_entries
La première composante de notre requête SQL est la récupération des infos du travail en fonction des paramètres, expliqués ci-dessus, via la vue système qsys2.output_queue_entries.
Encapsulation et récupération de la liste des logs d’un travail
Nous récupérons la dernière ligne entrée dans qsys2.output_queue_entries (ORDER BY create_timestamp DESC FETCH FIRST ROW ONLY
) que nous encapsulons dans un WITH
; ce qui correspond aux identifiants associés au dernier travail lancé par le programme CL.
Le résultat du WITH
(alias lastLog
ici) est passé dans un SELECT
sur la vue systools.spooled_file_data
pour récupérer la liste des spools associés à la commande QSH (variable &QSH
dans notre exemple): WHERE spooled_data like trim(:log) || '%'
.
Nous obtenons les spools associées à une (ou plusieurs) commandes QSH lancé(es) via un programme CL
Intégration dans un programme
A ce niveau, nous sommes capable d’obtenir les logs générées par une commande QSH pour consultation ; en passant nos requêtes SQL dans un exécuteur de script. Voyons maintenant comment il est possible d’obtenir ces logs par un programme et d’adapter le traitement en fonction de leurs valeurs.
Programme CL
L’idée est d’avoir notre programme CL (ici ggitAuth.clle
) qui :
- soumet le travail,
- appelle un programme SQLRPGLE qui retourne la log (ici
getqshlog.sqlrpgle
),
- effectue le traitement en fonction de la valeur de la log retournée par le programme SQLRPGLE.
Programme SQLRPGLE
Le programme SQLRPGLE reçoit en paramètre :
- la valeur de la log ciblé
log
, - la file de sortie
OUTQ
, - la file de travail
JOBQ
, - le nom du travail
JOBNAME
, - le temps d’exécution
TIMESTAMP
.
Par un exec sql
, nous retrouvons l’interrogation de table vue précédemment. Celle-ci est intégrée dans une boucle pour gérer le délai d’écriture dans la table au moment du passage de la commande QSH :
Enfin nous mettons dans une variable la valeur de la log ; qui prend ‘Log not found’ en cas d’échec de la requête (sqlCode <> 0
).
En résumé
Il est possible dans un environnement IBM i d’exécuter des commandes shell comparables à ce qui peut se faire sur UNIX. Les logs générées par ces commandes sont consultables par interrogation de tables SQL. Pour aller plus loin, la récupération des logs pour analyse dans un programme permet la prise de décision dans ce dernier.