> Tech > Comment traiter une exception ExecCmd ?

Comment traiter une exception ExecCmd ?

Tech - Par System iNews - Publié le 08 septembre 2014
email

Toutes les réponses aux questions des administrateurs d'environnements IBM i.

Comment traiter une exception ExecCmd ?

Boîte à outils System iNews, trucs et Astuces pour les Professionnels IT via @itprofr

  1. Traiter une exception ExecCmd
  2. Utiliser XML-INTO
  3. Naviguer avec la commande WRKLNK
  4. Changer la page d’atterrissage pour le serveur Apache
  5. Etablir des valeurs par défaut RPG avec un copy book H-Spec
  6. Protéger vos valeurs système contre toute modification

Retrouvez toutes les Boîtes à Outils System iNews.

Traiter une exception ExecCmd

Q. Comment puis-je traiter une exception en provenance d’un ExecCmd dans un programme RPGLILE ?

R. Quand une commande exécutée via QCMDEXC échoue, un message *ESCAPE est envoyé à votre programme et journalisé dans le job log. Vous pouvez utiliser la méthode  RPG monitor block, qui est l’équivalent de la commande MONMSG de CL, pour intercepter l’erreur et analyser le problème. Scott Klement a écrit un excellent article sur ce sujet. Vous le trouverez à systeminetwork.com/article/error-handling-when-running-commands-rpg.

Utiliser XML-INTO

Q. La commande XML-INTO demande comme option un paramètre document. J’ai le code suivant :

xmlfile = ‘/home/myname/my_xml_doc.xml’;                      

 options = ‘doc=file +                                          
            path=RequestForUICGroup/RequestForUIC +             
            case=any +                                          
            allowextra=yes +                                    
            allowmissing=yes’;                                  

 xml-into RequestForUIC %xml(xmlfile: options);

Est-il possible d’utiliser une variable en entrée, telle qu’un CGI parm passé dans le programme à partir d’une interface web ? Bien sûr, je pourrais écrire cette variable dans IFS puis la relire en retour, mais ce ne serait pas très satisfaisant.

R. Le comportement par défaut dans XML-INTO est de prendre le document XML à partir d’une variable. Retirez simplement « doc=file » de vos options. Dès lors, le premier paramètre de %XML() est la variable contenant le document XML.

—Scott Klement

Naviguer avec la commande WRKLNK

Q. En utilisant la commande CL WRKLNK, j’essaie de naviguer dans le chemin de répertoire suivant :
home/QIBMHELP/.eclipse/org.eclipse.platform_3.2.2/configuration/org.eclipse.osgi/.manager/.tmp9103087281292047364.instance

Je peux naviguer via WRKLNK vers l’objet directement en utilisant le chemin complet, mais si j’essaie de naviguer vers un élément de répertoire qui commence par un point, ce répertoire n’est pas visible dans la sortie WRKLNK. Comment puis-je naviguer vers ces répertoires intermédiaires et les visualiser ?

R. Les objets commençant par un point (.) sont des objets cachés. Par conséquent, pour les voir vous devez spécifier WRKLNK DSPOPT(*ALL).

Changer la page d’atterrissage pour le serveur Apache

Q. Je sais que je peux remplacer la valeur par défaut index.html comme page d’atterrissage pour le serveur Apache, par un autre .html. Est-il possible que cette page soit un programme cgidev2 ? Ou dois-je créer un autre .html avec un lien de redirection imbriqué ?

R. En utilisant la directive d’Apache DirectoryIndex dans le fichier httpd.conf, vous pouvez faire charger par défaut n’importe quel fichier. Par exemple, nous utilisons le produit RPG Server Pages de Damon Technologies. La ligne suivante nous convient :
DirectoryIndex index.rsp

Le fichier index.rsp est un programme exécutable, pas un fichier html.

Etablir des valeurs par défaut RPG avec un copy book H-Spec

IBM s’efforce de préserver la rétrocompatibilité de RPG. C’est l’un des points forts de notre plate-forme, mais aussi son talon d’Achille. Souvent, de superbes fonctions sont ajoutées à RPG mais désactivées par défaut par souci de compatibilité. Pour les activer, il faut ajouter un mot-clé à la H-spec.

C’est pour cette raison que j’ai créé pour ma H-spec un copy book que j’utilise dans tous les nouveaux programmes. Voici quelques suggestions de mots-clés H-spec.

OPTION(*SRCSTMT)

Sans cette option, le compilateur RPG génère de nouveaux numéros d’instructions quand il compile votre code. Si une erreur survient dans le programme, vous obtenez un message du genre « Error occurred at line 123. » Comme 123 est le numéro de ligne renuméroté plutôt que l’instruction du code source, seul un listing de compilation permettra de voir où se trouve l’erreur. Si vous spécifiez OPTION(*SRCSTMT), les messages d’erreur utiliseront le même numéro de ligne que votre code source.

OPTION(*NODEBUGIO)

Sans cette option, le compilateur RPG génère des étapes de débogage pour chaque champ dans les specs d’entrée de chaque fichier, même si le fichier est défini en externe. Si vous analysez pas à pas le code à déboguer, il vous faut traiter individuellement chaque spec d’entrée, ce qui peut être très fastidieux. Avec OPTION(*NODEBUGIO), le débogueur ne s’arrêtera plus sur les specs d’entrée ou de sortie.

EXTBININT(*YES)

Sans cette option, tout champ entier binaire dans des fichiers définis en externe sera converti en type de donnée B en RPG. Ce type de donnée est un étrange animal qui convertit des entiers en champs packés temporairement pour des calculs et les reconvertit en sens inverse pour le stockage. Ce procédé est plus lent que l’entier natif et, contrairement à ce dernier, ne supporte pas toute la gamme. Bien que DDS et SQL supportent tous deux la gamme d’entiers complète, RPG le convertit en un champ qui ne le fait pas. Quand vous validez  EXTBININT(*YES), RPG utilise de vrais champs entiers, ce qui améliore la performance et supporte davantage de valeurs. Sans aucun doute, ce devrait être la valeur par défaut de tout le monde !

DFTACTGRP(*NO)

Sans cette option, le comportement par défaut est de mettre vos programmes RPG en mode de compatibilité OPM. Non seulement ils s’exécuteront dans le groupe d’activation par défaut, mais ils fonctionneront comme un programme OPM, en vous dispensant d’utiliser les fonctions ILE et de désactiver des programmes plus fréquemment. L’utilisation de DFTACTGRP(*NO) résout cela en transformant votre code RPG en un vrai programme ILE, ce qui améliore la performance et l’accès aux fonctions ILE si elles vous intéressent.

BNDDIR(‘MAIN’:’QC2LE’)

Sans cette option, le binder ILE (invoqué par les commandes  CRTPGM, CRTSRVPGM, ou CRTBNDxxx) ne recherche les sous-procédures que dans les modules ou programmes de service que vous listez explicitement sur la commande ou dans le System API Binding Directory (QUSAPIBD). Avec cette option, vous pouvez spécifier d’autres répertoires de liage (binding) à explorer. Dans mon site, nous avons un répertoire de liage nommé MAIN, dans lequel nous rangeons tous nos programmes de service. Le fait de spécifier BNDDIR(‘MAIN’) rend les programmes beaucoup plus simples à créer, parce que le système recherchera automatiquement les éventuels outils que nous avons rendus disponibles en tant que sous-procédures. Le répertoire de liage QC2LE contient aussi beaucoup d’outils intéressants fournis par IBM. A partir de l’IBM i 6.1, vous n’avez pas besoin de spécifier QC2LE ici, parce qu’il est exploré automatiquement.

Remarque : L’ajout d’un répertoire de liage à votre application n’augmente pas la taille du programme et ne le lie pas non plus à tous les programmes de service dans le répertoire de liage. En revanche, le répertoire de liage est utilisé pour trouver les éventuelles sous-procédures manquantes. Si vous appelez une sous-procédure introuvable dans votre code, le répertoire de liage est exploré jusqu’à ce qu’un programme de service contenant la procédure demandée soit trouvé. Seuls les programmes de service (ou modules) qui fournissent une procédure nécessaire seront liés à votre programme.

