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

sábado, 29 de septiembre de 2018

Mensaje pop-up en escritorio de usuario desde conexión ssh.

Un compañero planteaba el problema de como enviar un mensaje al usuario que tenia abierta una sesión gráfica en el escritorio de la máquina desde una conexión ssh del usuario root. Un escenario típico sería estar haciendo alguna tarea de mantenimiento en remoto y comunicar algo de interés al usuario de la máquina a la que estamos conectados, tipo "ya está instalado el programa" o "no apague la máquina al acabar, por favor".

Para conseguir esto el código a teclear después de entrar por ssh sería:
export XAUTHORITY=/var/run/lightdm/root/:0
mensaje="El programa ya esta instalado, puede probar"
zenity --warning --width=200 --no-wrap --text="$mensaje" --display=:0
Lo importante aquí es asignar a XAUTHORITY la sesión del usuario que está usando el escritorio, ya que por muy root que seamos no podemos enviar el mensaje mostrado por "zenity" a su escritorio sin tener permisos para ello.

En este código hay varias asunciones: que el usuario está en la sesión gráfica :0 (eso se sabe haciendo un "who" antes) y que su fichero XAUTHORITY es /var/run/lightdm/root/:0. Esto último lo sabemos haciendo:
# ps aux | grep X
root       517  2.1  1.0 293236 41432 tty7     Ssl+ 16:28   2:15 /usr/lib/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
.....
Estos parámetros serán así de forma general para todas las máquinas de nuestros centros (basadas en una imagen similar de Xubuntu) pero habría que tener cuidado con los valores del display o el xauthority otros casos, como una configuración multiseat o con thinclients.

Me despido con una foto de la Opportunity reaparecida después de la mega-tormenta de arena que ha azotado Marte en los últimos meses:


De momento está mohína y no responde, a ver si con un poco de suerte se cargan las baterías y puede hacer un rearranque del sistema, despertando una vez más victoriosa y con ganas de explorar. Que maravilla, preparada para funcionar 90 soles (días marcianos) lleva mandando datos 14 años. Sin ningún genero de duda está hecha por los mismos técnicos que diseñaron los Fujitsu P300 que tenemos como thinclients en las aulas.


lunes, 10 de septiembre de 2018

Ejecutar un script que necesita conexión de red al apagar la máquina en Ubuntu 18

Ya estamos de vuelta del veranito con las pilas cargadas, vamos al lío: me interesa ejecutar un script cuando las máquinas estén apagándose o reiniciándose pero es importante que durante la ejecución del mismo todavía hubiera red, ya que el script hace conexiones hacia fuera.

Anteriormente con init.d esto lo hacíamos poniendo el script en /etc/rc6.d, pero con Ubuntu 18 y systemd eso se ha acabado. Ahora debemos hacerlo creando un servicio:
# cat /etc/systemd/system/apagado.service 
[Unit]
Description=Script para ejecutar en apagado
Requires=network.target
After=network.target
Before=shutdown.target reboot.target halt.target
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /root/apagado.sh

[Install]
WantedBy=multi-user.target
Los parámetros Requires/After/Before establecen las dependencias y precedencias con las que se ejecutará el script /root/apagado.sh, que es donde tenemos nuestro código.

Una vez definido el servicio lo activamos con:
# systemctl enable apagado.service
Después reiniciamos la máquina y a partir de ahora el script /root/apagado.sh se ejecutará en cada shutdown/reboot.