Aller au contenu

Couches personnalisables

Version

Page écrite pour pupitre 0.1.35-1.

Un serveur pupitre empile des couches : Debian en bas, le paquet pupitre par-dessus, puis des couches optionnelles que l'administrateur pilote, et enfin ce que la collectivité ajoute elle-même. Savoir à quelle couche appartient un fichier dit trois choses : qui a le droit de le changer, comment le changer, et s'il survivra à la prochaine mise à jour du paquet.

Les couches d'un serveur pupitre

Les couches, de la base Debian aux ajouts de la collectivité : qui change quoi, et ce qui survit à une mise à jour.

Deux modes de session, deux périmètres

Une partie de ce qui suit ne vaut qu'en mode élèves. Le siège a deux modes (variable PUPITRE_CONNEXION) :

  • fixe, le défaut : le siège ouvre lui-même un bureau Xfce fixe, sans écran de connexion ;
  • eleves (depuis 0.1.27) : un écran de connexion LightDM par siège, une session par élève sous son propre compte.

Les raccourcis de l'école sur le bureau, le son d'ouverture de session, l'absence de verrouillage d'écran (light-locker masqué) et le pavé numérique allumé à l'écran de connexion passent par la session LightDM : ils sont propres au mode élèves. En mode fixe, le siège lance lui-même xfce4-session et ne lit pas /etc/X11/Xsession.d/60pupitre.

L'apparence PrimTux, la politique Firefox, les briques de contrôle et la règle polkit valent pour les deux modes.

Les couches, de bas en haut

Couche Livrée par Où elle vit Qui la change
1. Debian 13 apt partout apt
2a. Base de pupitre, toujours active le paquet /usr/share/pupitre, /usr/lib/pupitre, /usr/lib/firefox-esr/distribution/, /usr/share/lightdm/, /usr/share/polkit-1/rules.d/ personne
2b. Conffiles le paquet /etc/pupitre/, /etc/pam.d/pupitre, /etc/X11/Xsession.d/60pupitre l'administrateur, avec prudence
3. Couche de contrôle (depuis 0.1.28) le paquet, briques activées par l'administrateur fichiers posés dans /etc par chaque brique pupitre-controle
4. Apparence PrimTux paquets PrimTux installés par un script thèmes système, xfconf réécrit à chaque démarrage de siège variables PUPITRE_*
5. Logiciels de l'école scripts du paquet /usr/bin/tuxbot, bureau de l'élève l'administrateur, une fois
6. Ajouts de la collectivité vous drop-ins systemd, /etc/firefox-esr/, /etc/lightdm/, /etc/skel vous
7. L'élève l'élève ~/.config de son compte l'élève

La base livrée, toujours active

Le paquet installe une base que la mise à jour suivante remplace en entier. Elle porte la sécurité et la vie privée, et n'est pas négociable :

  • la politique Firefox de base, dans /usr/lib/firefox-esr/distribution/policies.json (voir la politique Firefox) ;
  • la règle polkit qui interdit aux élèves et à l'écran de connexion d'éteindre, redémarrer ou mettre en veille le serveur, ainsi que toute action systemd (depuis 0.1.27) ;
  • la configuration de LightDM et de son écran de connexion, dans /usr/share/lightdm/ ;
  • les lanceurs du bureau, l'autostart des élèves, les briques et les scripts.

Ne modifiez aucun fichier sous /usr/share/pupitre, /usr/lib/pupitre ou /usr/lib/firefox-esr/distribution/ : il serait écrasé à la mise à jour suivante.

Les cinq conffiles

Le paquet construit déclare exactement cinq conffiles (debian/pupitre/DEBIAN/conffiles) :

Fichier Rôle Le modifier ?
/etc/pupitre/pupitre.conf le gestionnaire : interface, IP, nombre de sièges, enrôlement, console web oui, c'est fait pour
/etc/pupitre/limits.conf fichiers ouverts des sessions élèves (souple 1024, dure 4096) avec prudence
/etc/pupitre/pam-env.conf environnement PAM des sessions non conseillé
/etc/pam.d/pupitre service PAM des sessions élèves ouvertes par LightDM sur les sièges non conseillé
/etc/X11/Xsession.d/60pupitre ouverture d'une session élève non conseillé

dpkg garde un conffile que vous avez modifié, et pose la question si le paquet change aussi le sien. Les trois derniers portent l'isolement entre élèves : ne les affaiblissez pas.

Où se règlent les sièges

/etc/pupitre/pupitre.conf ne règle que le gestionnaire. Les réglages d'un siège (mode de connexion, apparence, fond, lanceurs de la barre, mémoire, etc.) sont des variables PUPITRE_* posées par un drop-in systemd reglages.conf de pupitre-seat@.service, décrit dans Installation, les sièges. Un drop-in dans /etc/systemd/system appartient à l'administrateur : il survit aux mises à jour. La liste des variables et leur défaut est dans Versions et fonctionnalités.

La couche de contrôle (depuis 0.1.28)

La couche de contrôle regroupe les choix éducatifs, chacun sous forme de brique qui couvre tout le serveur. Pas de démon, pas de fichier de configuration, pas de fichier d'état : l'état d'une brique se lit sur le disque.

Brique Effet État par défaut Depuis
dns-recherche-sure un Unbound local réécrit les noms de DuckDuckGo, Google et YouTube vers leurs versions sûres ; le reste part au DNS de l'école allumée 0.1.28, allumée par défaut depuis 0.1.33
recherche-enfants Firefox ne cherche qu'avec « DuckDuckGo sûr » (filtre strict) ou Qwant Junior, les autres moteurs sont retirés, la région est figée à FR éteinte 0.1.28
video-fenetre pas de plein écran dans Firefox, les vidéos restent dans la fenêtre éteinte 0.1.30
accueil-pupitre Firefox démarre sur une page locale de quatre tuiles (Qwant Junior, Vikidia, Calcul@tice, TACIT) éteinte 0.1.30

Activer ou désactiver une brique

sudo pupitre-controle etat
sudo pupitre-controle activer recherche-enfants
sudo pupitre-controle desactiver video-fenetre

etat affiche chaque brique, active ou inactive, et une ligne de description. Activer deux fois ne change rien ; désactiver retire exactement ce que la brique a posé. Une brique refuse d'écraser un fichier qui n'est pas le sien, et ne le retire pas à la désactivation. Un nom inconnu est refusé (code 2). activer et desactiver exigent root, etat se lit aussi sans (scripts/pupitre-controle).

Dans Firefox, about:policies montre la politique réellement appliquée.

Ce qu'il faut savoir sur dns-recherche-sure :

  • elle n'est allumée d'office qu'à la première installation, et une seule fois à la mise à jour depuis une version antérieure à 0.1.33-1 (debian/postinst). Ensuite, le choix de l'administrateur prévaut : une brique désactivée reste désactivée ;
  • elle exige que /etc/resolv.conf soit écrit par dhcpcd. Avec NetworkManager, par exemple, elle refuse et dit pourquoi, et l'installation continue ;
  • elle lit les serveurs DNS de l'école au moment de l'activation : si le DNS de l'école change, relancez activer ;
  • si Unbound s'arrête, les postes retombent sur le DNS de l'école, sans recherche sûre ;
  • le mode restreint de YouTube ne retire pas les Shorts : c'est une limite de YouTube.

Avant de désinstaller le paquet, désactivez les briques actives : apt remove et apt purge laissent leurs fichiers en place.

Écrire une brique

Une brique est un script exécutable de /usr/share/pupitre/controle/ qui répond à etat (code 0 si active, 1 sinon, plus une ligne de description), activer et desactiver. Il n'existe pas de répertoire prévu pour les briques d'une collectivité : une nouvelle brique se contribue au dépôt (scripts/controle/, déclarée dans debian/pupitre.install, testée sur le modèle de tests/test_controle.py). Pour une préférence Firefox, scripts/controle/video-fenetre donne le modèle en dix lignes, à partir de prefs-firefox.sh.

La politique Firefox

Firefox ne fusionne pas ses politiques : un fichier de politique en remplace un autre en entier. Les préférences des fichiers .js, elles, s'additionnent.

Ordre d'application dans Firefox

L'ordre dans lequel Firefox lit ses politiques et ses préférences.

  1. La base, /usr/lib/firefox-esr/distribution/policies.json, livrée par le paquet : télémétrie et études coupées, DNS sur HTTPS coupé et verrouillé (depuis 0.1.28) ; page de nouvel onglet sans actualités ni contenu sponsorisé, uBlock Origin installé d'office, about:config bloqué, ni page de bienvenue, ni compte Mozilla, ni import, ni suggestions, quatre sites de l'école épinglés (depuis 0.1.30) ; bandeaux de cookies masqués par les listes d'uBlock (depuis 0.1.32, effet au second démarrage de Firefox sur un profil existant).
  2. /etc/firefox/policies/policies.json, s'il existe, remplace toute la base. C'est là que la brique recherche-enfants pose un fichier complet : la base, plus les moteurs pour enfants.
  3. /etc/firefox-esr/*.js s'ajoutent à la politique active. Les briques video-fenetre et accueil-pupitre y posent pupitre-video-fenetre.js et pupitre-accueil-pupitre.js, en préférences verrouillées.
  4. Le profil de l'élève : seules les préférences non verrouillées restent modifiables, comme les sites épinglés.

Pour ajouter une préférence à vous, posez un fichier .js dans /etc/firefox-esr/ avec un nom qui ne commence pas par pupitre-. Ne posez jamais un /etc/firefox/policies/policies.json à la main : il effacerait toute la base (télémétrie, DNS sur HTTPS) et empêcherait recherche-enfants de s'activer. Si vous le faites malgré tout, il doit reprendre toutes les clés de la base.

L'apparence

L'apparence PrimTux (thèmes Colloid, icônes, police Luciole, fond uni et mascotte) est optionnelle (depuis 0.1.1). Le détail est dans Apparence.

Installer les paquets PrimTux, une fois :

sudo pupitre-themes-primtux

Le script installe trois paquets PrimTux (thème, icônes, police) et le paquet des fonds d'écran (41 Mo), seule source de la mascotte, que --sans-fond évite. Rien de PrimTux n'est copié dans le paquet pupitre. Sans ces paquets, le siège marche quand même, avec l'aspect Xfce par défaut pour chaque réglage manquant.

Changer le thème, par des variables dans le drop-in commun pupitre-seat@.service.d/ : PUPITRE_GTK_THEME, PUPITRE_WM_THEME, PUPITRE_ICON_THEME, PUPITRE_CURSOR_THEME, PUPITRE_FONT, PUPITRE_TITLE_FONT, PUPITRE_MONO_FONT, PUPITRE_PANEL_SIZE, PUPITRE_PANEL_ICON_SIZE, PUPITRE_BG_RGBA, PUPITRE_LANCEURS, PUPITRE_FOND_IMAGE. PUPITRE_APPARENCE=0 saute toute l'apparence. Un thème ou une police absents sont journalisés et laissés de côté. Le changement prend effet au prochain démarrage du siège.

Le fond coûte du débit. Chaque image est encodée en RLE avant de partir vers le boîtier : un plein écran du fond PrimTux d'origine fait 2 584 997 octets, l'aplat 72 378, l'aplat avec la mascotte 127 364 (docs/apparence.md). Préférez un aplat ou une image à grands aplats, aux dimensions de l'écran (1280 x 1024 par défaut). PUPITRE_FOND_IMAGE vide donne l'aplat nu.

L'écran de connexion n'obéit pas à ces variables. Surchargez-le dans /etc/lightdm/lightdm-gtk-greeter.conf (background, theme-name, font-name, etc.) : une clé posée là l'emporte sur celle de pupitre (commentaire de config/lightdm/50-pupitre-greeter.conf). Ce réglage vaut pour tout le serveur.

Pourquoi un réglage de /etc/xdg semble ignoré. En mode élèves, la session cherche sa configuration dans cet ordre, du plus fort au plus faible (config/Xsession.d/60pupitre) :

  1. ~/.config de l'élève ;
  2. /var/lib/pupitre/xdg : les quatre canaux xfconf de l'apparence (xsettings, xfwm4, xfce4-desktop, xfce4-panel), réécrits à chaque démarrage d'un siège ;
  3. /usr/share/pupitre/xdg : l'autostart des élèves ;
  4. /etc/xdg : Debian et l'administrateur.

Un réglage de l'administrateur dans /etc/xdg pour l'un de ces quatre canaux est donc masqué par pupitre ; les autres canaux (Thunar, clavier, etc.) s'appliquent. En mode fixe, l'apparence est écrite dans le ~/.config du siège à chaque démarrage : un réglage fait en session dans ces quatre canaux est perdu au démarrage suivant.

En mode élèves, l'apparence est commune à tous les sièges et republiée à chaque démarrage de siège : des drop-ins d'apparence différents d'un siège à l'autre se marcheraient dessus, le dernier siège démarré gagnant. Réglez l'apparence dans le drop-in commun.

Les logiciels de l'école

Le bureau de l'élève (mode élèves, depuis 0.1.30) : à chaque connexion, pupitre-bureau pose les raccourcis de l'école dans un ordre fixe, après le dossier personnel et la place de la clé USB : Calcul@tice, Vikidia, Qwant Junior, Writer, Impress, puis TuxBot une fois installé. Un raccourci n'apparaît que si son programme est installé. Les sites s'ouvrent dans une fenêtre Firefox agrandie. Rien d'autre sur le bureau n'est touché.

Ajouter un logiciel au bureau. Aucun point d'extension n'est prévu en 0.1.35-1 : la liste et l'ordre sont dans le paquet (scripts/pupitre-bureau, variable ORDRE). Trois possibilités, de la plus propre à la moins propre :

  1. Contribuer au dépôt : un .desktop dans config/bureau/, avec TryExec, et son nom dans ORDRE de scripts/pupitre-bureau.
  2. La barre des tâches : PUPITRE_LANCEURS, une liste de .desktop de /usr/share/applications, dans le drop-in commun. Défaut : firefox-esr.desktop libreoffice-writer.desktop thunar.desktop.
  3. /etc/skel : un .desktop déposé dans /etc/skel/Bureau/ est copié à la première connexion de chaque nouvel élève seulement. Ne le nommez jamais pupitre-* : pupitre-bureau le retirerait.

TuxBot (depuis 0.1.25) :

sudo pupitre-logiciels-primtux

Le script active l'architecture i386 et le dépôt PrimTux, puis installe TuxBot et Wine 32 bits : environ 215 paquets et 2,6 Go. Le préfixe Wine est préparé sans fenêtre à l'ouverture de session (depuis 0.1.32). TuxBot est muet par construction : son animation ne contient aucun son, le son du siège n'y est pour rien.

Menus en français (depuis 0.1.25) : les sièges tournent en fr_FR.UTF-8, et le paquet dépend des traductions françaises de Firefox et de LibreOffice.

Ce qui survit à une mise à jour

Élément Après apt upgrade
Conffiles modifiés gardés ; dpkg pose la question si le paquet change aussi le fichier
Drop-ins systemd, vos /etc/firefox-esr/*.js, /etc/lightdm/, /etc/skel gardés
État des briques inchangé : aucune mise à jour n'allume ni n'éteint une brique, sauf dns-recherche-sure, allumée une seule fois à la montée depuis une version antérieure à 0.1.33-1
Contenu d'une brique active pas rafraîchi, voir ci-dessous
Base Firefox, scripts des briques, raccourcis, autostart, réglages LightDM, règle polkit remplacés par ceux de la nouvelle version
/var/lib/pupitre/xdg régénéré au prochain démarrage de siège
Fond et avatar PrimTux générés gardés
Homes des sièges et des élèves gardés (depuis 0.1.26 ; avant, une mise à jour les rendait à root)
Lien avec les boîtiers maintenu (depuis 0.1.27)

Une brique active n'est pas mise à jour toute seule. Le postinst ne relance pas activer. recherche-enfants le signale (older version, run activer to update). video-fenetre, accueil-pupitre et dns-recherche-sure se disent actives même si le paquet a changé leur contenu : elles ne vérifient qu'une marque ou un fichier de configuration. Relancez pupitre-controle activer sur chaque brique active après une mise à jour.

Montée depuis 0.1.25, 0.1.26 ou 0.1.27 : les moteurs pour enfants étaient livrés par le paquet dans /etc/firefox/policies/policies.json, que 0.1.28 retire ; ils disparaissent jusqu'à sudo pupitre-controle activer recherche-enfants. Ce fichier, s'il avait été modifié, est gardé en policies.json.dpkg-bak (debian/pupitre.maintscript).

LightDM ne relit sa configuration qu'à son démarrage, et le paquet ne le redémarre jamais : voir Installation, mode élèves.

Préconisations

À modifier, c'est prévu pour :

  1. Les briques, avec pupitre-controle, selon la politique éducative de l'école. Relancer activer sur les briques actives après chaque mise à jour et après tout changement du DNS de l'école.
  2. Les réglages des sièges, par un drop-in systemd de pupitre-seat@.service, de préférence commun à tous les sièges.
  3. /etc/pupitre/pupitre.conf pour le gestionnaire, dont enroll = no une fois la salle installée.
  4. L'écran de connexion, par /etc/lightdm/lightdm-gtk-greeter.conf.
  5. Des préférences Firefox, par un fichier à vous dans /etc/firefox-esr/.
  6. Le fond d'écran : un aplat ou une image à grands aplats, aux dimensions de l'écran.

À ne pas toucher :

  1. Tout fichier sous /usr/share/pupitre, /usr/lib/pupitre et /usr/lib/firefox-esr/distribution/ : écrasé à la mise à jour.
  2. Un /etc/firefox/policies/policies.json écrit à la main : il remplace toute la base.
  3. Les fichiers posés par les briques (fichiers pupitre de /etc/unbound/, /etc/resolv.conf.head, /etc/firefox-esr/pupitre-*.js) : la prochaine activation les réécrit.
  4. /run/pupitre/seat-N.env et /var/lib/pupitre/xdg : régénérés.
  5. /etc/pam.d/pupitre, /etc/pupitre/pam-env.conf, 60pupitre et la règle polkit : ils portent l'isolement entre élèves et l'interdiction d'éteindre le serveur.
  6. Un fichier à vous nommé pupitre-*, sur le bureau d'un élève ou dans /etc/firefox-esr/.
  7. Désinstaller le paquet avec des briques encore actives.