On a parfois besoin d’envoyer pour différentes raisons des messages en RPGLE
Voici un tableau comparatif des solutions existantes :
Conclusions
Pour un développement moderne sur IBM i 7.5 ou plus voici nos préconisations :
SND-MSG pour les messages applicatifs en RPGLE (notamment *ESCAPE, *DIAG, *STATUS) , pour du SQLRPGLE il remplace avantageusement le dsply
QSYS2.SEND_MESSAGE lorsqu’on est principalement en SQL ou SQLRPGLE, il permet par exemple de choisir une file de messages
QSYS2.WRITE pour remplacer les DSPLY de débogage par des traces propres dans la joblog
QMHSNDPM pour les développements avancés , par exemple pour échanger vers des files de messages programmes
Remarques
Pour des actions particulières, par exemple refus de trigger, erreur de données dans un cgi, il peut être plus judicieux de créer un fichier de log. Il devra contenir les informations sur la nature de l’erreur et le contexte d’exécution à minima user, job, date heure, programme
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2026-07-18 10:45:332026-07-18 10:47:14Envoyer un message en RPGLE
Vous devez ou vous devrez vous conformer à la norme ISO27001 :
Voici quelques points à contrôler qu’un auditeur pourrait vous demander
1) séparation DEV / TEST / PROD
Ils vérifieront que vous avez à minima 3 environnements, 2 machines sont une bonne pratique
2) Git ou gestionnaire de versions
Ils vérifieront que vous avez un versioning de votre code source, aujourd’hui git est incontournable pour réaliser cette opération
3) Revue de code documentée
Ils vérifieront que vous faites des revues de code et que vous avez des actions suite à celle-ci, exemple modernisation du code obsolète entrant en maintenance.
4) Les droits des développeurs
Ils vérifieront par exemple qu’aucun développeur reste avec *ALLOBJ permanent, et qu’il a des droits limités et tracés à les actions en production
5) Données sensibles chiffrées en transit (TLS/HTTPS)
Ils vérifieront qu’aucune données ne circule en claire , mise en œuvre de TLS
6) Contrôle des accès aux objets
Ils vérifieront les droits d’accès aux objets , la bonne pratique est *use sur les programmes *change sur les datas
7) Journalisation et suivi des changements
Ils vérifieront que les modifications effectuées correspondent à une demande documentée et éventuellement un ticket d’incident ou de correctif
8) Procédure de mise en production documentée
Ils vérifieront que vous avez un process de mise en production avec de interlocuteurs différents pour les rôles jusqu’à la mise en production
9) Normes de développement sécurisées
Ils vérifieront que vous avez des normes de développement (nommage , SQL préparé, validation des entrées ou paramètres, gestion des erreurs)
Conclusion :
Tous ces points ne vous garantissent pas de passer un audit confortable, mais ils vous permettront d’avoir des éléments pour engager un dialogue
Quand Service Commander, un serveur MCP et une locale pakistanaise décident de compliquer votre journée
Ces derniers jours, j’ai installé un serveur MCP IBM i en m’appuyant sur Service Commander. Une opération qui, sur le papier, semblait relativement simple : installer le serveur MCP, créer le service par service commander pour faciliter l’exploitation.
Pourtant, je me suis retrouvé face à un comportement particulièrement déroutant. Et c’est là que l’utilisation de l’IA (BOB en l’occurrence) s’est révélée extrêmement intéressante.
Le symptôme : ça marche… sauf quand ça ne marche pas
Le serveur MCP démarrait parfaitement lorsque je lançais cette commande avec le profil MCPSERVER créé pour l’occasion :
sc start ibmi-mcp-server
Mais avec mon profil habituel, j’obtenais systématiquement un message d’erreur, ou alors un message de complétion mais le serveur MCP était inactif.
Le détail intriguant était que le service était pourtant configuré pour soumettre le job sous le profil MCPSERVER :
sbmjob_opts: 'JOBQ(QUSRNOMAX) USER(MCPSERVER)'
En théorie, le profil appelant n’aurait donc pas dû avoir d’importance.
La tentation du mauvais diagnostic
Le premier réflexe est de suspecter :
un problème de droits ;
un problème de PATH ;
une configuration npm ;
Node.js ;
la configuration MCP ;
ou encore Service Commander lui-même.
J’ai commencé à analyser les jobs, les spools, les variables d’environnement et les traces de démarrage.
Rapidement, une chose est apparue : le job était bien soumis sous MCPSERVER, mais l’environnement du processus n’était pas toujours cohérent.
Une découverte intéressante
Les premiers logs montraient que lorsque le démarrage était demandé par NB, certaines informations restaient liées à ce profil :
HOME=/home/NB
USER=nb
LOGNAME=nb
alors que le job tournait sous MCPSERVER.
J’ai donc modifié la configuration pour désactiver l’héritage implicite de l’environnement :
environment_is_inheriting_vars: false
et défini explicitement les variables nécessaires.
Le comportement a changé, mais le problème n’était toujours pas totalement résolu.
Le vrai coupable : la commande de démarrage
Pendant plusieurs itérations, j’ai tenté de simplifier la définition du service :
Pourquoi un serveur IBM i situé en France essayait-il d’utiliser une locale pakistanaise ?
Après investigation, j’ai découvert que Service Commander contient la logique suivante :lorsque aucune locale UTF-8 n’est définie dans l’environnement, Service Commander choisit simplement… la dernière locale (par ordre alphabétique) UTF-8 trouvée sur le système.
Sur ma machine, c’était : ur_PK.UTF-8, c’est-à-dire :
ur = ourdou
PK = Pakistan
D’où le message surprenant.
La solution a finalement consisté à définir explicitement :
export LC_ALL=FR_FR.UTF-8@euro
dans ~/.profile et ~/.bashrc
Depuis, plus aucun avertissement.
Et BOB dans tout ça alors ?
Ce que l’IA m’a réellement apporté ?
La partie la plus intéressante de cette aventure n’est pas le problème technique lui-même, j’aurais fini par trouver la solution. Les indices étaient là :
les spools ;
les joblogs ;
les variables d’environnement ;
le comportement différent selon le profil utilisé.
Mais cela m’aurait probablement pris plusieurs heures supplémentaires, que j’aurais réparti sur plusieurs jours.
L’IA n’a pas « résolu le problème à ma place ». Elle n’a pas eu accès à ma machine (je vous rappelle que j’installais le serveur MCP à ce moment là), à mes commandes ou à la documentation interne de mon environnement.
En revanche, elle a joué un rôle extrêmement utile :
proposer des pistes d’investigation ;
analyser rapidement les spools ;
repérer les incohérences ;
suggérer des vérifications ciblées ;
éliminer de nombreuses hypothèses ;
structurer le raisonnement.
En pratique, elle s’est comportée comme un collègue expérimenté assis à côté de moi, capable de relire instantanément chaque log et de suggérer la prochaine étape.
J’hallucine ?
Pas beaucoup sur cette affaire là ! Pas de commande (shell ou IBM i) extravagante, de boucle dans les réponse, d’idée totalement saugrenue.
Attention, plusieurs critères à prendre en compte :
je connais le sujet
j’ai fait des prompts verbeux et précis
j’ai détecté les mauvaises pistes ET donner les informations pour que BOB comprenne pourquoi c’est une mauvaise piste
Ce que je retiens
L’apport principal de BOB dans ce type de situation n’est pas le remplacement de l’expertise.
C’est l’accélération du diagnostic.
Mon expertise IBM i m’a permis d’interpréter les résultats, de comprendre les implications et de valider les solutions. L’IA, elle, m’a aidé à parcourir beaucoup plus rapidement l’arbre des hypothèses possibles.
Résultat :
un serveur MCP fonctionnel ;
une configuration Service Commander plus robuste ;
une anomalie de locale identifiée et corrigée ;
et quelques heures gagnées sur une enquête qui aurait probablement été bien plus longue en solitaire.
Et, accessoirement, j’ouvrirais une issue sur la gestion des locales par service commander !
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2026-07-03 10:54:102026-07-03 11:00:16Les droits d’un fichier IFS à sa création
Vous voulez savoir le droit qu’un utilisateur aura quand il tentera d’accéder à un fichier IFS
Voici un script avec les requêtes qui vous aidera à déterminer le droit que vous obtiendrez.
Vous aurez 8 étapes possibles , et il s’arrêtera à la première correspondance.
--
-- Voici une liste de commande SQL pour trouver le droit d'un utilisateur
-- Sur un fichier IFS
-- ici l'utilisateur PLB
-- tente d'accéder au fichier
--/home/plb/Controle_demarrage_SBS.csv
-- 1 si user *ALLOBJ
-- Si oui tous les droits
--
SELECT SPECIAL_AUTHORITIES,
FROM qsys2.user_info
WHERE AUTHORIZATION_NAME = 'PLB';
--
-- 2 si user sur l'objet
--
SELECT *
FROM TABLE (
QSYS2.IFS_OBJECT_PRIVILEGES('/home/plb/Controle_demarrage_SBS.csv')
)
WHERE AUTHORIZATION_NAME = 'PLB';
--
-- 3 si utilisateur dans liste d'autorisations
--
SELECT *
FROM QSYS2.AUTHORIZATION_LIST_USER_INFO
WHERE AUTHORIZATION_NAME = 'PLB'
AND AUTHORIZATION_LISt = (SELECT AUTHORIZATION_LIST
FROM TABLE (
QSYS2.IFS_OBJECT_PRIVILEGES('/home/plb/Controle_demarrage_SBS.csv')
)
WHERE AUTHORIZATION_NAME <> '*PUBLIC');
--
-- 4 si groupe all obj
-- Si oui tous les droits
--
SELECT
SPECIAL_AUTHORITIES
FROM qsys2.user_info
WHERE AUTHORIZATION_NAME = ( SELECT GROUP_PROFILE_NAME
FROM qsys2.user_info
WHERE AUTHORIZATION_NAME = 'PLB');
--
-- 5 si groupe sur l'objet
--
SELECT * FROM TABLE(QSYS2.IFS_OBJECT_PRIVILEGES('/home/plb/Controle_demarrage_SBS.csv'))
where AUTHORIZATION_NAME =
( SELECT GROUP_PROFILE_NAME
FROM qsys2.user_info
WHERE AUTHORIZATION_NAME = 'PLB');
--
--6 Si groupe dans la liste d'autorisation
--
SELECT *
FROM QSYS2.AUTHORIZATION_LIST_USER_INFO
WHERE AUTHORIZATION_NAME = (SELECT GROUP_PROFILE_NAME
FROM qsys2.user_info
WHERE AUTHORIZATION_NAME = 'PLB')
AND AUTHORIZATION_LIST = (SELECT AUTHORIZATION_LIST
FROM TABLE (
QSYS2.IFS_OBJECT_PRIVILEGES('/home/plb/Controle_demarrage_SBS.csv')
)
WHERE AUTHORIZATION_NAME <> '*PUBLIC');
--
--7 Si public
--
SELECT *
FROM TABLE (
QSYS2.IFS_OBJECT_PRIVILEGES('/home/plb/Controle_demarrage_SBS.csv')
)
WHERE AUTHORIZATION_NAME = '*PUBLIC'
AND DATA_AUTHORITY <> '*AUTL';
--
--8 Si public reporté sur la liste d'autorisation
--
SELECT *
FROM QSYS2.AUTHORIZATION_LIST_USER_INFO
WHERE AUTHORIZATION_NAME = '*PUBLIC'
AND AUTHORIZATION_LISt = (SELECT AUTHORIZATION_LIST
FROM TABLE (
QSYS2.IFS_OBJECT_PRIVILEGES('/home/plb/Controle_demarrage_SBS.csv')
)
WHERE AUTHORIZATION_NAME <> '*PUBLIC');
Remarque :
Ce mécanisme peut être complété par des groupe additionnels , les droits proposés devenant complétifs (‘Ajouter au droit existant’)
Il est conseillé de les utiliser modérément , on peut avoir un système de droit assez efficace juste avec le mécanisme historique
Dans l’IFS l’adoption de droit ne s’applique pas, mais dans vos sript sh vous pouvez utiliser la notion de SETUID
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2026-07-03 10:13:032026-07-03 10:13:04Droit d’utilisateur sur un fichier IFS