miércoles, 5 de septiembre de 2007

Desplegar actualizaciones pendientes (apt-get)

La idea era crear un theme de Superkaramba que mostrara la cantidad de actualizaciones pendientes, cuáles son y cuánto pesan. Para esto como mínimo necesitamos un script que obtenga la información que queremos. Una forma es utilizando apt-get con el argumento upgrade. La salida es algo como:

neoakiraz@fcksys:~/pruebas$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
  compiz compiz-bcop compiz-core compiz-dev compiz-fusion-plugins-extra
  compiz-fusion-plugins-main compiz-fusion-plugins-unofficial compiz-gnome
  compiz-kde compiz-plugins compizconfig-settings-manager emerald
  libcompizconfig-backend-gconf libcompizconfig0 libcompizconfig0-dev
  libdecoration0 libdecoration0-dev libemeraldengine0 libkadm55
  libkrb5-dev libkrb53 python-compizconfig
22 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 5909kB of archives.
After unpacking 106kB of additional disk space will be used.
Do you want to continue [Y/n]?



Lo que nos interesa obtener es la cantidad de paquetes actualizables, cuales son y el peso de la descarga. Para eso usamos este script:

#!/bin/bash
# ejecutamos el comando:
TEXTO=`echo "n" | apt-get upgrade`

# extraemos la cantidad de paquetes, cantidad a bajar y cuales son
PAQUETES_CANT=`echo $TEXTO | sed -r 's/.* ([0-9]*) upgraded.*/\1/'`
PAQUETES_SIZE=`echo $TEXTO | \
               sed -r 's/.*get ([0-9]*\.?[0-9]*[kM]B).*/\1/'`
PAQUETES=`echo $TEXTO | sed -r 's/.*: (.*) [0-9]* upgraded.*/\1/'`

# imprimimos
echo "Hay $PAQUETES_CANT actualizaciones, $PAQUETES_SIZE:"
echo $PAQUETES



Le damos permiso de ejecución para el nuestro usuario con chmod u+x script.sh y lo ejecutamos con ./script.sh.

Al ejecutar el comando, el cual espera un Y/n para saber si llevar a cabo la actualización, utilizamos un pipe (|) para conectarle una entrada estandar que contenga la letra n, ya que lo único que nos interesa es la información que despliega. De este modo no va a quedarse esperando una entrada del teclado.

Al guardar la salida en una variable, por algún motivo los \n (caracteres newline) no quedan almacenados. De esta forma el contenido de $TEXTO es una sola línea de texto, y sed la va a procesar como tal.

Utlizamos sed con la opción r para poder escribir expresiones regulares extendidas, que por ejemplo permite el uso de grupos (o "átomos"). Luego, entre comillas simples, va la instrucción a ejecutar sobre cada línea de texto de entrada. En este caso s/TEXTO1/TEXTO2/ reemplaza todas las ocurrencias de TEXTO1 por TEXTO2. La diferencia en este caso es que en lugar de reemplazar una simple cadena de texto por otro, utilizamos expresiones regulares (originales de perl). Por más información pasar por acá.

Finalmente imprimimos el contenido de las variables del modo que queramos. La salida en este caso:

Hay 22 actualizaciones, 5909kB:
compiz compiz-bcop compiz-core compiz-dev compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-fusion-plugins-unofficial compiz-gnome compiz-kde compiz-plugins compizconfig-settings-manager emerald libcompizconfig-backend-gconf libcompizconfig0 libcompizconfig0-dev libdecoration0 libdecoration0-dev libemeraldengine0 libkadm55 libkrb5-dev libkrb53 python-compizconfig



Como comentario final, notar que es necesario ejecutar el script con privilegios de root; en Debian/*ubuntu utilizando sudo.
Si lo vamos a usar en un theme de Superkaramba esto no es conveniente, por lo que podemos usar el método descrito en la siguiente entrada del blog. Para esto, previamente cambiamos el owner del archivo a root, con sudo chown root script.sh. De esta forma, el script queda con permisos de ejecución exclusivo para root.

Dudas, comentarios, sugerencias, p**eadas están bienvenidas! Saludos ;)

No hay comentarios: