--- categories: ['OpenBSD','Système','X11'] date: 2017-08-06T19:29:05+02:00 description: "Explications sur le serveur graphique xenodm sous OpenBSD et personnalisations" draft: false tags: ['OpenBSD','xenodm'] title: "xenodm : Gestionnaire de sessions X pour OpenBSD" translationKey: 'openbsd-xenodm' --- ## Description **xenodm** est un gestionnaire de sessions X, fourni dans le système de base d'OpenBSD, depuis 6.1 - le serveur X et les sessions graphiques ! C'est un dérivé du gestionnaire `xdm`, purgé de beaucoup de codes, donc plus léger, et débarrassé de potentielles failles de sécurités :
Time has passed by and nowadays, xdm(1) is mainly used just to manage the local X server running on laptop or desktop machines. Moreover `XDCMP's security is weak (based on DES) and doesn't support IPv6 well. So it's time to retire it. So Xenocara is getting a “new” X Display Manager which will be called “xenodm”. Xenodm is based on xdm source code. I've removed all support for XDMCP and other old cruft like ugly games with signals and setjmp(3)/longjmp(3) to set timeouts on potentially blocking operations. Another goal was to un-tangle the ifdef maze that supported various flavors of authentication methods, to only keep the BSDauth code used in OpenBSD.
{{< note warning >}} **ATTENTION** :
Ne pas utiliser `xenodm` avec l'environnement graphique Gnome3 ! Pour Gnome : Il est **fortement recommandé d'utiliser GDM**. {{}} ## Configuration Tous les fichiers de configuration se trouvent normalement être sur : `/etc/X11/xenodm/` Quelques explications : ### xenodm-config Le fichier `/etc/X11/xenodm/xenodm-config` est le fichier de configuration central du serveur xenodm. Il "redirige" vers les autres fichiers de configuration spécifique… certains sont décrits ci-dessous. {{< note tip >}} Créer vos fichiers personnels, tel quel dans `~/.config/xenodm/` ; faites vos modifications dedans, puis modifier les variables `DisplayManager*` dans le fichier `/etc/X11/xenodm/xenodm-config` en la faisant pointer vers vos fichiers personnels ! Mais **attention à chaque upgrade** de version d'OpenBSD, certains paramètres pourraient être dysfonctionnels - si vous avez des problèmes de connexion avec votre configuration personnalisée de xenodm, il serait plus prudent de repartir sur la base des fichiers originaux. {{}} #### Auto-connexion Vous désirez vous connecter automatiquement avec votre identifiant, sans avoir à le saisir constamment ? Ajouter la variable suivante `DisplayManager._0.autoLogin`, de telle manière :
`DisplayManager._0.autoLogin: Identifiant` {{}} **ATTENTION** : du fait de ne pas avoir à taper votre mot-de-passe, toute personne peut utiliser votre ordinateur et entrer directement dans votre session, avec tous les risques que cela comporte : vols d'informations, modifications voire suppressions de documents, etc… {{}} #### xenodm-config : Exemple Exemple de fichier `etc/X11/xenodm/xenodm-config` : ```cfg ! $OpenBSD: xenodm-config.cpp,v 1.1 2016/10/23 08:30:37 matthieu Exp $ ! ! ! ! ! DisplayManager.authDir: /etc/X11/xenodm DisplayManager.errorLogFile: /var/log/xenodm.log DisplayManager.keyFile: /etc/X11/xenodm/xenodm-keys DisplayManager.servers: /etc/X11/xenodm/Xservers !DisplayManager*resources: /etc/X11/xenodm/Xresources DisplayManager*resources: /home/UserId/.config/xenodm/Xresources ! All displays should use authorization, but we cannot be sure ! X terminals may not be configured that way, so they will require ! individual resource settings. DisplayManager*authorize: true ! DisplayManager*startup: /etc/X11/xenodm/Xstartup DisplayManager*session: /etc/X11/xenodm/Xsession DisplayManager*reset: /etc/X11/xenodm/Xreset DisplayManager*authComplain: true ! The following three resources set up display :0 as the console. !DisplayManager._0.setup: /etc/X11/xenodm/Xsetup_0 DisplayManager._0.setup: /home/UserId/.config/xenodm/Xsetup_0 !DisplayManager._0.startup: /etc/X11/xenodm/GiveConsole DisplayManager._0.startup: /home/UserId/.config/xenodm/GiveConsole DisplayManager._0.reset: /etc/X11/xenodm/TakeConsole DisplayManager.*.authName: MIT-MAGIC-COOKIE-1 ``` * Les lignes commençant par un `!` sont toutes des lignes de commentaires. * Par principe de précaution, j'ai dédoublé les lignes `DisplayManager*resources`, `DisplayManager._0.setup`, `DisplayManager._0.startup` en commentant celles en rapport avec les fichiers dans le répertoire de configuration principal, pour paramétrer ceux de fichiers dans le $HOME. * Remplacez `UserId` par votre identifiant de session… ### Xresources Le fichier `/etc/X11/xenodm/Xresources` permet de modifier l'apparence du gestionnaire *(couleurs, polices, textes, etc.)*. {{}} Ce fichier NE doit PAS avoir des droits en exécution ! {{}} --- #### Arrêter l'exécution de xenodm Pour sortir de l'exécution de xenodm, il est nécessaire de configurer le fichier Xresources afin d'ajouter ce qui suit : ```cfg xlogin.login.translations: #override \ CtrlR: abort-display() ``` Cette astuce permet de basculer en mode console, en arrêtant le serveur de xenodm, par l'appui sur les touches Ctrl+R. #### Interdire la connexion root Pour interdire la connexion du compte root, il faut modifier ce fichier de configuration et décommenter la ligne 128, de telle manière : ```cfg xlogin.Login.allowRootLogin: false ``` {{}} Ceci est une recommandation pratique de sécurité ! {{}} #### Xresource : Exemple personnalisé Exemple personnalisé du fichier `$HOME/.config/xenodm/Xresource` : ```cfg ! $OpenBSD: Xresources.in,v 1.1 2017/07/26 21:14:54 matthieu Exp $ DisplayManager*terminateServer: true ! ---------------------------------------------------------------------- ! XLogin ! xlogin.Login.allowRootLogin: false xlogin.Login.echoPasswd: false xlogin.Login.fail: Authorization failed xlogin.Login.greeting: xlogin.Login.namePrompt: xlogin.Login.passwdPrompt: xlogin.Login.y: 340 xlogin.Login.width: 480 xlogin*borderWidth: 0 xlogin.Login.frameWidth: 0 xlogin.Login.innerFramesWidth: 0 xlogin.Login.sepWidth: 0 xlogin.Login.face: DejaVu Sans-16 xlogin.Login.failFace: DejaVu Sans-18:bold xlogin.Login.greetFace: DejaVu Sans-0 xlogin.Login.promptFace: DejaVu Sans-18 ! ---------------------------------------------------------------------- ! XMessage ! !xmessage*background: nord0 !xmessage*foreground: nord4 xmessage*borderWidth: 0 xmessage*font: -*-terminus-bold-*-*-*-16-*-*-*-*-*-iso8859-15 xmessage*message.scrollHorizontal: Never xmessage*message.scrollVertical: Never xmessage*timeout: 0 ``` ### Xsession Le fichier `/etc/X11/xenodm/Xsession` s'occupe de l'entrée en session personnelle. {{}} Ce fichier doit avoir des droits en exécution ! {{}} Un peu de décryptage utile : * création et gestion d'un fichier personnel `~/.xsession-errors`, dont le but est de permettre au système d'écrire dedans tout problème relatif à l'exécution de l'entrée en session. C'est le fichier à vérifier IMPÉRATIVEMENT si vous rencontrez des problèmes de connexion. * gestion de l'agent SSH - si celui-ci est installé ET fonctionnel, c'est la raison pour laquelle il est demandé la saisie des clés SSH lors de la connexion. Si erreur, la session se fermera immédiatement. * gestion du fichier personnel `~/.xsession` : * si le fichier existe ET qu'il n'est pas vide, il sera exécuté. * si le fichier a des droits en exécution, il sera appelé directement - à ce propos, il est recommandé dans le [manpage](https://man.openbsd.org/xenodm.1#SESSION_PROGRAM) que celui-ci **doit avoir** ces fameux droits. * s'il n'a pas de droits en exécution, un appel système au shell sera fait pour l'exécuter. * si le fichier n'existe pas, le système vérifiera l'existence d'un fichier personnel `~/.Xresources` - *copie personnelle du fichier `/etc/X11/xenodm/Xresources`* - pour le charger, ainsi exécuter les binaires `xterm`, et `fvwm` par défaut. C'est le seul cas, où si ce fichier existe, il sera lu… ### Xsetup_0 Le fichier `/etc/X11/xenodm/Xsetup_0` nous permet d'utiliser des binaires X, tels que `xconsole` *(c'est la fameuse console de log qui s'affiche par défaut)*, `xclock`, `display`, etc. {{}} Ce fichier doit avoir des droits en exécution ! {{}} Exemple de fichier `/etc/X11/xenodm/Xsetup_0` : ```cfg #!/bin/sh # $OpenBSD: Xsetup_0,v 1.1 2016/10/23 08:30:37 matthieu Exp $ if [ "$DISPLAY" = ":0" -o "$DISPLAY" = ":0.0" ] then xconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail fi ``` ⇒ `display` permet, entres autres, d'avoir une image en fond d'écran…
`/usr/local/bin/display -window root /home/user/Images/Wallpapers/OBSD_From_Dark_to_the_Light.png`
*(Retrouvez l'[image][1] en question…)* ⇒ `qiv` permet, entres autres, d'avoir un fond d'écran aléatoire, selon les options fournies… à chaque fois que xenodm est relancé !
`/usr/local/bin/qiv -zr /home/user/Images/Wallpapers/* &`
*(cet outil ne fait pas partie du système de base).* ⇒ `xclock` permet d'afficher une horloge…
`/usr/X11R6/bin/xclock -d -update 1 -render &` Pour fermer automatiquement l'horloge, on récupère son id - dans le fichier `Xsetup_0`, sous la ligne déclarant le binaire, {{< abbr "e.g." "exemplī grātia" >}} :
`echo $! > /var/run/xclock.pid` #### Exemple personnalisé Exemple personnalisé du fichier `$HOME/.config/xenodm/Xsetup_0` : ```cfg #!/bin/ksh # $OpenBSD: Xsetup_0,v 1.1 2016/10/23 08:30:37 matthieu Exp $ if [ "$DISPLAY" = ":0" -o "$DISPLAY" = ":0.0" ]; then BG_COLOR=$(/usr/X1R6/bin/xrdb -query | awk '/xroot.background/ { print $2 }') OS_NAME=$(uname -n) OS_INFO=$(uname -smr) USER=id_user # changer par votre identifiant utilisateur /usr/X11R6/bin/xrandr --output default --dpi 96 /usr/X11R6/bin/xset fp+ /usr/local/share/fonts/roboto /usr/X11R6/bin/xsetroot -solid $BG_COLOR # obtenir un fichier aléatoire dans un répertoire précis set +A files /home/$USER/Images/OpenBSD-Art/* N=${#files[@]} # Number of members in the array ((N=RANDOM%N)) img=${files[$N]} /usr/local/bin/feh -b --bg-center -B $BG_COLOR -. -Z $img & /usr/local/bin/qiv -zrd7 /home/$USER/Images/Wallpapers/* & # menu ( while true; do /usr/X11R6/bin/xmessage -center \ -buttons "[ Sleep ]":20,"[ Restart ]":21,"[ Shutdown ]":22 "" ACTION=$? echo "Xmessage said: $ACTION" if [ $ACTION -eq 20 ]; then /usr/sbin/zzz; elif [ $ACTION -eq 21 ]; then /usr/X11R6/bin/xsetroot -cursor_name watch /sbin/shutdown -r now elif [ $ACTION -eq 22 ]; then /usr/X11R6/bin/xsetroot -cursor_name watch /sbin/shutdown -p now else echo "Something bad happened to Xmessage."; fi # stop looping if xclock died (hopefully killed by GiveConsole) if [ -z "$(pgrep -U root /usr/X11R6/bin/xclock)" ]; then break; fi done ) & /usr/X11R6/bin/xclock -geometry -0+0 -d -update 1 -render \ -strftime "$OS_NAME ($OS_INFO) | %a. %d %b. %Y %H:%M:%S " & #/usr/X11R6/bin/xclock -d -update 1 -render & echo $! > /var/run/xclock.pid fi #sxpm OpenBSD.xpm & ``` À la différence, mon fichier appelle le shell `ksh`, car pour définir un fichier image aléatoire, je définis : * un tableau nommé `files` dans lequel est attribué les noms de fichiers du répertoire cible… * la variable `N` qui, dans un premier temps, définit le nombre d'éléments du tableau `files`, puis après être passer par un calcul `RANDOM`, * la variable `img` qui est attribué selon le `N`ème élément du tableau `files`, qui est ensuite appelé par le logiciel `feh`. Normalement, `feh` devrait afficher l'image au centre de l'écran…
*ça bogue, puisque elle est affichée depuis le haut à gauche*. La boucle `while` permet d'afficher un menu linéaire, sous la zone de saisie de session, affichant : `[ Sleep ] [ Restart ] [ Shutdown ]`.
Cliquer avec la souris sur l'une ou l'autre des actions permet de déclencher l'action nommée. Pour l'exécution correcte de ce script `Xsetup_0`, il faudra installer par le biais du gestionnaire de paquets, et `feh`, et `qiv`. ### GiveConsole Le fichier `/etc/X11/xenodm/GiveConsole` a pour propos de traiter des instructions en sortie de xenodm. {{}} Ce fichier doit avoir des droits en exécution ! {{}} #### Exemple personnalisé Exemple personnalisé du fichier `$HOME/.config/xenodm/GiveConsole` : ```cfg #!/bin/sh # Assign ownership of the console to the invoking user # $OpenBSD: GiveConsole,v 1.1 2016/10/23 08:30:37 matthieu Exp $ # # By convention, both xconsole and xterm -C check that the # console is owned by the invoking user and is readable before attaching # the console output. This way a random user can invoke xterm -C without # causing serious grief. # chown $USER /dev/console if [ -c /dev/drm0 ]; then chown $USER /dev/drm0 fi /usr/X11R6/bin/sessreg -a -l $DISPLAY -u none -x /etc/X11/xenodm/Xservers $USER if test -r /var/run/xclock.pid; then kill $(cat /var/run/xclock.pid); fi pkill feh pkill xmessage ``` ## Documentation ### Manpages * {{< man xenodm >}} --- [1]: https://huc.fr.eu.org/img/EBNH/OBSD/OBSD_From_Dark_to_the_Light.png ---