Je suggère de créer un copy book qui fournisse les mots-clés H-spec désirés. Voici un exemple du code dans ce copy book:

      H OPTION(*SRCSTMT:*NODEBUGIO) EXTBININT(*YES)
      H BNDDIR(‘MAIN’: ‘QC2LE’)                   
       /if defined(*CRTBNDRPG)                    
      H DFTACTGRP(*NO)                            
       /endif     

L’option DFTACTGRP ne peut être utilisée qu’avec la commande CRTBNDRPG (ou CRTSQLRPGI, qui invoque CRTBNDRPG en coulisses). Si vous essayez de spécifier DFTACTGRP sur la commande CRTRPGMOD, vous obtiendrez une erreur. La logique /if defined(*CRTBNDRPG) élimine l’option DFTACTGRP quand la commande CRTBNDRPG n’est pas utilisée.

A titre d’exemple, supposons que vous mettiez les H-specs précédentes dans un copy book et nommiez le membre DFTHSPEC. Pour utiliser ce copy book à partir de vos applications RPG, vous mettriez cette ligne de code au début :

      H/copy DFTHSPEC

Avec cette option, les valeurs par défaut seront plus pertinentes. Si votre application a besoin de spécifier des H-specs supplémentaires, c’est aussi sans problème. Vous pourrez les spécifier sur des lignes ultérieures :

      H/copy DFTHSPEC
      H ACTGRP(*CALLER) NOMAIN

RPG utilisera toutes les H-specs, celles du copy book et du code en dessous de lui, pour mettre en place les options dont vous avez besoin. Ces options constituent de meilleures valeurs par défaut pour le code d’aujourd’hui.

—Scott Klement

Protéger vos valeurs système contre toute modification

Les valeurs système (System Values) de l’IBM i déterminent son mode de fonctionnement. Quand vous n’êtes pas le seul dans l’entreprise à avoir des privilèges de responsable de la sécurité ou un haut niveau d’autorité, un autre utilisateur peut changer les paramètres de ces valeurs. Afin de les protéger, IBM fournit un mécanisme Lock/Unlock uniquement disponible au moyen de System Service Tools (SST).

Pour pouvoir accéder au paramètre Lock/Unlock, un utilisateur doit posséder un ID et mot de passe utilisateur Service Tools. Ces ID et mot de passe ne sont pas les mêmes que ceux du système d’exploitation. Ce sont des ID utilisateur Service Tools spéciaux, comme 11111111, 22222222 et, oui, QSECOFR. Mais le QSECOFR de l’utilisateur de Service Tools est un utilisateur différent de QSECOFR de l’OS, généralement avec un mot de passe différent.

Pour accéder à la fonction Lock/Unlock, utilisez la commande Start System Service Tools (STRSST) et, à l’invite, entrez l’ID utilisateur QSECOFR et le mot de passe SST. S’affiche alors le menu System Service Tools comme dans la figure 1.

Sélectionnez l’option 7 (Work with System Security). L’écran de la figure 2 apparaît. Pour verrouiller (Lock) les valeurs système liées à la sécurité, choisissez 2 dans l’option « Allow system value security changes, » et appuyez sur ENTREE. L’option 2 empêchera quiconque de modifier des valeurs système liées à la sécurité.

Dans l’IBM i 6.1, les valeurs système montrées dans la figure 3 sont verrouillées par la fonction SST Lock/Unlock :

Si vous devez restreindre les changements des valeurs système supplémentaires, vous pouvez essayer de restreindre l’accès à la commande CHGSYSVAL elle-même. Mais si vos techniciens ont un haut niveau d’autorité, cette restriction ne suffira pas à empêcher les changements des valeurs système non listées ci-dessus.
Je vous engage fortement à verrouiller la valeur système  dans SST. Si une valeur système protégée doit être changée, l’administrateur doit donner son aval. Dans ce cas, le verrou peut être levé temporairement pour modifier la valeur système.

Aussitôt après, l’administrateur reverrouille.

Téléchargez cette ressource

Préparer l’entreprise à l’IA et aux technologies interconnectées

Préparer l’entreprise à l’IA et aux technologies interconnectées

Avec la « quatrième révolution industrielle », les environnements hyperconnectés entraînent de nouveaux risques en matière de sécurité. Découvrez, dans ce guide Kaspersky, comment faire face à cette nouvelle ère de vulnérabilité.

Tech - Par System iNews - Publié le 08 septembre 2014