> Tech > La Boîte à outils System iNews – Programme CL pour invoquer FTP

La Boîte à outils System iNews – Programme CL pour invoquer FTP

Tech - Par System iNews - Publié le 04 février 2014
email

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

La Boîte à outils System iNews – Programme CL pour invoquer FTP

Au sommaire de cette édition :

Programme CL pour invoquer FTP
Problèmes avec CHKOBJM
Changer l’autorité des utilisateurs pour les dossiers IFS
Faire apparaître un panneau de contrôle
Changer la configuration i pour le réseau Gigabit
Les dangers du multithreading
Utiliser l’instruction Prompt Control
Obtenir une Job Date en SQL
Mettre à jour une boîte de listes

Retrouvez toutes les Boîtes à Outils System iNews.

Programme CL pour invoquer FTP

Q. Je souhaite déplacer certains objets d’une boîte AS/400 dans une autre, via un SAVF en utilisant FTP. J’aimerais créer un programme CL pour faire le FTP, en appelant le programme chaque fois qu’un SAVF est prêt pour le transfert. Quelles sont les commandes CL pour invoquer FTP et spécifier le fichier à transférer ? Je peux appeler FTP, mais comment vais-je fournir des arguments de transfert de
fichiers ?

R. FTP a deux sources pour les arguments des transferts de fichiers : interactivement via la ligne de commande et en mode batch via un fichier de commandes. Créez simplement un fichier contenant vos commandes FTP (un SRCPF fera l’affaire), puis spécifiez ce fichier comme un recouvrement en invoquant
FTP. Le fichier de commandes doit contenir l’information de login nom d’utilisateur et mot de passe) suivie par les mêmes commandes FTP que vous entreriez interactivement.
Par exemple, vous pourriez avoir un fichier source qftpsrc avec un membre sndsavf contenant :

username password
quote rcmd crtsavf library/savefile
bin
put mylib/mysavf library/savefile
quit

Vous invoqueriez cela dans un programme CL de la façon suivante :

ovrdbf input tofile(qftpsrc) mbr(sndsavf)
addpfm qftpsrc sndresult
monmsg cpf0000
ovrdbf output qftpsrc sndresult
ftp

Le membre de fichier sndresult contient les éventuels messages d’erreurs résultant du transfert.

—S. Kattie.

Problèmes avec CHKOBJM

Q. J’essaie d’utiliser la commande CHKOBJ pour l’existence de fichiers dans l’IFS avant de les renommer. J’obtiens une erreur sur la syntaxe ainsi que sur la longueur de la variable que j’essaie d’utiliser.

R. Vous ne pouvez pas utiliser CHKOBJ sur un chemin IFS. CHKOBJ est réservée aux bibliothèques traditionnelles et aux objets qu’elles contiennent. Toutefois, le simple utilitaire CHKIFSOBJ (que vous pouvez créer en RPG ou CL) fera l’affaire.

—Scott Klement et Terry Winchester.

Changer l’autorité des utilisateurs pour les dossiers IFS

Q. Actuellement, mes utilisateurs peuvent supprimer des fichiers dans les dossiers IFS. Comment  puis-je les en empêcher ?

R. Quand vous publiez un share, vous pouvez spécifier s’il est en lecture seule (il l’est par défaut). Cela affecte l’accès au fichier par des places de réseau ou des lecteurs mappés.
Cependant, les utilisateurs peuvent généralement supprimer les fichiers qui leur appartiennent, c’est-àdire ceux qu’ils ont créés. Quiconque a des droits object exist peut supprimer le fichier, sans toutefois pouvoir octroyer à d’autres personnes l’autorité sur le fichier.

Si vos utilisateurs n’ont pas le droit de supprimer le fichier mais peuvent quand même le faire, vous risquez des problèmes quand le fichier est créé : par exemple, un fichier préexistant que le serveur FTP n’a pas pu supprimer et sur lequel il a par conséquent rétabli les permissions. L’IFS ne respecte pas les paramètres d’autorité adoptée, bien qu’il honore *ALLOBJ. Je pense que si le fichier n’existe pas déjà (auquel cas, parce que Replace fonctionne différemment que s’il y a création d’un nouveau, la propriété n’est pas prise en compte), l’utilisateur créateur peut changer le propriétaire et les
droits sur le fichier. L’utilisateur créateur est l’utilisateur courant, pas l’utilisateur du job, au cas où ils seraient différents.

— Lynne Noll.

Faire apparaître un panneau de contrôle

Q. J’ai créé une « operations console » de sauvegarde, et je me connecte (log on) parfaitement au système, mais je ne peux pas faire surgir le panneau de contrôle : il est grisé sur l’écran Configuration. Selon la documentation IBM, il semble que je doive changer quelque chose dans Dedicated Service Tools (DST) d’IBM, mais je ne peux pas déterminer le changement nécessaire. Je suis en version 7.1.

R. Dans DST, choisissez Option 5 (Work with DST Environment), puis Option 6 (Service Tools Security
Data). Le paramètre “RCP privilege on autocreated device IDs” devrait avoir la valeur GRANTED. Ainsi,
les nouvelles unités créées autoriseront le panneau de contrôle à distance.

Pour changer une unité existante à partir de l’environnement DST, choisissez Option 5 (Service Tools
Device IDs) pour voir la liste des unités d’outils de services enregistrées. Vous pouvez changer les attributs de toute unité déjà créée pour accorder l’accès au panneau de contrôle à distance.

Changer la configuration i pour le réseau Gigabit

Q. Nous sommes en train de remanier entièrement notre réseau (commutateurs, routeur, et câblage cuivre) pour passer d’une dorsale à 100 Mbps au gigabit. Nous avons changé notre câblage d’infrastructure de CAT5 à CAT6 cuivre, et toutes les machines, y compris l’IBM i, ont été déplacées sur le nouveau réseau. La configuration i doit-elle faire l’objet d’autres modifications ?

R. Vous devez changer vos descriptions de ligne Ethernet (LIND) pour avoir une valeur LINESPEED de 1G. IBM recommande que les LIND IBM I et les ports correspondants sur les commutateurs d’interconnexion aient des paramètres = speed et duplex codés en dur. Vous risquez une perte de connectivité intermittente si vous dépendez de la fonction auto-detect d’Ethernet.

Assurez-vous que votre carte Ethernet supporte des vitesses de 1G, bien entendu, et la ligne LIND doit être mise sur vary off avant que vous ne procédiez au changement. Avant d’entreprendre cette opération, réfléchissez à l’endroit d’où vous vous connectez à l’IBM i. En effet, vous ne voulez sûrement pas couper votre accès à la boîte ! L’idéal est de procéder au changement à partir
de la console, sans aucun utilisateur actif sur la carte affectée.

Si vous n’avez pas de console (par exemple, HMC) et si votre seule connectivité avec l’AS/400 passe par une carte Ethernet unique, vous pouvez essayer ce qui suit, mais seulement après mûre réflexion :
Soumettez 3 jobs:

  • Un pour appliquer end/vary off au LIND Ethernet
  • Un pour exécuter la commande CHGLIND
  • Un pour rétablir vary on sur le LIND

Si vous avez un port Ethernet non utilisé, vous pouvez mettre cela en place (avec une adresse IP temporaire) et vous connecter à votre système via cette adresse IP, pendant que vous modifiez votre LIND Ethernet primaire.

Par ailleurs, assurez-vous que DUPLEX est sur*FULL. J’ai aussi donné à nos LIND une taille MAXFRAME
de 8996, mais vous devez d’abord vérifier que vos nouveaux commutateurs prennent en charge des
jumbo frames Ethernet. Les jumbo frames sont des frames Ethernet avec plus de 1500 octets de charge utile. En principe, les jumbo frames peuvent transporter jusqu’à 9000 octets de charge utile, mais avec quelques variations. Donc, assurez-vous que ce paramètre sur l’IBM i est inférieur à la limite imposée par vos commutateurs.

—Dan Devoe, J. Taylor, et Rocky

Les dangers du multithreading

Q. Quelle commande me permet de savoir si un programme RPG IV a été créé avec thread(*serialize),
thread(*concurrent), ou ni l’un ni l’autre, si je n’ai pas accès à la source ?

R. La commande dspmod detail(*import) donnera ce renseignement, mais cette technique n’est pas documentée et pourrait changer au fil des releases. Je n’accorderais pas grande confiance à des modules RPG fonctionnant dans un environnement multithread.
Thread(*serialize) risque de conduire à des impasses, et pour thread(*concurrent), le compilateur RPG ne permet pas la synchronisation.

