banneer

Informatique › scripts shell bash

Fil des billets - Fil des commentaires

cmd.jpg Nous allons voir comment purger un dossier avec un script .bat (pour windaube quoi)

Bon okie, j'ai honte d'écrire ce billet. Mais faut me comprendre, cette semaine, j'ai installé des PC, modifié le script d'interface laboratoire, tellement spécifique qu'il n'y a aucun intérêt à en faire un billet. j'ai ajouté une fonction de petites annonces à notre intranet. Ce code est sans grand intéret aussi, juste un appel mysql en PHP. Ça m'embêtait de ne poster que des conneries, et encore plus ne rien poster. Alors, même si c'est tout simple, le code batch pour purger un repertoire, c'est:

@echo off
ECHO O | DEL D:\INTRANETG\INTRANET\scanner\*.*

"Echo O" retourne "O" lorsque le DOS demande confirmation, dans une version anglaise il aurait fallu "echo Y".

Vous l'aurez compris, le dossier scanner, qui reçoit les éléments scannés, mais qui par soucis de configuration est accessible à tout le monde contient plein de trucs confidentiels. Gênant. Ce script est en tâche planifiée tous les soirs pour compenser.


Fonctionnement

Le laboratoire avec qui on traite crypte les résultats de laboratoires avec des clés personnelles, les envoie à Apirypt (notre tiers de confiance) qui les décrypte, les recrypte avec nos clés avant de nous les envoyer (sur une BAL dédiée à ça).

Apicrypt propose facilement deux solutions:

  • on utilise ou paramètre un client mail (dans ce cas c'est manuel)
  • on ajoute leur "proxy" mail dans le lan. là c'est surtout adapté quand on a plusieurs services et plusieurs boites aux lettres pour les résultats de laboratoire.

La première solution est chiante car manuelle. Le seconde fait ajouter un élément dans le réseau pour pas grand chose.

Mais comme ils distribuent l'appli codée en C [1] qui peut décrypter depuis un système UNIX, profitons en.

Mon serveur de mails marche au format maildir, ça me permet de séparer simplement les mails.

Vous verrez, à une étape, le message transite en clair sur le serveur où se trouve l'application de dossier de soins. Je précise que le serveur de mails est sur la passerelle et que cette étape se fait via la carte réseau dans le lan, dans une DMZ. De plus physiquement les deux machines sont branchées sur le même switch, ce qui rendra difficile un sniffage tant que le cache d'adresses mac du répartiteur n'est pas en faute.

Monter le dossier dans lequel seront déposés les résultats de laboratoire.

Editer le fichier /etc/fstab et y ajouter la ligne suivante:

//IP-du-serveur/applic$  /media/applic cifs user,rw,username=USERNAME,password=PASSWORD,gid=1000,uid=1000,iocharset=utf8 0 0

J'utilise un compte qui a des droits minimums

Créer le point de montage

mkdir /media/applic

Et monter le dossier

mount /media/applic

A ce stade là, le serveur mail sait communiquer avec son voisin, pour accéder au partage réseau applic$, on en aura besoin pour déposer les résultats de laboratoire. (il savait déja le faire mais pour le partage intranet).

Installer l'appli apiuncrypt

créer les dossier nécessaires.
mkdir /home/virtual/apicrypt

Le dossier home/virtual contient les "maildir" (traduction: les mails sous formes des fichiers des utilisateurs) Si c'est le dossier de "virtual" c'est parceque les utilisateurs ne sont pas (plus) des comptes unix, mais des enregistrements dans une base de données, et donc des utilisateurs virtuels. Je m'égare.... ça m'arrange de tout mettre là, car le script je vais le faire marcher par le compte système unix vmail. C'est lui qui a les droits sur les mails (hormis root) et ça m'arrange de tout lui regrouper dans son home.

je me place dans le dossier, je télécharge l'appli qui décrypte les mails, et je crée le dossier pour les clés de décriptage.

cd /home/virtual/apicrypt
wget http://www.apicrypt.org/page5/files/linux/apiuncrypt.tgz
tar -xvf apiuncrypt.tgz
mkdir Clefs

Déposer les clefs de décryptage (le master et la clé personnelle) de l'année en cours UNIQUEMENT dans le dossier Clefs (attention il est sensible à la casse le C est en majuscule).

rendre les droits à vmail

chown -R vmail:vmail /home/virtual/

Le script qui lancera le décryptage des mails. et pousse les fichiers textes décryptés dans le répertoire où le logiciel de dossier de soins va les chercher.

Pour le moment c'est un script shell enregistré en tache cron, exécuté par le compte vmail. Je le remplacerai par des regles "mailfilter" ou procmailrc dès que je saurai le faire (plus propre).

je l'ai mis là: /home/virtual/apicrypt/Uncryptbal.sh et voici ma composition:

##!/bin/sh
#by Gnieark http://blog-du-grouik.tinad.fr 
#version 0 fevrier 2010
# Le contenu de ce code est distribué en licence Cecill V2, 
#qui dit grossomodo que c'est libre de droits, sauf la marque de paternité du code (pour ma gloire), 
#mais aussi que je ne suis pas responsable si ce code fait une connerie . 
#la license est disponible là: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt
#
#Liste les fichiers "mails d'un repertoire", décrypte le corps via la moulinette apycript et les envoie dans le dossier pour l'application de dossier de soins.
#
#variables chemins
repertoireorigine="/home/virtual/DOSSIER DE L'ADRESSE MAIL DEDIEE AU LABO/new"
repertoiredestination="/media/applic/soins/resultatslabo/Data/Reception/A classer/"
cheminapiuncrypt="/home/virtual/apicrypt/apiuncrypt"
chemincles="/home/virtual/apicrypt/"
fichierlog="/home/virtual/apicrypt/log.txt"
fichiertemp="/home/virtual/apicrypt/temp.txt"
#variable d'erreur (déclenchera une alerte à la fin du script)
erreur=0
 
    #log:
    echo "$(date) Début du script décriptage de la bal pour les résultats laboratoire ">>$fichierlog
 
 
    #supprmmer le fichier temporaire s'il existe
    if [ -e "$fichiertemp" ];
    then
       rm $fichiertemp
       echo "$(date) Le fichier temp.txt existait, suppression">> $fichierlog
    else
       echo "$(date) Le fichier temp.txt n'existait pas (normal)">> $fichierlog
    fi
    #lister les fichiers dans le repertoire
    find $repertoireorigine -type f > $fichiertemp
 
    while read line; do
 
          $cheminapiuncrypt -s $line -k $chemincles
 
       #vérifier si le fichier.txt a ete créé
       if [ -e "$line.txt" ];
       then
          echo "$(date) Le fichier $line.txt décrypté a été créé">> $fichierlog
          #on envoit le fichier dans son repertoire de destination
 
          mv "$line.txt" "$repertoiredestination"
          fichier = basename $line.txt
 
          #vérifier si le tranfert s'effectue
          if [ -e "$repertoiredestination$fichier" ];
          then
             #c'est ok
             rm $line
             echo "$(date) -OK-le fichier $line transfert ok">> $fichierlog       
          else
 
 
             #probleme
             echo "$(date) -WARNING- le fichier $line.txt transfert échoué">> $fichierlog
             erreur=2
          fi
 
       else
          echo "($date) -WARNING- le fichier $line n'a pas été décrypté"
          erreur=1   
       fi
    done < $fichiertemp
 
    if [ $erreur = 1 ];
    then
       echo "Erreur de type 1 sur l'interface laboratoire. Un des fichiers n'a pas pu être décrypté (Il est probable qu'il sagisse d'un spam ou d'un mail \"parasite\" Le message d'origine n'a pas été supprimé" > $fichiertemp
       mail -s "Erreur sur l'interface de laboratoire" "MAILS DES DESTINATAIRES DES ALERTES" < $fichiertemp
    fi
 
    if [ $erreur = 2 ];
    then
       echo "Erreur de type 2 sur l'interface laboratoire. Le transfert d'un des fichiers décryptés n'a pas été effectué, vérifiez que $repertoiredestination est une ressource disponible" > $fichiertemp
       mail -s "Erreur sur l'interface de laboratoire" "MAILS DES DESTINATAIRES DES ALERTES" < $fichiertemp
    fi
 
    echo "$(date) Fin du script décriptage de la bal pour les résultats laboratoire ">>$fichierlog

Il est un chouilla long, parcequ'il vérifie à plusieurs endroits si les étapes se sont bien déroulées et envoie un mail d'alerte en cas d'erreur. De plus les actions du script sont logguées.

Créer la crontab pour que le script soit exécuté automatiquement

crontab -e

Aouter la ligne suivante:

*/5 * * * * su -c '/home/virtual/apicrypt/Uncryptbal.sh' vmail

Mise à jour des clés.

Il suffira de les déposer das le dossier prévu. et supprimer les anciennes (sinon ça marche pas)

Notes

[1] le serveur est sous debian lenny, mais pour les quelques essais sous ubuntu, j'ai eu des problèmes de dépendances ne se trouvant plus dans les paquets de la distribution


Il s'agit d'un billet juste pour moi. ^^ UN truc qui faisait partie de ma dernière To Do List [1]. Je ne suis pas très adroit en PHP (je lutte même pour déclarer des variables), je mets ce mémo sur le blog pour pouvoir le retrouver, mais c'est tellement spécifique, que je doutte que ça intéresse un visiteur régulier (si, si vous n'êtes pas nombreux, mais google analitycs me dit que vous existez). Ça me servira dès que j'aurai besoin de refaire un truc similaire.

