> Tech > Boîte à outils System i, Données FTP à partir de l’IFS

Boîte à outils System i, Données FTP à partir de l’IFS

Tech - Par System iNews - Publié le 20 février 2012
email

Toutes les réponses aux questions des administrateurs d'environnements IBM i. Ce dossier est issu de notre publication System iNews (06/11). Pour consulter les schémas et illustrations associés, rendez-vous dans le club abonnés. Au sommaire de cette édition : - Obtenir des données FTP à partir de l'IFS - Résoudre le problème de verrouillage numérique (numlock) dans Xterm - Activer PCO.EXE dans SmarTerm - Imposer une lettre majuscule dans les mots de passe - Créer un nom de fichier variable en SQL - Audit des objets dans QSYS et dans l'IFS

Obtenir des données FTP à partir de l’IFS

Q. J’essaie de recevoir des données de l’IFS, via FTP. Normalement, quand des données sont reçues via FTP, je vérifie que j’ai reçu un code de retour 226 provenant de la commande MGET, pour confirmer la bonne réception des données. Quand j’envoie FTP à un dossier sur l’IFS, au lieu d’obtenir le code 226, je reçois le message “501 Unknown extension in database file name.” (Extension inconnue dans le nom du fichier de base de données). Mais les données me parviennent. J’aimerais bien savoir pourquoi je ne vois pas le code 226 indiquant que les données ont été reçues. Je suis en V5R4 ; l’extension du nom de fichier est .trn.

R. Avez-vous d’abord appliqué CD (Change Directory) à un dossier IFS ? Si vous ne l’avez pas fait, votre répertoire courant est probablement encore /qsys.lib/qgpl.lib, qui est une extension de fichier base de données invalide pour le système de fichiers QSYS. Le problème pourrait aussi se situer côté client, avec son répertoire local dans FTP réglé sur une bibliothèque du système client.Essayez de changer votre répertoire local (via la commande LCD) une fois que vous êtes à l’intérieur de l’application FTP, sur un emplacement IFS. Puis réessayez MGET.

— Tom Holden et Scott Klement

Résoudre le problème de verrouillage numérique (numlock) dans Xterm

Q. J’utilise l’émulateur UNIX Cygwin/X sur Windows pour exécuter le programme X Window xterm, qui est un émulateur de terminal à écran vert (passif). Je démarre qsh, puis xterm — j’obtiens une fenêtre sur mon ordinateur serveur X, mais il semble que je ne puisse rien taper. Quelqu’un aurait-il une explication ?

R. J’avais installé le dernier Cygwin/X et j’avais des problèmes xterm de la part de mon système i. Il s’est avéré que le mal venait du verrouillage numérique (numlock) sur mon pavé numérique : en position incorrecte, il empêche toute entrée de texte au clavier. Il suffit que j’appuie sur la touche Verr. num pour que la saisie de texte et l’interaction avec le terminal se passent bien. J’obtiens aussi un bon résultat en utilisant aixterm avec un paramètre :

aixterm -v X

Cela désactive le pavé numérique en remplaçant les frappes de touches par le caractère fourni comme argument (X). Le problème est déroutant du fait que xterm ne fonctionne qu’avec Verr. num dans la position opposée.

— Michael Frilot

Activer PCO.EXE dans SmarTerm

Q. Au lieu d’utiliser TN5250 Navigator, j’utilise le logiciel d’émulation de terminal SmarTerm d’Esker. J’ai besoin d’utiliser le Windows PCO.EXE dans une application, mais quand j’essaie d’utiliser STRPCCMD dans SmarTerm, j’obtiens l’erreur suivante :

Required PC program (PCO.EXE) is not active
No communications with PC can occur
Press ENTER to resume

Comment puis-je activer PCO.EXE dans SmarTerm ?

R. Cette erreur est trompeuse. Elle dit toujours que vous avez besoin de PCO.EXE, alors qu’aucun logiciel d’émulation moderne (y compris IBM i Access) n’a un programme de ce nom.

Ce message d’erreur continue de s’afficher. Même si la commande à distance fonctionne correctement, elle produit quand même un message d’erreur disant qu’elle a échoué et qu’il vous faut PCO.EXE. Le logiciel d’émulation PC qui comprend la manière dont STRPCCMD fonctionne, interceptera cet écran d’erreur et ne l’affichera pas. Autrement dit, avec un logiciel qui comprend STRPCCMD, ce message d’erreur persiste mais vous ne le voyez jamais.

Avec un logiciel qui ne comprend pas STRPCCMD, vous verrez l’erreur parce que le programme sans capacité STRPCCMD n’interceptera pas le message d’erreur original. Il est donc probable que votre émulateur ignore complètement STRPCCMD. L’installation d’un programme nommé PCO.EXE ne vous aidera peut-être pas, mais amener votre programme d’émulation de terminal à la dernière version fera peut-être l’affaire.

