Si vous avez un serveur sous OS X, peut-être utilisez-vous les comptes mobiles. De quoi s’agit-il ?
Les utilisateurs du domaine géré par votre OpenDirectory peuvent en effet disposer d’une synchronisation de leur dossier utilisateur entre leur machine et un dossier partagé (en NFS ou AFP). Cette configuration est particulièrement intéressante pour des utilisateurs itinérants, qui ne peuvent travailler tout le temps en étant connecté au serveur.
Par contre, autant le dire, la synchronisation proposée par Apple n’est pas ce qui se fait de mieux, et vous aurez certainement à faire avec des synchronisations avortées, ou pire, des utilisateurs qui contournent votre configuration en annulant leurs synchronisation.
Pour surveiller cela de prêt, suite à une discussion sur la liste de diffusion admin-ml (http://coruscant.mosx.org/mailman/listinfo/admin-ml), j’ai modifié un script proposé pour surveiller périodiquement les dates de synchronisation. L’idée est de vérifier sur un panel de fichier si des modifications ont été effectuées.
Vous pouvez facilement intervenir sur les variables notamment :
- NBJOURS pour le nombre de jours maximum de tolérance entre synchronisations,
- ADMINS pour l’adresse email d’alerte
- LOG_CUMUL pour l’adresse du journal du script
- HOMEDIRS pour l’emplacement sur le serveur des répertoires utilisateurs.
Pour obtenir la liste des utilisateurs à tester, je m’appuie ici sur une requête sur notre OpenDirectory, en listant les utilisateurs d’un Groupe (ligne 35, ici “workgroup”, vous pouvez évidemment personnaliser), puis en ne gardant que ceux qui disposent d’un répertoire dans $HOMEDIRS. Selon votre configuration, cette stratégie sera peut-être à adapter.
#!/bin/sh ######################################## ## Definition des variables a parametrer # Nb jours avant alerte synchronisation NBJOURS=10 # Adresses emails des administrateurs ADMINS="moi@mondomaine.fr" # Fichiers a tester FILES_TO_TEST=( com.apple.finder.plist com.apple.MCX.plist com.apple.recentitems.plist .DS_Store Mail) # Definition du dossier contenant les repertoires des utilisateurs HOMEDIRS="/Users" # Definition du fichier de log permanent LOG_CUMUL=/var/log/HomeSync-Test.log ######################################## ## Definition des variables utiles au script # Version du script SCR_VERS="1.3" # Definition du PATH pour s'assurer qu'il est conforme export PATH=/sw/bin:/sw/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin # Definition du dossier courant CURRENT_DIR=$(dirname $0) # Nom du script SCRIPT_NAME=$(basename $0) # Definition du fichier contenant la liste des utilisateurs, à partir du LDAP, en ne tenant compte que des répertoires qui existent FILE_USERS=$CURRENT_DIR/users.list rm $FILE_USERS members () { dscl /LDAPv3/127.0.0.1 -list /Users | while read user; do printf "$user "; dsmemberutil checkmembership -U "$user" -G "$*"; done | grep "is a member" | cut -d " " -f 1; } LISTE_USERS=$(members workgroup) for dossier in $LISTE_USERS do PATH_TEST=$HOMEDIRS/$dossier if [ -d $PATH_TEST ]; then echo "$dossier" >> $FILE_USERS fi done cd $HOMEDIRS # Fichier de log LOGTMP="/tmp/${SCRIPT_NAME}.$$.log" # Initialisation des variables NOMAIL=0 FORCEMAIL=0 THE_USER="" ALERTE=0 [ -z "$1" ] || { case $1 in "-nomail" ) NOMAIL=1 ;; "-forcemail" ) FORCEMAIL=1 ;; "-v" | "-version" ) echo "${SCRIPT_NAME} version ${SCR_VERS}" ;; * ) THE_USER="$1" esac } test_account() { let idx=${#FILES_TO_TEST[@]} stroptions=" ${HOMEDIRS}/${1} -maxdepth 3 -a -mtime -${NBJOURS} -a \(" while [ $idx -ge 0 ] do stroptions="$stroptions -name ${FILES_TO_TEST[$idx]}" let idx-=1 [ $idx -ge 0 ] && stroptions="$stroptions -o" done stroptions="$stroptions \)" nbres=$(echo $(eval find $stroptions |wc -l)) if [ $nbres -gt 2 ] then echo "${SCRIPT_NAME}:$0($1)\t: OK, $nbres fichiers modifiés depuis $NBJOURS jours." else echo "${SCRIPT_NAME}:$0($1)\t: ATTENTION, $nbres fichiers modifiés depuis $NBJOURS jours." fi [ $nbres -gt 2 ] } myuid=$(id -u) [ $myuid -ne 0 ] && { echo "Il faut lancer le script avec les droit root, essayez avec sudo." exit 1 } [ ${#FILES_TO_TEST[@]} -eq 0 ] && { echo "Le tableau FILES_TO_TEST ne doit pas etre vide, editez le script." exit 2 } echo "***************\t${SCRIPT_NAME}\t($(date +"%Y-%m-%e_%H:%M:%S"))\t***************" >${LOGTMP} if [ -z "$THE_USER" ] then cat "${FILE_USERS}" | grep -v "^#" else echo "${THE_USER}" fi |while read theuser do [ -z $theuser ] || { test_account ${theuser} >>${LOGTMP} } done TEST_GREP=$(grep -c "ATTENTION" ${LOGTMP}) if [ $TEST_GREP -ne 0 ] then ALERTE=1 fi cat ${LOGTMP} [ $NOMAIL -eq 0 ] && [ $ALERTE -eq 1 ] && mail -s "[FAILED] (${0}) : probleme possible de synchronisation." $ADMINS <"${LOGTMP}" [ $FORCEMAIL -eq 1 ] && [ $ALERTE -eq 0 ] && Mail -s "[OK] (${0}) : Aucun probleme." $ADMINS <"${LOGTMP}" cat ${LOGTMP} >> $LOG_CUMUL rm -f ${LOGTMP} exit 0