, , Rechercher dans l’IFS de votre IBMi

Il peut vous arriver de vouloir rechercher une chaine de caractères dans votre IFS voici comment vous pouvez faire en utilisant SQL service .

1) Recherche d’un nom fichier sur une chaine

SELECT cast(substr(PATH_NAME , 1 , 132) as char(132)) as PATH_NAME
FROM TABLE(IFS_OBJECT_STATISTICS(
START_PATH_NAME => ‘/HOME/PLB’ ,
OBJECT_TYPE_LIST => ‘*ALLSTMF’))
where ucase(PATH_NAME) like (‘%PRO%’)

Ici, recherche PRO dans le nom du fichier du répertoire /HOME/PLB

2) Recherche d’une chaine dans les fichiers

Création d’un fichier résultat !

CREATE OR REPLACE TABLE RETURN_TABLE
(STMF_NAME char(100),
LINE_NUMBER decimal(5 , 0),
LINE varchar(132))

Recherche de la chaine dans tous les fichiers

begin
for
SELECT PATH_NAME as IFS_PATH_NAME
FROM TABLE(IFS_OBJECT_STATISTICS(
START_PATH_NAME => ‘/HOME/PLB’ ,
OBJECT_TYPE_LIST => ‘*ALLSTMF’))
do
INSERT INTO RETURN_TABLE
SELECT IFS_PATH_NAME ,
LINE_NUMBER ,
cast(substr(LINE , 1 , 132) as char(132))
FROM TABLE(IFS_READ(
PATH_NAME => IFS_PATH_NAME))
WHERE UPPER(LINE) like ‘%’ concat ‘PRO’ concat ‘%’ ;

end for;
end

Ici, recherche PRO dans les fichiers du répertoire /HOME/PLB

Attention

Ces recherches sont très consommatrices elles doivent être soumises en batch

Conclusions :


Ça peut vous aidez dans vos recherches, mais attention au nombre de fichiers à scanner.
Si vous êtes amené à faire régulièrement ce type de recherche, préférer la mise en œuvre de OMNIFIND

Si vous voulez l’exemple en fonction table il est ici :

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

, 5 Choses (expertes) sur la gestion des mots de passe

1) Crypter le mot de passe

Voici quelques informations complémentaires sur la gestion de vos mots de passe qui sont un peu plus compliquer à mettre en œuvre mais qui peuvent vous éviter des problèmes et vous faciliter la gestion .


Par défaut les mots de passe circulent en clair sur votre réseau et avec TRCCNN sur L’IBMi ou en utilisant un outil réseau par exemple, wireshark vous pouvez voir le mot passe.
La solution est donc de passer en SSL.
Voici les étapes à réaliser :

  • Vous devez créer un certificat autosigné en utilisant DCM

  • Indiquer les applications qui seront protégées par ce service

  • Indiquer sur le client que la connexion se fait en TLS

  • La première connexion vous demandera d’accepter d’échanger avec le site distant est par la suite tous vos échanges seront cryptés

2) Supprimer les mots de passe


La volonté est de plus pour éviter la prolifération des mots de passe d’aller vers du SSO, ce qui simplifierait la gestion des mots de passe utilisateurs.
Sur l’IBMi la solution à mettre en œuvre c’est Kerberos qui s’appuiera sur votre AD Windows, pour en savoir plus regardez ici https://blog.devensys.com/kerberos-principe-de-fonctionnement/
Vous devrez alors gérer un annuaire sur votre IBMi qui s’appelle EIM pour en savoir plus, regardez ici https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzalv/rzalvmst.htm
dans cette annuaire vous aurez toutes les correspondances entre vos logins IBM i et Windows, vous pouvez également utiliser kerberos pour sécuriser vos accès entre partitions IBMi, FTP par exemple .

3) Mise en place d’un programme de validation

Si les règles de contrôle de mot de passe ne suffisent pas vous pouvez indiquer un programme complémentaire.
Si vous êtes en niveau de mot de passe 1 ou 0 valeur système QPWDLVL, vous pouvez indiquer un programme dans la valeurs système QPWDVLDPGM voici un exemple

PGM (&NEWPWD &OLDPWD &sts &usrprf)
DCLPRCOPT USRPRF(OWNER) / Programme de controle de mot de passe / / Il est déclaré par la valeur système QPWDVLDPGM / / PWDLVL Doit être à Zéro ou à 1 / DCL VAR(&NEWPWD) TYPE(CHAR) LEN(10)
DCL VAR(&OLDPWD) TYPE(*CHAR) LEN(10)
dcl &sts *char 1 /* résultat du controle / / 0 ok / / 1 pas ok / DCL VAR(&USRPRF) TYPE(CHAR) LEN(10)
/* Renvoyer ‘0’ si ok dans tous les cas */
chgvar &sts ‘0’
endpgm

Si le niveau de mot de passe est 2 ou 3, vous devrez utiliser un programme exit QIBM_QSY_CHK_PASSWRD , ou QIBM_QSY_VLD_PASSWRD vous pouvez ajouter votre programme par WRKREGINF puis option 8.

d/INCLUDE QSYSINC/QRPGLESRC,ECHKPWD1
dcl-s old ucs2(128) based(oldPtr) ;
dcl-s new ucs2(128) based(newPtr) ;
dcl-s old2 ucs2(128) based(oldPtr) ;
dcl-s new2 ucs2(128) based(newPtr) ;

dcl-pi *N ;
P_Buffer char(1024) ;
P_status char(1) ;
end-pi ;

ECHQCPI00 = P_Buffer;

oldPtr = %addr( P_Buffer ) + ECHOTOP ;
newPtr = %addr( P_Buffer ) + ECHOTNP ;
old2 = %subst( old : 1 : ECHLOOP * 2 ) ;
new2 = %subst( new : 1 : ECHLONP * 2 ) ;
// Votre contrôle
// si ok on renvoit ‘0’ si Ko on renvoit KO
P_status = ‘0’ ;
*inlr = *on ;

attention les mots de passe sont en UCS2, et le mot de passe old est toujours à *NOPWD

Le programme ne se déclenchera que si les règles de contrôle de mot de passe sont vérifiés avant

Ces programmes devront être compiler en adoption de droit par rapport à QSECOFR

4) Mettre en place un rendu de mot de passe automatique


Il peut être important de faciliter le rendu de mot de passe, un peu comme sur internet avec le bouton mot de passe oublié.
le principe est le suivant :
il faudra avoir un fichier qui comporte à minima l’utilisateur IBMi et le mail pour faire le lien

vous devrez avoir un programme en CLLE par exemple
/* 1 récupération du mail* /

call pgm(rtvmail &usr &mail )

/* 2 calcul du mot de passe */

chgvar &PWD …….

/* 3 modification du mot de passe * /

CHGUSRPRF USRPRF(&USR ) PASSWORD(&PWD ) + PWDEXP(YES) STATUS(ENABLED)

/*6 envoi du nouveau mot de passe */
CHGVAR VAR(&NOTE) VALUE(‘Votre nouveau mot de passe +
est, ‘ *BCAT &PWD *BCAT ‘, vous devrez le +
changer à la première utilisation’)
SNDSMTPEMM RCP((&MAIL)) SUBJECT(‘Mot de passe perdu’) +
NOTE(&NOTE)

/* 5 log de l’information */
SNDMSG MSG(‘Mot de passe pour l »utilisateur’ *BCAT +
&USR *BCAT ‘réinitialiser par’ *BCAT +
&USRE) TOMSGQ(*HSTLOG)

Ce programmes devra être compiler en adoption de droit par rapport à QSECOFR

Attention,
vous pouvez en fonction de votre organisation, envoyer un mail au responsable , etc…
vous pouvez lancer ce programme par un autre utilisateur qui fera la demande
vous pouvez, et c’est le mieux, faire une page web sur votre IBMi, PHP, NODEJS, Autres qui fera cette demande
Il est conseillé malgré tout de bien suivre ces opérations de rendu de mot de passe

