"Después del juego es antes del juego"
Sepp Herberger

martes, 15 de septiembre de 2015

Panel inmutable para todos los usuarios en XFCE

En entornos educativos/empresariales como los nuestros es muy conveniente mantener uniformes los escritorios de todos los usuarios, haciendo que sean personalizables el menor número de opciones posible.

Cuando usábamos Gnome2 teníamos los ficheros mandatory que nos permitían fijar cosas como el fondo de pantalla y varias opciones mas del escritorio. En nuestro breve paso por Gnome3 también vimos que había una manera de hacerlo.   Al pasarnos a XFCE nos llevamos la agradable sorpresa de que también existía esa posibilidad: el modo kiosco que permite bloquear configuraciones de xfconf, el gestor de configuraciones de dicho escritorio.

Básicamente consiste en meter ficheros xml (donde se almacena la configuración de XFCE) en la ruta /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/, con determinadas partes bloqueadas o desbloqueadas (con los parámetros locked/unlocked). Estas configuraciones bloqueadas se impondrán siempre sobre la configuración personal del usuario almacenada en ~/.config/xfce4/xfconf/xfce-perchannel-xml/. En ambos directorios hay muchos ficheros xml, cada uno de los cuales configura determinados aspectos de nuestro entorno XFCE4.

root@servidor:~/.config/xfce4/xfconf/xfce-perchannel-xml# ls -1
displays.xml
keyboards.xml
pointers.xml
thunar-volman.xml
xfce4-desktop.xml
xfce4-keyboard-shortcuts.xml
xfce4-mixer.xml
xfce4-panel.xml
xfce4-session.xml
xfce4-settings-manager.xml
xsettings.xml 
Se puede configurar y bloquear el panel, el fondo de pantalla, el control de volumen, el volume manager del explorador de archivos y muchísimas cosas más. Las posibilidades son mucho mayores que en Gnome2 y Gnome3.

Como ejemplo vamos a ver como poner un panel (definido en el fichero xfce4-panel.xml) fijo e inmutable para todos los usuarios. Para ello cogemos un usuario de prueba y configuramos desde el entorno gráfico el panel tal como queremos quedarlo finalmente. Luego simplemente copiamos el fichero ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml a la ubicación /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml y lo modificamos para que quede bloqueado para todo el mundo excepto para el usuario "root" (fragmento marcado en rojo).

root@servidor:/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/# cat xfce4-panel.xml
<?xml version="1.0" encoding="UTF-8"?>

<channel name="xfce4-panel" version="1.0" locked="*" unlocked="root">
  <property name="panels" type="uint" value="1">
    <property name="panel-0" type="empty">
      <property name="size" type="uint" value="36"/>
      <property name="length" type="uint" value="100"/>
      <property name="locked" type="bool" value="true"/>
      <property name="autohide" type="bool" value="false"/>
      <property name="position-locked" type="bool" value="true"/>
      <property name="plugin-ids" type="array">
        <value type="int" value="1"/>
        <value type="int" value="2"/>
        <value type="int" value="3"/>
        <value type="int" value="4"/>
        <value type="int" value="5"/>
        <value type="int" value="6"/>
        <value type="int" value="7"/>
        <value type="int" value="8"/>
        <value type="int" value="9"/>
        <value type="int" value="10"/>
        <value type="int" value="11"/>
        <value type="int" value="12"/>
      </property>
      <property name="horizontal" type="bool" value="true"/>
      <property name="position" type="string" value="p=10;x=0;y=991"/>
      <property name="leave-opacity" type="uint" value="80"/>
      <property name="enter-opacity" type="uint" value="100"/>
      <property name="background-style" type="uint" value="1"/>
      <property name="background-color" type="array">
        <value type="uint" value="38053"/>
        <value type="uint" value="38053"/>
        <value type="uint" value="38053"/>
        <value type="uint" value="65535"/>
      </property>
    </property>
  </property>
  <property name="plugins" type="empty">
    <property name="plugin-1" type="string" value="whiskermenu">
      <property name="show-menu-icons" type="bool" value="true"/>
      <property name="show-button-title" type="bool" value="true"/>
      <property name="custom-menu-file" type="string" value=""/>
      <property name="button-icon" type="string" value="linex-icon"/>
      <property name="button-title" type="string" value="Inicio"/>
      <property name="custom-menu" type="bool" value="false"/>
    </property>
    <property name="plugin-2" type="string" value="separator">
      <property name="style" type="uint" value="1"/>
    </property>
    <property name="plugin-3" type="string" value="showdesktop"/>
    <property name="plugin-4" type="string" value="launcher">
      <property name="items" type="array">
        <value type="string" value="system-config-printer.desktop"/>
      </property>
    </property>

    <property name="plugin-5" type="string" value="launcher">
      <property name="items" type="array">
        <value type="string" value="google-chrome.desktop"/>
      </property>
    </property>
    <property name="plugin-6" type="string" value="launcher">
      <property name="items" type="array">
        <value type="string" value="rayuela.desktop"/>
      </property>
    </property>
    <property name="plugin-7" type="string" value="places"/>
    <property name="plugin-8" type="string" value="actions"/>
    <property name="plugin-9" type="string" value="tasklist">
      <property name="grouping" type="uint" value="0"/>
      <property name="include-all-workspaces" type="bool" value="false"/>
      <property name="flat-buttons" type="bool" value="false"/>
      <property name="show-handle" type="bool" value="true"/>
    </property>
    <property name="plugin-10" type="string" value="systray">
      <property name="show-frame" type="bool" value="false"/>
      <property name="rows" type="uint" value="1"/>
    </property>
    <property name="plugin-11" type="string" value="gnome-sound-applet"/>
    <property name="plugin-12" type="string" value="datetime"/>

  </property>
</channel>
Al ser XML no es muy legible (tampoco importa mucho, ha sido generado automáticamente al configurar el panel con el entorno gráfico), pero mas o menos se puede ver que  se define el tamaño, el orden de los plugins y el color de fondo. Posteriormente se definen los plugins que formarán parte del panel:
  1. Menú Whisker.
  2. Separador.
  3. Botón de "Mostrar escritorio".
  4. Lanzador system-config-printer.desktop (este lanzador y los siguientes deben estar definidos en /usr/share/applications/, como cualquier otro fichero .desktop ), para abrir la aplicación de gestión de impresoras.
  5. Lanzador google-chrome.desktop, para abrir Google Chrome.
  6. Lanzador  rayuela.desktop, para abrir directamente la página de Rayuela.
  7. Plugin "Lugares", con accesos directos a las carpetas más comunes. Necesita que instalemos previamente el paquete xfce4-places-plugin.
  8. Plugin "Actions", para botón de salida de sesión.
  9. Plugin "Tasklist", para mostrar la lista de ventanas abiertas.
  10. 11. 12....  Fecha, control de volumen, etc.
Al principio del todo, las líneas:
locked="*" unlocked="root"
Hacen que todo lo que cuelgue de ese nodo XML esté bloqueado para todo el mundo excepto para el usuario root, de tal forma que no podrá modificarse. Podemos especificar grupos de usuarios anteponiento  "@" y poner varios separándolos por ";", por ejemplo:
locked="*" unlocked="root;@teachers;usuario01"
El panel estará bloqueado para todos, excepto para root, los miembros del grupo "teachers" y el usuario "usuario01".

Al aplicar el locked/unlocked un "channel" afecta a todo lo contenido dentro de él. Cuando se aplica sobre una "property" solo afecta a dicha property, no a las que estén dentro de ella.

El resultado final es algo así como:
 

Este panel será inmodificable por el usario y aparecerá con ese aspecto a todos los usuarios que hagan login en la máquina donde se ha configurado, imponiéndose sobre sus configuraciones particulares. Con ayuda de puppet podemos distribuirlo a todas las máquinas que queramos.

Si queremos que un usuario pueda modificar el panel, simplemente hay que añadir su nombre de usuario en el atributo unlocked del XML.

Para finalizar un par de cosas: mostramos el contenido de /usr/share/applications/rayuela.desktop, ya que no viene por defecto en nuestras distribuciones:

~ # cat rayuela.desktop 
[Desktop Entry]
Version=1.0
Name=Rayuela
Comment=Aplicación Rayuela
Exec=google-chrome http://rayuela.educarex.es
Terminal=false
Icon=/usr/share/icons/hicolor/64x64/apps/rayuela.png
Type=Application
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito

El icono rayuela.png usado es este:

Otra cosa que quiero comentar es la configuración del plugin Places. Como se puede ver tengo varias carpetas que quiero que siempre estén accesibles para el usuario desde allí (y desde el explorador de archivos Thunar, ya que usa el mismo fichero de configuración). El fichero usado por Places es ~/.gtk-bookmarks y tiene el siguiente contenido:

~ # cat .gtk-bookmarks
file:///home/aulas
file:///home/instituto
file:///media/salaprofesores
file:///media/escaner
file:///media/docprofesorado
file:///media/filmoteca

Siendo todas distintas carpetas de red montadas en el /etc/fstab de la máquina. Si queremos que se aplique a todos los usuarios una alternativa es copiar este .gtk-bookmarks a todos sus home. Otra opción mas cómoda es configurarlo de una manera centralizada, por ejemplo en la carpeta de red de acceso libre /home/instituto :

~# ls -l /home/instituto/comunes/.gtk-bookmarks.sprof
-r--r--r-- 1 root teachers 146 jul 17 13:14 /home/instituto/comunes/.gtk-bookmarks.sprof

Para conseguir  que todos los usuarios que hagan login en una máquina tengan su ~/.gtk-bookmarks apuntando a /home/instituto/comunes/.gtk-bookmarks.sprof lo que hago es meter el siguiente script en el arranque de la sesión X:
~# cat /etc/X11/Xsession.d/99session_tasks
#!/bin/bash
#Irá en /etc/X11/Xsession.d
#El nombre no es al azar, debe ser: XXcustom_script, sin extensiones, sino Xsession no lo procesa.
#Meter aqui cosas a realizar en cada inicio de sesión
#Crea un acceso a la lista de carpetas estándar para que se muestren en thunar y en el plugin lugares del panel.

ln -sf /home/instituto/comunes/.gtk-bookmarks.sprof $HOME/.gtk-bookmarks
Nota 8/2/2016: lo anterior era para Wheezy. En Ubuntu Trusty los bookmarks se guardan adicionalmente en la ruta $HOME/.config/gtk-3.0/bookmarks, por lo que el script debería ser:
~# cat /etc/X11/Xsession.d/99session_tasks
#!/bin/bash
#Irá en /etc/X11/Xsession.d
#El nombre no es al azar, debe ser: XXcustom_script, sin extensiones, sino Xsession no lo procesa.
#Meter aqui cosas a realizar en cada inicio de sesión
#Crea un acceso a la lista de carpetas estándar para que se muestren en thunar y en el plugin lugares del panel.

ln -sf /home/instituto/comunes/.gtk-bookmarks.sprof $HOME/.gtk-bookmarks
ln -sf /home/instituto/comunes/.gtk-bookmarks.sprof $HOME/.config/gtk-3.0/bookmarks
De esta manera, aun cuando el usuario borrase o manipulase su .gtk-bookmarks, en el siguiente inicio de sesión se restauraría. Adicionalmente en /home/instituto/comunes podemos ubicar varios .gtk-bookmarks.xxx para usar en función de la máquina y/o el usuario.

Bueno, pues el resto de ficheros XML de xfce4 se configurarían de forma similar. Solo hay que probar e investigar que demonios se configura dentro de cada uno y tendremos un escritorio totalitario y dictatorial que haría las delicias del Amado Líder:


Hasta la próxima, tovariches.

No hay comentarios:

Publicar un comentario