#!/bin/bash
# file-integrity.sh : Vérifie si les fichiers d'un répertoire donné ont été
#                    modifié.

E_REP_INEXISTANT=70
E_MAUVAIS_FICHIER_BD=71

fichierdb=File_record.md5
# Fichier pour stocker les enregistrements (fichier de base de données).


init_base_donnees ()
{
  echo ""$repertoire"" > "$fichierdb"
  # Écrit le nom du répertoire sur la première ligne du fichier.
  md5sum "$repertoire"/* >> "$fichierdb"
  # Ajoute les sommes de contrôle md5 et les noms de fichiers.
}

verifie_base_donnees ()
{
  local n=0
  local nomfichier
  local somme_controle

  # ------------------------------------------------- #
  #  Cette vérification du fichier devrait être
  #+ inutile mais il est préférable de le faire.

  if [ ! -r "$fichierdb" ]
  then
	  echo "Incapable de lire les somme de contrôle du fichier de base de données!"
    exit $E_MAUVAIS_FICHIER_BD
  fi
  # ------------------------------------------------- #

  while read enregistrement[n]
  do

    repertoire_verifie="${enregistrement[0]}"
    if [ "$repertoire_verifie" != "$repertoire" ]
    then
      echo "Les répertoires ne correspondent pas !"
      # Essayez d'utiliser un fichier d'un autre répertoire.
      exit $E_REP_INEXISTANT
    fi

    if [ "$n" -gt 0 ]   # Pas de nom de répertoire.
    then
      nomfichier[n]=$( echo ${enregistrement[$n]} | awk '{ print $2 }' )
      #  md5sum écrit les enregistrements après,
      #+ effectue en premier un contrôle des sommes, puis du fichier.
      somme_controle[n]=$( md5sum "${nomfichier[n]}" )


      if [ "${enregistrement[n]}" = "${somme_controle[n]}" ]
      then
        echo "${nomfichier[n]} non modifié."
	
      elif [ "`basename ${nomfichier[n]}`" != "$dbfile" ]
      #  Saute le fichier de base de données des sommes de contrôle.
      #+ car il changera à chaque appel du script.
      #  ---
      #  Ceci signifie malheureusement que lors du lancement de ce script sur
      #+ $PWD, travailler sur le fichier de base de données des sommes de
      #+ contrôle ne sera pas détecté.
      #  Exercice : Corrigez ceci.
	then
        echo "${nomfichier[n]} : ERREUR DE SOMME DE CONTRÔLE !"
	# Le fichier a été changé depuis la dernière vérification.
      fi

    fi  


    let "n+=1"
  done <"$fichierdb"       #  Lit les sommes de contrôle à partir du fichier de
                           #+ base de données.

}  

# =================================================== #
# main ()

if [ -z  "$1" ]
then
  repertoire="$PWD"     #  Si non spécifié,
else                    #+ utilise le répertoire courant.
  repertoire="$1"
fi  

clear                   # Efface l'écran.
echo " Lancement de la vérification de l'intégrité du fichier sur $repertoire"
echo

# ------------------------------------------------------------------ #
if [ ! -r "$fichierdb" ] # Besoin de créer un fichier de base de données?
  then
	  echo "Configuration de la base de données, \
	    \""$repertoire"/"$fichierdb"\"."; echo
    init_base_donnees
  fi  
# ------------------------------------------------------------------ #

verifie_base_donnees          # Fait le vrai travail.

echo 

#  Vous pouvez souhaiter rediriger stdout vers un fichier spécialement si le
#+ répertoire vérifié a de nombreux fichiers.

exit 0

#  Pour une explication sur la vérificaton d'intégrité,
#+ considérez le paquetage
#+ http://sourceforge.net/projects/tripwire/.