5) Auditer les violations de mot de passe


Vous pouvez tracer les erreurs de mot de passe, pour faire ça sur l’IBMi, vous devez mettre en place l’audit
C’est la valeurs système QAUDLVL vous devez au moins indiquer *AUTFAIL
C’est les codes PW qui vont indiquer une erreur de mot de passe
Vous pouvez avoir un suivi en analysant les postes de journaux exemple
DSPJRN JRN(QAUDJRN) JRNCDE((T)) ENTTYP(PW)
Vous pouvez être proactif en mettant en place une solution IDS
En utilisant un programme d’exit de journal par exemple :

RCVJRNE JRN(QAUDJRN) EXITPGM(VOTREBIB/VOTREPGM) RCVRNG(*CURCHAIN) +
FROMENTLRG(poste de début) +
JRNCDE((T)) ENTTYP(‘PW’)

Attention à soumettre votre traitement pour pouvoir l’arrêter proprement

Conclusions

Une bonne politique de mots de passe est une des pierres angulaires de la stratégie de sécurité

, 5 Choses (avancées) sur la gestion des mots de passe

Voici quelques informations, un peu plus sensibles sur la gestion des mots de passe.

1) Mot de passe SST


Pour accéder aux outils de maintenance système (SST), vous devez avoir un profil créé (CRTSSTUSR) et votre profil IBMi devra avoir le droit *SERVICE
vous pouvez ensuite lancer une session SST par STRSST

2) Mot de passe iNetServer


iNetServer gère son propre contrôle de mot de passe identique pour accéder à vos partages.
vous avez sans doute déjà reçu des messages CPIB682 qui indiquent que l’utilisateur est désactivé pour NetServer
pour le réactiver vous pouvez passer par Navigator For i ou utiliser l’API QZLSCHSI
exemple ici

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

3) Contrôler un mot de passe


Par la commande CHKPWD sur le profil en cours , monmsg CPF2300 à traiter
Par API QSYGETPH, plus d’information, sur le site https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/apis/QSYGETPH.htm
exemple
PGM PARM(&userid &passwrd &STS)
/* Paramètres*/

DCL VAR(&USERID) TYPE(CHAR) LEN(10) /* input */

DCL VAR(&PASSWRD) TYPE(CHAR) LEN(10) /* input */
DCL &STS *CHAR 01 /* output */

/* Variables de travail / DCL VAR(&ERRORCODE) TYPE(CHAR) LEN(272)
DCL VAR(&MSGID) TYPE(CHAR) STG(DEFINED) LEN(7) DEFVAR(&ERRORCODE 9)
DCL VAR(&HANDLE) TYPE(CHAR) LEN(12)

/* Récupère le handle */

CHGVAR VAR(&ERRORCODE) VALUE(X’0110′) CALL QSYGETPH (&USERID &PASSWRD &HANDLE &ERRORCODE X’0000000A’ X’FFFFFFFF’) /* test message d’erreur */
If (&MSGID *ne ‘ ‘) THEN(Do)
CHGVAR VAR(&STS) VALUE(‘1’)
SNDPGMMSG MSGID(CPF9897) MSGF(*LIBL/QCPFMSG) +
MSGDTA(&MSGID *BCAT ‘Erreur contrôle de +
mot de passe’) MSGTYPE(ESCAPE) ENDDO ELSE CMD(DO) CHGVAR &STS VALUE(‘0’) SNDPGMMSG MSGID(CPF9897) MSGF(LIBL/QCPFMSG) +
MSGDTA(‘Mot de passe correct pour le +
profil ‘ !! &USERID) MSGTYPE(*COMP)
ENDDO
ENDPGM

4) Supprimer le mot de passe

Certains utilisateurs ne servent pas à se connecter et il peut être important de leurs enlever celui c’est le cas des profils de QSRV et QSRVBAS par exemple !
pour réaliser cette opération vous devez faire un chgusrprf en indiquant le paramètre PASSWORD(*NONE)

5) Rendre un mot de passe utilisateur sans être *SECADM


Par défaut un utilisateur ne peut modifier que son mot de passe. Pour qu’un utilisateur puisse rendre un mot de passe, on peut faire un programme en adoption de droit par rapport à un profil qui lui a *SECADM.
exemple
commande
CMD PROMPT(‘Changement PWD Utilisateur’)
PARM KWD(USRPRF) TYPE(NAME) LEN(10) MIN(1) + PROMPT(‘Profil utilisateur’)

programme

PGM PARM(&USR)

DCLPRCOPT USRPRF(OWNER)
/* paramètres */
dcl &usr *char 10
/* variables de travail */
dcl &usre *char 10
CHKOBJ OBJ(&USR) OBJTYPE(*USRPRF)
monmsg cpf9801 exec(do)
SNDUSRMSG MSG(‘Profil,’ *BCAT &USR BCAT ‘inexistant’) + MSGTYPE(INFO)
RETURN
enddo
RTVJOBA USER(&USrE)
CHGUSRPRF USRPRF(&USR ) PASSWORD(&USR ) +
PWDEXP(YES) STATUS(ENABLED)
monmsg cpf0000 exec(do)
SNDMSG MSG(‘Modification de passe impossible pour +
l »utilisateur’ *BCAT &USR *BCAT ‘demandée +
par’ BCAT &USRE) TOMSGQ(HSTLOG)
RETURN
enddo
SNDMSG MSG(‘Mot de passe pour l »utilisateur’ *BCAT +
&USR *BCAT ‘réinitialisé par’ BCAT + &USRE) TOMSGQ(HSTLOG)
endpgm

, 5 Choses (basiques) sur la gestion des mots de passe

Voici quelques informations concernant la gestion des mot de passe sur IBM i

1) Le niveau de mot de passe

Vous pouvez indiquer un niveau de mot de passe par la valeur Système QPWDLVL

1 et 2, vous avez un mot de passe sur 10 sans diférentiation de CAST
3 et 4, vous avez un mot de passe à 128 sensible à la cast.

le passage au niveau 3 ou 4 impose un IPL pas de gros risque pensez juste si vous avez des mires customizée à ajuster la taille de la zone PWD.
ce qu’il est conseillé, c’est de modifier le sous système CHGSBSD … SGNDSPF(*QDSIGNON) avant l’ipl et de faire vos modifications après en changeant à nouveau la valeur après avoir mis à niveau le fichier ècran.

2) Régle de validation des mots de passe

les principales valeurs systèmes

QPWDCHGBLK *SEC Bloquer la modification du mot de passe
QPWDEXPITV *SEC Durée de validité d’un mot de passe
QPWDEXPWRN *SEC Avertissement d’expiration de mot de passe
QPWDLMTAJC *SEC Limiter chiffres adjacents dans un mot de passe
QPWDLMTCHR *SEC Limiter certains caractères dans un mot de passe
QPWDLMTREP *SEC Limiter nb caractères identiques dans mot de pass
QPWDMAXLEN *SEC Longueur maximale du mot de passe
QPWDMINLEN *SEC Longueur minimale du mot de passe
QPWDPOSDIF *SEC Limiter positions des caractères dans mot de pass
QPWDRQDDGT *SEC Chiffre obligatoire dans un mot de passe
QPWDRQDDIF *SEC Mot de passe différent des précédents

QPWDRULES *SEC Règles mot de passe
les valeurs possibles sont :
*PWDSYSVAL prendre les valeurs sysval QPWD
*ALLCRTCHG règle de composition de mot de passe appliquées au chgusrprf et crtusrprf
*CHRLMTAJC
*CHRLMTREP
*DGTLMTAJC
*DGTLMTFST
*DGTLMTLST
*DGTMAXn
*DGTMINn
*LMTSAMPOS
*LMTPRFNAME
*LTRLMTAJC
*LTRLMTFST
*LTRLMTLST
*LTRMAXn
*LTRMINn
*MAXLENnnn
*MINLENnn
*MIXCASEn
*REQANY3
*SPCCHRLMTAJC
*SPCCHRLMTFST
*SPCCHRLMTLST
*SPCCHRMAXn
*SPCCHRMINn
plus d’informations ici
https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzarl/rzarlpwdrules.htm

3) Comment modifier un mot de passe ?

il y a 3 méthodes pour modifier un mot de passe
-la commande chgpwd
-l’API QSYCHGPW
-la commande chgusrprf (elle nécessite le droit *SECADM)

4) La validité d’un mot de passe et les actions associées

La durée de validité d’un mot de passe est exprimé en jours dans le paramètre du profil PWDEXPITV, par défaut on peut indiquer *SYSVAL il se baser alors sur la valeur système QPWDEXPITV
la règle d’usage est fixée par la valeurs système QMAXSIGN qui indique le nombre de tentatives
QMAXSGNACN indique l’action à réaliser en cas de débordement on peut désactiver le profil ou le profil est l’écran associé

5) Pour connaitre les profils désactivés

Voici une requête

select AUTHORIZATION_NAME as Profil_IBMi,
PREVIOUS_SIGNON as derniere_signature,
STATUS as status,
PASSWORD_CHANGE_DATE as date_changement,
DATE_PASSWORD_EXPIRES as date_expiration,
USER_DEFAULT_PASSWORD as PWD_egal_USRPRF,
LAST_USED_TIMESTAMP AS derniere_utilisation
from QSYS2.USER_INFO
where status = ‘*DISABLED’

Conclusion

Il est important d’avoir une bonne gestion des mots de passe sur votre ibm i.
La stratégie doit être adaptée au niveau requis par l’activité de l’entreprise
Elle doit être le plus possible globale au niveau des logins utilisés pour les différentes applications
Il n’y a pas de solution miracle ….

, , , , Utiliser ACS pour produire des fichiers Excel depuis l’IBM i

Access Client Solutions (ACS)

Pour rappel, ACS est le successeur de Client Access et permet toujours les exports de données.

ACS est également un produit entièrement Java, et utilisable en mode ligne de commande.

