> Tech > La Boîte à outils System iNews – Enlever un caractère EOF d’un fichier

La Boîte à outils System iNews – Enlever un caractère EOF d’un fichier

Tech - Par System iNews - Publié le 20 juillet 2012
email

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

La Boîte à outils System iNews – Enlever un caractère EOF d’un fichier

Au sommaire de cette édition :

Enlever un caractère EOF d’un fichier
Une alternative à Gunzip
Changer l’autorité de visualisation des fichiers spool
Vérifier si une application TCP est active
Définir l’autorité pour de nouveaux objets

Enlever un caractère EOF d’un fichier

Q. J’ai modifié un programme CL pour pouvoir utiliser Copy to PC Document (CPYTOPCD) afin de copier un fichier dans un dossier de l’IFS (QDLS). Auparavant, le programme utilisait FTP pour envoyer le fichier à une unité du réseau. Tout se passe bien, à cela près que l’utilisateur doit maintenant enlever un caractère EOF à la fin du fichier .txt avant de le transférer sur le site web d’un fournisseur. Ce problème ne se posait pas avec FTP. Voici la commande que j’utilise :

CPYTOPCD FROMFILE(WACHAP) TOFLR(GMFLR) TODOC(GMPOS22.TXT) REPLACE(*YES):

CPYTOPCD FROMFILE(WACHAP) TOFLR(GMFLR) +
    TODOC(GMPOS22.TXT) REPLACE(*YES)

Comment éviter la présence de caractère EOF dans le fichier final ?

R. Il se peut que ce soit une conséquence de CPYTOPCD. Je pense que vous pouvez utiliser Copy to Stream File (CPYTOSTMF). Mais n’oubliez pas que votre dossier est maintenant dans /QDLS.
— Richard Schoen

Une alternative à Gunzip

Q. On m’a soumis un fichier comportant tar, gzip, gpg, que je dois décrypter et soumettre à gunzip et untar. Je l’ai décrypté mais je ne trouve pas d’utilitaire gunzip pour l’IBM i. Les liens que je trouve vers les utilitaires IBM sont mauvais, y compris ceux qui conduisent aux sites IBM. Quelqu’un pourrait-il me procurer une bon lien ? Quant au untar, je pense pouvoir l’effectuer avec le qshell tar ; est-ce correct ?

R. Je recommanderais 7-zip de préférence à gunzip, parce que ce dernier est très limité quant aux tailles de fichiers.  Scott Klement en a parlé à  www.scottklement.com/p7zip.

Pour untar, j’utilise essentiellement PASE avec de bons résultats.

Changer l’autorité de visualisation des fichiers spool

Q. Mon système est configuré avec une sécurité au niveau objet et l’accès limité aux files d’attente de sortie. Aucun de mes utilisateurs n’a l’autorité Spool Control (*SPLCTL). Cette sécurité suffisait pour protéger mes rapports. Mais il n’en est plus ainsi depuis que mon fournisseur ERP tiers a ajouté une option permettant d’exécuter Work with Spool Files (WRKSPLF), où l’utilisateur peut écrire tout utilisateur de son choix.

Quand il affiche la liste des fichiers spool, l’IBM i ne vérifie aucune autorité. Par conséquent, n’importe quel utilisateur peut voir la liste de tous les fichiers spool, sans toutefois pouvoir les afficher, les modifier ou les supprimer. Comment empêcher les utilisateurs de voir des fichiers spool sans en avoir l’autorité.

R. Tout d’abord, assurez-vous que vos profils utilisateurs et profils de groupes ne contiennent pas *JOBCTL ou *SPLCTL. En effet, l’une ou l’autre de ces options permettra à l’utilisateur en mode d’assistance *BASIC de changer l’identification utilisateur.

En second lieu, il se peut que le programme qui appelle le WRKSPLF à partir du fournisseur tiers le fasse dans un programme via l’API CALL QCMDEXE, qui utilise probablement le mode adoptive à partir d’un profil qui avait *JOBCTL ou *SPLCTL.

J’ai résolu un problème de ce genre en créant un programme CL appelé SHOWSPL, qui appelle simplement WRKSPLF. Et en m’assurant que le programme n’utilise pas l’autorité adoptive mais plutôt *USER. Ensuite, j’ai créé un CMD, également appelé SHOWSPL, en m’assurant que sa sécurité était bonne.

J’ai ensuite changé l’objet PGM du fournisseur pour appeler la commande SHOWSPL au lieu de WRKSPLF. Le champ utilisateur est ainsi protégé et les utilisateurs ne peuvent pas le changer pour voir d’autres fichiers spool. Vous pourriez aussi obtenir le même résultat en renommant SHOWSPL comme WRKSPLF dans une bibliothèque placée avant les autres dans la liste de bibliothèques du job.

