Navigator for i évolue, petit rappel au passage l’ancien interface ne sera plus utilisable en 2023, ils vous faut donc passé au nouveau, en réalité pas de panique, il n’y a rien à faire l’application des PTFs fait l’installation automatiquement.
Je vais vous parler ici d’une fonction passée un peu inaperçue mais qui peut intéresser certain d’entre vous en effet elle permet de visualiser les postes d’audit sous forme de graphique !
Vous devez choisir l’option
Vous devez ensuite choisir les informations que vous voulez voir sur votre graphique
Vous pouvez choisir une vue détail
ou une vue graphique
Remarque :
C’est le deuxième outil qui se base sur les journaux d’audit, l’autre c’est IDS il faut être un expert en réseau pour en tirer partie
Celui la est très simple et il vous permet d’avoir rapidement affichage intéressant des informations de sécurités que vous voulez tracer
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2022-12-22 17:24:442022-12-22 17:24:45Navigator for Visualisation des Audits
Lorsque l’on crée un programme de service il est intéressant de classer les procédures utilisées dans différents modules afin de faciliter une maintenance future. On peut regrouper par exemple les procédures par fonctionnalité métier (prise de commandes, rangement, calculs de taux,… ) ou par proximité technique (manipulation de chaines de caractères, calcul d’un modulo, manipulation de dates,… ). Dans l’article intitulé « CONTROLER IBAN & RIB » on regroupe les deux fonctions bancaires au sein d’une même procédure.
Lorsque l’on veut créer un programme de service il faut procéder en deux temps :
Créer les modules contenant les procédures et fonctions
Nous vous proposons donc de créer une fonction qui permettra d’enchainer ces deux opérations (nous nous limiterons à la possibilité d’agréger 10 modules dans un programme de service)
Présentation de la commande
Cette commande permet de saisir plusieurs modules et de les intégrer directement dans un programme de service
On peut également ajouter un répertoire de liage, si besoin
https://www.gaia.fr/wp-content/uploads/2021/07/GG-2.jpg343343Guillaume GERMAN/wp-content/uploads/2017/05/logogaia.pngGuillaume GERMAN2022-12-06 09:53:472022-12-06 11:15:48Création de programmes de service
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.
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)
Nous utilisons de plus en plus les services SQL pour de nombreuses actions : accès aux *DTAQ, *DTAARA, travaux etc …
Par exemple, pour accéder au contenu d’une variable d’environnement, la vue QSYS2.ENVIRONMENT_VARIABLE_INFO est très simple à utiliser :
Dans un programme RPG, il est très simple d’effectuer une lecture SQL.
Mais dans certains cas, nous préférerons utiliser les APIs système : pour la performance, ou dans le CL ! En CL, il est possible d’exécuter une instruction SQL, mais pas de récupérer un result sets (en tout cas pas simplement et avec une bonne performance).
L’appel d’API depuis le CL ne pose pas de soucis, principalement depuis les évolutions permettant de maitriser l’allocation mémoire des variables (variables autonomes, basées sur un pointeur, ou basée sur une autre variable – équivalent OVERLAY du RPG) :
Maintenant, lorsque l’on utilise des API, il est (souvent) nécessaire de passer par des pointeurs, de façon explicite ou non. Par exemple, c’est le cas pour QUSRJOBI même si l’on a pas déclaré de pointeur dans notre programme CL :
En réalité, lors d’un appel de programme ou procédure, les paramètres sont transmis par défaut par référence : concrètement on passe un pointeur sur le début de la valeur, mais pas la valeur elle-même !
Il faut commencer à interpréter les prototypes des API en fonction du langage d’appel …
Le système étant écrit en C, certaines API utilisent la définition C d’une chaine de caractères : un pointeur sur le premier caractère, la fin de la chaîne étant marquée par le premier octet null !
En RPG, nous avons la fonction %str() qui permet de gérer ceci :
En CL, pas de fonction équivalent pour gérer cela.
Prenons par exemple l’API getEnv() (en fait une fonction de la bibliothèque standard C) :
De même, la valeur de retour est un pointeur sur le début de la valeur. La fin se situe au premier octet null rencontré …
Cela nous sert à créer la valeur pour l’appel : chaine à terminaison nulle contenant le nom de la variable d’environnement recherchée (ici CLASSPATH) :
CHGVAR &ENVVAR ( 'CLASSPATH' *CAT &SPC_INIT )
Pour décoder la valeur de retour, il nous faut parcourir la valeur reçue jusqu’à trouver la terminaison nulle. On utilise simplement %SCAN pour trouver la position et redécouper :
Au final, très peu de code à ajouter, mais nécessite une compréhension de la documentation des APIs, des types de données dans les différents langages, et des mécanismes de transmission de paramètres !
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.
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.
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.
/wp-content/uploads/2017/05/logogaia.png00Damien Trijasson/wp-content/uploads/2017/05/logogaia.pngDamien Trijasson2022-11-07 16:52:172022-11-08 11:16:52Réinitialisation des tableaux en free form
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
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
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2022-11-04 17:07:312022-11-06 09:30:49Tuez les jobs SSH dans QINTER
Vous connaissez tous, au moins de nom l’extension « code for i » qui vous permet d’éditer vos sources RPGLE dans votre éditeur favori qui est publié par notre Ami Liam Allan
Si voulez en savoir plus une vidéo très bien faite de notre ami de Yvon est disponible sur la chaine youtube de Volubis ici
Mais il existe également des extensions créé par d’autres contributeurs en voici une qui est apparu en 2022 « IBM i Snippets », elle a été créée par Andy Youens.
L’installation est très simple à partir de la gestion des extensions
Le principe de cette extension est de vous proposer des exemples de codes (par exemple des squelettes pour du RPGLE ou CLLE).
Son usage est très simple vous devez saisir « !i » dans votre éditeur favori .
Cette extension bouge beaucoup depuis sa sortie et les dernières contributions sont récentes, n’hésitez pas à proposer des exemples de codes si vous en avez qui soit présentable
Nous pensons qu’il y aura de plus en plus de extensions disponibles pour l’IBMI et une amélioration de celle exitantes extensions existantes, il est donc important d’avoir un œil ce mode de développement , en sachant que les « JEUNNNNES » connaissent déjà cet interface
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2022-11-01 09:31:152022-11-01 09:31:16Visual studio code IBM i Snippets