"Después del juego es antes del juego"
Sepp Herberger

jueves, 23 de marzo de 2023

Script para chequear el árbol LDAP

Los servicios LDAP que tenemos en los centros se basan en OpenLDAP, que guarda información en una base de datos jerárquica. Las bases de datos jerárquicas son esas que estudias en la carrera antes de las bases relacionales y luego olvidas para siempre, porque tienen un uso mucho más limitado. Si quieres saber más de ellas pincha aquí.

Pese a sus ventajas, como la rapidez para algunas consultas, tienen ciertas desventajas. Una de ellas es que, en el caso de OpenLDAP, los datos quedan inconsistentes con cierta frecuencia, de tal manera que se va acumulando "información basura" dentro de las diversas ramas. Por ejemplo: ramas vacías, grupos con miembros no existentes, atributos duplicados...

Para un trabajo que estoy perpetrando, necesitaba tener el ldap de mi red limpito y consistente. Por ello he unificado diversos scripts que tenía en uno solo que recorre el árbol ldap y muestra todo lo que resulta sospechoso. Avisos:
  • OJO: este script no arregla nada, solo muestra las cosas rarunas que encuentra. El arreglo nos corresponde a nosotros a mano usando la herramienta web phpldapadmin.
  • IMPORTANTE: antes de tocar nada se aconseja hacer un backup de ldap por si la liamos parda, aquí un script de Esteban para hacer el backup y otro para restaurarlo.
El script de chequeo se puede encontrar en este enlace. Allí hay además una relación de las comprobaciones que se hacen.

Out!
Ya tenemos al Miura 1 en la rampa de lanzamiento, listo para su primer vuelo desde las instalaciones de El Arenosillo, en Huelva:
Esperemos que en las próximas semanas el inexistente programa espacial español dé un paso exitoso con el lanzamiento de esta maravilla.

viernes, 27 de enero de 2023

Restaurar imagen de clonezilla en disco mas pequeño que el original

A veces sucede que tenemos una imagen de clonezilla y nos encontramos que cuando queremos restaurarla sobre un disco vemos que no cabe, ya que el disco original desde donde hicimos la imagen tiene un tamaño mayor que el disco destino. Vamos a ver distintas soluciones para esto.

1. Hacer otra imagen mas pequeña.

Para ello restauramos la imagen en un tercer disco alternativo mas grande donde la imagen no tenga problemas de tamaño para entrar. Luego, con ayuda de la herramienta gparted (la podemos ejecutar desde cualquier disco live de Linux), reducimos todas las particiones de dicha imagen a un tamaño suficiente para que entre en el disco destino que nos daba problemas de tamaño y tras este paso podemos hacer una nueva imagen con clonezilla. Esta imagen reducida será la que restauremos. Se tarda tiempo, pero es un proceso sin complicaciones .

2. Intentar restaurar la imagen con las opciones de Experto de clonezilla.

Cuando restauramos una imagen con clonezilla, llega un punto del proceso en el que nos preguntan si queremos seguir en modo Basic o Expert. Normalmente elegimos el modo Basic, pero para esta vía deberemos coger el modo Expert. Para intentar encoger y meter la imagen en nuestro disco elegiremos en una de las pantallas posteriores la opcion "-icds" (no comprobar tamaño de disco) y en la siguiente pantalla la opción -k1 (construir las particiones de forma proporcional al tamaño del disco), tal como nos cuentan aquí.

