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

, , , QCMDEXC en Fonction SQL

Depuis la TR4 de la version V7R4, vous pouvez utiliser la fonction QCMDEXC

C’est l’occasion de faire un rappel sur les différents usages disponibles jusque la

1 ) C’est une API (un programme) que vous pouvez appelez depuis un programme RPG ou CLP

en RPGLE

Dcl-Pr Exec_Commande QCMDEXC ExtPgm(‘QCMDEXC’);
Cmd Char(3000) Const;
CmdLen packed(15:5) Const;
End-Pr;

Dcl-S Gbl_Cmd Char(3000);

Gbl_Cmd = ‘Votre commande’ ;

Exec_commande(Gbl_Cmd : %len(Gbl_Cmd)) ;

En CLLE

PGM
DCL &CMD *CHAR 300
DCL &LEN *DEC (15 5)

CHGVAR &CMD (‘VOTRE COMMANDE’)
CHGVAR &LEN %LEN(&CMD)
CALL QCMDEXC (&CMD &LEN)

2) C’est une procédure SQL

call qcmdexc(‘votre commande’)

en SQL embarqué

Dcl-S Gbl_Cmd Char(3000);

call qcmdexc(:Gbl_Cmd)

3) C’est une Fonction SQL à partir de la TR4

Réorganisation des fichiers BD

SELECT qcmdexc(‘RGZPFM FILE(‘ concat
trim(substr(TABLE_SCHEMA, 1 , 10))
concat ‘/’ concat
substr(TABLE_NAME, 1 , 10) concat ‘)’) as résultat
FROM systables WHERE TABLE_SCHEMA =
‘GDATA’ and FILE_TYPE = ‘D’

la fonction renvoi 1 si ok et -1 si ko

Conclusion :
Vous avez un aperçu des possibilités qcmdexc sur la machine, à vous de jouer !

, , , Surveillez vos requêtes SQL sur votre #IBMi

Il est possible que vous ayez des doutes sur les performances de vos requêtes SQL, voici comment avoir une idée rapide de ce qui tourne

On va utiliser ACS
dans Base de données choisir
SQL Performance center

Vous avez un onglet Affichage des instructions

Vous choisissez le filtre à appliquer, ici on choisit les actives, vous pouvez être beaucoup plus pertinent en limitant votre choix.

Une fois que vous avez repéré une requête candidate, il vous suffit de faire un clic droit sur celle ci et vous pouvez lancer directement Visual Explain, qui vous expliquera le comportement de cette requête, vous pourrez alors faire les ajustements qui s’imposent

Le résultat dans V-E

PS:
Le principal critère de performance sur SQL, c’est les index, pensez à surveiller les suggestions faites par Index Advisor

Une des nouveautés de TR4 c’est Query Supervisor

L’idée est de limiter les requêtes selon certain critères (de temps d’exécution, d’espace temporaire occupé etc… )
Jusqu’à présent c’était pas toujours simple et un peu binaire

Ajout d’un seuil à contrôler

Se fait par la procédure QSYS2.ADD_QUERY_THRESHOLD

Exemple

CALL QSYS2.ADD_QUERY_THRESHOLD(THRESHOLD_NAME => ‘Seuil’,
THRESHOLD_TYPE => ‘CPU TIME’,
THRESHOLD_VALUE => 1,
INCLUDE_USERS => ‘PLB’,
DETECTION_FREQUENCY => 60)

Vous devez indiquer :
– Un nom ici Seuil
– Le seuil à contrôler
– Une valeur pour ce seuil
– Un filtre d’inclusion ou d’exclusion ici inclusion du profil PLB
– Un délai de rafraichissement en seconde

Vous avez une vue qui permet de voir les seuils définis sur votre partition

C’est la vue QUERY_SUPERVISOR

exemple

voir tous les seuils définis pour Query supervisor

SELECT *
FROM QSYS2.QUERY_SUPERVISOR ORDER BY THRESHOLD_TYPE, THRESHOLD_VALUE DESC;

;

Vous pouvez indiquer un programme d’exit QIBM_QQQ_QRY_SUPER

ci joint un exemple basique pour expliquer ce qui ce passe

pgm parm(&qrysupdta &returncod)
/* Paramètres */
dcl &qrysupdta *char 1024
dcl &returncod char 8

/* Variables de Travail */

DCL VAR(&SIZ_HEADER) TYPE(CHAR) LEN(4) +
STG(DEFINED) DEFVAR(&qrysupdta 1)

DCL VAR(&FMT_NAME) TYPE(CHAR) LEN(8) +
STG(DEFINED) DEFVAR(&qrysupdta 5)

DCL VAR(&JOB_NAME) TYPE(CHAR) LEN(10) +
STG(DEFINED) DEFVAR(&qrysupdta 13)

DCL VAR(&JOB_USER) TYPE(CHAR) LEN(10) +
STG(DEFINED) DEFVAR(&qrysupdta 23)

DCL VAR(&JOB_NUMBER) TYPE(CHAR) LEN(6) +
STG(DEFINED) DEFVAR(&qrysupdta 33)

DCL VAR(&SUBSYSTEM) TYPE(CHAR) LEN(10) +
STG(DEFINED) DEFVAR(&qrysupdta 39)

DCL VAR(&Usr_name) TYPE(CHAR) LEN(49) +
STG(DEFINED) DEFVAR(&qrysupdta 23)

DCL VAR(&QRYPLANID) TYPE(CHAR) LEN(08) +
STG(DEFINED) DEFVAR(&qrysupdta 67)

DCL VAR(&THR_NAME) TYPE(CHAR) LEN(60) +
STG(*DEFINED) DEFVAR(&qrysupdta 75)
dcl &msg *char 2056
chgvar &msg (&JOB_NAME *cat ‘/’ *cat &JOB_USER *tcat ‘/’ *tcat +
&JOB_NUMBER *bcat ‘Arreté pour dépassement, ‘ *bcat &THR_NAME)
SNDUSRMSG MSG(&MSG)
/* on force l’arret de la requete */
CHGVAR VAR(%BIN(&returncod 1 4)) VALUE(1)
ENDPGM
Pour en savoir plus le lien ici

https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/xqrysuper.htm

Le message ne cas de débordement

Le message remonté depuis notre programme d’exit

Vous pouvez voir vos statistiques de sollicitation dans ACS SQL performance center

Vous pouvez enlever vos seuils

c’est la procédure REMOVE_QUERY_THRESHOLD

CALL QSYS2.REMOVE_QUERY_THRESHOLD(THRESHOLD_NAME => ‘Seuil’);

vous indiquez le nom que vous avez donné à votre seuil

Conclusion

C’est une bonne nouveauté pour les administrateurs DB2

On peut regretter l’absence du procédure de change qui permettrait de revenir sur les paramètres de définition.

, , Passage SQLSTATE en SQL

Depuis la TR4 de la V7R4, vous pouvez passer votre propre SQLSTATE ce qui est très intéressant sur les triggers avants par exemple.
Vous pouvez avoir la vraie raison du refus
C’est un petit pas pour SQL, mais un grand pas pour le développeur SQL

Exemple

Création de la table

CREATE OR REPLACE TABLE ARTICLE (
NOMART CHAR(30) CCSID 297 NOT NULL DEFAULT  » ,
NUMART DECIMAL(6) ,
DESIGN CHAR(25) CCSID 297 NOT NULL DEFAULT  » ,
PRXUNI DECIMAL(6)
)
Insertion d’un article (Je sais, je surfe sur l’actualité du moment)
INSERT INTO ARTICLE VALUES(‘Maillot Benzema’, 19,
‘Maillot Benzema EDF’, 166)

tentative de mise à jour

UPDATE ARTICLE SET PRXUNI = 167 WHERE NUMART = 19

Création d’un trigger de controle
ici on teste que l’utilisateur est bien ‘DBADMIN’ pour pouvoir modifier le tarif

CREATE OR REPLACE TRIGGER ARTICLETRG
BEFORE UPDATE OF PRXUNI ON ARTICLE
FOR EACH ROW
BEGIN ATOMIC
IF CURRENT USER <> ‘DBADMIN’ THEN
SIGNAL SQLSTATE ‘DB999’
SET MESSAGE_TEXT = ‘UTILISATEUR NON AUTORISÉ’;
END IF;
END;

Par SQL

Maintenant dans un programme RPGLE

On va utiliser get diagnostics pour récupérer le SQLTATES et le Message associé

**free
dcl-s MessageText char(45) ;
dcl-s ReturnedSQLState char(5);
exec sql SET OPTION COMMIT = *NONE ;
// test mise à jour trigger
exec sql
UPDATE ARTICLE SET PRXUNI = 167 WHERE NUMART = 19 ;
exec sql
get diagnostics condition 2
:ReturnedSQLState = RETURNED_SQLSTATE ,
:MessageText = MESSAGE_TEXT;
dsply (ReturnedSQLState + ‘ ‘ + MessageText) ;
*inlr = *on ;

Vous lancez le programme

Conclusion :

c’est une nouveauté qui devrait simplifier le contrôle des triggers est donc leur usage.

, , Conversion d’une OUTQ en PDF par GENERATE_PDF

Depuis la TR4 de la V7R4,vous avez une fonction qui génère un PDF à partir d’un spool.

Voici une requête qui convertit les spools de votre outq en PDF

On va créer une variable globale pour indiquer le répertoire de génération des PDF

CREATE OR REPLACE VARIABLE QGPL.REPERT_PDF VARCHAR(30)DEFAULT ‘/home/PDF/’

Exécution de la requête sur votre outq

SELECT SPOOLED_FILE_NAME, JOB_NAME, FILE_NUMBER ,
SYSTOOLS.GENERATE_PDF(JOB_NAME => JOB_NAME ,
SPOOLED_FILE_NAME => SPOOLED_FILE_NAME ,
SPOOLED_FILE_NUMBER => FILE_NUMBER,
PATH_NAME => REPERT_PDF concat current date concat ‘_’ concat regexp_replace(JOB_NAME, ‘/’,  ») concat ‘_’ concat
SPOOLED_FILE_NAME concat ‘_’ concat FILE_NUMBER concat ‘.pdf’)
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC WHERE OUTPUT_QUEUE_NAME = ‘votre_outq’

Le résultat vu par un WRKLNK


C’est juste un exemple, à vous de l’ajuster

, 5 choses à savoir sur le CPYF

Vous voulez copier un fichier vers un autre, une des alternatives est d’utiliser SQL, en utilisant une instruction du genre insert into ficcible select * from ficsource.
Il existe d’autres méthodes que les plus anciens connaissent bien, mais les nouveaux un peu moins.
C’est la commande CPYF voici quelques utilisation à connaître

1) Les sélections

Sélection d’un nombre d’enregistrement
Paramètres
FROMRCD
TORCD
exemple les 100 premiers
FROMRCD(1)
TORCD(100)

Sélection sur des valeurs de clé
FROMKEY
TOKEY
exemple les clés de 0001 à 0002
FROMKEY(1 (0001))
TOKEY(1 (00002))

Sélection sur des caractères d’un format
INCCHR RCD Exemple les enregs qui OUI en position 15 INCCHAR(RCD 15 *EQ ‘OUI’)

Sélection des avec des relations
INCREL
Exemple les enregistrements valides et avec une date de référence > ‘20200101’
INCREL((*IF VALIDE *EQ ‘OUI’) (*AND DATEREF *GT ‘20200101’))

2) Les performances

La plupart du temps un CPYF est plus rapide qu’une copie par SQL

Quand on copie un fichier qui a des clés, pour améliorer les performances
on peut indiquer, FROMRCD(1) au lieu de FROMRCD(*START) , la copie se fera sans tenir compte de l’index, et le gain est d’environ la moitié.

3) Les ajustements de zones


Paramètre FMTOPT
utilisez les 2 paramètres suivants pour que vos nouvelles zones soient initialisées et que celle qui ont changé soient recadrées
FMTOPT(*MAP *DROP)

4) Les messages d’erreur


Vous devez monitorer, votre commande CPYF, CPF2800 CPF2900 CPF3100
Avant de copier, vérifier si votre fichier source contient des enregistrements
DCL &nbr *dec 10
RTVMBRD SOURCE NBRRCD(&nbr)
if cond(&nbr *gt 0) then(do)
cpyf …
enddo

5) Formater à l’exécution


Pour améliorer le paramétrage et l’administration vous pouvez construire la commande CPYF dynamiquement

dcl &cmd *char 1024

chgvar &cmd (‘cpyf *bcat ……)
call qcmdexc (&cmd %len(&cmd))

Conclusion :

Le CPYF permet de nombreuses formes de copies et son usage est indispensable !

, Utiliser SNMP pour superviser votre IBM i.

Sur votre partition SNMP agent est disponible et sa mise en œuvre est très simple
(tout du moins en version snmp1) , Si vous décidez de continuer avec cette solution il est recommandé de passer en SNMP3

SNMP (Simple Network Management Protocol) RFC 1157

C’est un protocole simple qui permet de superviser vos éléments réseaux

https://www.commentcamarche.net/contents/537-le-protocole-snmp

Il y a trois éléments à connaitre (oui je sais 4, je ne parlerai pas ici de la communauté)
L’agent c’est celui qui va collecter les informations à mettre à dispo
La MIB (Management Information Base) c’est la description des informations extraites
Un manager de type console de supervision par exemple CENTREON, ou un logiciel de supervision réseau type PRTG (Paessler Router Traffic Grapher), c’est celui qui va interpréter les informations reçues et les consolider

Pour faire la mise en œuvre

Vous devez démarrer SNMP sur votre partition , par Navigator for i , ou par STRTCPSVR *SNMP

Dans Navigator for i

en 5250

Vous devez avoir ensuite un manager , si vous n’en avez pas déjà un disponible (CENTREON par exemple)

par exemple check_mk disponible ici https://checkmk.com , l’installation se fait en NEXT, NEXT

Vous devez ensuite paramétrer votre IBM i

Et voila le résultat, vous avez les principales informations comme la taille disque occupée par exemple

Quelques liens

https://www.ibm.com/support/pages/ibm-i-snmp-overview

https://www.ibm.com/support/pages/configuring-snmpv3-ibm-i

, 5 contrôles rapides par SQL

SQL service vous simplifie l’administration au quotidien, voici quelques contrôles que vous pouvez automatiser pour être proactif

1) Les logiciels en erreurs

SELECT PRODUCT_ID , PRODUCT_OPTION, TEXT_DESCRIPTION, LOAD_ERROR, SYMBOLIC_LOAD_STATE, COMPATIBLE, SUPPORTED
FROM QSYS2.SOFTWARE_PRODUCT_INFO
WHERE LOAD_ERROR = ‘YES’
or SYMBOLIC_LOAD_STATE = ‘DAMAGED’
or (COMPATIBLE = ‘NO’ and SUPPORTED = ‘NO’)

Compatible et supported ne sont pas forcément bloquants

2) Les logiciels qui expirent dans un mois

SELECT ‘Expire dans un mois’ AS STAtUS, PRODUCT_ID , PRODUCT_TEXT FROM QSYS2.LICENSE_INFO
WHERE LICENSE_EXPIRATION between (CURRENT DATE + 1 month) and current date
union
SELECT ‘Expiré’ AS STAtUS, PRODUCT_ID , PRODUCT_TEXT FROM QSYS2.LICENSE_INFO
WHERE LICENSE_EXPIRATION < CURRENT DATE ;

3) Les PTFs en erreur

SELECT PTF_PRODUCT_ID, PTF_IDENTIFIER
FROM QSYS2.PTF_INFO A
WHERE PTF_LOADED_STATUS = ‘DAMAGED’

4) Les certificats qui expirent dans 1 mois

Vous devez connaitre le mot de passe de votre magasin
ensuite il vous faudra le passer à votre requete

le choix ici est d’utiliser une variable globale (attention à sécuriser)

CREATE VARIABLE VOTRBIB/PASSWORD_CERTIF VARCHAR(32);
SET VOTRBIB/PASSWORD_CERTIF = ‘votre mot de passe’;

SELECT ‘Expire avant un mois’ as status, CERTIFICATE_LABEL, VALIDITY_END FROM TABLE(QSYS2/CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=> VOTRBIB/PASSWORD_CERTIF))
WHERE VALIDITY_END between (CURRENT DATE + 1 MONTH) and current date
union
SELECT ‘Expiré’ as status, CERTIFICATE_LABEL, VALIDITY_END FROM TABLE(QSYS2/CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=> VOTRBIB/PASSWORD_CERTIF))
WHERE VALIDITY_END < CURRENT DATE ;

5) Les Problèmes en cours


C’est la liste des incidents ouverts par le système sur vos partitions, il n’y a pas encore de vue SQL, vous devez générer la table

cl: DSPPRB OUTPUT(*OUTFILE) OUTFILE(QTEMP/LSTPRB) ;
SELECT PBID, PBSEV, PBSTAT, PBDESC, PBDATO, PBTIMO FROM lstprb

Il existe bien d’autres contrôles que vous pouvez automatiser et que vous pourrez automatiser, les TR apportant de nouvelles informations à chaque fois !