— Scott Klement

Imposer une lettre majuscule dans les mots de passe

Q. J’essaie d’instaurer un programme de validation de mots de passe exigeant une lettre majuscule dans le mot de passe de l’utilisateur quand il le change sur l’écran d’expiration ou de redéfinition (CHGPWD). Je veux aussi qu’un message d’erreur en bas de l’écran signale l’absence de la lettre majuscule.

Quel code permet de vérifier la présence d’une lettre majuscule ? Mon API est déjà prête. Par ailleurs, là où le message d’erreur est attendu au bas de l’écran, un message indique que le programme de validation du mot de passe a causé une erreur. Comment obtenir que le bon message d’erreur souhaité en utilisant la commande SNDPGMMSG reste sur l’écran ?

R. Voici le code de programme de sortie qui vérifie la présence d’au moins une lettre majuscule dans le mot de passe de l’utilisateur : voir figure 1.

— Tom Sullivan

Créer un nom de fichier variable en SQL

Q. J’ai un programme SQLRPGLE qui applique un peu de SQL sur un fichier de travail. Ce fichier est construit via une option de sortie d’un rapport de ratio de perte que l’utilisateur exécute. J’aimerais pouvoir passer le nom de fichier à l’instruction SQL comme une variable. Existe-t-il un moyen simple pour cela ? Le nom du fichier de sortie changera et je ne veux pas dupliquer toutes les instructions SQL pour chaque fichier.

R. Lorsque SQL imbriqué est utilisé en RPG, vous avez le choix entre des instructions SQL statiques et dynamiques. Les instructions statiques sont plus rapides, mais certaines informations, comme le nom de table et les noms de colonnes doivent être connus au moment de la compilation. Les instructions dynamiques font presque tout à l’exécution, et donc les noms de tables et de colonnes peuvent être ignorés jusqu’à l’exécution de l’instruction. Selon vos besoins, vous choisirez entre SQL statique ou dynamique.

SQL statique fait une partie du travail au moment de la compilation. Un plan d’accès sera généré ou mis à jour à la compilation et stocké dans l’objet programme lui-même. Cela peut influencer fortement les performances. Pour générer un plan d’accès, il faut savoir à quel fichier on accédera ! N’oubliez pas que l’instruction SQL que vous tapez n’est que du code source : il doit être interprété/compilé pour pouvoir s’exécuter. Le nom du fichier joue ici un grand rôle parce qu’il devra savoir à quels champs vous accéderez et leur emplacement dans le fichier.

Avec SQL statique, si vous voulez spécifier un fichier différent à l’exécution, vous pouvez utiliser un OVRDBF pour le pointer vers un fichier différent :

cmd = ‘OVRDBF FILE(MYFILE) TOFILE(QTEMP/TEMPFILE)’;
QCMDEXC(cmd: %len(cmd));

exec SQL declare MYCURSOR for
select field1, field2 from MYFILE
where AcctNo=:myAcctNo;
exec SQL open MYCURSOR;
exec SQL fetch next from MYCURSOR into :myDS;
…etc…

Répétons-le, le principal avantage de SQL statique est d’être performant. Dans le cas présent, le fichier auquel vous accédez (TEMPFILE) n’est pas si différent de celui sur lequel votre instruction a été compilée (MYFILE). C’est juste une copie temporaire du même fichier. Si la seule différence est le nom du fichier, il en résultera de meilleures performances.

SQL dynamique fait presque tout son travail à l’exécution. Donc, vous pouvez construire toute l’instruction SQL à la volée et l’exécuter. Le moteur SQL ne connaît rien de l’instruction avant l’exécution, c’est pourquoi il est un peu plus lent. (Comme tout le travail doit être fait à l’exécution, rien d’étonnant à ce qu’il soit plus lent !) Il est plus souple parce que vous pouvez tout faire à la volée : construire l’instruction, spécifier les noms des champs, spécifier le nom du fichier, etc.

Beaucoup de langages (dont Java, PHP, C#, VB.NET) n’acceptent que le SQL dynamique. RPG accepte les deux, statique et dynamique. Par exemple :

mySql = ‘select field1, field2 from ‘ + %trimr(FileName)
+ ‘ where AcctNo=?’;

exec SQL prepare MYSTMT from :mySql;
exec SQL declare MYCURSOR for MYSTMT;
exec SQL open MYCURSOR using :myAcctNo;
exec SQL fetch next from MYCURSOR into :myDS;
…etc…

A noter que la manière dont vous insérez des variables de programmes dans votre instruction SQL est différente en SQL dynamique. En SQL statique, vous pouvez coder simplement : :VarName pour insérer la variable VarName dans l’instruction. Rien de tel en SQL dynamique. Rappelons que les noms de variables n’existent que pour nous faciliter la vie ! Le compilateur les remplace avec l’accès aux banques de mémoire de l’ordinateur, et, par conséquent, ils n’existent pas vraiment au moment de l’exécution. En SQL dynamique, où tout est fait à l’exécution, vous devez placer un point d’interrogation (appelé « marqueur de paramètre ») à l’endroit prévu pour une variable.

Le mot-clé « using » sur le curseur ouvert (cursor open) spécifie quelle variable correspond au marqueur de paramètre. De sorte que :myAcctNo dans l’exemple précédent peut être converti en une position mémoire à la compilation. À l’exécution, SQL recherche le caractère “?” et insère les données de cette position mémoire. Ce n’est pas aussi commode que la variante statique, mais cela vous permet de changer l’instruction SQL à l’exécution.

— Scott Klement

Audit des objets dans QSYS et dans l’IFS

Le Système i intègre d’excellentes possibilités d’audit. Vous pouvez auditer divers types d’événements importants, auditer l’accès aux objets, et l’accès aux « objets » IFS. J’ai beaucoup utilisé les fonctions d’audit d’objets pour des objets QSYS. Mais l’autre jour, j’ai été pris de court. On m’a demandé : « Comment activez-vous l’audit pour des fichiers et répertoires nouvellement créés dans l’IFS ? » Je savais qu’il y avait un moyen, mais la méthode ne m’est pas venue immédiatement à l’esprit. Après quelques recherches sur le web et pas mal de tests, j’ai à présent la réponse à cette question.

La valeur système QCRTOBJAUD spécifie la valeur par défaut globale du niveau d’audit instauré pour les objets nouvellement créés. La valeur de départ est *NONE, ce qui signifie que les objets nouvellement créés ne seront pas audités au niveau global/système. Vous pouvez remplacer la valeur système QCRTOBJAUD au niveau bibliothèque en spécifiant le paramètre CRTOBJAUD des commandes CRTLIB (Create Library) et CHGLIB (Change Library), comme ceci :

CHGLIB LIB(MYLIB) CRTOBJAUD(*CHANGE)Quand une bibliothèque est créée, la valeur par défaut pour le paramètre CRTOBJAUD de CRTLIB est *SYSVAL, mais vous pouvez lui préférer *ALL, *CHANGE, *USRPRF, *NONE, ou *SYSVAL:

CRTLIB LIB(MYLIB) … CRTOBJAUD(*CHANGE)

Désormais, chaque fois qu’un nouvel objet sera créé dans MYLIB, la valeur OBJAUD de l’objet sera automatiquement *CHANGE.

Le système de fichiers /root de l’IFS est utilisé pour stocker divers types de fichiers, répertoires, dossiers et documents. Il recueille souvent les données sensibles : feuilles de calcul Excel, images de documents, fichiers PDF, et objets d’applications PC, entre autres.

Outre le paramètre global pour le système de fichiers QSYS, la valeur système QCRTOBJAUD est aussi le paramètre global appliqué aux répertoires IFS. Si vous voulez activer l’audit pour tous les “ objets” IFS nouvellement créés, réglez la valeur système QCRTOBJAUD sur *ALL, *CHANGE, ou *USRPRF, selon les besoins. Dans l’IFS, ce paramètre global peut être remplacé au niveau répertoire à l’aide de la commande CHGATR (Change Attribute) comme on le voit ici :

CHGATR OBJ(‘home/myuser’) ATR(*CRTOBJAUD) VALUE(*CHANGE)

Si vous voulez que l’attribut d’audit *CRTOBJAUD soit aussi appliqué aux sous-répertoires, incluez l’option SUBTREE(*ALL) de la commande CHGATR.

On voit donc que la commande CHGATR est au coeur de la gestion de l’audit pour les objets nouvellement créés dans l’IFS. Vous spécifiez l’attribut *CRTOBJAUD et la valeur correspondante pour le répertoire et, éventuellement, pour les sous-répertoires associés.

Un dernier point : pendant que je travaillais sur ce sujet, j’ai été très surpris par une IBM Technote sur le site web IBM. J’ai cru comprendre que vous pouvez commencer à auditer tous les « objets » IFS nouvellement créés en changeant la valeur CRTOBJAUD du répertoire racine. Mais cette méthode n’a fonctionné dans aucun de mes tests. Elle commence seulement à auditer les objets nouvellement créés dans la racine elle-même, mais dans aucun répertoire ou sous-répertoire.

— Dan Riehl

Téléchargez cette ressource

Guide inmac wstore pour l’équipement IT de l’entreprise

Guide inmac wstore pour l’équipement IT de l’entreprise

Découvrez toutes nos actualités à travers des interviews, avis, conseils d'experts, témoignages clients, ainsi que les dernières tendances et solutions IT autour de nos 4 univers produits : Poste de travail, Affichage et Collaboration, Impression et Infrastructure.

Tech - Par System iNews - Publié le 20 février 2012