Mostrando entradas con la etiqueta Paquetes. Mostrar todas las entradas
Mostrando entradas con la etiqueta Paquetes. Mostrar todas las entradas

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 ;)

Listado cronológico de paquetes instalados/actualizados (dpkg)

Buenas! Arranco con mi blog de una buena vez, ya hace meses que estoy en la vuelta. La idea principal es guardarlo como diario de soluciones a problemas que se me plantean utilizando Linux. Soy relativamente nuevo en ello, me pasé de forma definitiva desde Güindous hace unos pocos meses, y la idea es loguear lo que voy aprendiendo para tenerlo como referencia, para que con suerte le sirva a alguien más y siempre escuchando críticas y sugerencias sobre formas más simples o eficentes de hacer lo mismo. Así que ya saben, comentarios bienvenidos!

Hoy me fue necesario ver los últimos paquetes que habían sido instalados/actualizados en mi Kubuntu... Googleando, encontré aquí cómo hacerlo. Módificando un poco el comando llegué al siguiente, que despliega todos los paquetes que fueron instalados/actualizados en el sistema en orden cronológico:

ls /var/lib/dpkg/info/ -ltr | grep .list$ | awk '{print $6" "$7" "$8 }' | sed 's/\.list//'



En el directorio /var/lib/dpkg/info/parecen guardarse varios tipos de archivo referentes a los paquetes manejados por el gestor de Debian/*ubuntu, dpkg. En particular, los .list tienen información sobre los archivos que fueron copiados para cada paquete, y en que ubicación están. De todas formas lo que usamos no es esto sino la fecha de creación/modificación de estos archivos, la cual coincide con la fecha de instalación/actualización del paquete, y su nombre.

Así listamos en formato largo (l) el contenido del directorio especificado ordenando en reverso (r) según la fecha de modificación (t) con ls. Nos quedamos con las líneas que terminan en ".list" (para tener una sola entrada por paquete) utilizando grep. Imprimimos los campos de cada línea según el formato que especifiquemos con awk y eliminamos el ".list" del final de cada línea para quedarnos sólo con el nombre del paquete con sed.

La salida quedaría algo como:

...
2007-09-01 12:43 zenity
2007-09-01 12:43 ubuntu-desktop
2007-09-01 12:43 brltty-x11
2007-09-01 14:12 compiz-gnome
2007-09-02 14:42 libwrap0
2007-09-02 14:42 linux-headers-2.6.20-16
2007-09-02 14:43 linux-headers-2.6.20-16-generic
2007-09-02 14:43 linux-image-2.6.20-16-generic
2007-09-02 14:43 tcpd
2007-09-02 14:43 linux-libc-dev