Assurer le montage de ressources partagées depuis un serveur local samba lors de la connexion de l'utilisateur suivant le critère “MaClasse”.
Rappelons qu'à l'opposé d'une distribution du type Debian-EDU, SkoleLInux, seuls 4 utilisateurs (on dira plutôt des profils) sont définis. Cette distribution propose la mise à disposition d'applications éducatives libres au sein d'une classe, chaque machine est indépendante. Dans une école, les ordinateurs peuvent même être à la disposition de plusieurs classes. Sans atteindre le niveau individuel, comment partager exercices, documents…. entre élèves et professeur d'une classe.
lightdm assure la connexion d'un profil utilisateur de PrimTux sans mot de passe(mini, maxi, super), et avec identification mot de passe pour l'administrateur. Adapté à PrimTux, lightdm utilise un greeter spécifique, lightdm-webkit-greeter (icônes pour chacun des utilisateurs standard mini,maxi,super,administrateur, avec image d'arrière-plan).
Cependant nous souhaitons avoir, dès la connexion, l'accès à des dossiers partagés Samba suivant un critère d'appartenance à une classe. Ces partages doivent pouvoir être utilisés sous PrimTux mais aussi sous Windows.
En effet, PrimTux a simplifié l'utilisation et la configuration des applications suivant des critères d'âge, mais nous souhaitons qu'enseignants et élèves puissent partager des données suivant leur appartenance à une classe.
Pour Windows, seuls les enseignants auront besoin d'utiliser telle ou telle ressource. Ils devront utiliser les fonctionnalités de base.
Nous avons donc défini 2 groupes de partage:
Afin de simplifier l'accès à ces ressources, nous monterons dans le système de fichiers les partages concernés par CIFS dès la connexion. Les partages seront démontés automatiquement à la déconnexion.
Le montage du forum sera donc prédéfini dans le fichier /etc/fstab mais seulement monté à la connexion de l'utilisateur. Le montage de MaClasse sera réalisé par un mount -t cifs par l'utilisateur root au moment de la connexion de l'utilisateur.
on va donc utiliser les 2 types de partage:
Ce dossier sera donc celui d'une classe.
Nous identifierons toutes les classes de l'école et les désignerons comme étant des utilisateurs du serveur. Par exemple : cp, ce1, ce2, ou même Nicole-maitresse-cm2 peu importe, désigner un nom de classe sera plus “portable”.
Pour être plus visible au niveau de la fenêtre de session, on rajoute une session publique qui sera la session par défaut.
Donc nous décrirons le partage forum à monter sur le système de fichiers des machines PrimTux dans /etc/fstab
.. .. //10.0.0.1/forum /home/forum cifs _netdev,users,noauto,users,file_mode=0666,dir_mode=0777,credentials=/etc/samba/.credentials/forum 0 0 ..
Il sera monté dans le système de fichiers avec la commande
mount /home/forum
le montage du partage MaClasse se fera dans le setup de lightdm sur le principe suivant :
mount -t cifs //SRV/homes /home/MaClasse -o \ rw,\ vers=2.1,\ domain=WORKFLOW,\ user=$SESSION_USER,\ password=$SESSION_USER,\ uid=$(id -u $USER),forceuid,\ gid=$(id -g $USER),forcegid,\ file_mode=0775,dir_mode=0775
[global] workgroup = WORKGROUP netbios name = SRV dns proxy = no server string = %h SAMBA # nom du serveur samba # interfaces = 10.0.0.1 enp5s0 log file = /var/log/samba/log.%m max log size = 1000 log level = 1 panic action = /usr/share/samba/panic-action %d server role = standalone server passdb backend = tdbsam obey pam restrictions = yes unix password sync = yes passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . pam password change = yes map to guest = bad user usershare allow guests = yes [homes] comment = Home Directories browseable = yes read only = no create mask = 0700 directory mask = 0700 valid users = %S [forum] comment = tout public path = /home/forum/ browsable =yes create mask = 0666 directory mask = 0777 writable = yes guest ok = yes # force user = nobody # force group = nobody ;[printers] ; comment = All Printers ; browseable = yes ; path = /var/spool/samba ; printable = yes ; guest ok = no ; read only = yes ; create mask = 0700 ;[print$] ; comment = Printer Drivers ; path = /var/lib/samba/printers ; browseable = yes ; read only = yes ; guest ok = no '''
Sur le serveur SAMBA,
mkdir /home/forum
mkdir /home/classes groupadd classes useradd -b /home/classes -G classes -N -s /usr/sbin/nologin -d /home/classes/<nomdelaclasse> -m <nomdelaclasse>
exemple: useradd -b /home/classes -G classes -N -s /usr/sbin/nologin -d /home/classes/cp -m cp
On affecte un mot de passe pour le partage samba :
root@srv:/home/administrateur# smbpasswd -a <nomdelaclasse> New SMB password: Retype new SMB password:
Notez ce mot de passe, il devra être reporté dans /etc/lightdm/session/session-setup.sh des postes PrimTux.
Rappelons que les machines PrimTux sont “mono-utilisateur”, 1 seul utilisateur sur 1 seule machine à la fois.
Nous monterons donc les ressources partagées (suivant une information donnée par l'utilisateur d'appartenance à telle ou telle classe) avec lightdm à la connexion de l'utilisateur.
Pour cela Lightdm dispose de 2 paramètres définissant des scripts exécutés par root:
Nous utilisons alors ces scripts pour monter et démonter nos partages : /etc/lightdm/session/session-setup.sh à la connexion /etc/lightdm/session/session-cleanup.sh à la déconnexion
PrimTux propose une interface de connexion simplifiée pour les enfants : 4 images permettent de choisir l'utilisateur parmi mini, maxi, super et administrateur (le maître), et quelques boutons sont disponibles pour contrôler le PC parmi “Arrêter, Hiberner, Veille, Redémarrer”.
Il manque donc une liste pour la sélection de l'appartenance de l'utilisateur à telle ou telle classe. Nous allons donc rajouter dans l'interface de connexion ce choix avec le sélecteur de session habituel.
Commençons par ajouter les différentes sessions souhaitées.
Il n'est prédéfini qu'une seule session “fluxbox”,donc pour différencier les classes nous dupliquons simplement la session existante sous d'autres noms correspondant aux critères d'organisation (pour l'exemple j'ai choisi une différenciation par niveau classe).
cp /usr/share/xsessions/fluxbox.desktop /usr/share/xsessions/fluxbox-cp.desktop cp /usr/share/xsessions/fluxbox.desktop /usr/share/xsessions/fluxbox-ce1.desktop ... cp /usr/share/xsessions/fluxbox.desktop /usr/share/xsessions/fluxbox-cm2.desktop cp /usr/share/xsessions/fluxbox.desktop /usr/share/xsessions/fluxbox-bonjour.desktop
(On pourrait imaginer une organisation avec le nom des professeurs ou tout autre choix).
for f in /usr/share/xsessions/fluxbox-{cp,ce1,cm2,bonjour}.desktop ; do cp /usr/share/xsessions/fluxbox.desktop $f ; done
Ensuite on va modifier, pour chaque nouvelle session créée, le paramètre Name=fluxbox avec le texte qui apparaîtra dans le sélecteur Name=Classe de CP pour fluxbox-cp.desktop, et ainsi de suite…
Nous allons maintenant rajouter dans l'interface de connexion la liste déroulante du choix des différentes sessions que nous venons de créer.
La présentation de l'écran de connexion de LightDm (dénommé greeter) est lightdm-webkit-greeter.
Elle est configurable à l'aide de thèmes.
PrimTux a été dessinée autour du thème pretty, nous allons donc retoucher le fichier /usr/share/lightdm-webkit/themes/pretty/index.html pour ajouter le “session selector”
<html> <head> <link rel="stylesheet" href="css/dock.css" /> <link rel="stylesheet" href="css/greeter.css" /> <script type="text/javascript" src="js/jquery-1.8.0.min.js"></script> <script type="text/javascript" src="js/greeter.js"></script> <!-- lignes à insérer --> <script type="text/javascript"> function show_message(text) { table = document.getElementById('message_table'); label = document.getElementById('message_label'); label.innerHTML = text; if (text.length > 0) table.style.visibility = "visible"; else table.style.visibility = "hidden"; } loading_text = '' function throbber() { loading_text += '.'; if (loading_text == '....') loading_text = '.' label = document.getElementById('countdown_label'); label.innerHTML = loading_text; setTimeout('throbber()', 1000); } function authentication_complete() { if (lightdm.is_authenticated) { session_list = document.getElementById('session_list'); session = lightdm.sessions[session_list.selectedIndex]; lightdm.login (lightdm.authentication_user, session.key); } else show_message ("Authentication Failed"); reset (); setTimeout('throbber()', 1000); } document.write('<table id="user_table" style="margin: auto;">'); document.write('<select id="session_list">'); for (i in lightdm.sessions) { session = lightdm.sessions[i]; if (session.key == lightdm.default_session) document.write('<option selected="selected" value="' + session.key + '">' + session.name + '</option>'); else document.write('<option value="' + session.key + '">' + session.name + '</option>'); } document.write('</select>'); document.write('</table>'); </script> <!-- fin des lignes à insérer --> </head> <body> <div class="dockArea"> <div class="dock"> <ul id="dockList"> </ul> </div> </div> <div id="passwordArea" class="password"> <table border="0" align="center"> <tr> <td><img src="img/transp.gif" width="32" height="32"/></td> <td><img src="img/transp.gif" width="32" height="32"/></td> <td><input id="passwordField" type="password" class="password"/></td> <td><img src="img/action_ok.png" title="Authentification" onclick="submitPassword()"/></td> <td><img src="img/action_cancel.png" title="Annuler" onclick="cancelAuthentication()"/></td> </tr> </table> </div> <div id="statusArea" class="status"> <table border="0" align="center"> <tr> <td><img src="img/status.png"/></td> <td><span style="font-size: 100%">Erreur</span></td> </tr> </table> </div> <div id="timerArea" class="timer"><img src="img/timer.gif"/></div> <div id="actionsArea" class="actions"></div> <div id="logArea" class="log"></div> </body> </html>
Nous avons donc ajouté le sélecteur de session en haut à gauche de la page de connexion.
Les scripts sont identifiés dans la configuration de lightdm par les paramètres
Ils sont exécutés en tant que root à la connexion et à la déconnexion de l'utilisateur. On les créera dans le dossier /etc/lightdm/session/
Configuration de lightdm
[Seat:*] greeter-session=lightdm-webkit-greeter greeter-hide-users=false user-session=bonjour session-setup-script=/etc/lightdm/session/session-setup.sh session-cleanup-script=/etc/lightdm/session/session-cleanup.sh
Le script reçoit, dans son environnement, diverses variables :
DISPLAY=:0 USER=administrateur PWD=/ HOME=/home/administrateur SHELL=/bin/sh SHLVL=1 LOGNAME=administrateur XAUTHORITY=/var/run/lightdm/root/:0 PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games _=/usr/bin/env
mais le nom de session n'y est pas présent, il doit être récupéré dans le fichier .dmrc du répertoire HOME de l'utilisateur.
[Desktop] Language=fr_FR.utf8 Session=fluxbox-ce1
On devra fournir les mots de passe des montages à réaliser dans ce script, ces mots de passe sont ceux qui ont été définis dans le chapitre “ configuration du serveur Samba ” ci-dessus.
#!/bin/bash # session-setup.sh echo $* >/root/session env >>/root/session cat <<EOF | tee /etc/samba/.credentials/forum > /dev/null username=sharing password=tuxprof domain=WORKGROUP EOF mount /home/forum SESSION=$(grep Session $HOME/.dmrc) SESSION_LIGHTDM=${SESSION#Session=} SESSION_USER=${SESSION_LIGHTDM##*-} # prévoir une test de connectivité, sinon il sera impossible de démarrer la session en cas d'erreur ping -W 2 -c 2 srv.ecole.pdc >/dev/null if [ $? -eq 0 ]; then mount /home/forum mount -t cifs //SRV/homes /home/MaClasse -o rw,vers=2.1,domain=WORKFLOW,user=$SESSION_USER,password=$SESSION_USER,uid=$(id -u $USER),forceuid,gid=$(id -g $USER),forcegid,file_mode=0775,dir_mode=0775 else echo "no network" >>/root/session fi # ignore les erreurs de réseau exit 0
#!/bin/bash # session-cleanup.sh # prls -emier test demonter dossiers partagés /home/MaClasse umount /home/MaClasse umount /home/forum rm /etc/samba/.credentials/*
Nous retrouvons donc le sélecteur de session en haut à gauche de la page de connexion
Il suffit à l'utilisateur de choisir la session correspondant à sa classe, puis de se connecter.
On peut prédéfinir un choix dans le fichier /etc/lightdm.conf (le nom du fichier de session dans /usr/share/xsessions/ sans l'extension .desktop).
[Seat:*] ... user-session=fluxbox-cp ...
Créer les points de montage sur chaque PC PrimTux :
mkdir /home/forum chmod 777 /home/forum mkdir /home/MaClasse
Ajouter un dossier vide qui apparaîtra dans le navigateur de fichiers si le montage n'a pas réussi :
mkdir /home/forum/Pas_Disponible mkdir /home/MaClasse/Pas_Fisponible
Ajouter des liens symboliques dans les dossiers documents des utilisateurs :
ln -sf /home/forum /home/01-mini/Documents/forum ln -sf /home/forum /home/02-super/Documents/forum ln -sf /home/forum /home/03-maxi/Documents/forum ln -sf /home/forum /home/administrateur/Documents/forum ln -sf /home/MaClasse /home/01-mini/Documents/MaClasse ln -sf /home/MaClasse /home/02-super/Documents/MaClasse ln -sf /home/MaClasse /home/03-maxi/Documents/MaClasse ln -sf /home/MaClasse /home/administrateur/Documents/MaClasse
Ainsi lors de la suppression d'un fichier, PCManFM tente de créer un dossier .Trash-xxxx dans le dossier partagé pour y déplacer le fichier concerné.
Bien qu'il soit tout à fait possible de créer un tel dossier, PCManFM n'arrive pas à le créer ????? –BUG–
.
Pour éviter cet écueil, il faut donc modifier le comportement en effectuant une suppression immédiate depuis menu –> Édition –> Préférences.
décocher : [ ] Mettre les fichiers supprimés à la “Corbeille” au lieu de les effacer du disque.