#!/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