, 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

, 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 !

, , 5 astuces pour optimiser vos connexions ODBC.

On a souvent du mal a régler ODBC voici quelques points qui peuvent vous aider dans cette tache.
L’apport de la procédure SET_SERVER_SBS_ROUTING qui permet de router des jobs ODBC, par adresses IP ou utilisateurs à considérablement changer la donne.

Rappel sur la procédure SET_SERVER_SBS_ROUTING

Gestion par utilisateur

call qsys2.SET_SERVER_SBS_ROUTING(‘PLB’, ‘QZDASOINIT’ , ‘ODBC’)

pour activer la redirection

call qsys2.SET_SERVER_SBS_ROUTING(‘PLB’, ‘QZDASOINIT’ , NULL);

pour supprimer cette redirection

SELECT * FROM QSYS2.SERVER_SBS_ROUTING

Pour les redirections existantes par nom user

Gestion par adresse IP

Pour activer

CALL QSYS2.SET_SERVER_SBS_ROUTING(AUTHORIZATION_NAME => ‘*ALL’,
SERVER_NAME => ‘QZDASOINIT’,
IP_ADDRESS_START => ‘192.168.1.10’,
IP_ADDRESS_END => ‘192.168.1.30’,
SUBSYSTEM_NAME => ‘ODBC’)

Pour supprimer cette redirection

CALL QSYS2.SET_SERVER_SBS_ROUTING(AUTHORIZATION_NAME => ‘*ALL’,
SERVER_NAME => ‘QZDASOINIT’,
IP_ADDRESS_START => ‘192.168.1.10’,
IP_ADDRESS_END => ‘192.168.1.30’,
SUBSYSTEM_NAME => NULL);

pour voir les redirections existantes par adresses IP

SELECT * FROM QSYS2.SERVER_SBS_CONFIGURATION;

Voici quelques axes qui peuvent vous donner des idées

1) Séparer vos connexions en créant un sous-système spécifique

Ce qui permet une meilleur administration.
Vous pourrez router vos jobs par utilisateurs ou par adresse IP grâce à la procédure SQL SET_SERVER_SBS_ROUTING

CRTSBSD SBSD(VOTRESBS)
POOLS((1 *BASE))
TEXT(‘Sous-système pour job ODBC’)
vous pouvez indiquer le pool de base

un travail à démarrage automatique

ADDPJE SBSD(GODBC) PGM(QSYS/QZDASOINIT) INLJOBS(QZDASOINIT) JOBD(Qgpl/votrejobd) CLS(QSYS/votreclasse) user(votreuser)

et un poste de routage

ADDRTGE SBSD(VOTRESBS)
SEQNBR(9999)
CMPVAL(*ANY)
PGM(VOTREPGM)
CLS(VOTRECLASS)

2) Mettre un pool spécifique sur votre sous système

Ce qui permettra de réinitialiser votre cache entre 2 benchmarks.

POOLS((1 *SHRPOOL7))

3) Mettre une classe spécifique

Ce qui permettra de régler les priorités d’exécution sur la commande RTGE.
la classe par défaut est la QPWFSERVER , dupliquez la et ajustez les paramètres que vous désirez par CHGCLS.
Par exemple, les priorités.

4) Mettre une JOBD spécifique pour fixer le niveau de log

par exemple sur la commande ajout des travaux auto.
la jobd par défaut est la QDFTSVR , dupliquez la et ajustez les paramètres que vous désirez par CHGJOBD.
Par exemple le niveau de log.

5) Mettre un programme initial spécifique

Pour par exemple choisir le fichier QAQQINI pour les réglages SQL.
Le programme par défaut est QCMD , voici un exemple.
Par exemple, changer le fichier QAQQINI
PGM
CHGQRYA QRYOPTLIB(&LIB)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(‘Vous +
utilisez désormais QAQQINI de la +
bibliothèque, ‘ BCAT &LIB) MSGTYPE(STATUS)
ENDPM

Rappel :

Ici on traite pas de la traçabilité, il est important de voir qui peut faire de l’ODBC sur votre système.

Nous avons un logiciel GODBC qui peut vous aider dans cette tache ici : https://www.gaia.fr/produits/

, , Authentification par JWT (Json Web Token)

Pour mettre en place une authentification par JWT sur IBMi, on utilise l’API Qc3VerifySignature.

Le JWT

Il est composé de trois partie :

  • Un entête (header)
  • Une charge utile (payload)
  • Une signature numérique

Pour obtenir la signature, il faut tout d’abord encoder séparément le header et le payload avec BaseURL64, ensuite, on les concatène en les séparant d’un point.

On calcule enfin une signature d’après le header et le payload afin de garantir que le jeton n’a pas été modifié, d’après l’algorithme défini dans le header (RS256, HS256, HS512, …). Cette signature binaire est elle-même encodée ensuite en Base64URL.

On obtient ainsi le JWT : { header }.{ payload }.{ signature }

Préparation

Afin de tester cette API, il faut dans un premier temps générer une clé au format PEM en suivant les étapes ci-dessous :

  • openssl req -new -out monserveur.csr

Pour créer une demande certificate (.csr = certificat signing request)

Cela crée deux fichiers : monserveur.csr et privkey.pem

  • openssl rsa -in privkey.pem -out monserveur.key

Cela crée le fichier monserveur.key (clé privée sans le mot de passe)

  • openssl x509 -in monserveur.csr -out monserveur.cert -req -signkey monserveur.key

Cela crée le fichier monserveur.cert, qui est le certificat.

Paramètres d’appels de Qc3VerifySignature

  • Signature

La signature est fournie en BASE64, il faut la convertir en binaire pour la fournir à l’API

  • Longueur de signature

La longueur de la signature fournie après sa conversion

  • Donnée à contrôler

{ header }.{ payload } en ASCII

  • Longueur de la donnée à contrôler
  • Format de la donnée à contrôler
  • Description de l’algorithme

C’ ‘est une Data Structure qui contient les paramètres de l’algorithme.

  • Format de la description de l’algorithme
  • Description de la clé

C’ ‘est une Data Structure qui contient les paramètres de la clé.

  • Format de la description de la clé
  • Fournisseur de service cryptographique (0, 1 ou 2)
  • Nom du périphérique de cryptographie (à blanc si fournisseur 1 ou 0)
  • Code Erreur

C’est une Data Structure qui indique le code retour de l’exécution

Cinématique

Pour mettre en place l’appel à Qc3VerifySignature, nous avons défini les formats suivants :

  • Données             DATA0100 : La donnée est contrôlée sur sa valeur et sa longueur
  • Algorithme         ALGD0400 : Paramètres pour une opération de vérification de signature
  • Clé                      KEYD0600 : Certificat PEM (voir paragraphe « Préparation »)

Données

On crée la donnée à contrôler en concaténant header et payload, séparés d’un point, comme expliqué au paragraphe précédent.

Exemple :

ATTENTION : Il faut, pour être utilisable, que celle-ci soit en ASCII. Pour ce faire on utilise le programme système QDCXLATE qui permet de faire de la conversion de chaines de caractères grâce à des tables système.

Data Structure du format ALGD0400 (algorithme) :

cipher   INT(10) inz(50)                  // Code secret pour RSA , initialisé à 50

PKA      CHAR(1) inz(1)                  // PKCS bloc 01

filler   CHAR(3) inz(x’000000’)      // Réservé : ce champ doit rester NULL

hash     INT(10) inz(3)                   // Signature Algorithme de Hash 3=SHA256

Data Structure du format KEYD0600 (clé) :

keylen INT(10)                                       // Longueur du certificat PEM

filler CHAR(4) inz(x’00000000′)           // Réservé : ce champ doit rester NULL

key CHAR(4096) CCSID(65535)           // Certificat PEM en ASCII

Code Retour

L’appel de l’API avec les paramètres choisis , retourne un Data Structure ErrorCode décrite ci-dessous :

bytesProv  INT(10) inz( %size( ErrorCode ) ); // ou 64 pour voir MSGID

bytesAvail INT(10) inz(0);

MSGID CHAR(7);

filler CHAR (1);

data  CHAR (48);

Dans le cas où la signature est vérifiée, les valeurs retour sont les suivantes

  • BYTESPROV = 64                                          
  • BYTESAVAIL = 0                                          
  • MSGID = ‘       ‘                                       
  • FILLER = ‘ ‘                                            
  • DATA = ‘                                                ‘

Si la signature n’est pas vérifiée, les valeurs retour seront  :

  • BYTESPROV = 64                                          
  • BYTESAVAIL = 15                                         
  • MSGID = ‘CPF9DEF’                                       
  • FILLER = ‘0’                                            
  • DATA = ‘                                                ‘
, Télécharger PTF par FTPS

Téléchargement de PTF par FTP

Depuis mi-juillet 2021, ce n’est plus un choix le mode FTP simple en anonymous ne fonctionne plus, vous le voyez quand vous allez sur fix central le mode ftps ou sftp est par défaut .

Quand vous faites votre demande vous recevez désormais 3 mails au lieu de 2
– Le premier, pour vous dire que votre demande a été prise en compte.
– Le deuxième, pour vous indiquer les instructions à passer pour votre téléchargement
– Le Troisième (nouveau) qui contiendra le mot de passe que vous devrez utiliser

Comment faire désormais pour télécharger ces PTFs, on va voir 2 méthodes ?

1) A partir de Filezilla


Le logiciel connait le certificat racine Digicert, donc si vous vous connectez en SSL sur le site delivery01-bld.dhe.ibm.com, il vous propose la première fois de télécharger le certificat.

Et vous pouvez faire ensuite votre téléchargement .

2) A partir de votre partition IBMi

