Mon CV

Vérifier si la synchronisation des comptes mobiles est à jour

14 mai 2013

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

 

Posted in Apple et Macintosh, Unix et LinuxTags: