, , , Informations sur les commandes

Avec la version TR1 de 7.5 et la TR7 de la 7.4

IBM met à dispo un service (COMMAND_INFO) qui va permettre d’avoir des informations sur les commandes de votre partition IBM i.

Voici 2 idées d’utilisation de cette vue QSYS2.COMMAND_INFO

Par exemple, pour connaitre les commandes qui sont permises en environnement restreint

SELECT *
FROM QSYS2.COMMAND_INFO
WHERE ALLOW_LIMITED_USER = ‘*YES’

Par exemple, pour savoir si un programme est utilisé dans une commande lorsqu’on fait une analyse d’impact avant une modification

SELECT COMMAND_NAME,
COMMAND_PROCESSING_PROGRAM_LIBRARY,
COMMAND_PROCESSING_PROGRAM
FROM QSYS2.COMMAND_INFO
WHERE COMMAND_LIBRARY = ‘GFTP’

Conclusion :

Cette vue fournit des informations intéressantes et faciles à croiser avec d’autres éléments sur toutes les commandes présentes sur vos systèmes.

, Suivi des travaux par JOBQ

Avec la version TR1 de 7.5 TR1 et la TR7 de la 7.4

IBM met à dispo un service qui va permettre suivre les travaux soumis par JOBQ, cette information existait mais était plus compliquée d’utilisation et vous pourrez choisir les JOBQ que vous voulez suivre.

Voici la liste des services disponibles :

ADD_TRACKED_JOB_QUEUE, qui permet d’ajouter une JOBQ à superviser
CLEAR_TRACKED_JOB_QUEUE, qui permet de reseter les statistiques des JOBQ supervisées
REMOVE_TRACKED_JOB_QUEUE, qui permet de retirer une JOBQ à superviser
TRACKED_JOB_INFO, qui permet d’avoir des informations sur les travaux soumis dans cette JOBQ
TRACKED_JOB_QUEUES, qui permet de voir les JOBQ supervisées

Ci-dessous le lien de référence pour retrouver les informations essentielles

https://www.ibm.com/docs/en/i/7.4?topic=services-work-management

Principe

Vous ajoutez une JOBQ à superviser


CALL QSYS2.ADD_TRACKED_JOB_QUEUE(IASP_NAME => ‘*SYSBAS’,
JOB_QUEUE_LIBRARY => ‘SSHLIB’,
JOB_QUEUE => ‘SSHJOBQ’);

Vous pouvez voir les travaux qui sont placés par votre JOBQ

SELECT * FROM TABLE(QSYS2.TRACKED_JOB_INFO(JOB_QUEUE_LIBRARY_FILTER => ‘SSHLIB’,
JOB_QUEUE_FILTER => ‘SSHJOBQ’))
WHERE JOB_END_TIME IS NULL;

Vous pouvez avoir des informations sur les JOBQ supervisées

SELECT *
FROM QSYS2.TRACKED_JOB_QUEUES
ORDER BY IASP_NAME, JOB_QUEUE_LIBRARY, JOB_QUEUE_NAME;

Conclusion :

Ce service peut vous permettre d’avoir un suivi précis par JOBQ des jobs soumis, à l’inverse vous pourrez savoir si une JOBQ n’est pas utilisée

Vous connaissez tous les notions de cette bibliothèque :

Elle n’est pas sauvegardée à la fin d’un travail et chaque travail a sa QTEMP.

Elle est généralement dans votre liste de bibliothèque.

Maintenant imaginez que vous utilisez un logiciel et que vous voulez être sûr que QTEMP soit la première bibliothèque de votre liste :

Vous pouvez l’enlever et la remettre en entête mais attention, l’enlever revient à la supprimer. Si vous avez des données par exemple des fichiers à l’intérieur, ils seront donc perdus, je propose donc un petit programme qui pourra réaliser ça pour vous :

