, Les programmes de contrôle de validité sur IBM i

Il est possible d’effectuer un contrôle sur les paramètres passés dans une commande avant que le programme de traitement ne soit exécuté et d’envoyer un message de diagnostic au sein même de la commande en cas d’erreur.

Documentation IBM sur le sujet : https://www.ibm.com/docs/fr/i/7.5?topic=commands-validity-checking-program-cl-command

Introduction

Pour ajouter des contrôles sur les paramètres d’une commande (en plus des contrôles inclus dans celle-ci), on peut lui affecter un programme de contrôle de validité créé en amont.

Ce programme recevra tous les paramètres de la commande et on pourra y réaliser divers contrôles/tests avant l’exécution du programme de traitement. Il permet également d’envoyer des messages de diagnostic pour que l’utilisateur puisse ajuster la saisie de ses paramètres.

Pour assigner le programme de contrôle de validité à la commande, on indique son nom dans le paramètre VLDCKR de la commande CRTCMD (lors de la compilation de la commande).

Cas d’exemple

Prenons le cas où nous souhaitons créer une commande simple qui permettrait de récupérer une extraction CSV des ventes réalisées par un utilisateur sur une année donnée.

On souhaitera donc vérifier deux choses :

  • L’utilisateur doit exister sur la machine
  • L’année choisie doit être comprise dans une période de 10 ans avant l’année en cours

On commence donc par créer la commande GETUSRVEN qui recevra ces deux paramètres :

Une fois la commande prête on peut préparer le programme de contrôle de validité.
Pour cet exemple on créera un programme VGETUSRVEN (CLLE) :

Dans ce programme, on récupère les différents paramètres de la commande GETUSRVEN et la date actuelle en décimal.

On procède ensuite aux contrôles :

  • De l’utilisateur

Ici on utilise une suite de requêtes SQL pour vérifier que l’utilisateur existe sur la machine.

En cas d’absence d’utilisateur correspondant au paramètre de notre commande, on utilise la commande SNDPGMMSG (MSGTYPE *DIAG) avec le code message CPD0006 (conçu pour être utilisé dans des programmes de contrôle de validité).

On peut indiquer le message de notre choix dans le paramètre MSGDATA, mais attention, les quatre premiers caractères étant réservés il faut commencer son message par ‘0000’.

Une fois le message de diagnostic indiqué on réutilise la commande SNDPGMMSG (MSGTYPE *ESCAPE) avec le code message CPF0002 ce qui permettra d’indiquer à l’appelant que des erreurs ont été trouvées et de suspendre l’exécution de la commande.

  • De l’année choisie

On applique ici la même méthode que précédemment, en vérifiant que l’année n’est pas antérieure de 10 ans par rapport à l’année en cours, et qu’elle n’est pas supérieure.

On peut maintenant compiler le programme VGETUSRVEN (commande CRTBNDCL).

Enfin on compile la commande GETUSRVEN en spécifiant VGETUSRVEN dans le paramètre VLDCKR de la commande CRTCMD.

On peut maintenant essayer la commande, et constater les messages de diagnostic en cas de mauvaise saisie :

Il est également possible de voir quel programme de contrôle de validité est utilisé pour une commande (s’il y en a un) avec la commande DSPCMD CMD(nom de la commande) :

, SSH Alternative à PUTTY

Vous cherchez un client SSH et vous avez commencé à toucher les limites de PUTTY ?

Nous en avons testé plusieurs et nous avons bien aimé smarTTY

L’interface est simple et épurée, vous avez les icônes avec les sites que vous avez définis

Vous pouvez utiliser une connexion existante ou définir une nouvelle connexion
il vous demandera les éléments classiques, vous pourrez ensuite passer à un échange de clés pour vous identifier.

Vous avez le choix entre 2 interfaces, j’ai préféré l’interface plus classique, les plus jeunes préféreront le « SMART »

Dans l’interface SMART vous pouvez par exemple éditer directement les fichiers …

Vous pouvez alors saisir vos commandes et travailler comme sur n’importe quelle interface .

Le petit plus que nous avons aimé

C’est le bouton SCP qui est une alternative à Filezilla pour les échanges simples


Vous choisissez le fichier à télécharger


Vous avez une fenêtre qui apparait pour indiquer l’avancement du téléchargement
Vous pouvez suspendre, fermer la fenêtre

Voila , comme on dit à Gaia c’est simple et efficace, vous pouvez le tester

Remarque :

Pour l’intégrer dans ACS vous devez modifier le fichier AcsConfig.properties

Attention de vérifier que vous utiliser bien le bon fichier de configuration plus d’informations ici

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

En résumé vous lancez à partir de ACSBUNDLE.jar vous devrez l’ouvrir et l’éditer manuellement.

Pour se repérer dans un écran DSPF

Vous voulez savoir ou vous êtes positionné dans votre écran , pour appeler un programme liste par exemple.

Vous avez plusieurs solutions on va en présenter 4 ici

1) INFDS sur le fichier écran (DSPF)


Permet d’avoir la ligne et la position du curseur sur votre écran
dans votre programme
Dcl-F votre-ecran WORKSTN INFDS(FICHIERDS)

dcl-ds fichierDS;
ligne INT(3) POS(370); // curseur : ligne
colonne INT(3) POS(371); // curseur : colonne
end-ds;
..
if ligne = 4 and colonne = 22;

endif;

Avantage, tout ce passe dans le programme rien à faire dans l’écran

Nous vous conseillons d’utiliser un include pour normaliser l’utilisation de cette data structure

2) Nom de la zone active


dans votre écran
A RTNCSRLOC(&W_FMT &W_ZON)
A CF04(04)
A CA12(12)
A CF10(10)
A W_FMT 10A H TEXT(‘Nom du format’)
A W_ZON 10A H TEXT(‘Nom de la Zone’)
dans votre programme

if W_FMT = ‘FMT01’ and C1 = W_ZON = ‘NUMCLI’;

endif;

Avantage, vous avez directement le nom de la zone dans la quelle vous vous trouvez

3) Positionnement du curseur sur souris

Vous devez déclarer dans les dspf les zones
qui contiendront les informations
dans votre écran

A RTNCSRLOC(MOUSE &L1 &C1 &L2 &C2) A RÉCUPÉRATION DU CURSEUR
A L1 3S 0H
A C1 3S 0H
A L2 3S 0H
A C2 3S 0H
dans votre programme
if C1 = 4 and C1 = 22;

endif;

Avantage, Vous avez un exemple ici https://www.gaia.fr/utilisation-de-la-souris-dans-un-dspf/

c’est la seule solution pour gérer la souris

4) Divers sur sous fichier

Il y a un mot clé méconnu qui permet de connaitre le rang du SFL sans faire de readc
dans l’écran
A SFLCSRRRN(&R1))
A* RÉCUPÉRATION DU CURSEUR
A R1 3S 0H
dans votre programme
R1 CHAIN SFL01 ;

Avantage , sur les sélections simples c’est une alternative au readc

Remarque :

Vous avez sans doute d’autres solutions, mais celles ci sont simples et efficaces
Vous avez des mots clés pour les zones liés au aide, qui ne sont pas traités ici,
regardez plutôt la, https://www.gaia.fr/ajouter-de-laide-a-vos-dspf/

Merci à Fawzia pour son aide

, Zones avec informations confidentielles

Vous pouvez utiliser le catalogue base de données pour identifier vos informations sensibles

Pour cela vous allez utiliser les vues syscolumns de QSYS2 (norme IBMi) ou sqlcolumns de SYSIBM (norme DB2)

Vous pouvez rechercher toutes les zones qui contiennent (email, mail, RIB, IBAN, ETC..)

Dans notre exemple , on recherchera les zones IBAN dans toutes les tables en analysant :
Nom de zone SQL
Nom de zone IBMI
Entête de colonne
Texte de colonne

Sans différentiation de majuscule minuscule

Et on sortira la liste des droits public sur ces objets


— liste des fichiers avec une zone IBAN

— Avec un IBAN

SELECT COLUMN_NAME AS Zone,
IFNULL(COLUMN_HEADING, ' ') AS Entete,
IFNULL(COLUMN_TEXT, ' ') AS Text,
TABLE_SCHEMA AS bibliotheque,
TABLE_NAME AS fichier,
(SELECT OBJECT_AUTHORITY
FROM QSYS2.OBJECT_PRIVILEGES
WHERE SYSTEM_OBJECT_SCHEMA = TABLE_SCHEMA
AND OBJECT_NAME = TABLE_NAME
AND OBJECT_TYPE = '*FILE'
FETCH FIRST ROW ONLY) AS DROIT_public
FROM qsys2.syscolumns
WHERE COLUMN_NAME LIKE ('%IBAN%')
OR SYSTEM_COLUMN_NAME LIKE ('%IBAN%')
OR UCASE(COLUMN_HEADING) LIKE ('%IBAN%')
OR UCASE(COLUMN_TEXT) LIKE ('%IBAN%');

Conclusion :

Ca veut dire que toutes les tables avec *public à *USE sont visualisables par tous les utilisateurs de la machine.

Pour sécuriser vous devez le faire sur les fichiers
Soit
– Mettre en place des droits sur l’objet, attention l’utilisateur peut avoir droit à ce fichier quand il est dans l’application.
Soit
– Sécuriser un service d’accès par exemple ici ODBC, pour éviter un accès remote, (Fonctions usage ou programme d’exit sont les meilleurs solutions)

Bien sur si vous créez de nouvelle table vous pouvez crypter ces zones, ce qui la rendrait illisible à un utilisateur qui ne connait pas la clé

, , , Contrôler le nombre de paramètres passés à un programme CL – %PARMS() / CEETSTA
presence_flagSortie*INTVariable de retour : 1 ou 0
arg_numEntrée*INTPosition de la variable à tester

Remarques

Le compte des paramètres pour la arg_num commence à 1
La valeur de retour est un *INT pas un *LGL

Pour plus de détails