Il est donc possible de le piloter sur l’IBM i. Pour cela il vous faut :

  • Avoir le produit sous licence 5770JV1 (Java) version 8 ou supérieur
  • Access Client Solutions sur l’IFS (désormais installé via PTF (7.4: SI71900 / 7.3: SI71934 / 7.2: SI71935) dans /QIBM/ProdData/Access/ACS/Base

Exemples

Il est alors possible de provoquer le transfert de données de deux façons :

  • le fichier complet
  • une requête SQL permettant la sélection, transformation, jointure …

Syntaxe :

/PLUGIN=cldownload /system=<system>
                          [/userid=<userid>]
                          {/hostfile=<library/filename> | /sql="statement"}
                          {/clientfile=<path><filename>.<extension> | /display}
                          [/<options>]

    /userid     - user id to use when connecting to the target system
    /hostfile   - Source library and file on the IBM i system for the download
                  e.g. /hostfile=QIWS/QCUSTCDT
    /sql        - specify an SQL statement
                  e.g. /sql="select CUSNUM,LSTNAM,INIT,ZIPCOD from QIWS/QCUSTCDT"
    /clientfile - Target file location for the download.
                  The format of this file will be determined by the specified
                  extension (for example, .csv .ods .xlsx .xlsx)
                  If the file extension is not specified or is of a type
                  not supported, the data will be formatted as a .csv file
    /display    - write the output to the terminal
    
    Valid options are:
       /colheadings=<1/0> - Include column headings as the first row. When specified, the column names will be the heading.
       /usecollabels      - Use column labels for the heading.

Puisque ACS est directement sur votre IBM i, on peut utiliser localhost pour la valeur /system. Cela permet également la portabilité de la commande d’une machine à l’autre.

Pour transférer tout un fichier on utilisera le paramètre /hostfile. Ici sous QSH :

cd /QIBM/ProdData/Access/ACS/Base

java -jar acsbundle.jar
/PLUGIN=cldownload /system=localhost
/hostfile=sqlsample/employee
/clientfile=/home/nb/export/employe.xlsx

Cela produit :

Remarquer le nom de l’onglet.

Pour transférer par une requête SQL :

cd /QIBM/ProdData/Access/ACS/Base

java -jar acsbundle.jar
/PLUGIN=cldownload /system=localhost
/sql="select trim(firstnme) concat ' ' concat trim(lastname), hiredate, current date - hiredate as \"Ancienneté\" from sqlsample.employee" /clientfile=/home/nb/export/employesql.xlsx

Attention à l’échappement des caractères spéciaux …

On obtient :

Des options supplémentaires vous permettent d’affiner la sortie :

  • /colheadings=<1/0> – Inclure ou non l’entête
  • /usecollabels – Utiliser les labels au lieu des noms de colonne

Ces fonctions nécessitent une version de ACS > 1.1.8.6 pour fonctionner correctement.

Comment automatiser ?

Il est relativement simple d’intégrer cette commande Java dans un programme CL. Ici en utilisant /clientfile.

Par exemple avec RUNJVA :

Ou par QSH :

Ici on a paramétré plus d’éléments pour avoir une base de programme plus générique.

Avantages ?

Access Client Solutions permet facilement d’automatiser vos conversions depuis l’IBM i, et non depuis un poste client. Cela rend beaucoup plus naturel l’intégration de ces traitements dans vos chaines, la maitrise des transferts par l’IT et non par les utilisateurs, la maitrise des flux, des versions de produits utilisées etc …

, , Exécuter une action sur une liste SQL service

Vous avez tous compris qu’une grande partie de l’administration de vos IBMi se fera par SQL service.

Pour faire des contrôles, l’accès aux vues est suffisante.

Par exemple, le contrôle du nombre de pages dans une OUTQ :

SELECT sum(TOTAL_PAGES)
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC
where OUTPUT_QUEUE_LIBRARY_NAME = ‘SRCEXPL’ and OUTPUT_QUEUE_NAME = ‘VOTREOUTQ’

Mais pour agir c’est plus compliqué, dans certains cas il existe des procédures pour les DTAQ par exemple.

Mais la plus part du temps, vous devrez passer par une commande système dans ce cas en SQL ; vous pouvez utiliser la procédure cataloguée QCMDEXC.

Elle fonctionne comme l’api du même nom.

Exemple :

Pour épurer l’OUTQ QEZJOBLOG

Call qcmdexc(‘CLROUTQ QEZJOBLOG’)

Mais comment faire pour agir sur une liste sans faire un programme ou une procédure qui lirait un curseur ?

L’astuce est d’utiliser un For et dans le select de générer directement la commande à exécuter

Voici un exemple de script qui déplace les spools des OUTQs, commençant par ACT en mettant en référence utilisateur l’OUTQ d’origine.

les zones SPOOLNAME, JOBNAME, FILENUM, OUTQ_QUEUE_NAME proviennent de la vue.

begin
for
SELECT ‘ chgsplfa FILE(‘ concat SPOOLNAME concat ‘) JOB(‘ concat JOB_NAME concat ‘) SPLNBR(‘ concat char(FILENUM) concat ‘) outq(Votreoutq) save(*yes) usrdta( »’ concat OUTPUT_QUEUE_NAME concat  »’)’ as chgspl
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC
where OUTPUT_QUEUE_LIBRARY_NAME = ‘Votrelib’ and OUTPUT_QUEUE_NAME like(‘ACT%’)
do
call qcmdexc(CHGSPL);
end for;
end

Conclusions :

Cette solution est souvent utilisée par exemple avec la fonction table OBJECT_STATISTICS.

Exemple :

pour faire la liste des fichiers SAVF

SELECT objname, objlib, ifnull(objtext, ‘ ‘) as objtext
FROM TABLE (QSYS2.OBJECT_STATISTICS(‘ALL’,’FILE’) ) AS X
WHERE OBJATTRIBUTE = ‘SAVF’

La seule limite est qu’il est un peu plus compliqué pour gérer les erreurs sur le qcmdexc …

Bien sûr pour la bible rendez vous sur la page de Scott Forstie

, 5 choses à connaitre sur la notion de membre

1) Qu’est ce qu’un membre ?
Un membre est une notion purement IBM i, il sert à cloisonner les données dans un fichier, l’usage le plus connu c’est les fichiers sources où chaque objet est défini dans un membre.
mais on peut également utiliser cette notion pour des fichiers de données , exemple un fichier client avec un membre par régions pour cloisonner les informations.