— R. Miller

Vérifier si une application TCP est active

Q. Comment un programme peut-il vérifier si le serveur HTTP est opérationnel ? Et qu’en est-il de FTP, du e-mail, de Telnet ? PING peut-il vérifier un port particulier ?

R. La commande PING ne teste que la connectivité IP de base entre deux machines. Elle travaille à un niveau très bas et ne comprend pas la couche TCP qu’utilisent la plupart des logiciels TCP/IP actuels. La commande PING ne vous dira pas si un serveur particulier est online.

Cet article présente un simple utilitaire Check TCP Server (CHKSVR). CHKSVR établit une connexion rapide avec le port TCP de votre choix, sur le même ordinateur ou sur un autre à distance. Vous pourrez ainsi tester si un serveur donné répond, soit à partir d’un programme  CL, soit interactivement depuis la ligne de commande.

J’ai écrit CHKSVR, voilà quelques années, pour vérifier facilement si un serveur était opérationnel. (Je l’ai publié dans l’article “How to Check If a Remote Telnet Server Is Active,” March 2005, article ID 20099. ?????) Mais il n’est pas limité à Telnet ! Il peut vérifier n’importe quel serveur de type TCP, y compris ceux qui utilisent SSL ou SSH. J’avais d’ailleurs oublié cet utilitaire jusqu’à ce qu’un participant à une conférence récente m’interpelle pour faire l’éloge de mon petit utilitaire … qui lui aurait même « sauvé la vie ».  Quelle fierté !

Vous pouvez voir la commande CHKSVR dans la figure 1.

L’utilitaire CHKSVR essaie de se connecter à un numéro de port. Ce dernier peut être associé à n’importe quel serveur, pourvu que ce soit sous le protocole TCP. En changeant le numéro de port, vous vous connectez à pratiquement tous les services TCP/IP imaginables et vous pouvez les vérifier.

Le point essentiel est que tous les services TCP/IP fonctionnent sur leur propre numéro de port. Des normes désignent quels ports sont alloués à quels services. Les plus courants d’entre eux se trouvent dans la figure 2.
Si vous voulez savoir si le serveur SSH fonctionne sur votre machine locale, vous pouvez exécuter :

CHKSVR HOST(‘localhost’) PORT(22) TIMEOUT(5)

Si le serveur n’est pas actif, CHKSVR vous envoie un CPE3425 : “A remote host refused an attempted connect operation = un hôte à distance a refusé une tentative de connexion”. Ou, si l’hôte n’a pas répondu dans un délai de cinq secondes, vous recevez un CPF9897 avec “Connection timed out!”

De la même manière, si vous voulez vérifier le serveur HTTP, il suffit de changer le numéro de port :
CHKSVR HOST(‘localhost’) PORT(80) TIMEOUT(5)

Pour vérifier si un hôte à distance répond, il suffit de spécifier un nom d’hôte différent :

CHKSVR HOST(‘www.google.com’) PORT(80) TIMEOUT(30)
Cette technique fait merveille pour vérifier si vos imprimantes sont online et si elles répondent au réseau :

CHKSVR HOST(‘prt24.klements.com’) PORT(9100) TIMEOUT(30)

Vous pouvez regrouper tout cela dans un programme CL que vous chargerez dans votre planificateur de jobs. Et vous pourrez écrire vous-même un petit programme qui vous indiquera les défaillances éventuelles :

PGM
     CHKSVR HOST(‘smtp.example.com’) PORT(25) TIMEOUT(10)
     MONMSG MSGID(CPE0000 CPF0000) EXEC(DO)
        SNDMSG MSG(‘The Exchange Server is down!’) +
               TOUSR(KLEMSCOT)
     ENDDO
ENDPGM

C’est un outil polyvalent entièrement écrit en RPG et j’espère que vous lui trouverez un usage. Vous pouvez visiter systeminetwork.com/article/check-whether-any-tcp-application-active  pour télécharger l’utilitaire CHKSVR.

Scott Klement

Définir l’autorité pour de nouveaux objets

Quand vous créez un nouveau fichier ou programme, vous pouvez spécifier l’autorité sur le nouvel objet. Mais cela ne se fait généralement pas. Chaque commande CL utilisée pour créer des objets a le paramètre Authority (AUT), qui spécifie l’autorité appliquée au nouvel objet. La plupart d’entre nous ne voient même pas le paramètre AUT parce que nous activons rarement les commandes CRTxxx. Et même si vous les activez, le paramètre AUT est généralement bon dernier dans la longue liste. Il est rare que nous allions aussi loin.

