miércoles, 26 de mayo de 2010

Mejorando un script con Zenity

El paquete Zenity viene incluido en los repositorios de las distros principales; permite mostrar cuadros de diálogo a partir de scripts de terminal.

Como creo que la manera más fácil de ver cómo se usa algo es a través de unos ejemplos, aquí hay algunos: En las siguientes páginas (en ingles) hay una recopilación de todos los posibles diálogos en zenity:
http://linux.byexamples.com/archives/259/a-complete-zenity-dialog-examples-1/
http://linux.byexamples.com/archives/259/a-complete-zenity-dialog-examples-2/

Tienen capturas usando cada una de las opciones y el comando correspondiente. Además, el siguiente extracto, con el comando zenity --help lista todas las posibilidades.

zenity --calendar Mostrar el diálogo del calendario
zenity --entry Mostrar el diálogo de entrada de texto
zenity --error Mostrar el diálogo de error
zenity --info Mostrar el diálogo de información
zenity --file-selection Mostrar el diálogo de selección de archivo
zenity --list Mostrar el diálogo de lista
zenity --notification Mostrar notificación
zenity --progress Mostrar el diálogo de indicación de progreso
zenity --question Mostrar el diálogo de pregunta: ¿Está seguro de que desea continuar?
zenity --warning Mostrar el diálogo de advertencia: ¿Está seguro de que desea continuar?
zenity --scale Mostrar el diálogo de escala: ajustar el valor de la escala
zenity --text-info Mostrar el diálogo de texto de información

Aplicaciones: Como podéis suponer, las aplicaciones son múltiples. Creo que prácticamente cualquier script que requiera algo de interactividad con el usuario puede mejorarse con esta herramienta para pedirle (o mostrarle) los datos a la persona que está enfrente de la pantalla. Creo que son dos las situaciones donde más útil puede ser conocer esta herramienta:

* Para preparar scripts para gente que le asuste la consola. Con un poco de esfuerzo se puede montar un script con apariencia de programa "muy trabajado" y con la misma funcionalidad (invocando por debajo a los programas oportunos, claro está).
* Para hacer que un script que corra a través del "demonio cron" ( "tareas programadas" - programa gnome-schedule ) se comunique con el usuario (mostrando mensajes de error o de estado).

El "demonio cron" es un proceso en segundo plano que ejecuta uno o varios programas en particular, en determinados momentos (por ejemplo, cada minuto, día, semana o mes); el usuario normal o el administrador del sistema, con permisos de root,  puede crear procesos de este tipo con el programa "tareas programadas" ( gnome-schedule).

Si lo usáis a través de cron (o, en general con gnome-schedule en modo root) es probable que necesitéis usar algo como lo siguiente:

su "nombre del usuario" -c 'DISPLAY=:0 zenity --info --text="vuestrotexto"'

( su = comando para que lo siguiente se use como root; sustituir: zenity --info --text="vuestrotexto"' , por la opción de zenity que se requiera ).

------------------------

Comparto con vosotros, como ejemplo de lo que se puede hacer con Zenity,  este "Script para apagar el pc de forma programada, con una barra deslizante de tiempo" que nos indica el tiempo que queda hasta que se apaga el pc.
Nos puede servir, por ejemplo para dejar encendido el pc por la noche durante un cierto tiempo y que luego se apague el solo. De todas formas una vez lanzado si a mitad del tiempo que falta para que se ejecute la orden de apagado, te arrepientes puedes darle a cancelar.
Información extraída desde: http://blog.deigote.com/2009/04/17/programmed-shutdown-pequeno-script-para-apagar-la-maquina/ o desde: http://deigote.com/scripts/x-programmed-shutdown

El script es:

#!/bin/bash
# Ask for time in minutes to sleep and after that poweroff the computer
# needs - zenity


minutes=`zenity --entry --title "Apagar el ordenador" --text "¿Dentro de cuántos minutos?" --entry-text "120" 2>&1` || exit
seconds=`expr $minutes "*" 60`


if [ $seconds != "" ] ; then
for i in `seq 1 $seconds` ; do
percentage=`expr $i "*" 100`
percentage=`expr $percentage "/" $seconds`
echo $percentage
sleep 1
done | zenity --title="Apagar el ordenador" --text="Esperando $minutes minutos" --progress --auto-close --auto-kill
sudo /sbin/poweroff

fi

-----------------
Para ejecutarlo, basta guardarlo en un directorio  y darle permisos de ejecución. Hay que tener permiso de root para ejecutar el mandato poweroff. En mi caso, tengo en el panel un lanzador precedido de gksudo, de tal manera que el script se lanza pidiendo primero la contraseña de root.

Otra solución es editar el archivo /etc/sudoers y añadir la linea:  usuario ALL=NOPASSWD: /sbin/poweroff al final del archivo /etc/sudoers para que el usuario "usuario" pueda ejecutar el comando poweroff sin que se le pida la contraseña de root.  De esta forma se puede ejecutar el script sin que pida la contraseña de root.

El archivo /etc/sudoers se puede editar:
--- Con el editor nano: con la siguiente linea en la terminal:
sudo nano /etc/sudoers
Una vez añadida la linea que se indica mas arriba se guardan los cambios en nano con: tecla F3, luego la tecla intro, y despues se cierra el editor nano con la tecla F2 .

--- Con gedit: para esto hay que seguir los siguientes pasos:
1- abrir Nautilus con permisos de root:  alt+f2      gksu nautilus
2- seleccionar el archivo /etc/sudoers y cambiar los permisos para que sean de lectura y escritura para root ( seleccionar el archivo->propiedades->permisos )
3- abrir con Gedit el archivo /etc/sudoers  y añadirle la línea indicada arriba
4- guardar los cambios  y cerrar el archivo
5- volver a cambiar los permisos del archivo para que sean de solo lectura para el usuario root y para el grupo root, y ninguno para otros.
6- cerrar Nautilus

-----------------------
El manual de Zenity ( en español ) se puede consultar aquí: http://library.gnome.org/users/zenity/stable/index.html.es

2 comentarios:

  1. Hola. Es muy posible que sabiendo más sea capaz de desarrollar este script que nos ha ofrecido, pero entonces no me haría falta consultarlo. Sin embargo, siguiéndolo no soy capaz de hacerlo funcionar, luego no está hecho con la suficiente claridad. Ahí queda, ojalá cambie a mejor todo, usted y yo.

    ResponderEliminar
  2. Armando Lagorda:
    Me he dado cuenta, tras copiar y pegar el texto del script de apagado, que había dos errores en el texto:

    1 error: había un solo guión - en donde debía haber dos guiones --
    Esto ya lo he corregido.

    2 error: las comillas dobles " deben de ser todas las que se consiguen con la combinación Mayusc+2 (con el teclado típico español).
    No se porque aunque todas las comillas las escribo igual, con esa combinación, al copiar y pegar el texto desde el blog, en el editor del texto que usamos para crear el script solo aparecen correctamente las comillas de la línea
    if [ $seconds != "" ] ; then
    el resto de comillas hay que, una vez las tenemos en el editor de textos, sustituirlas por las que aparecen con la combinación Mayusc+2 (con el teclado típico español)
    Una vez hecho esto el texto entre las comillas, y ésta, deben aparecer en color rosa en el gedit.

    Una vez hechas estas correcciones ya he comprobado que el script funciona perfectamente, si se tiene Zenity y se le ha dado permisos de ejecución y cambiado el archivo /etc/sudoers como se indica.

    ResponderEliminar

A la vez que haces un comentario, por favor da una puntuación al tema: malo, normal, bueno o muy bueno.
Gracias.