, , Créer un menu UIM

Voici un 2ème post d’une série consacré à UIM (User Interface Manager).

Ce langage peut vous permettre de réaliser des menus standards IBM, en effet tous les menus sont codés en ce langage !

Vous allez devoir saisir un code source au format UIM puis le compiler.
Ça peut être fastidieux à réaliser, c’est pourquoi nous avons réalisé un outil (CRTMNUUIM) qui va vous permettre de réaliser un menu sans aucune compétence dans ce langage.

Vous pouvez le retrouver ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/

1) Génération du source du menu

vous pouvez indiquer jusqu’à 10 commandes

Exemple

CRTMNUUIM MENU(GAIA/MONMENU)
FICHIER(GAIA/QMNUSRC)
SOCIETE(GAIA)
TITRE(‘Gestion Spools’)
OPTION1(‘Gestion Spools’)
COMMANDE1(WRKSPLF)
OPTION2(‘Gestion Outqs’)
COMMANDE2(‘?WRKOUTQ’)

Si vous avez quelques compétences malgré tout, vous pouvez éditer le source ici MONMENU du fichier source QMNUSRC, en complétant par exemple les aides !

2) Vous pouvez ensuite compiler le menu en indiquant que vous avez un source UIM

CRTMNU MENU(GAIA/MONMENU) TYPE(*UIM) SRCFILE(GAIA/QMNUSRC)

3) Vous avez alors un menu identique à tous les menus IBM

Pour le lancer
GO MENU(MONMENU)

, , Ajouter de l’aide à vos commandes

Vous créez des commandes et vous voudriez leur ajouter de l’aide, ces aides sont écrites dans un langage UIM (User Interface Manager) qui vous permet de générer des panneaux d’aide que vous pouvez ensuite ajouter à vos commandes.
Le langage UIM est un langage de présentation un peu similaire à HTML, il existe de nombreux sites pour l’apprendre.
Pour les commandes, il existe une commande IBMi qui permet de générer une structure qui vous permettra de vous concentrer sur le texte à mettre sans avoir de connaissance approfondie du langage UIM.

Nous avons fait un outil que vous pouvez trouver ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/
qui vous permettra d’automatiser la génération votre source et voici ce que vous devrez faire ensuite

1) Génération du source en utilisant notre outil

GTOOLS/GENCMDUIM COMMANDE(GTOOLS/SCANSRC)
FICHIER(GTOOLS/QPNLSRC)

2) Modification du source

Vous devez customiser votre source en indiquant vos spécificités

3) Compilation du panel de groupe

CRTPNLGRP PNLGRP(GREFER/SCANSRC)
SRCFILE(GREFER/QPNLSRC)

4) Association de l’aide à la commande

CHGCMD CMD(GREFER/SCANSRC)
HLPPNLGRP(GREFER/SCANSRC)
HLPID(*CMD)

5) Tester votre commande

==>SCANSRC puis <F4> et <F1>

Quelques sites pour vous aider

https://www.rpgpgm.com/2017/02/creating-help-text-using-uim.html

https://www.volubis.fr/news/liens/AF4SRC/ANIMTXT/UIM.htm

https://larreya.pagesperso-orange.fr/as400/hlphlp.html

, Utilisation de QSYSMSG

Vous pouvez créer une file de messages supplémentaire pour les messages importants !
Elle viendra en complément de QSYSOPR

C’est la file QSYSMSG

Pour la créer

CRTMSGQ QSYS/QSYSMSG +
TEXT(‘Messages importants’)

Voici les messages qui sont envoyés dedans

CPF1269 Demande de démarrage de programme reçue sur unité &1
CPF1393 Le profil utilisateur &2 a été désactivé
CPF1397 Poste &3 mis hors fonction par sous-système &1
CPI2209 Profil utilisateur &1 supprimé car endommagé.
CPI9014 Le mot de passe reçu de l’unité &1 est incorrect.
CPI96C0 Le mot de passe protégé n’a pas pu être validé.
CPI96C1 La valeur de la variable GDS d’ouverture de session
CPI96C2 Le mot de passe utilisateur n’a pas pu être changé.
CPI96C3 Message &4 renvoyé lors d’un appel système.
CPI96C4 Le mot de passe n’est pas correct pour le profil utilisateur
CPI96C5 L’utilisateur &4 n’existe pas.
CPI96C6 Code retour &4 reçu lors de l’appel de CPI-Communication
CPI96C7 Incident système dans programme de transaction d’ouverture

