%
Puffy image/svg+xml Puffy 2019-06-14 Stéphane HUC OpenBSD Team Inkscape Puffy OpenBSD https://www.openbsd.org/art4.html English "Puffy", it's a symbol of OpenBSD

xenodm : Gestionnaire de sessions X pour OpenBSD

Article publié, le et modifié le
8 minutes de lecture

Cet article contient 1521 mots.
Source brute de l'article :
Commit version : 6623954

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 :

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.

Attention

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.

Astuce

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

Danger

xenodm-config : Exemple

Exemple de fichier etc/X11/xenodm/xenodm-config :

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

Attention

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 :

xlogin.login.translations: #override \
  Ctrl<Key>R: 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 :

xlogin.Login.allowRootLogin:    false
Attention

Xresource : Exemple personnalisé

Exemple personnalisé du fichier $HOME/.config/xenodm/Xresource :

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

Attention

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

Attention

Exemple de fichier /etc/X11/xenodm/Xsetup_0 :

#!/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 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, e.g. : echo $! > /var/run/xclock.pid

Exemple personnalisé

Exemple personnalisé du fichier $HOME/.config/xenodm/Xsetup_0 :

#!/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.

Attention

Exemple personnalisé

Exemple personnalisé du fichier $HOME/.config/xenodm/GiveConsole :

#!/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