La commande thread(*serialize) sérialise au niveau du module, donc vous perdrez le multithreading pour ce module. Thread(*concurrent) crée une copie complète du stockage statique pour chaque thread, ce qui complique singulièrement l’usage de la mémoire partagée pour la synchronisation.

—Dieter Bender

Utiliser l’instruction Prompt Control

Q. Je suis en train d’écrire un CMD et je souhaiterais que l’un des paramètres n’apparaisse que si une certaine autre option de paramètre est sélectionnée. Quelqu’un sait-il comment faire cela ?

R. Utilisez l’instruction Prompt Control (PMTCTL), qui spécifie qu’une condition est testée pour déterminer s’il y a une invite pour l’instruction PARM contenant l’instruction PMTCTL. Cette dernière (ou la première instruction PMTCTL s’il y en a plus d’une) doit avoir une étiquette d’instruction (statement label) qui corresponde à l’étiquette à laquelle il est fait référence dans le paramètre PMTCTL d’une ou plusieurs instructions PARM dans la source de définition de commande.
Comme le montre la figure 1, le mot-clé REPLACE ne sera visible que si le mot-clé OUTPUT a la valeur
*OUTFILE:

—Tom Holden

Obtenir une Job Date en SQL

Q. Y a-t-il un équivalent de Job Date, plutôt que System Date, en SQL System i ? J’ai plusieurs jobs qui sont sélectionnés à la date du jour. Si le traitement de fin de journée se passe mal et si je dois les exécuter la matin suivant, je ne peux pas simplement instaurer ma session d’écran Job Date et faire un RUNSQLSTM.

A. Il n’y a pas d’équivalent en SQL, mais vous pouvez écrire une fonction RPG qui renvoie la Job Date et
l’enregistrer avec SQL comme une fonction définie par l’utilisateur (User Defined Function, UDF). Voici un
exemple UDF/CL permettant d’obtenir la date du job courant.

Tout d’abord, compilez le programme CL suivant, getjobdate:
/* Return Job Date in format: CYYMMDD */
PGM PARM(&CYYMMDD)
DCL VAR(&CYYMMDD) TYPE(*CHAR) LEN(7)
RTVJOBA CYMDDATE(&CYYMMDD)
endpgm

Ensuite, exécutez le script SQL suivant via la commande

CL RUNSQLSTM :
CREATE FUNCTION MYLIBl/getjobdate()
RETURNS char(7)
LANGUAGE CL

Puis, créez l’UDF via la commande CL suivante :

RUNSQLSTM SRCFILE(MYLIB/QSQLSRC) SRCMBR(GETJOBDATE)
COMMIT(*NONE) PROCESS(*RUN)

Enfin, invoquez l’UDF au début de votre job SQL :

select getjobdate() from sysibm/sysdummy1

Mettre à jour une boîte de listes

Q. J’ai un programme CGI de mise à jour d’enregistrements (voir figure 2) qui utilise une boîte de listes HTML. Lorsque l’utilisateur final fait une sélection dans cette boîte et entre dans le formulaire, le programme CGI réaffiche la page, et la boîte de listes dans laquelle l’utilisateur a choisi revient à l’état sans sélection. Comment obliger la boîte de listes à refléter l’état de la dernière sélection de l’utilisateur?

A. Utilisez plutôt CrtTagOpt. Si le troisième paramètre correspond au premier, cette option sera présélectionnée dans la liste déroulante. Par exemple, en supposant que vous avez lu un enregistrement détail contenant un champ MYCLS, le code de la figure 3 fera ce que vous voulez.

-Glenn McClenny

Téléchargez gratuitement cette ressource

Guide de Gestion des données Cloud

Guide de Gestion des données Cloud

Découvrez comment OuiCar utilise la solution New Relic sur AWS pour réduire le temps de dépannage lié aux problèmes de performance et améliorer de 40 % le temps de réponse en back-end. Avec la solution APM de New Relic sur AWS Marketplace, OuiCar bénéficie d'une vision complète de ses performances système pour tirer le meilleur profit de ses données Cloud.

Tech - Par System iNews - Publié le 04 février 2014