Vous en avez d’autres qui seront envoyés dans les 2 files

pour des compléments regardez ICI

https://www.ibm.com/docs/en/i/7.3?topic=messages-qsysmsg-message-queue

Vous pouvez créer un watcher pour faire remonter les informations en temps réel par mail par exemple !

Exemple :

STRWCH SSNID(SUPQSYMSG)
WCHPGM(VOTREPGM)
WCHMSG(*NONE)
WCHMSGQ((QSYS/QSYSMSG))

Pour le programme regardez ici, tout est dans le passage des paramètres


https://www.ibm.com/docs/en/i/7.3?topic=collectors-i-job-watcher

, , Nombre d’accès DB d’un travail

Vous voulez avoir une idée du nombre d’entrées-sorties que génère un travail sur votre base de données.

Pour ceci, vous pouvez par exemple utiliser la comptabilité des travaux.

Pour utiliser cette fonctionnalité, vous devez la mettre en œuvre voici comment :

1 ) Créer un récepteur de journal par exemple dans qusrsys ou une de vos bibliothèques
CRTJRNRCV JRNRCV(QUSRSYS/QACGJRN)
2) Créer le journal QACGJRN
CRTJRN JRN(QSYS/QACGJRN)
JRNRCV(QUSRSYS/QACGJRN)
3) Changer la valeur système QACGLVL
CHGSYSVAL SYSVAL(QACGLVL) VALUE(‘*JOB’)

Tous les jobs démarrés à partir de ce moment seront logués

Pour analyser vous avez des postes de type JB
Le plus simple est d’utiliser un fichier modèle
Le fichier modèle qui correspond est QSYS/QAJBACG4

dupliquez le

CRTDUPOBJ OBJ(QAJBACG4)
FROMLIB(QSYS)
OBJTYPE(*FILE)
TOLIB(PLB)
NEWOBJ(WAJBACG4)

Maintenant vous pouvez le remplir en faisant un DSPJRN

DSPJRN JRN(QACGJRN)
JRNCDE((A))
ENTTYP(JB)
OUTPUT(OUTFILE) OUTFILFMT(TYPE4)
OUTFILE(PLB/WAJBACG4)

Vous pouvez alors interroger votre fichier par sql

exemple ici en se limitant au jobs interactifs :

SELECT
JAJOBH as travail,
JAUSRH as utilisateur,
JANBRH as numero,
JADBPT as acces,
JADBGT as creation,
JADBUP as mise_à_jour
FROM PLB.WAJBACG4
WHERE JATYPE = ‘I’

Remarque :
N’oubliez pas supprimer les récepteurs quand vous les avez traité
Si vous voulez arrêter la collecte
CHGSYSVAL SYSVAL(QACGLVL) VALUE(‘*NONE’)

Vous pouvez également utiliser la comptabilité des travaux pour de nombreuses autres informations, pour par exemple estimer vos volumes d’impression.

, 5 choses à faire avant de changer de version

Vous avez décidé de changer de version d’OS , voici quelques opérations auxquelles on ne pense pas toujours, mais qui peuvent vous aider en cas de problème.

1) Appliquer les PTFs définitivement


APYPTF LICPGM(ALL) APY(PERM)
vous pourrez ainsi faire le ménage et supprimer les SAVFs sans déphaser le catalogue
DLTPTF PTF(*PRMAPY)


2) Faire le ménage

Ça ne fait jamais de mal de faire un peu de place

Supprimer tout ce qui est inutile
les SAVFs

Les récepteurs
Les spools
Dans l’ifs les fichiers de travail de log etc…

Réorganiser les fichiers ayant beaucoup de d’enregistrements supprimés, méfiez vous de BRMS et des collectes de performances.

Supprimer les objets inutilisés (si nécessaire faire une sauvegarde au cas où).


3) Téléchargez PRUV, lancez le, et suivez les recommandations qu’il vous donne …

Pour télécharger c’est ici https://www-01.ibm.com/support/docview.wss?uid=nas8N1014074

Je vous conseille de télécharger la dernière version juste avant de faire votre opération.

.


4) Faire un DSPOBJD *ALL dans un fichier pour garder les dates de référence sur les objets.

Ça vous permettra d’avoir les dates d’usage, de modification etc .. de vos objets avant installation, cette dernière pouvant changer ces informations et fausser vos analyses futures.


5) Bien sur faire une SAV21 de votre système qui vous servira à redémarrer en cas de gros problèmes

Conserver cette bande vers vous jusqu’à la fin de votre opération complète !

, , 5 requêtes pour contrôler vos PTFS

On ne dira jamais assez comment à quel point SQL nous simplifie la vie.
C’est d’autant plus vrai pour la gestion des correctifs

Voici 5 requêtes à garder pour vos contrôles de PTFs

1) Contrôle de la TR et de la version avec QSYS2.GROUP_PTF_INF


SELECT CURRENT SERVER CONCAT ‘ est en version ‘ CONCAT PTF_GROUP_TARGET_RELEASE
CONCAT ‘ et le niveau de TR est : ‘ CONCAT PTF_GROUP_LEVEL AS NIVEAU_DE_TECHNOLOGY_REFRESH
FROM QSYS2.GROUP_PTF_INFO WHERE PTF_GROUP_DESCRIPTION = ‘TECHNOLOGY REFRESH’
AND PTF_GROUP_STATUS = ‘INSTALLED’ ORDER BY PTF_GROUP_TARGET_RELEASE DESC
FETCH FIRST 1 ROWS ONLY

2) Contrôle des cumulatives sur le microcode et l’OS avec QSYS2.PTF_INFO

with result_ptf
as(
SELECT PTF_PRODUCT_ID , Max(PTF_IDENTIFIER) as last_ptf
FROM QSYS2.PTF_INFO
WHERE (PTF_PRODUCT_ID = ‘5770999’ and substr(PTF_IDENTIFIER , 1 , 2) = ‘TL’ ) or
(PTF_PRODUCT_ID = ‘5770SS1’ and substr(PTF_IDENTIFIER , 1 , 2) = ‘TC’ ) GROUP BY PTF_PRODUCT_ID
)
select PTF_PRODUCT_ID, date(’20’ concat substr(LAST_ptf, 3, 2) concat ‘-01-01’) +
(dec(substr(Last_PTF , 4, 3)) – 1 ) days as last_date_ptf
from result_ptf
where date(’20’ concat substr(LAST_ptf, 3, 2) concat ‘-01-01’) +
(dec(substr(Last_PTF , 4, 3)) – 1 ) days < (current_date – 6 months)

3) Contrôle si groupes à télécharger, nécessite une connexion avec SYSTOOLS.GROUP_PTF_CURRENCY


select
cast(substr(PTF_GROUP_TITLE, 1, 50) as char(50)) as Nom_groupe,
PTF_GROUP_LEVEL_AVAILABLE as niveau
from systools.group_ptf_currency
where ptf_group_level_installed <> ptf_group_level_available

4) Contrôle si groupes à appliquer, nécessite un IPL avec QSYS2.GROUP_PTF_INFO

SELECT * FROM GROUP_PTF_INFO WHERE PTF_GROUP_STATUS not in
(‘INSTALLED’, ‘RELATED GROUP’, ‘NOT APPLICABLE’))

5) Contrôle du firmware, nécessite une connexion avec SYSTOOLS.FIRMWARE_CURRENCY

SELECT * FROM SYSTOOLS.FIRMWARE_CURRENCY
WHERE FW_CURRENTFIXPACK <> FW_RECOMMENDED_UPGRADE and +
FW_RECOMMENDED_UPGRADE is not null ) with data

Remarque

Il en existe sans doute d’autres, la limite c’est votre imagination …

, , , , Mise à jour Produits Open source sur votre IBMi

Vous connaissez l’outil ACS de gestion des packages OPEN SOURCE

Si vous décidez d’utiliser l’Open source vous vous rendrez compte qu’il faudra sans doute automatiser la mise à jour des Packages RPM par YUM.

Voici donc quelques éléments pour réaliser cette opération !

D’abord vous devrez vérifier que vous avez bien Yum installé sur votre machine, normalement il est là, ACS l’utilise.

Les logiciels open source sont installés dans le répertoire

/QOpenSys/pkgs/bin

sous QSH

faire un cd /QOpenSys/pkgs/bin

puis ls yum*
yum yum-builddep yum-debug-dump yum-groups-manager
yumdownloader yum-config-manager yum-debug-restore

$ Vous devez avoir le fichier yum

il est conseillé de mettre ce répertoire dans votre Path.
Vous avez un fichier .profile éditer le pour ajouter ces 2 lignes par exemple à la fin de votre fichier .profile :
PATH=/QOpenSys/pkgs/bin:$PATH
export PATH

Il est également conseillé pour des questions d’homogénéisation de votre système d’utiliser un répertoire /home/votreprofil qui est la valeur par défaut de votre profil utilisateur (paramètre HOMEDIR de votre USER IBMi) et votre .profile devrait s’y trouver

