Poesía Binaria

Píldora: Cómo controlar la inhibición de la gestión de energía en GNU/Linux

Los escritorios modernos en GNU/Linux suelen estar divididos en muchos módulos. Los grandes como Gnome o KDE suelen tener decenas de pequeños módulos independientes que hablan los unos con los otros de manera que la orquesta de todos ellos nos proporcione la mejor experiencia de usuario.

Además, si hablamos de GNU/Linux, donde, desde siempre, ha habido una fragmentación más que notable en lo referente al escritorio. Al tener libertad para crear los entornos, miles de desarrolladores ponen su ingenio, su corazón y parte de su vida en los diseños de los sistemas de escritorio que utilizamos a diario. El problema es que, como suele pasar en la vida, hay varias soluciones diferentes a un mismo problema y, en ocasiones, todas las soluciones son contrarias unas de otras. No vivimos en un mundo en blanco y negro. Por eso, cada escritorio es de su padre y de su madre. Al final, en el ecosistema linuxero, ha costado muchísimos años llegar a un acuerdo, o un estándar en lo que se refiere a cómo los escritorios realizan diferentes tareas. Por poner un ejemplo concreto, un programa reproductor de vídeo tiene la necesidad de desactivar el salvapantallas, el apagado de la pantalla e incluso la suspensión del sistema. ¡Claro! Si estamos viendo una película, normalmente no estamos moviendo el ratón (de hecho, recuerdo una época en la que teníamos que mover el ratón de vez en cuando porque se apagaba la pantalla en medio de una película).

Sistemas como Windows o Mac, al tener sólo un entorno de escritorio, y una sola API no tienen problema. Los programadores sólo tienen que hacer una llamada a esa API y listo, inhibición de la gestión de energía desactivada y, cuando termine la película, activamos de nuevo para que todo funcione como antes. Aunque, históricamente en GNU/Linux, cada sistema de escritorio ha tenido su manera propia de hacer las cosas. Algunas ideas eran mejores y otras peores, unas más completas y ligeras y otras más complejas y, todo ello, es lo que hace mágico un sistema como GNU/Linux.

Poco a poco, en freedesktop.org, una iniciativa dedicada a la reunión de estándares y la interoperabilidad entre los distintos sistemas de escritorio disponibles, se han ido desarrollando algunas directivas que deben cumplir sistemas de escritorio, frameworks, bibliotecas, drivers y en definitiva todos los módulos que conforman el escritorio tal y como lo conocemos. Esto, al final, beneficia a los programadores, porque no tienen que implementar (en muchos casos), varios métodos distintos para interactuar con el escritorio y, por supuesto, también a usuarios, porque los programas ocuparán menos, funcionarán de forma más efectiva, y tendrán menos problemas.

Evitar que la pantalla se apague

Como este post es una píldora seré breve. Si lo que queremos es que nuestro sistema no se suspenda. Imagínate que estamos ejecutando un comando crítico y podría haber una pérdida de datos si se nos apaga el ordenador, o se suspende, debemos activar la inhibición del sistema de gestión de energía.
Para comunicarlo, vamos a utilizar dbus, de la siguiente manera:

dbus-send --print-reply=literal --dest=org.freedesktop.PowerManagement /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Inhibit.Inhibit string:»My Script» string:»Te desactivo el salvapantallas»
uint32 3054

Donde indicamos con cadenas de caracteres (strings) el nombre del programa que lo solicita y el motivo.

Ya está, ya podemos dejar el ordenador libre que no se apagará la pantalla, ni se suspenderá, ni se bloqueará la sesión. Eso sí, el sistema nos devuelve un valor, fijaos en el «uint32 3054», nos está diciendo que el valor devuelto por esa llamada es de tipo unsigned int (uint, o entero sin signo) de 32bit, vamos un numero, que nos devuelve a continuación.
Eso sí, es recomendable guardar ese número, porque en el caso de querer eliminar el bloqueo lo necesitaremos. Si queremos incorporar esto a nuestros scripts podríamos hacer:

1
2
RES="$(dbus-send --print-reply=literal --dest=org.freedesktop.PowerManagement /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Inhibit.Inhibit string:"My Script" string:"Te desactivo el salvapantallas")"
COOKIE=$(echo $RES | awk '{print $2}')

y en la variable COOKIE tendremos el número.

Permitiendo el apagado de pantalla de nuevo

Si queremos volver al estado anterior, debemos ejecutar lo siguiente:

dbus-send --print-reply=literal --dest=org.freedesktop.PowerManagement /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Inhibit.UnInhibit uint32:3054

Como vemos, le pasamos el número que nos dieron antes. No hay más misterio.

Comprobar si la inhibición está activada

Si queremos verificar si esta inhibición está activada, debemos ejecutar lo siguiente:

$ dbus-send --print-reply=literal --dest=org.freedesktop.PowerManagement /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Inhibit.HasInhibit
boolean true

Esto nos devolverá true o false dependiendo de si está activa (evita que se apague la pantalla) o no.

Deshacer un bloqueo de cualquier aplicación

Como hemos visto, para deshacer un bloqueo, necesitamos el parámetro cookie, de tipo uint32 que nos dieron cuando colocamos el bloqueo. Aunque, puede que haya algún momento en el que algún programa coloque un bloqueo y necesitemos deshacerlo. Uno de los problemas que yo he tenido ha sido, por ejemplo, con Google Chrome o Chromium. Las versiones más nuevas permiten que una pestaña pueda bloquear el hecho de que se apague la pantalla de nuestro ordenador. Y yo, que soy de dejar el navegador encendido durante varios días, tenía siempre la pantalla iluminando la habitación.

Para cancelar este comportamiento ejecuté lo siguiente:

i=0; while [ «$(qdbus org.freedesktop.PowerManagement /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Inhibit.HasInhibit)» = «true» ]; do echo «Cookie $i»; qdbus org.freedesktop.PowerManagement             /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Inhibit.UnInhibit $i ; let i=i+1; done

Con este pequeño script se hará un ataque de fuerza bruta a las cookies del sistema de inhibición, hasta que org.freedesktop.PowerManagement.Inhibit.HasInhibit devuelva false. El script tarda un poco. Y, a diferencia de los comandos anteriores, aquí estoy utilizando qdbus en lugar de dbus-send porque me gusta más cómo devuelve el mensaje de true y false.

¿Qué más cosas podemos hacer?

Aunque siempre tenemos la documentación disponible, podemos ejecutar lo siguiente:

qdbus org.freedesktop.PowerManagement  /org/freedesktop/PowerManagement

Para ver los métodos disponibles y jugar con ellos

Foto principal: unsplash-logoRodion Kutsaev

También podría interesarte....