Pour la plupart des types d’objets, la commande CRTxxx utilise la valeur par défaut AUT(*LIBCRTAUT). *LIBCRTAUT est spécifiée pour attribuer la nouvelle autorité objet d’après la bibliothèque dans laquelle elle est créée. Ainsi, pour une bibliothèque , la valeur *LIBCRTAUT peut signifier AUT(*CHANGE), pour une autre, elle peut signifier AUT(*EXCLUDE). Tout dépend de la valeur CRTAUT de la bibliothèque.

Quand vous créez ou changez une bibliothèque, (CRTLIB, CHGLIB), l’un des paramètres est  Create Authority (CRTAUT), comme dans cette commande :

CRTLIB LIB(MYLIBRARY) CRTAUT(*EXCLUDE)

Quand la valeur CRTAUT de la bibliothèque est *EXCLUDE, les nouveaux objets créés dans la bibliothèque seront réglés sur *PUBLIC AUT(*EXCLUDE), selon la valeur CRTAUT de la bibliothèque.

Vous n’êtes pas tenu d’accepter la valeur par défaut AUT(*LIBCRTAUT) de la commande CRTxxx. Vous pouvez spécifier l’autorité pour l’objet au cas par cas, comme dans la commande suivante pour Create a Data Area (créer une zone de données) :

CRTDTAARA DTAARA(MYLIBRARY/MYDATA) TYPE(*CHAR) LEN(100) AUT(*USE)   

Ici, la valeur CRTAUT de MYLIBRARY n’est pas considérée, et la zone de données (data area) reçoit l’autorité *PUBLIC AUT(*USE).
Quand on définit la valeur du paramètre CRTAUT pour une bibliothèque, le nom d’une liste d’autorisations peut être attribué, comme ici sur la commande CHGLIB :

CHGLIB LIB(MYLIBRARY) CRTAUT(MYAUTL)

Ensuite, quant un nouvel objet sera créé dans la bibliothèque, sa sécurité sera assurée par la liste d’autorisations MYAUTL. Cela suppose que nous avons accepté la valeur par défaut  AUT(*LIBCRTAUT) sur la commande CRTxxx ou que nous avons spécifié AUT(MYAUTL).

Vous n’êtes pas limité à la seule autorité *PUBLIC, mais quand vous utilisez une liste d’autorisations, vous pouvez attribuer toutes les autorités privées à l’objet au moment de sa création.

La seule réserve lorsqu’on attribue l’autorité à un nouvel objet, est que celui-ci appartiendra au créateur ou au profil du groupe primaire de celui-ci. Le propriétaire aura l’autorité *ALL sur le nouvel objet, ce qui n’est peut-être pas ce que vous voulez, particulièrement si vous soumettez la sécurité du nouvel objet à une liste d’autorisations. Dans de tels cas, il vous faudra élaborer une méthode permettant de réattribuer la propriété du nouvel objet.

Je considère que la plupart des types d’objets devraient appartenir à un profil “propriétaire”, dont la seule raison d’être est de posséder des objets. Par exemple, créez le profil utilisateur PRODOWNER. Désignez PRODOWNER comme le propriétaire de vos objets de production. Ce profil propriétaire PRODOWNER n’est pas un profil de groupe, mais simplement un profil destiné à posséder des objets.

En pratique, cela marche bien jusqu’à ce que quelqu’un crée un nouvel objet, ce qui en fait (ou son groupe primaire) le propriétaire et pas PRODOWNER.

Ce serait bien d’avoir un paramètre OBJOWNER sur toutes les commandes Create, où vous pourriez spécifier quelque chose du genre OBJOWNER(*LIBOBJOWN), afin d’attribuer la propriété du nouvel objet d’après un attribut bibliothèque “Library Default Object Owner.” Malheureusement, pour l’instant, il nous faudra réaménager la propriété de ces objets nouvellement créés pour les définir correctement.

— Dan Riehl

Figure 1

La commande CHKSVR

Figure 2

Normes des numéros de port

Téléchargez gratuitement cette ressource

*** SMART DSI *** VERSION NUMÉRIQUE

*** SMART DSI *** VERSION NUMÉRIQUE

Découvrez SMART DSI, la nouvelle revue du Décideur IT en version numérique. Analyses et dossiers experts pour les acteurs de la transformation numérique de l'entreprise, Gagnez en compétences et expertise IT Professionnelle avec le contenu éditorial premium de SMART DSI.

Tech - Par System iNews - Publié le 20 juillet 2012