Attention si vous voulez que ça fonctionne dans tous les environnements votre fichier .profile doit être en CCSID 819 !

Maintenant voyons comment procéder pour automatiser ces opérations de mise à jour
vous devrez planifier une tache qui lancera un QSH

la commande à passer pour voir si des mises à jour sont disponibles
c’est > yum check-update
Pour se faciliter la vie on mettra cette information dans un fichier txt
yum check-update > majpackage.txt
Ce fichier comporte l’intégralité des mises à jours et même les obsolescences
pour se limiter au logiciel qu’on veut mettre à jour on peut faire un cat avec un grep, par exemple nous on veut les mises à jour pour le logiciel NODEJS

cat majpackage.txt | grep « node »

nodejs14.ppc64 14.17.5-1 ibm
$

On voit qu’on a une mise à jour à faire, vous pouvez alors envoyer un mail par la commande sndsmtpemm pour indiquer la mise à jour à faire.

ou faire la mise à jour directement

yum update nodejs14.ppc64 -y –enablerepo=ibm
-y pour indiquer que vous allez installer en batch !

Il est conseillé de mettre un fichier de log exemple

Vous pourrez analyser ensuite la log en cas de problème en principe le nettoyage étant fait à la fin et votre version continu à fonctionner !

Il suffit de faire un ou 2 programmes CLP ou scripts Unix et d’y intégrer ce qu’on vient de voir !

Une des problématiques, quand on fait du SQL, est d’identifier rapidement une requête qui serait trop gourmande.

Dans un post précédent j’indiquais comment avoir ces éléments en utilisant le cache SQL, mais ça peut être long pour une première analyse !

La TR5 version 7/4, TR11 version 7/3 apporte une nouvelle fonction table (QSYS2.ACTIVE_QUERY_INFO( )) qui va nous permettre de répondre à cette problématique !

page de référence IBM

https://www.ibm.com/docs/en/i/7.4?topic=services-active-query-info-table-function

Pour l’utiliser, vous devez avoir *JOBCTL dans votre profil ou être ajouté dans la fonction USAGE QIBM_DB_SQLADM .

Exemple :


Une demande qui donne à un instant donné, les 10 requêtes les plus consommatrices de votre IBMi

SELECT QUALIFIED_JOB_NAME as travail , query_type as type_requete, File_Name as fichier , Library_name as bibliotheque,
current_runtime as temps_execution , CURRENT_TEMPORARY_STORAGE as memoire_utilisee
FROM
TABLE(QSYS2.ACTIVE_QUERY_INFO())
where current_runtime is not null
ORDER BY current_runtime desc
fetch first 10 row only

Vous pourrez alors agir en ayant le nom du travail, et utiliser la vue ACS prévue à cet effet par exemple !

On indique le premier fichier spécifié dans la requête (vue ou table), attention QSQPTABL indique que c’est une fonction table.

, , Liste des jobqs utilisées sur votre IBMi

Vous avez sans doute un grand nombre de jobqs sur votre système, mais connaissez-vous réellement celles qui servent ?

Pour connaitre la liste des jobq utilisées, on va consulter les messages CPF11224 qui indiquent le début d’un travail et qui contiennent dans les données la jobq par laquellle ils sont arrivés

J’ai utilisé dans mon exemple de table dans qtemp, vous pouvez utiliser un with si vous préférez

Liste des jobqs utilisées

create table qtemp/lstjobqus as(
select distinct
cast(substr(message_tokens, 59, 10) as char(10)) as jobq,
cast(substr(message_tokens, 69, 10) as char(10)) as jobq_lib
FROM TABLE(qsys2.history_log_info(START_TIME => CURRENT TIMESTAMP –
30 days , END_TIME => CURRENT TIMESTAMP)) x
where message_id = ‘CPF1124’ ) with data

Liste des jobqs présentes sur le système

create table qtemp/lstjobq as (
SELECT OBJNAME as jobq, OBJLIB as jobq_lib
FROM TABLE(QSYS2.OBJECT_STATISTICS(‘ALL’, ‘JOBQ’)) ) with data

Liste des jobqs non utilisées

select a.jobq, a.jobq_lib from lstjobq as a exception join
lstjobqus as b on
a.jobq= b.jobq and a.jobq_lib = b.jobq_lib

remarque :

Avec cette liste vous pouvez faire du ménage et ne plus démarrer les sous-systèmes inutiles par exemple.