Il va vous falloir installer le certificat racine Digicert et le certificat du site dans DCM qui gère les certificats du coté IBMi.

Il est conseillé pour faire ses installations d’utiliser le logiciel QMGTOOLS.

Nous vous conseillons également de le mettre à jour pour éviter les problèmes.

ADDLIBLE LIB(QMGTOOLS)
GO MENU(MG)

  1. Check IBM for updated QMGTOOLS

Vous pouvez donc maintenant faire vos installations

Le certificat racine est disponible ici

https://www.ibm.com/support/pages/node/1077897

Vous devez dezipper vos fichiers et les copier dans l’IFS de votre IBMi par exemple /temp

Vous allez utilisez la première commande suivante
GETSSL pour le certifcicat racine
détail ici
https://www.ibm.com/support/pages/node/683901
et pour installer le certificat vous allez à nouveau utiliser la commande GETSSL avec le paramétrage suivant
QMGTOOLS/GETSSL IP(WWW.ECUREP.IBM.COM)
PORT(443)
AUTOIMP(Y)
STOREPWD(‘votre mot de passe’)

Si vous allez dans DCM vous avez un nouveau certificat installé QMG0001

Vous pouvez désormais vous connecter au site avec la commande suivante

FTP RMTSYS(‘delivery01-bld.dhe.ibm.com’) SECCNN(*SSL)

Attention cependant vous devrez forcer le mode par la commande FTP SENDEPRT

Voila, une fois que vous avez paramétré vous pouvez utiliser télécharger vos PTFs comme avant.

, , Comment repérer les requêtes SQL consommatrices sur votre IBMi

Comment voir à un instant donné, les requêtes les plus consommatrices de votre système ?

Vous êtes sans doute demandé comment connaitre les requêtes SQL qui consomment sur votre système, voici une solution.

Nous allons utiliser un dump du plan cache , vous pouvez aussi y accéder par ACS en quelques clics.

Voici une méthode qui va vous permettre d’automatiser et de trouver plus rapidement un problème.

Commencer par supprimer le fichier qui va servir à extraire le dump

Drop table gdata.dump_cache ;

Extrayez le cache dump dans votre fichier de travail

CALL QSYS2.DUMP_PLAN_CACHE (fileschema => ‘GDATA’, Filename => ‘DUMP_CACHE’) ;

Exécuter une requête sur ce fichier

Dans notre exemple, on sélectionne les jobs actifs sur le système, on sélectionne les requêtes SELECT et on trie par consommation descendante !

With job_act (JOB_NAME_SHORT, JOB_USER, JOB_NUMBER, JOB_USER_IDENTITY)
as (SELECT JOB_NAME_SHORT, JOB_USER, JOB_NUMBER,JOB_USER_IDENTITY
FROM TABLE (QSYS2.ACTIVE_JOB_INFO(DETAILED_INFO => ‘ALL’)) X
where substr(job_user_identity, 1, 1) <> ‘Q’)
Select qqjob, qquser, qvc102, qqjnum, qq1000, qqi6 as temps_execution
from gdata.dump_cache a join job_act b on
QQJOB = JOB_NAME_SHORT and QQUSER = JOB_USER and QQJNUM = JOB_NUMBER
where substr(QQ1000 , 1, 6) = ‘SELECT’
order by qqi6 desc

Vous pouvez changer vos critères de tri et de sélection, ici on est en mode pompier ?
Vous pouvez planifier cette requête et la faire tourner plusieurs fois par jour sur votre système en gardant le résultat ou les dump cache.

Nous avons packagé ce script pour faire une commande WRKSQLJOB que vous pouvez trouver ici !

https://github.com/Plberthoin/PLB/tree/master/GTOOLS


Vous retrouvez également une version un peu plus évoluée dans notre produit GODBC
https://www.gaia.fr/produits/

Les sites à connaitre, si vous voulez aller plus loin :

https://www.ibm.com/docs/en/i/7.4?topic=services-dump-plan-cache-procedure
https://www.ibm.com/docs/en/i/7.4?topic=cache-creating-snapshots

https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_74/pdf/rzajqpdf.pdf

, , , Renommer votre serveur LDAP Pour EIM

Vous utilisez la solution de single signon sur IBMi à base de kerberos et EIM

Votre serveur LDAP change de nom

Voici la liste des opérations à effectuer

Sur le serveur LDAP, vous n’avez rien à faire

Sur le serveur Kerberos

Vous avez 2 modifications à faire

Changer le nom du KDC sur l’onglet principal

Changer le nom du serveur de mot de passe sur l’onglet Serveur de mot de passe

Sur le serveur EIM

Sur le domaine changer le registre kerberos

Créer un nouveau registre utilisateurs de type source kerberos

et vous devrez ensuite sur chaque inscription remplacer votre source par le nouveau serveur

Ca peut être long si vous n’avez pas d’outils pour le faire

Notre produit GEIM peut vous aider dans cette tache !