https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-12-04 20:10:212022-04-12 10:02:39Afficher un panel de groupe
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-11-28 11:17:412022-04-12 10:04:19Réplication de mot de passe
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/
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
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-11-19 15:06:082022-04-12 10:07:04Créer un menu UIM
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
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-11-16 13:15:342022-04-12 10:12:57Ajouter de l’aide à vos commandes
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-10-29 19:53:042022-04-12 10:16:25Tester les paramètres en CLP
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
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.
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-10-22 16:46:132022-04-12 10:20:28Nombre d’accès DB d’un travail
Dans le même temps, nous avons droit à un refresh des fonctions utilitaires.
Parlons donc de l’encodage/décodage base64 !
Différences entre les fonctions fournies :
Les fonctions n’ont pas le même nom pour éviter toute ambiguïté :
Dans SYSTOOLS : BASE64ENCODE et BASE64DECODE
Dans QSYS2 : BASE64_ENCODE et BASE64_DECODE
L’implémentation des nouvelles fonctions (QSYS2) est basée sur Axis (en C natif), contrairement aux fonctions historiques de SYSTOOLS en Java. L’empreinte mémoire est donc bien meilleure avec les fonctions de QSYS2.
Surtout, les paramètres diffèrent : dans la version SYSTOOLS, la taille des paramètres est très limitée, et nous sommes donc sur du VARCHAR jusqu’à 4Ko maximum encodé. Les nouvelles versions utilisent des CLOB et BLOB jusqu’à 2Go !
Usages
Données caractères
On utilise régulièrement l’encodage base64 pour transmettre une authentification par profil/mot de passe, par exemple une authentification http basic.
Les deux fonctions renvoient bien sur le même résultat :
Si vous utilisez un convertisseur en ligne, vous n’obtenez pas le même résultat :
La raison est simple : l’encodage base64 a pour objectif d’exprimer sous forme de caractères une donnée binaire. Le paramètre en entrée des fonctions QSYS2.BASE64_ENCODE et SYSTOOLS.BASE64ENCODE sont donc un BLOB (Binary Large Object) ou un VARCHAR avec CCSID 65535 (signifie pas de conversion).
La chaine de caractères ‘toto’ est donc transmise ici en EBCDIC et c’est la valeur binaire correspondante qui est encodée en base64.
Pour être conforme au standard : convertissez les chaines de caractères en UTF-8 :
Pour décoder des données, on utilise SYSTOOLS.BASE64DECODE et QSYS2.BASE64_DECODE :
Le résultat affiché diffère.
La aussi c’est un effet de bord du changement de type de paramètre, ET de la configuration de ACS :
La fonction de SYSTOOLS étant en VARCHAR, elle est interprétée dans le CCSID du travail. La fonction de QSYS2 renvoyant un BLOB, il n’y a pas de conversion directe possible en caractères.
La valeur binaire renvoyée est bien la même. Si l’on teste en passant par un fichier :
Données binaires
L’objectif premier est tout de même de pouvoir travailler sur des valeurs binaires.
On utilise une image sur l’IFS en tant que donnée binaire à encoder. L’image fait 158Ko, une valeur très raisonnable.
Pour faciliter la démonstration, on travaille étape par étape avec des variables SQL.
Pour lire le fichier image en binaire :
Script de test :
Les résultats semblent concordants :
Mais :
C’est le problème de la longueur des paramètres des fonctions de SYSTOOLS !
Dans l’historique :
On a un SqlCode à 0 mais un SqlState en classe ‘01’ !
On décode notre image :
Les fichiers d’origine et le fichier encodé/décodé sont bien identiques !
Les nouvelles fonctions, au-delà de l’implémentation en C, nous apportent la possibilité d’encoder et décoder des « documents » (image, pdf …à) en base64. Très utile pour faire transiter des informations binaires dans nos web services par exemple !
https://www.gaia.fr/wp-content/uploads/2017/02/team1.png600600Nathanaël Bonnet/wp-content/uploads/2017/05/logogaia.pngNathanaël Bonnet2021-10-20 12:46:192022-04-12 10:37:22Base64 en SQL avec les nouvelles fonctions de QSYS2 !
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 !
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-09-23 16:27:352022-04-12 11:11:22Mise à jour Produits Open source sur votre IBMi
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 !
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.
Supposons que vous utilisiez le job scheduler de l’IBMi, (WRKJOBSCDE), si vous utilisez AJS seul le fichier de départ change mais la démarche reste la même.
Notre méthode ne marche que pour le jour courant. On va utiliser la date de prochaine soumission égale à la date du jour dans notre fichier SCHEDULED_JOB qui contient les jobs planifiés .
Vous devez planifier un job tous les matins à 0h et 2 minutes dans la file d’attente QCTL pour être sûr de le faire passer
Ce job aura une requête de ce type qui créera une table plandujour
create table plandujour as ( Select SCHEDULED_JOB_NAME, SCHEDULED_TIME, ifnull(DESCRIPTION, » ») as description from QSYS2.SCHEDULED_JOB_INFO where NEXT_SUBMISSION_DATE = current date and substr(SCHEDULED_JOB_NAME, 1, 1) <> »Q » and status <> »HELD » order by SCHEDULED_TIME ) with data +
Vous avez ainsi tous les jobs prévus pour la journée par heure de planification.
Maintenant nous allons voir comment suivre le déroulement des ces travaux
Pour suivre vos travaux on va utiliser la fonction table suivante HISTORY_LOG_INFO
exemple pour avoir les jobs du jour
SELECT * FROM TABLE(QSYS2.HISTORY_LOG_INFO(CURRENT DATE)) X
Chaque job qui tourne sur le système va générer au moins 2 messages
un CPF1124 Travail …/…/… démarré le un CPF1164 Travail …/…/… arrêté le
donc si votre travail n’a pas tourné vous n’avez aucun message si votre travail tourne vous avez un CPF1124 si votre travail est terminé vous avez un CPF1164
Vous pouvez déjà suivre l’avancement grâce à la zone MESSAGE_TIMESTAMP et avoir une durée entre les 2 messages
Remarque :
pour savoir si votre travail c’est terminé normalement c’est un peu plus compliqué, vous devrez analyser le code fin par exemple dans la zone MESSAGE_TEXT.
code fin 0 indiquant une fin normale du traitement
Un exemple de requête (à améliorer)
pour les codes fin , pour les jobs qui débordent de la journée etc…
WITH logdujour (mgr_id, mgr_name, mgr_dept) AS( SELECT * FROM TABLE(QSYS2.HISTORY_LOG_INFO(CURRENT DATE)) X) select a.SCHEDULED_JOB_NAME as nom_travail, a.SCHEDULED_TIME as HEURE_prev , ifnull(b.MESSAGE_TIMESTAMP, »1911-11-11-00.00.00.00000 ») as Heure_debut , ifnull(c.MESSAGE_TIMESTAMP, »1911-11-11-00.00.00.00000 ») as heure_fin, ifnull(c.SEVERITY, »99 ») as code_sev , ifnull(b.FROM_JOB, » ») as name_JOB from plandujour a Left outer join logdujour b on B.MESSAGE_ID = »CPF1124 » and B.FROM_JOB like( »% » concat A.SCHEDULED_JOB_NAME concat »% ») Left outer join logdujour c on C.MESSAGE_ID = »CPF1164 » and C.FROM_JOB like( »% » concat A.SCHEDULED_JOB_NAME concat »% »)
Vous pouvez planifier un job chaque soir qui vous envoie un récapitulatif de la journée, ou que les jobs en erreur par exemple.
Vous pouvez historiser ces données si vous avez besoin de consolider un suivi, etc …
Exemple d’un outil packagé utilisé dans notre centre de service pour suivre le planning quotidien:
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2021-09-01 10:30:302022-04-12 11:22:38Comment suivre son plan de production quotidien ?