Table des matières

PC Primtux et serveur SAMBA (chantier)

Introduction

objectif

Assurer le montage de ressources partagées depuis un serveur local samba lors de la connexion de l'utilisateur suivant le critère “MaClasse”.

contraintes

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 restant 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.

principe

lightdm assure la connexion d'un profil utilisateur de PrimTux sans mot de passe)(mini, maxi, super)) 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, dès la connexion, nous souhaitons avoir 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 :

  1. partage commun : toutes données communes sans droits particuliers, l'objectif par exemple étant la récupération de documents scannés depuis le copieur de l'école.
    Ce partage est identifié “forum”.
  2. partage pour une classe : professeur et élèves d'une classe déposeront ou récupéreront dans ce partage les documents (exercices, documents..) de leur classe.
    Ce partage est identifié “MaClasse”.

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.
  1. Le montage du forum sera donc prédéfini dans le fichier /etc/fstab et monté dès la connexion de l'utilisateur.
  2. Le montage de MaClasse sera lui réalisé par un
    mount -t cifs

    utilisé par l'utilisateur root au moment de la connexion de l'utilisateur.

Installation

Définition des partages

On va donc utiliser les 2 types de partage:

ATTENTION, c'est le dossier home d'un utilisateur du serveur, non pas de la machine cliente.

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 ainsi le partage forum à monter sur le système de fichiers des machines PrimTux dans /etc/fstab

/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

configuration du serveur Samba

/etc/samba/smb.conf
[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.

Attention le script prend en guise de mot de passe le nom de la classe, penser à adapter le script si vous choisissez une autre solution

configuration du pc primtux

lightdm connexion

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

Adapter l'écran de connexion de PrimTux

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 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.

Créer les sessions spécifiques par classe

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).
Pour éviter d'avoir à recopier et modifier de multiples fois les chemins et noms des fichiers, avec les risques d'erreurs que cela comporte, on peut effectuer cette opération de manière plus concise grâce à l'expansion d'accolades :
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…

Modifier l'interface de connexion

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”

/usr/share/lightdm-webkit/themes/pretty/index.html
<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.

Créer les scripts de session de lightdm

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

/etc/lightdm.conf
[Seat:*]
greeter-session=lightdm-gtk-greeter
greeter-hide-users=false
user-session=fluxbox
#####display-setup-script=/root/45x11-custom-xrandr-settings
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 :

.dmrc
[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.

/etc/lightdm/session/session-setup.sh
#!/bin/bash
# session-setup.sh
#/root/45x11-custom-xrandr-settings
 
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
/etc/lightdm/session/session-cleanup.sh
#!/bin/bash
# session-cleanup.sh
# prls -emier test demonter dossiers partagés /home/MaClasse
umount /home/MaClasse
umount /home/forum
rm /etc/samba/.credentials/*

Utilisation

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).

/etc/lightdm.conf
[Seat:*]
...
user-session=fluxbox-cp
...

Petites facilités pour l'utilisateur

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-maxi/Documents/forum
ln -sf /home/forum /home/03-super/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-maxi/Documents/MaClasse
ln -sf /home/MaClasse /home/03-super/Documents/MaClasse
ln -sf /home/MaClasse /home/administrateur/Documents/MaClasse

Suppression de documents dans le forum

Par défaut, la suppression d'un fichier depuis le navigateur de fichiers PCManFM, consiste à déplacer ce fichier à la Corbeille.

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.

1)
N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !