Outils pour utilisateurs

Outils du site


tutoriel:xenodm-dynamique

Xenodm dynamique

Ecran d'acceuil d'OpenBSD

Standard

Après l'installation d'OpenBSD avec le serveur X, le premier contact de l'utilisateur avec le système est l'écran d’accueil de xenodm qui se présente comme ça:

Personnalisé et dynamique

En n'utilisant que des éléments venant en standard avec OpenBSD donc ne nécessitant aucune installation supplémentaire, je vous propose d'obtenir un écran d’accueil qui se présente comme ça:

1568182829.jpg

Cet écran d’accueil se modifie automatiquement en fonction du nombre d'environnement de bureau installés sur le système.

Généralités

Fontionnement de xenodm

xenodm est un programme lancé en tache de fond au démarrage du système (un daemon).

xenodm ne s'affiche sur l'écran que lorsqu'aucune session graphique n'est lancée.

xenodm s'occupe, en autre et pour ce qui nous intéresse ici, de

  • lancer le serveur X s'il n'est pas démarré
  • présenter un écran d'acceuil
  • lancer la session utilisateur

xenodm est lancé au démarrage du système dans /etc/rc.conf.local par la ligne :

xenodm_flags=

Cette ligne signifie que xenodm est lancé sans paramètre et qu'il va donc utiliser la configuration par défaut.

Cette configuration par défaut est définie dans le fichier /etc/X11/xenodm/xenodm-config.

Ce fichier contient quelques variables dont un certain nombre d'entre elles pointent sur les fichiers qui seront utilisés par xenodm.

Une explication détaillée du fonctionnement de xenodm est disponible ici

Personnalisation de xenodm

Avertissement

La modification des fichiers de configuration de xenodm est une opération a risque qui peut conduire a l'impossibilité de démarrer le système.

Le risque 0 n'existant pas, nous allons tout de même prendre toutes les précautions pour éviter une mésaventure.

Précautions

Tous les fichiers de configuration originaux seront conservés en l'état et nous allons créer de nouveaux fichiers.

Tous ces fichiers sont des fichiers systèmes appartenant a root, donc vous devez passer en root pour les manipuler.

Mise au point

Commandes

Le fichier de log
cat /var/log/xenodm.log

xenodm inscrit sommairement dans ce fichier le déroulement des opérations et les erreurs rencontrées.
Attention, le nom de ce fichier peut être modifié dans xenodm-config (DisplayManager.errorLogFile).

La liste des processus
ps -A

La liste des processus en cours permet de s'assurer que les scripts lancés par xenodm ont bien été arrétés.

Outils

editres

editres permet de lister la hiérarchie et les propriétés des widgets dans les programmes X.
Trés utile malgrés son fonctionnement capricieux.

/usr/X11R6/include/X11/

Ce répertoire comporte de nombreux fichiers .h qui définissent une multitude de propriétés utilisables pour les widgets X11.
Les curseurs, les tips …

Les pages de man

xenodm X xmessage xclock toutes les autres
Des heures de lecture en perspective pour les longues soirées d'hiver.

Nouvelle configuration

Réalisation

Je n'ai utilisés que des éléments venant en standard avec OpenBSD ce qui ne nécessite aucune installation supplémentaire.
Les éléments utilisés ici sont xclock, xmessage(4) et bien sur xlogin, l'interface graphique de xenodm.

Les nouveaux fichiers semblent volumineux, notamment ctac-Xsetup_0, mais ils ne comportent pas que du code car:

  • J'ai écrit de nombreux commentaires pour expliquer le déroulement des opérations.
  • J'ai essayé d'expliquer les ressources utilisées dont les noms ne me semble pas clairs.
  • J'ai préféré n'utiliser aucun binding dans les ressources pour bien spécifier les propriétés concernées.

Une session inconnu apparait dans les sessions proposées pour illustrer ce qui se passe au cas ou !
C'est a l'administrateur de configurer les fichiers .xsession lors de l'installation d'un environnement de bureau pour éviter d'obtenir:

Je me suis contenté, pour les boutons, d'utiliser les pixmaps venant en standard.
Pour cela, j'ai utilisés en root les six commandes suivantes:

cd /usr/X11R6/include/X11/pixmaps/
cp Jnews.xpm failsafe.xpm
cp xcalc.xpm twm.xpm
cp datebook.xpm cwm.xpm
cp term.xpm lxqt.xpm
cp xterm-linux.xpm xfce4.xpm

Plusieurs fichiers temporaires sont créés puis détruits lorsqu'ils ne servent plus.
La police 34 est certainement um peu grande pour un écran de 1800 mais c'était surtout pour tester avec mon matériel.
La configuration proposée ici s'applique aux écrans couleur.
Certaines erreurs et imprécisions se sont certainement glissées ici ou là à l'insu de mon plein gré.

Mise en place

Xenodm

/etc/rc.conf.local

xenodm doit utiliser la nouvelle configuration et pour cela le fichier /etc/rc.conf.local va être modifié.
Le nouveau fichier de configuration s'appellera /etc/X11/xenodm/ctac-xenodm-config

rcctl set xenodm flags -config /etc/X11/xenodm/ctac-xenodm-config

Pour illustrer mon propos précédent par rapport aux risques encourus, si vous quittez maintenant, l'interface graphique ne démarre pas car xenodm ne trouve pas son fichier de configuration.
Il faut alors demarrer en console et modifier le fichier /etc/rc.conf.local pour retrouver un fichier fonctionel:

rcctl set xenodm flags

Cette operation peut être effectuée à tout moment si quelquechose se passe mal …

/etc/X11/xenodm/ctac-xenodm-config

C'est le premier fichier que xenodm va lire.
Il contient tous les paramètres que xenodm va utiliser et notamment l'emplacement de tous les scripts qu'il va lancer.

ctac-xenodm-config
! $OpenBSD: 6.5 ctac-xenodm-config 2019/09/05 ctac $
! Une grande partie de ce fichier est issue de l'original
! $OpenBSD: xenodm-config.in,v 1.5 2018/11/03 18:04:45 matthieu Exp $
!
DisplayManager.authDir:		/etc/X11/xenodm
DisplayManager.errorLogFile:	/var/log/xenodm.log
DisplayManager.servers:		/etc/X11/xenodm/Xservers
!
DisplayManager*resources:	/etc/X11/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
!
DisplayManager._0.setup:	/etc/X11/xenodm/ctac-Xsetup_0
DisplayManager._0.startup:	/etc/X11/xenodm/ctac-Xstartup_0
DisplayManager._0.reset:	/etc/X11/xenodm/ctac-Xreset_0
DisplayManager._0.session:	/etc/X11/xenodm/ctac-Xsession_0
DisplayManager._0.resources:	/etc/X11/xenodm/ctac-Xresources_0
!
DisplayManager.*.authName:	MIT-MAGIC-COOKIE-1
!

Plusieurs fichiers vont donc être ajoutés, présenté ici dans l'ordre d'utilisation.

  • /etc/X11/xenodm/ctac-Xresources_0
  • /etc/X11/xenodm/ctac-Xsetup_0
  • /etc/X11/xenodm/ctac-XStartup_0
  • /etc/X11/xenodm/ctac-Xsession_0
  • /etc/X11/xenodm/ctac-Xreset_0

/etc/X11/xenodm/ctac-Xresources_0

Ce fichier permet de définir les propriétés (notamment l'aspect) des différents widgets utilisés pour l'écran d'accueil.
Il est donc lu en priorité avant que xenodm n'affiche son interface graphique.

ctac-Xresources_0
! $OpenBSD: ctac-Xresources_0 2019/09/05 ctac $
!

! ----------
! Divers
!

! Police en fonction de la largeur de l'ecran
! xlogin n'utilise pas font et xmessage n'utilise pas face
! xclock peut utiliser les deux
! Pour les ecrans exotiques, il faudrait aussi tenir compte de la hauteur de l'ecran ...
! Cette remarque s'applique a tous les elements de l'ecran d'acceuil ...
! Pour les fonts, xfontsel
! Pour les faces, ???

#if WIDTH > 1800
#  define ctac_font -*-helvetica-bold-r-*-*-34-*-*-*-*-*-*-15
#  define ctac_face helvetica-34:bold
#elif WIDTH > 1400
#  define ctac_font -*-helvetica-bold-r-*-*-24-*-*-*-*-*-*-15
#  define ctac_face helvetica-24:bold
#else
#  define ctac_font -*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-15
#  define ctac_face helvetica-18:bold
#endif

! Couleurs
! Pour le nom des couleurs, voir /usr/X11R6/share/X11/rgb.txt

! texte
#define ctac_color_up grey60
! fond
#define ctac_color_down NavyBlue
! texte quand l'element est inactif
#define ctac_color_bt_disabled white
! fond du texte dans l'ecran de login
#define ctac_color_logdown MidnightBlue
! texte en cas d'erreur
#define ctac_color_fail red

! Variables transmises a Xsetup_0 via xrdb

! resolution ecran
ctac_width: WIDTH
ctac_height: HEIGHT
! logo
ctac_xpm: "/etc/X11/xenodm/pixmaps/OpenBSD_15bpp.xpm"
! Selection de la session par defaut, si absent failsafe
! ctac_defaut_session: xfce
! OpenBSD vient en standard avec twm, cwm et fvwm qui sert pour failsafe
ctac_list_session: "inconnu,failsafe,twm,cwm"
! hostname
ctac_host: CLIENTHOST
! couleurs
ctac_color_fond: ctac_color_down
ctac_bt_disabled: ctac_color_bt_disabled
! icon
ctac_default_icon: "/usr/X11R6/include/X11/pixmaps/xman.xpm"
! Pour enregistrer une image de l'ecran d'acceuil
! ctac_photo: "/tmp/ctac-xenodm_screen"

! ----------
! Login
!

! Par defaut xenodm positionne l'ecran de login au centre en x mais plutot vers le haut en y
! On ne peut pas faire de calcul dans ce fichier, a moins que l'option DisplayManager.DISPLAY.cpp ne le permette ?
! Il est donc impossible de donner des coordonnees precises a y pour centrer xlogin
! on fixe toutes les faces sur ctac_face pour que le login soit bien au centre en x

xlogin.login.face: ctac_face
xlogin.login.failFace: ctac_face
xlogin.login.greetFace: ctac_face 
xlogin.login.promptFace: ctac_face

! champs vides

xlogin.login.greeting:
xlogin.login.passwdPrompt:
xlogin.login.namePrompt:

! aucune bordures

xlogin.borderWidth: 0
xlogin.login.borderWidth: 0
xlogin.login.frameWidth: 0
xlogin.login.innerFramesWidth: 0
xlogin.login.sepWidth: 0

! couleurs

xlogin.login.background: ctac_color_down
xlogin.login.foreground: ctac_color_up
xlogin.login.failColor: ctac_color_fail
xlogin.login.inpColor: ctac_color_logdown

! divers

xlogin.login.echoPasswd: true
xlogin.login.echoPasswdChar: ?
xlogin.login.fail: Erreur!
xlogin.login.allowRootLogin: false

xlogin.login.translations: #override \
Ctrl<Key>E: move-to-begining() \n\
Ctrl<Key>A: move-to-end()

! ----------
! Xclock
!

! xclock peut utiliser font et face
! Le rendu me semble meilleur avec face mais xmessage n'accepte pas face
! Pour rester coherent, j'utilise font qui necessite de positionner render sur false

xclock.clock.font: ctac_font
xclock.clock.render: false

! aucune bordure

xclock.borderWidth: 0
xclock.clock.borderWidth: 0

! couleurs

xclock.clock.background: ctac_color_down
xclock.clock.foreground: ctac_color_up

! divers

xclock.geometry: -0-0
xclock.clock.analog: false
xclock.clock.chime: false
xclock.clock.twentyfour: true
xclock.clock.update: 10
xclock.clock.strftime: %d-%m-%y  %H:%M

! -----------
! Xmessage
!

! fonts

xmessage.form.Command.font: ctac_font
xmessage.form.message.textSink.font: ctac_font
xmessage.tip.font: ctac_font

! couleurs

xmessage.form.background: ctac_color_down
xmessage.form.Command.background: ctac_color_down
xmessage.form.message.background: ctac_color_down
xmessage.form.message.foreground: ctac_color_up
xmessage.form.Command.foreground: ctac_color_up
xmessage.form.foreground: ctac_color_up
xmessage.tip.background: ctac_color_up
xmessage.tip.foreground: ctac_color_down

! aucune bordure

xmessage.form.Command.borderWidth: 0
xmessage.form.message.borderWidth: 0
xmessage.borderWidth: 0
! Pour supprimer le bord du bouton quand la sourie le survole
xmessage.form.Command.highlightThickness: 0

! divers

! pas d'ascenseur dans le message

xmessage.form.message.scrollHorizontal: Never
xmessage.form.message.scrollVertical: Never

! curseur qui apparait sur les boutons
! la liste des curseurs disponibles dans /usr/X11R6/include/X11/cursorfont.h

xmessage.form.Command.cursorName: hand2

! par defaut les boutons sont rectangle a bords arrondis
! avec les boutons comportant un pixmap, le fond apparait en noir

xmessage.form.Command.shapeStyle: rectangle

/etc/X11/xenodm/ctac-Xsetup_0

Ce fichier doit être executable.
C'est le premier script lancé par xenodm.
Ce script permet:

  • de lancer les différents éxécutables utilisés.
  • d'ajouter ou de modifier les propriétés des widgets utilisés par ces éxécutables.
  • de définir ce qui se passe lors d'une action (click sur un bouton, …).
ctac-Xsetup_0
#!/bin/sh
# OpenBSD: 6.5 ctac-Xsetup_0 2019/09/05 ctac $
#

# ----------
# Divers
# ----------

# Suite au reset du seveur X par Ctrl C, Ctrl \ ou Ctrl Alt Backspace, toutes les fenetres sont detruites
# Les fichiers contenant leurs pid existent toujours
# On les supprime pour eviter les avertissements dans le fichier de log : DisplayManager.errorLogFile

  if test -f /tmp/ctac-pid_win
    then
      rm /tmp/ctac-pid_win*
  fi

# On recupere les valeurs definies dans Xressource avec xrdb
# Les variables que l'on veut recuperer se presentent sous cette forme :
# 'ctac_' NomDeLaVariable ': ' ValeurDeLaVariable
# Un petit traitement avec sed permet de les formater pour les sourcer
# Un seul appel a xrdb permet d'obtenir toutes les valeurs qui nous interessent
# La resolution d'ecran, les couleurs, le chemin des icons, etc...

  xrdb -query | 
    sed '/^ctac_/!d;s/:[[:blank:]]\{1,\}/=/' > /tmp/ctac-xrdb
  . /tmp/ctac-xrdb
  rm /tmp/ctac-xrdb

# Fonction pour determiner la taille de l'image xpm
# le xpm est un fichier texte et sa taille est inscrit sur une ligne en debut de fichier 

  logo_size()
    {
      echo $(sed -n '
        /^"/!d
        s/^"\([0-9]* [0-9]*\).*/\1/
        p
        q' < "$1")
    }

# On peut ecrire presqu'a tous moments dans le fichier de log : DisplayManager.errorLogFile
# On choisira d'ecrire dans un fichier specifique dans les sous-sous-...-shells

  echo "la fonction logo size a ete definie dans $0"

# Creation du fichier de session pour Xsession et du fichier pour afficher la session choisie

  echo "${ctac_defaut_session-failsafe}" > /tmp/ctac-session
  cp /tmp/ctac-session /tmp/ctac-choix

# Couleur de fond d'ecran

  xsetroot -solid "${ctac_color_fond}"

# ----------
# lancement de l'horloge
# ----------

# Tous les parametres sont dans Xressources
# On enregistre le pid de xclock dans le fichier /tmp/ctac-pid_win

  xclock &
  echo $! > /tmp/ctac-pid_win

# ----------
# affichage des boutons quitter et redemarrer
# ----------

# De nombreux parametres sont definis dans Xressource
# On enregistre le pid du xmessage dans le fichier /tmp/ctac-pid_win

  (
    (
      xmessage \
        -geometry -0+0 \
        -buttons "Reboot:31,Shutdown:32" \
        -xrm 'xmessage.form.message.height: 1' \
        -xrm 'xmessage.form.Reboot.leftBitmap: /usr/X11R6/include/X11/bitmaps/Up' \
        -xrm 'xmessage.form.Shutdown.leftBitmap: /usr/X11R6/include/X11/bitmaps/Down' \
        -xrm 'xmessage.form.Shutdown.tip: Arreter le systeme' \
        -xrm 'xmessage.form.Reboot.tip: Redemarrer le systeme' \
        "" 
      {
        case $? in
          31) shutdown -r now ;;
          32) shutdown -p now ;;
          *)  exit ;;
        esac
      }
    ) &
# pid de la boucle
    pid=$!
# pid du xmessage
    pgrep -P $pid >> /tmp/ctac-pid_win
  )

# ----------
# traitement du logo
# ----------

# De nombreux parametres sont definis dans Xressource
# Le logo s'affiche sur le message de xmessage
# Le hostname est ecrit sur le bouton de xmessage
# On enregistre le pid du xmessage dans le fichier /tmp/ctac-pid_win

  (
# taille et position du logo
# On utilise la fonction logo_size
    logo_width=$(logo_size "${ctac_xpm}")
    logo_width="${logo_width% *}"
    logo_height=$((ctac_height / 100 * 35 ))
    logo_posx=$(((ctac_width - logo_width) / 2 ))
# lancement du logo
# ici un petit probleme se presente si le logo est petit ou/et si le hostname est tres long
# 11 characteres maximum avec une police 34 et le logo OpenBSD
# la propriete sensitive permet de rendre le bouton inactif
    xmessage \
      -geometry +"${logo_posx}"-0 \
      -buttons "${ctac_host}" \
      -xrm 'xmessage.form.Command.sensitive: false' \
      -xrm "xmessage.form.message.height: ${logo_height}" \
      -xrm "xmessage.form.message.width: ${logo_width}" \
      -xrm 'xmessage.form.message.cursorName: left_ptr' \
      -xrm "xmessage.form.message.backgroundPixmap: ${ctac_xpm}" \
      -xrm "xmessage.form.Command.width: ${logo_width}" \
      -xrm 'xmessage.form.Command.cursorName: left_ptr' \
      -xrm "xmessage.form.Command.foreground: ${ctac_bt_disabled}" \
      "" &
    echo $! >> /tmp/ctac-pid_win
  )

# ----------
# Affichage des boutons pour changer de session
# ----------

# De nombreux parametres sont definies dans Xressource

  (
# On recupere ici la taille des icons
# La variable ctac_default_icon pointe sur un fichier xpm
# Ce fichier permet d'afficher un icon par defaut si on ne trouve pas d'icon correspondant
# Ce fichier fournit egalement l'emplacement des fichiers d'icons
# Tous les icons doivent avoir la meme dimension pour que ce soit coherent
# Tous les icons doivent se situer dans le meme repertoire
# Ici un petit probleme se presente si le nombre de sessions est important et/ou les icons sont larges
# On utilise la fonction logo_size
    Le_icon_width=$(logo_size "${ctac_default_icon}")
    Le_icon_height="${Le_icon_width#* }"
    Le_icon_width="${Le_icon_width% ${Le_icon_height}}"
# On recupere ici le repertoire des icons
    Le_icon_path="${ctac_default_icon%/*}/"
# On determine ici la liste des sessions
# Une partie provient de la variable ctac_list_session definie dans Xressource contenant les sessions standards failsafe, twm
# L'autre partie provient des fichiers startxxx dans /usr/local/bin que les DE installent
    lesboutons=$( \
      printf "%s" "$ctac_list_session"
      for i in /usr/local/bin/start*
        do
          if test -x "$i"
            then
              printf "%s,${i##*start}"
          fi
        done
      )
# On ecrit ici un fichier ressource que l'on va ensuite merger
# Ces ressources ne peuvent pas etre inscrites dans Xressource car on ne connait pas a l'avance le nombre de sessions disponibles
    echo "$lesboutons" |
      tr , '\n' |
        while read line
          do
            echo "xmessage.form.${line}.tip: Selection de la session ${line}" >> /tmp/ctac-lesboutons
            echo "xmessage.form.${line}.width: ${Le_icon_width}" >> /tmp/ctac-lesboutons
            echo "xmessage.form.${line}.height: ${Le_icon_height}" >> /tmp/ctac-lesboutons
            echo "xmessage.form.${line}.label:" >> /tmp/ctac-lesboutons
# si un icon n'est pas disponible affichage de l'icon par defaut
            if test -f "${Le_icon_path}${line}.xpm"
              then
                echo "xmessage.form.${line}.backgroundPixmap: ${Le_icon_path}${line}.xpm" >> /tmp/ctac-lesboutons
              else
                echo "xmessage.form.${line}.backgroundPixmap: ${ctac_default_icon}" >> /tmp/ctac-lesboutons
            fi
          done
    xrdb -merge /tmp/ctac-lesboutons
    rm /tmp/ctac-lesboutons
# Affichage du choix de la session
# Le nom de la session choisi est inscrit dans les fichiers /tmp/ctac-session et /tmp/ctac-choix
# Le fichier /tmp/ctac-choix servira pour l'affichage de la session choisie
# Le pid du sous-shell est incrit dans le fichier /tmp/ctac-pid_shell_A
# Le pid du xmessage est incrit dans le fichier /tmp/ctac-pid_win_A
# On n'utilise pas ici le fichier general /tmp/ctac-pid_win car xmessage est ephemere
# Un nouveau xmessage remplacera le precedent lors de la selection d'une session
# La_distance correspond a l'ecart entre les boutons pour eviter qu'ils ne se touchent tous
    while true
      do
        ret=$( \
          ( \
            La_distance=$((Le_icon_width / 3))
            test -s /tmp/ctac-pid_shell_A && kill $(< /tmp/ctac-pid_shell_A)
            xmessage \
              -print \
              -xrm 'xmessage.form.message.height: 1' \
              -geometry +0+-"$La_distance" \
              -xrm "xmessage.form.defaultDistance: $La_distance" \
              -buttons "$lesboutons" \
              "" \
          ) &
        pid=$!
#pid du sous-shell qui renvoie ret
        echo $pid > /tmp/ctac-pid_shell_A
# pid du xmessage
        pgrep -P $pid > /tmp/ctac-pid_win_A
      )
      if test $ret
        then
          echo $ret > /tmp/ctac-session
          echo $ret > /tmp/ctac-choix
        else
# en cas de reset du server X, ce shell se termine
# le fichier /tmp/ctac-choix vide permettra au shell d'affichage de la session de se terminer
          touch /tmp/ctac-choix
          rm /tmp/ctac-pid_shell_A
          break
      fi
    done
  ) &

# ----------
# affichage de la session choisie
# ----------

# De nombreux parametres sont definis dans Xressource
# Le pid du xmessage est incrit dans le fichier /tmp/ctac-pid_win_B
# On n'utilise pas ici le fichier general /tmp/ctac-pid_win pour xmessage car il est ephemere
# Un nouveau xmessage remplacera le precedent lors de la selection d'une session
# La session choisi est inscrit dans le fichier /tmp/ctac-choix

  (
    while true
      do
# une verification toutes les secondes est suffisant
        sleep 1
        if test -f /tmp/ctac-choix
          then
            if ! test -s /tmp/ctac-choix
              then
# en cas de reset du server X, le fichier /tmp/ctac-choix existe mais vide, ce shell se termine
                rm /tmp/ctac-choix
                break
            fi
            ret=$(< /tmp/ctac-choix)
            rm /tmp/ctac-choix
# ici une session a ete choisi, on detruit le xmessage
# ce test permet d'eviter d'avoir un avertissement au demarrage dans le fichier de log : DisplayManager.errorLogFile
            if test -f /tmp/ctac-pid_win_B
              then
                kill $(< /tmp/ctac-pid_win_B)
            fi
            xmessage \
              -geometry +0-0 \
              -xrm 'xmessage.form.Command.sensitive: false' \
              -xrm "xmessage.form.Command.label: SESSION : $ret" \
              -xrm "xmessage.form.Command.foreground: $ctac_bt_disabled" \
              -xrm 'xmessage.form.Command.cursorName: left_ptr' \
              -xrm 'xmessage.form.message.cursorName: left_ptr' \
              "" &
            echo $! > /tmp/ctac-pid_win_B
        fi
      done
  ) &

# ----------
# prise de la photo si inscrit dans Xressource
# ----------

# pour voir la photo
# xwud -in /tmp/ctac-xenodm_screen -geometry 640x512+100+100 -raw -scale &
# ici avec un ecran 1280x1024, affichage sur un demi ecran, adapter geometry en fonction de l'ecran
# pour conserver la photo, il faut la copier ailleur

  if test "${ctac_photo-}"
    then
      (
# souriez !
        sleep 2
        xwd -out "${ctac_photo}" -root -screen &
      ) &
  fi

/etc/X11/xenodm/ctac-Xstartup_0

Ce fichier doit être executable.
Ce script est lancé lorsqu'un utilisteur s'est identifié et permet de supprimer les widgets créés par /etc/X11/xenodm/ctac-Xsetup_0.

ctac-Xstartup_0
#!/bin/sh
# $OpenBSD: ctac-Xstartup_0 2019/09/05 ctac $
#

# On supprime ici tous les elements de l'ecran de login

  lesfiles=$(cat /tmp/ctac-pid_win*)
  echo "$lesfiles" |
    while read line
      do
        kill $line
      done
  rm /tmp/ctac-pid_win*


# la session choisie est inscrite dans /tmp/ctac-session
# on modifie le proprietaire du fichier pour pouvoir effacer le fichier apres son utilisation

  if test -f /tmp/ctac-session
  then
    chown $USER /tmp/ctac-session
  fi

# Ceci provient du fichier original et n'a pas subi de modification
# $OpenBSD: GiveConsole,v 1.2 2018/07/11 19:20:40 matthieu Exp $

  if [ -c /dev/drm0 ]
  then
    chown $USER /dev/drm0
  fi
  /usr/X11R6/bin/sessreg -a -l $DISPLAY -u none $USER

/etc/X11/xenodm/ctac-Xsession_0

Ce fichier doit être executable
Ce script permet de lancer la session utilisateur.

ctac-Xsession_0
#!/bin/sh
# $OpenBSD 6.5 : ctac-Xsession_0 2019/09/05 ctac $
#

# Une grande partie de ce fichier est issue de l'original
# $OpenBSD: Xsession.in,v 1.1 2017/07/26 21:14:54 matthieu Exp $

  prefix="/usr/X11R6"
  exec_prefix="${prefix}"

# redirect errors to a file in user's home directory if we can

  errfile="$HOME/.xsession-errors"
  if ( umask 077 && cp /dev/null "$errfile" 2> /dev/null )
    then
      exec > "$errfile" 2>&1
    else
      for errfile in "${TMPDIR-/tmp}/xses-$USER" "/tmp/xses-$USER"
        do
          if ef="$( umask 077 && mktemp "$errfile.XXXXXX" 2> /dev/null)"
            then
              exec > "$ef" 2>&1
              mv "$ef" "$errfile" 2> /dev/null
              break
          fi
        done
  fi

# if we have private ssh key(s), start ssh-agent and add the key(s)

  id1=$HOME/.ssh/identity
  id2=$HOME/.ssh/id_dsa
  id3=$HOME/.ssh/id_rsa
  id4=$HOME/.ssh/id_ecdsa
  id5=$HOME/.ssh/id_ed25519
  if [ -z "$SSH_AGENT_PID" ]
    then
      if [ -x /usr/bin/ssh-agent ] && [ -f $id1 -o -f $id2 -o -f $id3 -o -f $id4 -o -f $id5 ]
        then
          eval `ssh-agent -s`
          ssh-add < /dev/null
      fi
  fi

  startup=$HOME/.xsession

# On recupere ici la session choisie

  if test -f /tmp/ctac-session
    then
      go=$( < /tmp/ctac-session )
      lestartup="${startup}_${go}"
  fi

# On verifie qu'un fichier session choisie existe

  if test -f "$lestartup"
    then
      startup="$lestartup"
    else
# pour xfce qui renvoie xfce4
      lestartup="${lestartup%?}"
      if test -f "$lestartup"
        then
          startup="$lestartup"
        else
          startup=""
      fi
  fi
  rm /tmp/ctac-session

# On lance la session

  if test -s "$startup"
    then
      if test -x "$startup"
        then
          exec "$startup"
        else
          exec /bin/sh "$startup"
      fi
    else
      resources=$HOME/.Xresources
      if test -f "$resources"
        then
          /usr/X11R6/bin/xrdb -load "$resources"
      fi

# Pas de DE choisi ou le fichier .xsession correspondant n'existe pas
# On verifie si le choix correspond a un wm standard de X (cwm, fvwm, twm ...)

      if test -f "${exec_prefix}/bin/${go}"
        then
          exec "${exec_prefix}/bin/${go}"
        else
          if test "${go}" != "failsafe"
            then

# ici le fichier .xsession est manquant
# On lance la session failsafe avec un avertissement

              xmessage \
                -xrm "xmessage.form.Command.tip: OK, je l'appelle" \
                "Il y a um petit probleme avec .xsession_${go} !
                  Contacter l'administrateur." &
          fi
      fi
      ${exec_prefix}/bin/xterm &
      exec ${exec_prefix}/bin/fvwm
  fi

/etc/X11/xenodm/ctac-Xreset_0

Ce fichier doit être executable.
Ce script est lancé lorsque l'utilisateur clos sa session.
Il permet de rendre la main proprement a xenodm avant que le cycle ne soit redémarré.

ctac-Xreset_0
#!/bin/sh
# OpenBSD: ctac-Xreset_0 2019/09/05 ctac $
#

# Cette fonction provient du Xsession original
# $OpenBSD: Xsession.in,v 1.1 2017/07/26 21:14:54 matthieu Exp $
# En l'executant ici, elle evite que le processus Xsession tourne en permanence

do_exit() {
        if [ "$SSH_AGENT_PID" ]; then
                ssh-add -D < /dev/null
                eval `ssh-agent -s -k`
        fi
        exit
}

do_exit

# Ceci provient du fichier original et n'a pas subi de modification
# $OpenBSD: TakeConsole,v 1.3 2018/07/11 19:20:40 matthieu Exp $

if [ -c /dev/drm0 ]; then
    chown root /dev/drm0
fi
/usr/X11R6/bin/sessreg -d -l $DISPLAY -u none $USER

Sessions

$HOME/.xsession_xfce

Ce fichier permet de lancer xfce

.xsession_xfce
. ~/.profile
exec xfce4-session

$HOME/.xsession_lxqt

Ce fichier permet de lancer lxqt

.xsession_lxqt
. ~/.profile
exec startlxqt

Commentaires

Bugs

LOL Aucun LOL

En tous cas à ma connaissance!

Disfonctionnements

Malheureusement, tout n'est pas parfait.

Voici une liste des problèmes que j'ai identifiés.

  • Le logo et le hostname apparaissent sur le même xmessage.

Si le logo est petit et/ou le hostname trop long, le hostname sera tronqué.
On pourra utiliser 2 xmessages pour supprimer ce désagrément.

  • Si de nombreux environnements de bureau sont installés et/ou les icons utilisés sont larges.

la barre d'icons va déborder sur les boutons Shutdown/Reboot, voir les masquer et déborder de l'écran.
Je n'ais pas de solution a proposer, mais est t'il raisonnable d'avoir de nombreux DE installés et/ou d'utiliser des icons énormes?

  • Si le nom d'un DE comporte un point.

Un DE s'appelant Personel.DE, par exemple, le fichier startX correspondant s'appellera startPersonel.DE.
Dans ce cas, le bouton correspondant n'affichera pas d'icon mais le texte Personel.DE.
Je n'ais pas de solution a proposer mais existe t'il des DE dont le nom comporte un point?

  • Deux shells accédent au fichier /ctac-choix ce qui peux créer un dysfonctionnement lors d'un accés simultané.

Le risque est faible mais je pense réel.
On pourrait mettre en place un système de lock.

Suggestion

Comme spécifié en introduction, l'écran d'acceuil est le premier contact de l'utilisateur avec le système.
Une légère modification des fichiers installés de base avec OpenBSD pourrais lui donner un 'user friendly look' et ainsi attirer de nouveaux utilisateurs.
Ceci nécessite l'installation du pixmap de version en xpm dans /usr/x11/xenodm/pixmap.
Je propose un /etc/X11/xenodm/Xsetup_0 modifié ainsi:

Xsetup_0
#!/bin/sh
# $OpenBSD: Xsetup_0,v 1.5 2018/07/17 11:52:12 matthieu Exp $
xsetroot -solid rgb:79/8a/99
logo="/etc/X11/xenodm/pixmaps/Puffy_6.5.xpm"
logo_height=$(sed '/^"/!d;s/^"[0-9]* \([0-9]*\).*/\1/;q' "$logo")
sxpm -g +10-"$((logo_height+10))" "$logo" &
xclock \
  -render \
  -update 1 \
  -geometry "$logo_height"x"$logo_height"-10-10 \
  -xrm 'xclock.borderWidth: 0' \
  -xrm 'xclock.clock.background: rgb:79/8a/99' \
  -xrm 'xclock.clock.hourColor: red' \
  -xrm 'xclock.clock.minuteColor: blue' \
  -xrm 'xclock.clock.secondColor: black' \
  -xrm 'xclock.clock.majorColor: green' \
  &
 

2 lignes a ajouter a la fin de /etc/X11/xenodm/Xresources:

Lignes_ajouter_fin_Xresources
xlogin*borderWidth: 0
xlogin.login.frameWidth: 0

et 1 ligne a ajouter dans /etc/X11/xenodm/GiveConsole

Ligne_ajouter_GiveConsole
pkill xclock sxpm

Pour obtenir en standard:

tutoriel/xenodm-dynamique.txt · Dernière modification: 2020/01/19 16:30 (modification externe)