Sup­pres­sion de fichiers dans l’IFS

Sup­pres­sion de fichiers dans l’IFS

lun 24 juin 2019 0 Par Ibmiiste

Cet article est très lar­ge­ment ins­pi­ré de l’ar­ticle suivant :

Use Qshell Tools to Clean Up Your IFS Auto­ma­ti­cal­ly.

La pro­cé­dure va uti­li­ser QSHELL pour effa­cer un ou plu­sieurs fichiers de l’IFS.
La pro­cé­dure reçoit plu­sieurs para­mètres qui vont per­mettre de construire la com­mande Unix : find ‑exe rm. 

Com­mande find ‑exe rm

Find recherche des fichiers selon des cri­tères.
-exe exé­cute une com­mande sur les fichiers trou­vés par find.
Et rm est la com­mande de sup­pres­sion.
La com­mande com­plète dit au sys­tème « efface les fichiers répon­dants aux cri­tères four­nis.»

Para­mètres d’entrée

Les para­mètres d’en­trée sont les suivants :

  • p_chemin contient le che­min où se trouve le ou les fichiers,
  • p_jours contient le nombre de jours entre une date carac­té­ri­sant le fichiers et la date du jour,
  • p_Recursivite contient un boo­léen qui demande à recher­cher dans les sous-dos­siers s’il est à « VRAI »,
  • p_Filtre contient une chaîne de carac­tère qui indique à la com­mande find de recher­cher les fichiers qui contiennent cette chaîne,
  • p_Type_date contient le type de date qui doit être com­pa­rée à p_jours :
    • M=-mtime date de der­nière modification,
    • C=-ctime date de création,
    • A=-atime date de der­nier accès.
  • p_jours est le nombre de jours uti­li­sés pour com­pa­rer la date d’exé­cu­tion du find moins p_jours (en jours évi­dem­ment) avec une des dates du fichier.
// Définition de l'Interface de la procédure
// Paramètres d'appel
// Procedure-Interface definition
// --------------------------------------------------
// Procedure name: Suppression_ifs
// Purpose:        Supprimer un fichier ou un répertoire de l'ifs
//                 de façon récursive ou non
// Returns:
// Parameter:      p_chemin => Contient le chemin de l'objet à supprim...
//                          er dans l'ifs
//                 p_Jours  => Nombre de jours
//                 p_Recursivite => Récursif ou non
//                 p_Filtre => Filtre
//                 p_Type_date => date à comparer par rapport à p_Jours
// --------------------------------------------------
Dcl-proc Suppression_ifs export;
  dcl-pi Suppression_ifs ind;
    p_chemin varchar(2000) const;
    p_Jours Int(5) const;
    P_Recursivite ind const options(*nopass:*omit);
    p_Filtre varchar(128) const options(*nopass:*omit);
    p_Type_date char(1) const options(*nopass:*omit);
  end-pi;

Sécu­ri­té

Par sou­ci de sécu­ri­té, on ne peut accé­der qu’à /home afin d’é­vi­ter toute sup­pres­sion de fichiers sys­tèmes dans d’autres réper­toires sensibles. 

    //---------------------------------------------------------
    // Mécanisme optionnel de protection, autorisation uniquement dans le
    // répertoire /home afin d'éviter de supprimer des objets systèmes
    //---------------------------------------------------------
    if (%subst(p_chemin:1:6) <> '/home/');
      return *ON;
    endif;

Ges­tion de l’a­li­men­ta­tion des para­mètres d’entrée

Le début du trai­te­ment est de véri­fier quels sont les para­mètres qui sont pas­sés et de gérer les para­mètres null.

    //----------------------------------------------------------
    // Initialisation des variables avec les paramètres si applicable
    //----------------------------------------------------------
    if %parms > 2;
      if %addr(p_Recursivite) <> *NULL;
        l_Recursivite = p_Recursivite;
      endif;
    endif;
    if %parms > 3;
      if %addr(p_Filtre) <> *NULL;
        l_Filtre = %trim(p_Filtre);
      endif;
    endif;
    if %parms > 4;
      if %addr(p_Type_date) <> *NULL;
        l_type_date = p_Type_date;
      endif;
    endif;