Pour choisir le membre, on utilisait la commande ovrdbf
OVRDBF FILE(VOTREFIC) MBR(VOTREMEMBRE) quand vous aviez fini, vous faisiez un DLTOVR

Attention un LF peut pointer sur les données de pluseiurs membre du PF, c’est même la valeur par défaut de la commande,
CRTLF … DTAMBRS(*ALL)

2) Pourquoi utiliser la commande DSPPFM
Parce que c’est la seule commande qui montre les données brutes dans l’ordre réel, en effet SQL pourra faire des modifications de présentation, voire indiquer des erreurs de lectures.
Les touches de fonction F10 et F11 permettent de voir les données en hexadécimal.

3) Pourquoi réorganiser les membres des fichiers.
Quand on supprime un enregistrement dans un fichier donc dans un membre, cet enregistrement est juste tagué comme étant inutilisable.
il y a 2 cas:

  • en DDS, les fichiers sont créés avec le paramètre par défaut reusedlt(no) => un nouvel enregistrement est ajouté à la fin.
  • en SQL, les fichiers sont créés avec le paramètre par défaut reusedlt(yes) => un nouvel enregistrement est ajouté sur la place d’un enregistrement supprimé.

En SQL, on a donc besoin de moins de RGZPFM et surtout, si on a sensiblement le même nombre de créations et de suppressions.

4) Executer une requête sql sur un membre d’un fichier physique

Par défaut SQL s’exécute sur le premier membre crée en effet, il considère qu’il n’y a qu’un membre,
en effet un create table ne permet qu’un membre.

Si vous voulez lire un membre particulier sur un fichier physique multi-membres par SQL, vous devez faire un create alias
exemple :
CREATE ALIAS BIBLIO/NOMALIAS FOR BIBLIO/FICHIER (NOMMEMBRE)

vous utilisez désormais votre alias comme un fichier ou une vue

Select * from BIBLIO/NOMALIAS

Vous pouvez supprimer votre alias
DROP ALIAS BIBLIO/NOMALIAS

5) Avoir des informations sur les membres
il y a 2 solutions, de manière historique en lançant la commande dspfd … TYPE(*MBRLIST)
ou avoir des informations par SQL (on parle de partition …)
Vous avez une vue dans qsys2 qui s’appelle SYSPARTITIONSTAT et qui permet de voir ces informations.

Conclusion :
Utiliser les membres n’est pas le sens de l’histoire
En SQL on utilise des fichiers mono-membre
Pour les sources préférer L’IFS qui vous permettra d’utiliser des outils comme GIT
Mais il serait étonnant que vous n’en rencontriez pas, il faut donc comprendre comment ça marche.

, Comparer le niveau de ptf entre 2 systèmes IBMi

Pour comparer les niveaux de PTF de 2 partitions, vous pouvez utiliser ARE (logiciel 5733ARE).
Mais vous allez devoir l’installer et le paramétrer.

Mais si vous ne l’avez pas installé vous pouvez utiliser Navigator for i.

