#! /bin/bash

# sauvliens.sh v1.2
# pour créer des liens en dur faisant office de 'sauvegarde' contre les effacements accidentels

# si le script est lancé sans argument :
# il crée des liens en dur pour tous les fichiers créés il y a moins de 5 mn
# à lancer ainsi toutes les 5 mn par crond

# si le script est lancé avec l'argument init : il efface éventuellement le contenu actuel 
# du répertoire des liens et il crée des liens en dur pour tous les fichiers 
# du répertoire à protéger, à lancer ainsi la première fois, pour initialiser le dispositif
# puis chaque fois qu'on veut faire place nette

# toujours lancer le script avec l'argument init lors de sa première utilisation


# fixer la valeur de la variable abritant le chemin complet du répertoire à protéger
if [ "`id -un `"  != "root" ] ; then # si simple utilisateur on sauve tout le répertoire personnel

# variable abritant le chemin complet du répertoire à protéger
 DIR_A_SAUVER=$HOME

else # si root on sauve seulement /etc

 DIR_A_SAUVER=/etc

fi


# variable abritant le nom du répertoire qui contiendra les liens en dur
# ce nom est le même pour tous les utilisateurs
# si vous le modifiez, modifiez-le aussi dans sauvliens_stop.sh
 NOM_DIR_LIENS=".sauvliens"

# variable abritant le chemin complet du répertoire qui contiendra les liens en dur
# ce répertoire des liens est à la racine du répertoire à sauver
 DIR_LIENS="$DIR_A_SAUVER/$NOM_DIR_LIENS"


 if [ "$1" = init ] ; then                    # cas où le script est lancé avec l'argument init

    if [ -e "$DIR_LIENS" ] ; then # on supprime le répertoire contenant les liens s'il existe

	echo  "Attention : le contenu du répertoire $DIR_LIENS va être irrémédiablement effacé !"
        echo  "Tapez o pour continuer, une autre touche sinon."
	read
	if [ "$REPLY" == "o" ] || [ "$REPLY" == "O" ] ; then
	  rm -Rf $DIR_LIENS
        else
	  exit 0
        fi
    fi

    mkdir $DIR_LIENS   # on crée un nouveau répertoire pour les liens

else  # cas où le script est lancé sans argument

    if [ ! -e "$DIR_LIENS" ] ; then # on quitte si le répertoire des liens n'existe pas
	echo "Lancer le script avec l'argument init pour sauvegarder tous les fichiers !!"
        exit
    fi

fi

cd $DIR_A_SAUVER


# Trouver tous les répertoires                           (find . -type d)
# hors arborescence .sauvliens                           (-path "..." -prune -o)
# Créer répertoires correspondants sous .sauvliens       (-exec mkdir ... \;)
if [ "$1" = init ] ; then

find . -path "./$NOM_DIR_LIENS" -prune -o -type d  -print -exec mkdir ./$NOM_DIR_LIENS/{} \;

else # grâce à l'option '-mmin -5' seuls les répertoires créés il y a moins de 5 minutes sont répliqués

find . -path "./$NOM_DIR_LIENS" -prune -o -type d  -mmin -5 -print -exec mkdir ./$NOM_DIR_LIENS/{} \;

fi


# Trouver tous les fichiers                              (find . -type f)
# hors arborescence .sauvliens                           (-path "..." -prune -o)
# Créer liens PHYSIQUES correspondants sous .sauvliens   (-exec ln ... \;)

if [ "$1" = init ] ; then

find . -path "./$NOM_DIR_LIENS" -prune -o -type f  -print -exec ln {} ./$NOM_DIR_LIENS/{} \;

else

# grâce à l'option '-mmin -5' on ne crée de lien que pour les fichiers créés il y a moins de 5 minutes
# grâce à l'option  -f de ln : si fich a un lien dans .sauvliens et si fich a été effacé puis recréé
# dans les cinq minutes qui précèdent, le lien pointera vers la dernière version de fich 
# sans -f on aurait dans ce cas un message d'erreur et c'est le lien vers l'ancien fich qui subsisterait

find . -path "./$NOM_DIR_LIENS"  -prune -o -type f  -mmin -5 -print -exec ln -f {} ./$NOM_DIR_LIENS/{} \;

fi

exit 0

