Ejecutar un script interactivo *justo antes* de apagar KDE

02-06-2009 ACTUALIZACIÓN: Si estás utilizando KDE4 lo que sigue no te funcionará, puedes leerlo para tener una idea del objetivo perseguido, y a continuación pulsa aquí, encontrarás lo mismo explicado para KDE4. ¡Disfrútalo!
Fin de la actualización.

A continuación comparto, a modo de guía, la solución a este problema.

Y digo problema porque, aunque en un principio creí que iba a ser más fácil, al final me ha costado bastante. Si buscáis en google os daréis cuenta de lo poco documentadas que están este tipo de cosas. No obstante, gracias a la flexibilidad y al estar al descubierto los entresijos del software libre, uno acaba consiguiéndolo :-).

Utilidad: realizar una copia de seguridad de los contenidos que estimo valiosos *siempre antes* de apagar el ordenador (otro día hablaremos más de esto).

Objetivo: ejecutar un shell script (que en mi caso es el que realiza la copia de seguridad) *justo antes* de apagar el ordenador.

Restricciones:
1.- Trabajamos con el entorno KDE.
2.- Hemos de ser capaces de apagar el ordenador de forma ordenada, es decir, conservando datos entre sesiones, sin "destrozar" la forma en la que lo hace KDE.
3.- Hemos de evitar la existencia de varias opciones de "salida", obligando al usuario a ejecutar sólo una que colocaremos en un lugar fácilmente accesible (previa a esta, y de forma transparente para el usuario, se ejecutará el script).
4.- El script es interactivo: solicita una contraseña (para cifrar las comunicaciones) al usuario, cuando ésta ha sido introducida el script continúa con su trabajo... Y justo cuando finaliza se procede a apagar el sistema de forma ordenada.

Solución:
Tras investigar durante algunas horas entre foros y listas de correo, he conseguido construir justo la solución que estaba buscando:

1.- He suprimido la opción "Terminar..." del menú K. Lo he hecho con la herramienta kiosktool, que permite crear diferentes perfiles de usuarios y configurar en estos las acciones permitidas/prohibidas de los mismos (útil para la administración de cibercafés, etc.). La herramienta trae un perfil: "default", que es asociado a todos los usuarios del sistema por defecto. He creado uno nuevo para asociarlo sólo a mi usuario, y en este: configurar perfil - selección del componente "General" - configurar componente - selección "Deshabilitar la opción de terminar sesión". Mi usuario ya no puede apagar el sistema como habitualmente lo hacía.

2.- He creado el siguiente script "intermedio":

#!/bin/bash
#
####################################################
#                                                  
# Sincronizamos el ordenador de casa al apagar    
#                                                  
####################################################
#
# Utilizando konsole
konsole -name casa-parada -title casa-parada -e /home/godo/bin/casa-parada \
&& \
dcop ksmserver ksmserver logout 1 2 0

Lo denomino "intermedio" porque es ejecutado desde un botón que he creado en el panel de KDE (kicker) mediante la opción "Añadir aplicación no-KDE". Realiza dos acciones: abre una sesión de Konsole (programa terminal del entorno KDE) dentro de la cual ejecuta el script que me interesa (el que me solicita la contraseña y hace la verdadera tarea): /home/godo/bin/casa-parada, y cuando este termina satisfactoriamente (&&), hace una llamada al administrador de sesiones de KDE:

dcop ksmserver ksmserver logout 1 2 0

Donde los tres parámetros que siguen al mensaje de "logout" son, respectivamente:

enum ShutdownConfirm {
     ShutdownConfirmDefault = -1,
     ShutdownConfirmNo = 0,
     ShutdownConfirmYes = 1
};
 
enum ShutdownType {
     ShutdownTypeDefault = -1,
     ShutdownTypeNone = 0,
     ShutdownTypeReboot = 1,
     ShutdownTypeHalt = 2
};

enum ShutdownMode {
     ShutdownModeDefault = -1,
     ShutdownModeSchedule = 0,
     ShutdownModeTryNow = 1,
     ShutdownModeForceNow = 2,
     ShutdownModeInteractive = 3
};

Con lo que conseguimos *exactamente el mismo efecto* que cuando antes utilizábamos el botón "Terminar..." del menú K, pero esta vez "terminamos" justo después de haber ejecutado nuestro script: ¡Objetivo conseguido!

Como veis, hoy he aprendido muchas cosas nuevas.

Y tengo un problema menos ;-)

Clasificado en artículos de:

comment reply