Projet

Général

Profil

Gestion des profils itinérants sous linux

C'est lié aux tickets suivants:

Développement d’une solution de profil itinérant

En cours d’implémentation, la solution s’appuie sur pam_exec et modification des scripts Xsession.d/ pour afficher un message à l’utilisateur

  • Ajout d’une fenêtre (zenity) pour avertir l’utilisateur que la synchro est en cours
    • lancement en mode détaché de la commande rsync
    • utilisation d’un fichier « flag » pour une solution d’IPC basique
  • Question au logout / login
    • Lancement de rsync avec l’option --delete ?
    • Liste d’exclusion (trash, cache firefox etc.)
    • Profil thunderbird → taille des comptes mails pour les enseignants / directions d’école
À l’ouverture de session :
  • sshfs monte le home distant sur le point de montage local /home/profiletemp/test.prof
  • ensuite on fait un rsync de ce point de montage vers le répertoire local qui est le homedir normal : /home/utilisateurs/test.prof/
  • à la déconnexion on fait un rsync inverse
  • et ensuite un démonte le point de montage sshfs
Conséquences :
  • délais d’ouverture de session → popup pour faire patienter ok
  • délais de fermeture de session → popup idem
Effets de bords connus :
  • on ne synchronise pas certains répertoires spéciaux (exemple la corbeille)
  • on ajoute des liens symboliques vers les répertoires connus les plus classiques (Bureau, Documents, Images, Musique ...)
  • quid des documents stockés dans le home de l’utilisateur ? → création d’un lien symbolique « serveur de fichier » qui pointe sur /home/profiletemp/test.prof, l’utilisateur a donc accès à son espace de stockage complet du serveur par ce chemin là ;
  • on ne propage pas les suppressions de liens symboliques locaux → serveur ;
  • comment va se comporter thunderbird ? → en particulier pour la suppression de mails si le stockage local est de type maildir ;
    • un mail arrive → nouveau fichier ;
    • l’utilisateur se déconnecte → le fichier « remonte » sur le serveur ;
    • l’utilisateur se connecte → synchro, pas de problème ;
    • l’utilisateur supprime le mail → le fichier est supprimé sur le profil local ;
    • l’utilisateur ferme sa session → le fichier n’est pas supprimé sur le serveur ;
    • l’utilisateur ouvre sa session → le fichier (donc le mail) reviens sur le poste ...
Effets de bords inconnus :
  • Idem pb décrit « thunderbird » pour les applications qui utilisent des fichiers qui seront dans le profil « itinérant » ?
  • inconnus :-)

Détail de l’implémentation

La solution est implémentée à l’aide des fichiers suivants :
  • /etc/security/pam_mount.conf.xml : monter le profil utilisateur dans un répertoire profiletemp et non dans le homedir
<volume fstype="fuse" path="sshfs#%(USER)@servecole:" mountpoint="/home/profiletemp/%(USER)" options="port=2222,nonempty,password_stdin,reconnect,StrictHostKeyChecking=no,allow_root" />
<volume options="dir_mode=0700,file_mode=0600,setuids,serverino,nobrl,noperm,iocharset=utf8"user="*" mountpoint="/home/classes" path="classes" server="servecole" fstype="cifs" />
  • /etc/kde4/kdm/Xsetup : afficher une popup si un profil est en cours de synchronisation (logout)
# tant qu'un fichier "flag" existe on affiche le message de synchronisation
# en cours, ce fichier est gere par le script horizon-pam_session via pam_exec
HZN_PROGRESSFLAG=`ls -1 /var/tmp/horizon-pam_session_*.flag | head -n1`
HZN_PROFILESYNC=`echo ${HZN_PROGRESSFLAG} | sed s/".*pam_session_"/""/ | sed s/"\.flag"/""/`
while [[ -f ${HZN_PROGRESSFLAG} ]] ; do echo "ok" ; done | zenity --progress --pulsate --title="Synchronisation en cours" --timeout="600" --text="Synchronisation du profil de l'utilisateur (${HZN_PROFILESYNC}) en cours ... veuillez patienter" --auto-close –no-cancel
  • /etc/kde4/kdm/Xreset : ne plus faire de kill et de umount forcé sinon on tue le process de rsync
# #erics / ryxeo -> on stoppe tous les processus de l'utilisateur
# #pour entre autre que pam_mount puisse demonter ses partages
  • /etc/X11/Xsession.d/10horizon-pam_mount : afficher une popup pour informer que le profil est en cours de synchronisation
    # tant que le fichier "flag" existe on affiche le message de synchronisation
    # en cours, ce fichier est gere par le script horizon-pam_session via pam_exec
    HZN_PROGRESSFLAG="/var/tmp/horizon-pam_session_$USER.flag" 
    if [ -f ${HZN_PROGRESSFLAG} ]; then
    while [[ -f ${HZN_PROGRESSFLAG} ]] ; do echo "ok" ; done | zenity --progress --pulsate --title="Synchronisation en cours" --timeout="600" --text="Synchronisation de votre profil en cours ... veuillez patienter" --auto-close --no-cancel
    fi
    
  • /etc/pam.d/common-session : ajoute deux lignes de pam_exec avant et après pam_mount l’une sera active pour le logout et l’autre pour le login
#a la fermture de session le script doit etre lance AVANT pam_mount qui demonte le repetoire
session optional pam_exec.so log=/tmp/pam.log /usr/local/bin/horizon-pam_session.sh -o before_mount
session optional pam_mount.so
#et a l'ouverture de session il faut le lancer APRES que pam_mount ait rendu le repertoire accessible
session optional pam_exec.so log=/tmp/pam.log /usr/local/bin/horizon-pam_session.sh -o after_mount
  • /usr/local/bin/horizon-pam_session.sh : c’est le script principal de gestion des synchronisation lancé à l’ouvertures et fermetures de session
cf fichier joint
  • /usr/local/bin/horizon-rsync_profile.sh : script appelé depuis horizon-pam_session.sh et qui permet de passer en mode « non bloquant » parallélisé → si on ouvre une session en ligne de commande par exemple on aura un shell avant la fin de la synchronisation du profil ... en mode graphique c’est la boite zenity et le fichier flag qui permettent de « bloquer » l’utilisateur
cf fichier joint
  • /usr/share/horizon/horizon-pam_session.exclude : liste des fichiers / répertoires exclus de la synchronisation via rsync, si vous voulez utiliser une liste personnalisée il suffit de créer un fichier /usr/share/horizon/horizon-pam_session.exclude.local qui est prioritaire (exclusif, si ce fichier est présent, le fichier « normal » n’est plus utilisé)
cf fichier joint
  • /etc/init.d/horizon-autoboot : ajoute un « nettoyage » du home comme pour les homedir des comptes utilisateurs
TESTMOUNTPROFILES=`mount | grep home/profiletemp | wc -l`
if [ "${TESTMOUNTPROFILES}" == "0" ]; then
  rm -rf /home/profiletemp
  mkdir /home/profiletemp
else
  echo "Can't clean up profile temp dir someting is mounted" 
  echo " ${TESTMOUNTPROFILES}" 
  exit 1
fi

Actualisation 2020 - Client Version 19.08

La grosse idée d'amélioration sur le poste client 19.08 est la suivante: faire une synchronisation bidirectionnelle entre la copie locale du profil et la version "stockée sur le serveur". Pour celà les outils classiques s'appuient sur inotify, inotify qui n'est pas disponible sur sshfs (https://github.com/libfuse/sshfs/issues/155) ... il faut donc un outil plus basique qui gère sa base de donnée locale et s'appuie périodiquement dessus pour "voir" ce qui a été modifié des deux côtés et faire le nécessaire.

Première piste: rsync bidir exemple

rsync -rtuv /home/utilisateurs/test.prof/.config/ /home/profiletemp/test.prof/.config/
rsync -rtuv /home/profiletemp/test.prof/.config/ /home/utilisateurs/test.prof/.config/

Mais le souci c'est qu'on ne gère pas les suppressions de fichiers ...

Nouvelle piste avec osync (https://github.com/deajan/osync) et bsync (https://github.com/dooblem/bsync)

Note: la collision de fichiers modifiés des deux côtés n'est pas prise en compte ... c'est la limite de l'exercice.

20170721-abuledu_client_profils_itinerants.tar - Patch pour la mise en place des profils itinérants sous linux (40 ko) Eric Seigne, 18/09/2017 11:44

Redmine Appliance - Powered by TurnKey Linux