La gente de GNU/Linux a veces hace cosas molestas, como por ejemplo, cambiar interfaces, haciendo que cosas que antes andaban (aunque eran feas), ahora no andan. Este es el caso de los drivers de mi impresora Epson, que son feos y privativos, pero los necesito y de pronto no anda, porque se dió de baja algo que se llama LSB.

Qué es LSB

Al parecer LSB era una biblioteca que funcionaba como interfase para hacer andar drivers privativos en el sistema, en algún momento lo dieron deprecaron y crearon algo así como un “paquete de transición” para poder usar la mayoría de los drivers que dependen de este sistema.

Qué se rompió (y como arreglarlo)

Bueno, la primera evidencia del problema, es que cuando uno finalmente logra encontrar el paquete deb (extensión de los paquetes de Debian y derivados) correspondiente a la impresora este falla porque falta una dependencia, que no está disponible.

Buscando y rebuscando, encuentro una guía que explica lo que se supone que uno debería saber de forma mágica y que además es muy poco intuitivo: uno debería descargar el paquete rpm (los paquetes de Fedora y RedHat), para después generar un paquete dev usando alien (que es un paquete que no sabía que existía).

sudo aptitude install alien
sudo alien -c epson-inkjet-printer-201207w-1.0.0-1lsb3.2.x86_64.rpm

De pronto, no se bien como tenemos ahora un paquete deb que si podemos instalar, que no depende de lsb, pero como quien no quiere la cosa, depende de alien.

Ok, ahora de pronto podemos instalar la impresora, pero por desgracia, no imprime y saber por qué es un camino nuevamente muy difícil, porque los mensajes de error son erróneos.

El primer mensaje de error que nos encontramos en la interfase web de CUPS es “filter failed”, cuestión que nos quiere decir que hay un filtro que falló, pero no nos dice ni cuál, ni por qué y peor aún… no hay casi información de algo llamado filtros vinculado a CUPS.

Filtros en CUPS

Al parecer, cuando uno manda un documento a imprimir, CUPS aplica sobre este una serie de filtros que transforman el archivo en algo aceptable por la impresora, el archivo pps de la impresora indica qué filtros necesita ejecutar, en mi caso:

# /etc/cups/ppd/EPSON_L555_Series.ppd
*cupsFilter:    "application/vnd.cups-raster 0 /opt/epson-inkjet-printer-201207w/cups/lib/filter/epson_inkjet_printer_filter"

Errores en los logs

Pero para saber qué falla con el filtro es necesario leer los logs, pero antes hay que configurar CUPS para que genere dichos logs, así que hay que modificar:

# /etc/cups/cupsd.conf
# Log general information in error_log - change "warn" to "debug"
# for troubleshooting...
LogLevel debug   

Eso nos va a permitir leer, luego de reiniciar cups y mandar nuevamente algo a imprimir, entre muchos mensajes confusos otro mensaje de error, más confuso aún…

# /var/log/cups/error_log
D [03/Oct/2023:11:38:59 -0300] [Job 23] PID 14239 (/opt/epson-inkjet-printer-201207w/cups/lib/filter/epson_inkjet_printer_filter) stopped with status 102 (No such file or directory)

Vemos que parece que algo falla porque el archivo no existe, pero el archivo está ahí, lo que falla es el mensaje de error, que no está indicando qué archivo falta y quién lo necesita. Lo que pasa, lo que pasa es que el archivo ejecutable epson_inkjet_printer_filter es un archivo ELF vinculado a LSB que al parecer necesita un intérprete y ese intérprete es el que falta.

# file /opt/epson-inkjet-printer-201207w/cups/lib/filter/epson_inkjet_printer_filter
/opt/epson-inkjet-printer-201207w/cups/lib/filter/epson_inkjet_printer_filter: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.15, BuildID[sha1]=639e85f237ed13ade44f586e21ff61bdc1498a9c, not stripped

El interprete que nos falta es /lib64/ld-lsb-x86-64.so.3 que es parte del dichoso paquete lsb que ahora no está. Por suerte para nosotros, el archivo si está, pero no está con el nombre que nuestro privativo driver lo está buscando y le podemos dar el gusto sin mucho trabajo utilizando un enlace simbólico:

sudo ln -s /lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3

Y ahora finalmente, la impresora está andando.