PGM                                                                   
/* MISE EN PLACE QTEMP EN TETE DE LISTE */                            
dcl &time *char 6                                                     
             DCL        VAR(&NBR) TYPE(*DEC) LEN(10)                  
             dcl &libl *char 2750                                     
             dcl  &req *char 512                                      
 /* Recherche si QTEMP est entete on ne fait rien                  */ 
             RTVJOBA    USRLIBL(&LIBL)                                
             IF COND(%sst(&libl 1 10) = 'QTEMP') THEN(DO)             
             goto fin                                                 
             ENDDO                                                    
 /* Recherche si QTEMP est pas en tete de liste                    */ 
             ELSE                                                     
             DSPOBJD    OBJ(QTEMP/*ALL) OBJTYPE(*ALL) +               
                          OUTPUT(*OUTFILE) OUTFILE(QTEMP/WRESULT)     
             MONMSG     MSGID(CPF2123) exec(do)                       
 /* si bibliothèque vide */                                           
             RMVLIBLE   LIB(QTEMP)                                    
             ADDLIBLE   LIB(QTEMP) POSITION(*FIRST)                   
             GOTO       CMDLBL(FIN)                                 
             ENDDO                                                  
 /* Si bibliothèque QTEMP remplie */                                 
             CRTLIB     LIB('W' *TCAT &TIME) TYPE(*TEST) TEXT('Bib +
                          sauvegarde qtemp')                        
             monmsg CPF2111 exec(do)                                
             CLRLIB     LIB('W' *TCAT &TIME)                        
             ENDDO                                                  
             CRTDUPOBJ  OBJ(*ALL) FROMLIB(QTEMP) OBJTYPE(*FILE) +   
                          TOLIB('W' *TCAT &TIME) DATA(*YES)         
   monmsg    CPF2130                                                
             rmvlible qtemp                                         
             addlible qtemp  *first                                 
             CRTDUPOBJ  OBJ(*ALL) FROMLIB('W' *TCAT &TIME) +        
                          OBJTYPE(*FILE) TOLIB(QTEMP) DATA(*YES)    
   monmsg    CPF2130                                                
             DLTLIB     LIB('W' *TCAT &TIME)                        
 /* fin du programme */                                             
 fin:
            SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) +               
                         MSGDTA('Bibliothèque Qtemp placée en tête +
                         de liste') MSGTYPE(*COMP)                  
            ENDPGM                                                                                                                

Voila, vous avez une exemple tout en CLP , qui permet de mettre QTEMP en tête de liste sans perdre les informations à l’intérieur.

Merci à Jean-Marie pour son aide.

C’est un menu que vous pouvez lancer à tout moment par la combinaison de touche <flèche> + <ATTN> + <Enter>

Si vous avez du mal au clavier vous pouvez dans ACS faire un clique droit !

Ce menu vous propose des actions voici un source qui vous permet de voir ces options

Le programme en CLP

pgm
dclf wrkattn
dcl &msg *char 100
dcl &txt *char 50
             RTVMSG     MSGID(CPX2313) MSGF(QCPFMSG) MSG(&MSG)
             DOUNTIL    COND(&IN03) /* do */
             RTVOBJD    OBJ(%SST(&MSG 1 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd001  (%sst(&msg  1 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 12 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd002  (%sst(&msg 12 10)  *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 23 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd003  (%sst(&msg 23 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 34 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd004  (%sst(&msg 34 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 45 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd005  (%sst(&msg 45 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 56 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd006  (%sst(&msg 56 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 67 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd007  (%sst(&msg 67 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 78 10)) OBJTYPE(*CMD) TEXT(&txt)
             chgvar &cmd008  (%sst(&msg 78 10) *cat &txt)
             RTVOBJD    OBJ(%SST(&MSG 89 10)) OBJTYPE(*CMD) TEXT(&txt)
             monmsg cpf9801
             chgvar &cmd009  %sst(&msg 89 10)
             SNDRCVF    RCDFMT(FMT01)
             IF         COND(&IN03) THEN(LEAVE)
             enddo


endpgm

L’écran

     A*
     A                                      DSPSIZ(24 80 *DS3)
     A                                      CA03(03)
     A          R FMT01
     A*%%TS  SD  20221129  091353  QSECOFR     REL-V7R4M0  5770-WDS
     A                                  1 20'Liste des commandes ATTN'
     A                                      DSPATR(HI)
     A                                  3  2' 1'
     A            CMD001        61A  O  3  6
     A                                  4  2' 2'
     A            CMD002        61A  O  4  6
     A                                  5  2' 3'
     A            CMD003        61A  O  5  6
     A                                  6  2' 4'
     A            CMD004        61A  O  6  6
     A                                  7  2' 5'
     A            CMD005        61A  O  7  6
     A                                  8  2' 6'
     A            CMD006        61A  O  8  6
     A                                  9  2' 7'
     A            CMD007        61A  O  9  6
     A                                 10  2'80'
     A            CMD008        61A  O 10  6
     A                                 11  2'90'
     A            CMD009        61A  O 11  6
     A                                 22  4'F3=Exit'

Vous l’avez compris l’information se trouve dans le message CPX2313 .

Donc pour customiser votre menu ATTN, il vous suffit de faire un changement sur ce message, attention c’est pour tous les utilisateurs de votre système …

On rencontre parfois ces 2 customisations que je vous ai mis dans un programme CLP

pgm
/*-------------------------------------*/
/* Customisation du menu ATTN          */
/* 2 on remplace DSPJOB par WRKJOB     */
/* 4 on remplace SNDMSG par SNDSMTPEMM */
/*-------------------------------------*/
dcl &msg *char 100
             RTVMSG     MSGID(CPX2313) MSGF(QCPFMSG) MSG(&MSG)
             chgvar         %SST(&MSG 12 10)  'WRKJOB'
             chgvar         %sst(&msg 34 10)  'SNDSMTPEMM'
             CHGMSGD    MSGID(CPX2313) MSGF(QCPFMSG) MSG(&MSG)
endpgm

Vous pourrez désormais gérer vos travaux et envoyer un mail (si tout est paramétré chez vous)

, La valeur de sécurité QSECURITY

La valeur de sécurité QSECURITY

La valeur QSECURITY permet de connaître le niveau de sécurité appliqué au système.

Il y a 5 niveaux de sécurité, 10 – 20 – 30 – 40 – 50.

10 étant la sécurité la plus faible et 50 la plus élevé.

Pour connaître la valeur du niveau de sécurité de votre système, vous devez vous rendre dans les valeurs système en utilisant la commande WRKSYSVAL.

Au vu du nombre de valeurs de notre système, on va trier par sous-ensemble.

On va rentrer *SEC pour aller voir les valeurs système de sécurité.

On affiche ensuite la valeur système QSECURITY.

Sur la ligne rouge on peut voir le niveau de sécurité de notre système.

Dans le carré bleu, on peut voir les 5 niveaux de sécurité avec une courte description.

Depuis la version V7R5, le niveau de sécurité minimal est de 30.

Tableau des valeurs de QSECURITY depuis la V7R5

IBM recommande le niveau de sécurité 40 en raison des vulnérabilités trouvées au niveau 30.

La plupart des entreprises possédant un IBM i travaillent avec un niveau de sécurité 40.

Seuls les services financiers et quelques autres entreprises utilisent le niveau de sécurité 50 pour se conformer aux normes de défense américaine.

Voyons maintenant en détails, les 5 niveaux de sécurité :

Niveau 10 Pas de mot de passe requis, des profils sont créés à chaque fois qu’un utilisateur essaie de se connecter. Les utilisateurs créés ont accès à tout car l’autorité *ALLOBJ leur est attribuée automatiquement. Ce niveau n’est plus entretenu par IBM.

Niveau 20 → À ce niveau l’autorité *ALLOBJ est toujours attribuée à chaque utilisateur. En plus du niveau 10, un identifiant et un mot de passe sont nécessaires pour se connecter. Seul un profil *SECADM peut créer des nouveaux profils utilisateur. Ce niveau n’est plus admis depuis la V7R5.

Niveau 30 → En plus du niveau 20, ce niveau peut gérer les autorisations des utilisateurs au cas par cas. Les profils ayant l’autorité *ALLOBJ sont forcément créés avec la classe de sécurité *SECOFR, les autres n’ont pas cette autorité.

Niveau 40 → Protection de l’intégrité du système d’exploitation. Signature et sécurité des ressources. Le système empêche les tentatives d’appeler directement des programmes système non reconnus.

Niveau 50 → Protection renforcée de l’intégrité du système d’exploitation. Signature et sécurité des ressources. Avant de passer à ce niveau, la mise en place du journal d’audit est obligatoire. Ce niveau a été créé pour répondre à la norme C2 (Norme de département de défense Américain). Une meilleure protection des blocs de contrôle interne est appliquée.

, , Droits et génération SQL script

Vous devez moderniser votre base de données, pour cela vous pouvez commencer par extraire le source de votre PF,
par exemple en passant par Générations d’instructions SQL dans ACS , ou en utilisant la procédure SQL de QSYS2 GENERATE_SQL Ou GENERATE_SQL_OBJECT ,


La plus part du temps on obtient un scripte SQL qui vous permettra de générer votre nouvelle table , ici un exemple ou on a enlevé les commentaires.

Que ce passe t’il au niveau des droits ?

Avant par DSPOBJAUT

par DROITS dans ACS

La liste d’autorisations

Premier effet vous pouvez avoir des différences sur les droits publics

exemple ici

Après

Vous vous retrouvez avec un droit USER DEF au lieu de *CHANGE et vous avez perdu le droit exécute, on est d’accord ca ne change rien sur une table, c’est juste un peu moins lisible quand on analyse au niveau du système

le plus gênant c’est la liste d’autorisation que vous perdez
et la cela peux changer complètement puisque vous perdez 1 voir 2 niveaux de recherches

Dans notre cas FORM06 se retrouve avec des droits *PUBLIC

Conclusion :


Après avoir modernisé vos tables, vous devez réappliquer vos droits le plus simple est de généré un objet de référence

une autre solution est de vous affranchir des listes d’autorisation qui ne sont pas générées dans SQL

, , , Tuez les jobs SSH dans QINTER

Si vous commencez à faire du SSH (en tant que client), par exemple pour faire du GitHub, vous avez des jobs qui vont rester et que vous devrez tuer par un kill ou un ENDJOB.

C’est des jobs BCI qui restent après avoir arrêté vos JOBs interactifs.

Voici un petit script CLP qui permet de faire ça, il vous suffit de le planifier tous les soirs à 23 heures par exemples.

Ici on a utiliser la fonction table QSYS2.ACTIVE_JOB_INFO et la fonction QSYS2.QCMDEXC et on packagé le tout dans un CLP …

PGM
/* Suppression des jobs SSH dans QINTER */
dcl &NBRCURRCD *dec 10
/*  Exécution de la requete SQL */
             RUNSQL     SQL('Create table qtemp/sortie as(SELECT +
                          QSYS2.QCMDEXC(''ENDJOB '' CONCAT +
                          JOB_NAME)  as resultat FROM +
                          TABLE(QSYS2.ACTIVE_JOB_INFO(SUBSYSTEM_LIST_+
                          FILTER => ''QINTER'')) X  where job_type +
                          = ''BCI'') with data') COMMIT(*NONE)
             MONMSG     MSGID(SQL0000) exec(do)
             SNDUSRMSG  MSG('Erreur dans l''exécution de la requête +
                          SQL d''épuration des jobs SSH') +
                          MSGTYPE(*INFO)
             Return
             enddo
  /* Envoi d'un message de fin */
             RTVMBRD    FILE(QTEMP/SORTIE) NBRCURRCD(&NBRCURRCD)
             if cond(&NBRCURRCD > 0) then(do)
             SNDUSRMSG  MSG(%CHAR(&NBRCURRCD) *TCAT ', job(s) SSH +
                          arrêté(s)') MSGTYPE(*INFO)
             enddo
             else do
             SNDUSRMSG  MSG('Pas de Job SSH à Supprimer ') +
                          MSGTYPE(*INFO)
             enddo
ENDPGM

Sur les job de ssh-agent vous pouvez demander le kill directement comme ceci, merci à Julien …

La commande QSH lancer par votre CL qui vous permet de soumettre se présente donc comme ça :

eval "$(ssh-agent -s)" ; // Démarrage de l'agent 
SSH ssh-add /home/jl/.ssh/github ; // Ajout de la clé à l'agent 
ssh -T git@github.com ; // Test de connexion à GitHub 
ssh-agent -k // Arrêter l'agent
, , Droits SQL sur les Zones

On m’a récemment demandé comment savoir si un fichier était couvert par des droits SQL sur les zones

J’ai d’abord pensé que la fonction table QSYS2.OBJECT_PRIVILEGES allait me rendre ce service !

donc j’ai lancé cette requête pour analyser mon fichier

Exemple :

SELECT *
FROM TABLE(QSYS2.OBJECT_PRIVILEGES(‘MABASESQL’, ‘CLIENTS’, ‘*FILE’));

et je n’ai pas trouvé l’information dans les zones renvoyées

puis j’ai essayé avec les commandes historiques en sortie de fichier ici DSPOBJAUT

Exemple :

DSPOBJAUT OBJ(MABASESQL/CLIENTS)
OBJTYPE(FILE) OUTPUT(OUTFILE)
OUTFILE(MABASESQL/LSTAUT)

Select * from MABASESQL.lstaut

et la on a le résultat qui l’indique
ZONE OAOBJA à ‘USER DEF’ et une ZONE des DATA ici OAUPD à ‘/’

En résumé

On ne sait pas par SQL, mais on sait faire par une sortie fichier historique


Oui je sais , on peut trouver l’information par des vues spécifiques dans QSYS2 et SYSIBM

Vous avez d’abord la vue SYSIBM.SQLCOLPRIVILEGES mais attention, vous avez toutes les autorisations sur la zone y compris celles qui correspondent à un *CHANGE sur le fichier par exemple.


exemple :

Select * from SYSIBM.SQLCOLPRIVILEGES
where TABLE_SCHEM = ‘MABASESQL’ and TABLE_NAME = ‘CLIENTS’

order by column_name, grantee


Ou mieux la vue QSYS2.COLUMN_PRIVILEGES qui ne contient que les zones avec des autorisations spécifiques

exemple

Select * from QSYS2.COLUMN_PRIVILEGES
where TABLE_SCHEMA = ‘MABASESQL’ and TABLE_NAME = ‘CLIENTS’

j’ai donc fait une RFE pour avoir l’information dans la fonction table QSYS2.OBJECT_PRIVILEGES

Si vous êtes intéressés votez pour moi c’est ici https://2e4ccba981d63ef83a875dad7396c9a0.ideas.aha.io/ideas/RIRP-I-1260

Je vous indiquerais la réponse d’IBM sur le sujet

Une petite explication sur les fichiers ACS et leur extension, et les migrations possibles à partir des fichiers de Client Access

Pour les fichiers de définition de session

Les fichiers, KMP, PMP, BAR, MAC ont la même extension, mais ne sont pas compatibles, vous devrez les migrer par l’outil de migration .

Gestionnaire de sessions / fichier / importer

Pour les transferts de fichiers

Vous pouvez ouvrir un fichier DTF par ACS et l’enregistrer en DTFX, la migration est automatique

On n’a pas d’outil pour migrer les descriptions de fichier FDX, vous devrez les recréer ou modifier le source, il y a peu de différences

Résumé

On sait migrer les sessions, les claviers, les transferts les macros **

Pour les fichiers macros, vous ne pourrez migrer que ce qui a été enregistré et non codé

Mais ca peut être l’occasion de faire le ménage de reprendre propre.

**

, , Utilisation du catalogue DB2

Il existe de nombreuses tables dans QSYS qui constituent le catalogue DB2,
Ces tables sont accessibles par des vues qui se trouvent dans QSYS2 de manière globale et dans les bibliothèques de vos collections SQL.

On utilise pas assez ces informations pour analyser la base de données, elles contiennent une multitude d’informations

On va faire une petit exemple:

Imaginons que nous voulons savoir ou est utilisée une zone


Nous fixerons la database par set schema , pour éviter les qualifications

exemple de manière globale
SET SCHEMA QSYS2

On va utiliser une vue qui s’appelle SYSCOLUMNS qui contient les zones de votre database

SELECT
A.SYSTEM_COLUMN_NAME,
A.SYSTEM_TABLE_NAME,
A.SYSTEM_TABLE_SCHEMA
FROM SYSCOLUMNS A
WHERE COLUMN_NAME = ‘NUMCLI’

Vous obtenez une liste de tous les fichiers (tables, vue, PF, LF) etc …

Imaginons ensuite que vous ne vouliez que les tables ou PF vous pouvez utiliser la vue SYSTABLES

SELECT a.SYSTEM_COLUMN_NAME,
A.SYSTEM_TABLE_NAME,
A.SYSTEM_TABLE_SCHEMA
FROM SYSCOLUMNS a join SYSTABLES b on A.SYSTEM_TABLE_NAME=b.SYSTEM_TABLE_NAME
and a.SYSTEM_TABLE_SCHEMA = b.SYSTEM_TABLE_SCHEMA and B.TABLE_TYPE in(‘T’ , ‘P’)
WHERE COLUMN_NAME = ‘NUMCLI’

Vous limitez ainsi votre recherche aux tables et PF

Imaginons maintenant que vous ne vouliez que les tables et PF qui ont été utilisées sur l’année flottante (13 mois), on va utiliser la vue SYSTABLESTAT

SELECT a.SYSTEM_COLUMN_NAME,
A.SYSTEM_TABLE_NAME,
A.SYSTEM_TABLE_SCHEMA
FROM SYSCOLUMNS a join SYSTABLES b on A.SYSTEM_TABLE_NAME=b.SYSTEM_TABLE_NAME
and a.SYSTEM_TABLE_SCHEMA = b.SYSTEM_TABLE_SCHEMA and B.TABLE_TYPE in( ‘T’ , ‘P’)
join SYSTABLESTAT c on A.SYSTEM_TABLE_NAME=c.SYSTEM_TABLE_NAME
and a.SYSTEM_TABLE_SCHEMA = c.SYSTEM_TABLE_SCHEMA and c.LAST_USED_TIMESTAMP >
(current date – 13 months)
WHERE COLUMN_NAME = ‘NUMCLI’

Cette exemple n’est pas parfait, mais il vous montre qu’avec le catalogue db2 et un peu de SQL vous pouvez avoir de nombreuses informations pertinentes sur cette dernière .
Vous pouvez par exemple avoir des informations statistiques sur vos colonnes par la vue SYSCOLUMNSTAT et une vue globale avec la vue SYSFILES qui permet d’avoir un bon résumé de vos fichiers

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


Voici un lien qui vous présente les vues disponibles,

https://www.ibm.com/docs/en/i/7.5?topic=views-i-catalog-tables