L’instance admin de htpp doit être démarrée sur votre partition, voici comment faire :

vous devez vous connecter avec un profil qui est *iosyscfg au minimum.

à l’url http://votresys:2004

Une fois connecté vous devez définir vos systèmes distants ou groupe de systèmes.

Après vous allez utiliser l’interface graphique

en choisissant le système à contrôler

il est conseillé de ne pas appliquer mais de faire un IPL sur le système cible.

Vous pouvez choisir les produits

si vous êtes à jour vous obtenez cela

Rappel

Pour envoyer un groupe de PTF sur un système distant vous devez envoyer la description de la PTF, mais aussi les SAVF nécessaires.

, Contrôle des dates de validité de vos certificats

Vous allez utiliser de plus en plus de certificats et la problématique est que les certificats ont des périodes de validité.

Je vous rappelle que vous avez une interface pour gérer ces certificats qui s’appelle DCM accessible à l’adresse, http://votre_systéme:2006/dcm.

La nouvelle interface vous indique par une coloration jaune que votre certificat va expirer et rose pour vous indiquer que votre certificat est expiré.

Mais on ne va pas passer notre temps sur DCM.

Les TR V7R4 Niveau 7 et V7R3 Niveau 18 nous apportent une nouvelle fonction TABLE, QSYS2.CERTIFICATE_INFO() qui va nous permettre d’automatiser un contrôle.
Vous avez des informations à cette adresse, https://www.ibm.com/support/pages/node/6156105
Exemple :
On fixe la date de contrôle à – 1 mois, vous devrez avoir le mot de passe de votre magasin de certificat.

SELECT Substr(CERTIFICATE_LABEL, 1, 50) as label, VALIDITY_END as date_de_fin FROM
TABLE(QSYS2.CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=>’votre mot de passe’))
WHERE VALIDITY_END < CURRENT DATE + 1 MONTH

Pour vous aider on a fait une petite commande CHKCRTDAT qui est disponible sous github à l’adresse, https://github.com/Plberthoin/PLB/tree/master/GTOOLS

Vous pourrez planifier le contrôle de vos certificats, par exemple toutes les semaines.

Attention, il reste une problématique à gérer c’est le passage et le stockage du mot de passe.
Il y a plusieurs écoles, mais une chose est sûre : il doit être crypté au moins une fois.

, , Connaitre les PGMs référencés dans WRKJOBSCDE

Quand vous faites une analyse d’impact pour modifier un ou plusieurs programmes, vous avez besoin de connaitre ceux qui sont utilisés dans le Scheduler de votre IBMi.

Il y a une vue qui vous permet de connaitre la liste des travaux planifiés c’est la vue SCHEDULED_JOB_NAME

Exemple pour savoir si le programme NOM_PGM est utilisé vous pouvez exécuter la requête suivante

SELECT SCHEDULED_JOB_NAME,
UPPER(COMMAND_STRING),
ifnull(DESCRIPTION, ‘*NONE’)
FROM SCHEDULED_JOB_INFO WHERE STATUS <> ‘HELD’
and upper(COMMAND_STRING) like(‘%NOM_PGM%’)

Cette requête va bien pour un programme, mais pour une analyse plus complète ca peut être fastidieux.

Voici comment améliorer la chose, quand vous faites une analyse d’une manière ou d’une autre vous utilisez un fichier qui est le resultat en OUTFILE de la commande DSPPGMREF.

La solution est donc d’ajouter un poste dans ce fichier avec comme type *JOBSCDE et comme programme appelant le nom du travail.

Vous lancerez cet outil (commande REFJOBSCDE) à chaque fois que vous mettrez à jour votre fichier de références par DSPPGMREF

Vous trouverez les sources de cette outil à l’adresse suivante https://github.com/Plberthoin/PLB/tree/master/GTOOLS/

Il existe sans doute d’autres solutions mais celle-ci marche bien.

J’espère que ça vous sera utile .