Esto hará que la restauración de las particiones individuales mediante la herramienta partclone se ejecute con el parámetro -C (Don't check device size and free space). En resumen, lo que hacemos con esto es reducir todas las particiones originales proporcionalmente al tamaño del disco destino y meter la imagen sin comprobar nada a ver si hay suerte y cabe.

Si la imagen original tiene una sola partición puede que funcione. Mi experiencia es que rara vez me ha acabado con éxito, especialmente si hay varias particiones.

Hay al menos dos motivos para esto:

  • No siempre se pueden reducir todas las particiones proporcionalmente. La reducción se hace a costa del espacio libre que hay dentro de cada partición, pero puede que una de ellas esté demasiado llena y no deje espacio suficiente para reducirla en la medida en que queremos hacerlo. Por desgracia, no hay opción sencilla para reducir solo unas particiones y dejar las otras igual. La única vía con alguna posibilidad de éxito sería usar la opción k2 en lugar de k1 y crear las particiones a mano nosotros, lo cual es un proceso que habria que hacer con mucho cuidado.
  • Hay particiones ocultas o especiales (EFI, de sistema, reservadas, de la Agenda 2030, etc) que deben tener un tamaño y ubicación concreta en el disco y cualquier alteración de estos parámetros provoca que la clonación falle o que el sistema no arranque posteriormente. Esas aplicaciones deben restaurarse tal cual están en el disco original, sin quitar ni poner ni un byte.


3. Proceso manual partición a partición.

Esta vía es la que me ha llevado a documentar esta entrada del blog. Tengo una tarjeta SD de 32Gb con un sistema Rasbpian ya configurado que quiero clonar. Su estructura es:
# fdisk -l /dev/sdc
/dev/sdc1              8192   532479   524288   256M  c W95 FAT32 (LBA)
/dev/sdc2            532480 60579839 60047360  28,6G 83 Linux
Quiero restaurar la imagen en una tarjeta de 16Gb. Mis intentos de restaurarla usando el modo Experto de clonezilla (descrito en el paso anterior) han fracasado miserablemente.

Los ficheros que componen la imagen del disco son:
-rw-r--r-- 1 root root        449 ene 13 09:43 blkdev.list
-rw-r--r-- 1 root root        361 ene 13 09:44 blkid.list
-rw-r--r-- 1 root root       5878 ene 13 09:44 clonezilla-img
-rw-r--r-- 1 root root        159 ene 13 09:44 dev-fs.list
-rw-r--r-- 1 root root          4 ene 13 09:44 disk
-rw-r--r-- 1 root root      22062 ene 13 09:44 Info-dmi.txt
-rw-r--r-- 1 root root        187 ene 13 09:44 Info-img-id.txt
-rw-r--r-- 1 root root      27119 ene 13 09:44 Info-lshw.txt
-rw-r--r-- 1 root root       2986 ene 13 09:43 Info-lspci.txt
-rw-r--r-- 1 root root        161 ene 13 09:44 Info-packages.txt
-rw-r--r-- 1 root root         80 ene 13 09:44 Info-saved-by-cmd.txt
-rw-r--r-- 1 root root         10 ene 13 09:44 parts
-rw------- 1 root root   40735156 ene 13 09:44 sdd1.vfat-ptcl-img.gz.aa
-rw------- 1 root root 4096000000 ene 13 09:44 sdd2.ext4-ptcl-img.gz.aa
-rw------- 1 root root  953241799 ene 13 09:44 sdd2.ext4-ptcl-img.gz.ab
-rw-r--r-- 1 root root         36 ene 13 09:43 sdd-chs.sf
-rw-r--r-- 1 root root    4193792 ene 13 09:44 sdd-hidden-data-after-mbr
-rw-r--r-- 1 root root        512 ene 13 09:43 sdd-mbr
-rw-r--r-- 1 root root        327 ene 13 09:43 sdd-pt.parted
-rw-r--r-- 1 root root        303 ene 13 09:43 sdd-pt.parted.compact
-rw-r--r-- 1 root root        181 ene 13 09:43 sdd-pt.sf
En negrita he remarcado los ficheros que me importan: sdd-mbr (con la tabla de particiones y sector de arranque del disco), sdd1.vfat-* (con la imagen de la primera particion) y sdd2.ext4-* (con la imagen de la segunda partición).

Lo primero que haremos es restaurar la tabla de particiones y el MBR del disco original en el nuevo disco con:
# dd if=sdd-mbr of=/dev/sdc bs=512 count=1
Con esto creamos una tabla de particiones idéntica a la del disco original, lo cual no parece buena idea, ya que este disco es mucho mas pequeño. Lo que hago a continuación para arreglar esto es editar dicha tabla de particiones con:
# cfdisk /dev/sdc
Con cfdisk borramos a mano sdc2 (que es la partición grande que me obstaculiza la restauración de la imagen) y luego la creamos de nuevo ya ajustada al disco actual. La partición sdc1 es la partición de arranque, ocupa poco y tiene pinta de ser delicada, asi que para no sufrir represalias futuras del karma, mejor la dejamos como está. Tras editar la tabla de particiones como hemos descrito esta nos quedará:
/dev/sdc1              8192   532479   524288   256M  c W95 FAT32 (LBA)
/dev/sdc2            532480 30873599 30341120  14,5G 83 Linux
Ya creadas, podemos restaurar la partición scd1 usando clonezilla, como se ha hecho de toda la vida, y una vez restaurada podemos ponernos manos a la obra para meter la otra partición a martillazos en sdc2, que ha quedado mucho más pequeña. Arrancamos clonezilla, montamos la particion con las imágenes en /home/partimag y salimos a terminal para teclear allí:
# cd /home/partimag/nuestra-imagen-querida
# cat sdd2.ext4-ptcl-img.gz.a* | gunzip -d | partclone.restore -d -C -s - -o /dev/sdc2 
Lo que hemos hecho aquí es concatenar los ficheros que componen la imagen de la segunda partición (cat sdd2.ext4-ptcl-img.gz.a*), descomprimir el fichero resultante (gunzip -d) y restaurarlo sobre sdc2 usando partclone.restore con el parámetro -C (que omite comprobar si la imagen cabe o no en la partición). Esto parece muy aparatoso, pero es exactamente lo que hace clonezilla por debajo cuando restauramos una partición.

Tras acabar la restauración, vamos a ver si ha tenido éxito. Montamos la partición restaurada:
# mount /dev/sdc2 /mnt
mount: wrong fs type, bad option, bad superblock
...
Carajo, no se que ha liado pero no ha funcionado. No surrender, si lo anterior no nos funciona vamos a ver como hacerlo de otra manera:
# cat sdd2.ext4-ptcl-img.gz.a* | gunzip -d | partclone.restore -d -s - -o sdd2.ext4.img
En vez de descomprimir en una partición física llevamos todo al fichero sdd2.ext4.img. Ahora hacemos:
# resize2fs -M sdd2.ext4.img
# fsck.ext4 sdd2.ext4.img
Con los dos comandos anteriores encogemos el tamaño de la imagen para que ocupe lo mínimo posible ( -M: Shrink the filesystem to the minimum size) y hacemos un chequeo de disco para reajustar todo al nuevo tamaño. Esta partición encogida a mano si que debe entrar en el espacio que hemos quedado en /dev/sdc2.
# dd if=sdd2.ext4.img of=/dev/sdc2 bs=512 status=progress
Con el comando sobre estas líneas restauramos la imagen en la partición con un rústico "dd", la forma mas artesanal de clonado y restauración. Tras esto:
# mount /dev/sdc2 /mnt
# ls /mnt
# umount /mnt
Debería dejarnos montar y ver el contenido de la partición ya restaurada. Queda un último paso: expandir el sistema de ficheros restaurado para que ocupe toda la partición /dev/sdc2, ya que seguramente haya quedado bastante apretadito y es peligroso dejarlo asi. Vamos allá:
# e2fsck -f -y -v -C 0 /dev/sdc2
# resize2fs -p /dev/sdc2
Otra forma de hacer esto último es usando Gparted, con la opción Partición->Comprobar/Verificar. Que cada cual elija si quiere hacerlo con comandos o con ratón.

Después de esto ya tenemos lo que queríamos: una partición clonada con su tamaño natural y la otra reducida para entrar en el nuevo disco destino. Como el último método me ha funcionado no he seguido probando cosas más divertidas.

Taluec!


viernes, 20 de enero de 2023

Lanzar un test de impresión desde un script

De vez en cuando aparece alguien quejándose de que una impresora "no imprime nada" y te ves obligado a ir hasta un puesto que tenga configurada la impresora y hacer una prueba por ti mismo, imprimiendo una página de prueba desde CUPS o una aplicación de escritorio (para descubrir muchas veces que la impresora funciona OK y era realmente un problema del usuario). Para librarme de ese engorro tengo un script que permite imprimir un test desde una conexión ssh. El script en cuestión es:
# cat test-printer.sh

#!/bin/bash
ruta=$(dirname "$0")
if [ "$#" -ne 2 ]
then
    echo "Uso: $(basename $0) <impresora> <bn|color>"
    echo "Impresoras disponibles el sistema:"
    lpstat -p | awk '{ print $3}'
else
    impresora="$1"
    case "$2" in
        "color" )fichero="${ruta}/TestPrinterColor.pdf"  
                 ;;
        "bn" )fichero="${ruta}/TestPrinterBN.pdf"
                 ;;
        *) echo "Error en segundo parámetro"
           exit 1
           ;;
    esac
    lp -d "$impresora" "$fichero" || echo "Error: revise la cola de impresión"
fi
exit 0
El script es muy básico: recibe como primer parámetro un nombre de impresora y como segundo una cadena "bn" o "color", para lanzar una prueba con un documento en blanco y negro o un documento en color. Si lo ejecutamos sin parámetros nos listará los nombres de las impresoras configuradas en el PC donde ejecutamos el script, que son aquellas con las que podremos lanzar el test.

Lo único que necesitamos es crear 2 ficheros pdf a nuestro gusto para los tests en blanco/negro y color, dejándolos en el mismo directorio en que está el script. Estos 3 ficheros los podemos poner en una ruta de red accesible desde cualquier máquina o bien los copiaremos a los PC desde donde queramos hacer las pruebas. Luego, ante un problema bastará entrar por ssh y hacer:
# ./test-printer.sh IMPRESORA_DPTO_12 color
Out!