#!/bin/sh
#
# Script de synchronisation des fichiers spécifiés par chacun des
# utilisateurs dans leur répertoires personnels, en rapport avec
# le point de montage de leur répertoire NFS du réseau local.


# CONSTANTES :
#
VERSION="0.2.0"
VRAI=1
FAUX=0
DEBUG=$FAUX


# VARIABLES PAR DÉFAUT :
#
NFS_HOME=/mnt/home
SYNCFILE=.sync-file
SYNCCMD="rsync -Caqu"
# Description des options de rsync :
#  -C : auto ignore files in the same way CVS does
#  -a : archive
#  -q : quiet
#  -u : update only (don't overwrite newer files)
USRSYNCFILE=""
TMPFILE=/tmp/$THISUSER-tmpsyncfile
THISUSER=""
SILENCE=$FAUX


# AIDE EN LIGNE
#
do_help () {
    echo "filesync $VERSION -- utilitaire de synchronisation portable-LAN"
    echo "Usage : filesync [-h] [-d] [-q] [-f file] [-u user] [-n rep]"
    echo " -h      : cette aide"
    echo " -d      : mode débogage"
    echo " -q      : mode silencieux"
    echo " -f file : utiliser le fichier 'file' à la place de ~/$SYNCFILE (chemin complet)"
    echo " -n file : utiliser le fichier 'file' à la place de $SYNCFILE"
    echo " -u user : synchro de l'utilisateur 'user' (par root uniquement)"
    echo " -m rep  : point de montage du /home NFS (défaut : $NFS_HOME)"
    echo
    exit
}



# TRAITEMENT DES ARGUMENTS :
#
do_parse_args () {
    while [ "$1" != "" ]; do
        case "$1" in
            "-d")
                DEBUG=$VRAI
                SILENCE=$FAUX;;
            "-f")
                USRSYNCFILE=$2
                shift;;
            "-n")
                SYNCFILE=$2
                shift;;
            "-u")
                THISUSER=$2
                shift;;
            "-m")
                NFS_HOME=$2
                shift;;
            "-h")
                do_help;;
            "-q")
                if [ $DEBUG = $FAUX ]; then
                    SILENCE=$VRAI
                fi;;
            *)
                echo "filesync : $1 --- paramètre inconnu." 
        esac
        shift
    done
}


# VÉRIFICATION DES VARIABLES
#
do_set_vars () {
    if [ "$THISUSER" = "" ]; then
        THISUSER=$USER
    fi
    if [ "$USRSYNCFILE" = "" ]; then
        USRSYNCFILE=/home/$THISUSER/$SYNCFILE
    fi
}


do_display () {
    if [ $SILENCE = $FAUX ]; then
        echo $*
    fi
}


# SYNCHRONISATION
#
do_sync () {
    # SUPPRESSION DES ÉLÉMENTS NON UTILES : LIGNES VIDES ET COMMENTAIRES
    #
    grep -v -x "" $USRSYNCFILE | grep -v "^#" > $TMPFILE
    if [ $DEBUG = $VRAI ]; then
        echo "Contenu du fichier épuré :"
        cat $TMPFILE
    fi

    # PRISE EN COMPTE DE LA LISTE DES ENTRÉES :
    #
    NB_ENTRIES=`wc -l $TMPFILE | awk '{ print($1) }'`
    do_display "Mise à jour de $NB_ENTRIES élément(s) pour $THISUSER..."
    ELT=0
    while [ $ELT != $NB_ENTRIES ]; do
        ELT=`expr $ELT + 1`
        ENTRY=`head -n $ELT $TMPFILE | tail -n 1`
        do_display " - élément $ELT : $ENTRY"
        REP1=/home/$THISUSER/$ENTRY
        REP2=$NFS_HOME/$THISUSER/$ENTRY
        if [ $DEBUG = $VRAI ]; then
            echo "   $SYNCCMD $REP1 $REP2"
            echo "   $SYNCCMD $REP2 $REP1"
        else
            $SYNCCMD $REP1 $REP2
            $SYNCCMD $REP2 $REP1
        fi
    done
}


# ERREUR
#
do_error () {
    do_display "Utilisateur $THISUSER : RIEN"
    if [ $DEBUG = $VRAI ]; then
        echo -n "Répertoire personnel NFS non monté "
        echo -n "-- ou -- "
        echo    "Fichier de description absent."
        ls -d $NFS_HOME
        ls $USRSYNCFILE
    fi
}


# NETTOYAGE DES FICHIERS TEMPORAIRES
#
do_clean () {
    rm -f $TMPFILE
}


# TRAITEMENT PRINCIPAL :
#
do_parse_args $*
do_set_vars
if [ -d $NFS_HOME/$THISUSER -a -f $USRSYNCFILE ]; then
    do_sync
else
    do_error
fi
do_clean