Il s'agit d'une passerelle entre deux bases de données... sauf que faire des requêtes sur le serveur informix (à part avec le couple MS QUERY / Tun SQL ou en java, je n'ai pas trouvé). Je fais donc un truc un peu crado: je télécharge le fichier qui contient la table.

Le script en tâche CRON:

(j'ai évidemment masqué les mots de passe, même si ça reste dans le réseau local)

#!/bin/sh
# By gnieark septembre 2009 http://blog-du-grouik.tinad.fr
#Se placer dans le repertoire de l'user (root)
cd ~
# Télécharger la base de données
wget ftp://root:THEMOTDEPASSE@IPDuServeur/u/DIS/paidis/salar1
#Exécuter le script PHP de mise à jour des bases
php ~/scripts/majtablepersonnels.php
#Supprimmer le fichier salar1 (il y a plein de données bien confidentielles dedans, autant qu'il ne traine pas)
rm salar1

Et le script PHP qui me fait mes requêtes:

<?php
//SCRIPT PHP MISE à jour de la liste du personnel et de leurs numéros à partir 
//du fichier de base de données salar1 de paidis.
//
//by Gnieark http://blog-du-grouik.tinad.fr Septembre 2009
$dbname = 'tinai';
 
if (!mysql_connect('localhost', 'root', 'THEMOTDEPASSE')) {
   echo 'Impossible de se connecter à MySQL';
   exit;
}
mysql_query("USE tinai");
mysql_query("DELETE * FROM table_temp;");
mysql_query("LOAD DATA INFILE '~/salar1' REPLACE INTO TABLE `table_temp` FIELDS TERMINATED BY '|';");
 
$sql1 = "SELECT champ1, champ3, champ4, champ6, champ2, champ51, champ56  FROM table_temp";
 
$result1 = mysql_query($sql1);
 
if (!$result1) {
   echo "Erreur DB, impossible de lister les tables\n";
   echo 'Erreur MySQL : ' . mysql_error();
   exit;
}
 
while ($row1 = mysql_fetch_row($result1)) {
   $result2 = mysql_query("SELECT COUNT(*) FROM table_utilisateurs WHERE cde_paidis='${row1[0]}'");
   //echo "SELECT COUNT(*) FROM table_utilisateurs WHERE cde_paidis='${row1[0]}'";
   $row2 = mysql_fetch_row($result2);
   if ($row2[0]>0) {
     mysql_query("UPDATE table_utilisateurs SET nom_usuel='${row1[1]}',nom_de_jeune_fille='${row1[2]}', prenom='${row1[3]}', cde_etat='${row1[4]}',telephone='${row1[5]}',portable='${row1[6]}' WHERE cde_paidis='${row1[0]}'");
   }
   if ($row2[0]=0) {
     mysql_query("INSERT INTO table_utilisateurs(nom_usuel, nom_de_jeune_fille, prenom, cde_etat, telephone, portable) VALUES ('${row1[1]}','${row1[2]}','${row1[3]}','${row1[4]}','${row1[5]}','${row1[6]}')");
   }
}
mysql_query("DELETE * FROM table_temp;");
?>

Notes

[1] Enfin, il reste aussi la petite interface de consultation de la base de données à créer.