Documentation IBM – %PARMS() : https://www.ibm.com/docs/en/i/7.5?topic=procedure-parms-built-in-function
Documentation IBM – CEETSTA : https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_75/apis/CEETSTA.htm
, Surveillez l’état de vos bandes

Vous sauvegardez sur des bandes LTO, et vous voulez savoir si vos bandes sont en bon état,
pour en savoir plus sur les LTO : https://fr.wikipedia.org/wiki/Linear_Tape-Open

La durée de vie théorique d’une bande LTO est donnée pour 30 ans, mais elle dépend beaucoup des conditions d’utilisation et elles peuvent être défectueuses.
Certaines sociétés changent leurs bandes tous les 3 ans.

La bonne pratique c’est de le faire quand vous changez votre POWER en principe tous les 3 à 5 ans.

Mais il peut être important de contrôler l’état de vos supports pour éviter les mauvaises surprises.

Il n’existe pas de service SQL ni de sortie outfile pour l’instant.

Vous allez pouvoir faire une analyse par volume.

C’est vous qui indiquez le nom de volume quand vous formater votre support
INZTAP DEV(TAPXXX) NEWVOL(xxxxxx) vous disposez de 6 caractères

Exemple :
==>INZTAP DEV(TAP01) NEWVOL(LUNDI1) …

La commande qui va vous permettre d’analyser ces volumes est la commande PRTERRLOG
qui va vous générer un spool QPCSMPRT.

En principe vous avez un roulement de bande par semaine.

Vous pouvez contrôler le volume dans le lecteur avant de déclencher une sauvegarde, mais il n’est pas conseillé de la bloquer, vous pouvez remonter un message.

« * Attention bande du LUNDI trouvée dans le lecteur * »

Exemple

Vous devez connaitre le type de votre unité de bande pour utiliser cette commande.

==>DSPDEVD TAP01

==>PRTERRLOG TYPE(VOLSTAT) OUTPUT(PRINT)
VOLTYPE(3580)
VOLSTATTYP(*LIFETIME)

Si vous avez des erreurs il faut remplacer vos bandes.

Pour vous aider à automatiser cette remontée d’information, vous pouvez utiliser notre outil disponible ici :

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

Remarque :

Il est important :
d’avoir un plan de reprise d’activité suite à un crash
de tester une restauration partielle de temps en temps
de passer la cartouche de nettoyage tous les 6 mois

, Vue rapide du catalogue DB2

Comment à voir une vue rapide du catalogue de votre base de données ?

Voici une solution qui consiste à utiliser le centre de santé

Dans l’onglet « Schémas »
sur la base de donnée faites un clic droit
sélectionnez « Centre de santé »

Les fichiers du catalogue DB2 sont dans QSYS et ils commencent par QADB.

Commencez par mettre en place ce filtre et cliquez sur régénération

Vous allez utiliser 2 vues

« limites de taille » , qui vous permettra de voir le nombre d’enregistrements

Vous voyez par exemple dans QADBFILD la liste des zones de votre DB

« Activité« , qui vous donnera des informations sur les mises à jour sur vos fichiers.

Conclusion :


Vous avez une vue syntaxique de la taille et des mouvements de votre catalogue DB2.

L’exécution de la requête peut être un peu longue quand vous cliquez sur régénération.

Pour voir les informations contenues dans votre catalogue, utilisez les vues SYS* de QSYS2 ou de vos SCHEMAS.

, Connaitre la taille vos MTI

Vous désirez connaitre la taille occupée par les MTI (Maintained Temporary Index) sur votre machine, voici une Méthode.
Vous avez des buckets (espaces dans votre mémoire centrale) sur votre partition.

Vous avez un service QSYS2.SYSTMPSTG qui permet de voir ces buckets

La taille des MTI, c’est le bucket 14

Voici la requête pour voir cette taille

SQL SELECT CURRENT TIMESTAMP AS date_heure,
BUCKET_NUMBER,
GLOBAL_BUCKET_NAME,
BUCKET_CURRENT_SIZE,
BUCKET_LIMIT_SIZE
FROM QSYS2.SYSTMPSTG
WHERE bucket_number = 14

Pour diminuer cette taille il faut créer les index qu’Index advisor vous suggère.

Vous avez une fonction table qui vous indique les MTIs de votre système, QSYS2.MTI_INFO

Ceux qui concernent votre base de données doivent être construits

Ici ceux utilisés depuis une semaine sur la bibliothèque exploit !

SELECT *
FROM TABLE (
QSYS2.MTI_INFO(‘EXPLOIT’, ‘*ALL’)
)
WHERE LAST_BUILD_START_TIME > CURRENT DATE – 7 DAYS

Remarque :

Cet espace sera réutilisé par les autres Buckets

Vous pouvez faire un suivi de ces buckets , par exemple ceux de la base de données pour voir les grandes variations

La mise à jour du fichier d’index Advisor dépendra de la méthode utilisée pour générer l’index, n’hésitez pas à effacer des enregistrements dans le fichier QSYS2.SYSIXADV.

sinus cosinus tangentes