Ini­tia­li­sa­tion de la com­mande Unix

Ini­tia­li­sa­tion de la com­mande find : le début de la com­mande Unix est constituée.

    //-------------------------------------------------------------
    // Départ de la construction de la chaîne de commande QSH
    l_commande_qsh = 'STRQSH CMD(''find '
                      + %trim(p_chemin)
                      + ' -type f ';

Récur­si­vi­té

Par défaut, la com­mande est non récur­sive si le para­mètre cor­res­pon­dant est nul. L’op­tion ‑prune empêche de des­cendre dans les sous-dossiers.

    dcl-s l_Recursivite ind inz(*off);
      |          |         |
      |          |         |
    if %parms > 2;
      if %addr(p_Recursivite) <> *NULL;
        l_Recursivite = p_Recursivite;
      endif;
    endif;
      |          |         |
      |          |         |
    //-------------------------------------------------------------
    // Voie sécurisée, par défaut non récursif
    // -prune empêche de descendre dans les sous-répertoires
    if not l_Recursivite;
      l_commande_qsh = %trim(l_commande_qsh)
                  + ' -path '''''
                  + %trim(p_chemin)
                  + '/*'''''
                  + ' -prune';
    endif;

Filtre sur le nom

La com­mande accepte un para­mètre pour fil­trer sur le nom du fichier. Des jokers sont uti­li­sables «*» pour rem­pla­cer plu­sieurs carac­tères et «?» pour rem­pla­cer un caractère.

    //-------------------------------------------------------------
    // Plus sécurisé, on filtre sur un modèle de nom
    if l_Filtre <> *BLANKS;
      l_commande_qsh = %trim(l_commande_qsh)
                  + ' -name '''''
                  + %trim(l_Filtre)
                  + '''''';
    endif;

Filtre sur les dates

La com­mande peut fil­trer sur cer­taines dates carac­té­ri­sant les fichiers.

Le para­mètre M cor­res­pond à la date de der­nière modi­fi­ca­tion du fichier. Le nombre de jours trans­mis « x » indique de trai­ter les fichiers modi­fiés ces « x » der­niers jours. 

Le para­mètre C cor­res­pond à la date de créa­tion du fichier. Le nombre de jours trans­mis « x’ indique de trai­ter les fichiers créés ces « x » der­niers jours. 

Le para­mètre A cor­res­pond à la date du der­nier accès du fichier. Le nombre de jours trans­mis « x’ indique de trai­ter les fichiers dont l’ac­cès a eu lieu ces « x » der­niers jours. 

    //-------------------------------------------------------------
    // Time: M, C or A = -mtime, -ctime, -atime
    // M : Date de modification
    // C : Date de création
    // A : Date de dernier accès
    l_type_date = %xlate('MCA':'mca':l_type_date);
    l_commande_qsh = %trim(l_commande_qsh) + ' -'
                     + l_type_date + 'time';
    //-------------------------------------------------------------
    // +/- Nombre de jours
    if (l_Jours >= 0);
      l_commande_qsh = %trim(l_commande_qsh) + ' +';
    else;
      l_commande_qsh = %trim(l_commande_qsh) + ' -';
    endif;
    l_commande_qsh = %trim(l_commande_qsh)
                           + %trim(%editc(%abs(p_Jours):'J'));

Fina­li­sa­tion de la com­mande Unix

La com­mande est com­plé­tée avec l’exé­cu­tion de la com­mande de sup­pres­sion. Et l’exé­cu­tion de celle-ci avec l’A­PI QCMDEXC.

    //-------------------------------------------------------------
    // -exec rm = Remove en QSH
    l_commande_qsh = %trim(l_commande_qsh)
                           + ' -exec rm {} \;'')';
    //-------------------------------------------------------------
   Cmd_exec(%trim(l_commande_qsh));

Ci-des­sous, se trouve le source com­plet héber­gé par Github.

https://github.com/ibmiiste/bazar/blob/master/QRPGLESRC/DLTIFS010R.SQLRPGLE