xenodm : Gestionnaire de sessions X pour OpenBSD

Article publié, le et modifié le
7 minute(s) de lecture

Cet article contient 1352 mots.
Source brute de l'article : MD

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 :

Citation : en

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

Autologin

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

Exemple

Fichier : /etc/X11/xenodm/xenodm-config

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
! $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.).

Exemple personnalisé

Fichier : $HOME/.config/xenodm/Xresource

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
! $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

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.

Fichier : /etc/X11/xenodm/Xsetup_0

1
2
3
4
5
6
#!/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é

Fichier : $HOME/.config/xenodm/Xsetup_0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/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.

Exemple personnalisé

Fichier : $HOME/.config/xenodm/GiveConsole

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/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

Documentations

Manpages