26 de noviembre de 2011

Peleando con Gentoo y con el DNI-E (1/3)


conjuntoEntradas() {
  Peleando con Gentoo y con el DNI-E (1/3)
  Peleando con Gentoo y con el DNI-E (2/3)
  Peleando con Gentoo y con el DNI-E (3/3)
}

Introducción

Hace un par de seman...., mmm mejor casi un par de meses, motivado porque me iba a tocar emplear una parte de mi tiempo a realizar unos cuantos tramites para la pu.. AEAT, me decidí a pasarme el fin de semana mirando de conseguir hacer funcionar el DNI-E sobre mi equipo de casa, el que tengo instalado un Gentoo, y sobre el cual he escrito, en varias ocasiones, entradas en este blog.

Era algo que tenía pendiente desde que hace poco más de un año, pasé del DNI “analógico” a el nuevo DNI-E, el “digital”; no obstante son de esas cosas que se van dejando pasar hasta que un día te se antoja meterte con el tema o simplemente llega el día que te toca meterte porque lo vas a tener que utilizar.

Desde hace algún tiempo, que ya se dio soporte para usar el DNI-E sobre el sistema operativo Linux, no obstante, todos sabemos que distribuciones de Linux hay unas cuantas, aunque muchas de ellas están basadas sobre una de las populares. En el caso de Gentoo, que es con la que yo lidié, no es tan es simple como tener una paquete en el portage para instalar de manera sencilla mediante emerge, ni tampoco te puedes descargar desde la web oficial un paquete de instalación como si que encuentras para las distribuciones Ubuntu, Debian, Fedora y OpenSuSE, bueno es lo que se tiene que sufrir por haberse liado la manta a la cabeza y haber decido utilizar un Gentoo.

Finalmente la cosa me llevo un rato de un sábado y otro de un domingo, entre directos, crochetes y uppercuts.

El lector de tarjetas

Lo primero, que uno tiene que hacer es comprarse un lector, algo que ya hice bastante tiempo, enchufarlo y hacer que funcione; esto, en mi caso, tenía que ser la parte fácil, ya que el fabricante del lector que compré (C3PO) indicaba que funciona sobre Linux, no obstante como antes, se indica que lo puedes instalar directamente desde el repositorio de las clásicas distribuciones, de las que no se encuentra Gentoo, y para el resto te deja del enlace al middleware necesario para que el SO hable con la smart card a través del lector; aunque finalmente, a los de Gentoo no nos hace falta descargarlo, para luego configurarlo, compilarlo, etc..., sino que lo emergimos del portage y así nos simplificamos la vida.
Buscamos los paquetes de PCSC disponibles:

bash$ emerge -s pcsc
* sys-apps/pcsc-lite
Latest version available: 1.6.6
Latest version installed: 1.6.6
Size of files: 468 kB
Homepage: http://pcsclite.alioth.debian.org/
Description: PC/SC Architecture smartcard middleware library
License: as-is

* sys-apps/pcsc-tools
Latest version available: 1.4.17-r2
Latest version installed: 1.4.17-r2
Size of files: 110 kB
Homepage: http://ludovic.rousseau.free.fr/softwares/pcsc-tools/
Description: PC/SC Architecture smartcard tools
License: GPL-2


Vemos que hay dos paquetes, uno que es propio middle ware PCSC y otro que son herramientas para operar con este; aunque parece que las herramientas no son estrictamente necesarias, por el espacio en disco que ocupan, yo preferí instalar los dos paquetes.

Una vez hecho esto, había que probar si el sistema ya reconoce y puede interactuar con el lector, así que vamos a arrancar el servicio:

$ /etc/init.d/pcscd start
* Caching service dependencies ... [ ok ]
* Starting pcscd ...
* WARNING: -c/--chuid is deprecated and will be removed in the future, please use -u/--user instead


Arrancar, arrancó pero ya hay algo que no mola: WARNING.
Vamos a mirar un poco más en detall a que se puede deber aunque parece que así que consulté el /var/log/messages:

Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/etc-update.conf: mode 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 10 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 10 in /etc/etc-update.conf: clear_term 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 13 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 13 in /etc/etc-update.conf: eu_automerg 
e 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 16 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 16 in /etc/etc-update.conf: rm_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 19 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 19 in /etc/etc-update.conf: mv_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 22 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 22 in /etc/etc-update.conf: cp_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 25 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 25 in /etc/etc-update.conf: pager 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 38 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 38 in /etc/etc-update.conf: diff_comman 
d 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 39 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 39 in /etc/etc-update.conf: using_editor 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 43 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 43 in /etc/etc-update.conf: merge_command 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 2 in /etc/shells: /bin/bash 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 3 in /etc/shells: /bin/csh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 4 in /etc/shells: /bin/esh 
ct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 5 in /etc/shells: /bin/fish 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/shells: /bin/ksh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 7 in /etc/shells: /bin/sash 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 8 in /etc/shells: /bin/sh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 9 in /etc/shells: /bin/tcsh 
Oct  8 21:39:37 IVAN input in flex scanner failed 
Oct  8 21:39:37 IVAN pcscd: pcscdaemon.c:655:clean_temp_files() Cannot remove /var/run/pcscd/pcscd.comm: No such file or directory

Primera impresión: “Joder, ¿que pasa?, parece que hay errores en el fichero de configuración etc-update.conf, pero que coño tiene que ver ahora este fichero; bien calma vamos a analizar un poco con más detalle los mensajes del log”.

Después de leer con más tranquilidad la salida me di cuenta que cada mensaje, viniese lo que viniese luego (/etc/etc-update.conf, /etc/shells:/bin/bash, …), todo estaba introducido por “pcsc”, así que llegué a la tanta simple conclusión, que todo el problema debía venir del fichero de configuración, por lo tanto lo abrí y encontré esto:

#!/sbin/runscript
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/pcsc-lite/files/pcscd-init.3,v 1.1 2010/12/04 02:08:39 flameeyes Exp $

depend() {
 need localmount
}

start() {
 if ! [ -d /var/run/pcscd ]; then
  mkdir -p /var/run/pcscd
 fi

 chgrp pcscd /var/run/pcscd
 chmod 0775 /var/run/pcscd

 ebegin "Starting pcscd"
 start-stop-daemon --start \
        --exec /usr/sbin/pcscd \
        --pidfile /var/run/pcscd/pcscd.pid \
  --chuid nobody:pcscd \
  -- ${EXTRA_OPTS}
 eend $?
}

stop() {
 ebegin "Stopping pcscd"
 start-stop-daemon --stop \
        --exec /usr/sbin/pcscd \
        --pidfile /var/run/pcscd/pcscd.pid
 eend $?
}

Primera impresión: “Y aquí que cojones debe estar mal”.
Bueno, como antes, me puse a analizar de nuevo todo la información del problema; empezando por el principio, vemos que el WARNING, ya nos decía: -c/--chuid is deprecated and will be removed in the future, please use -u/--user instead
Así que parece que la opción -c/--chuid que está para la jubilación y que hay que sustituirlo por la opción -u/--user; así que con todo esto si nos revisamos de nuevo el fichero /etc/init.d/pcscd y en el buscamos --chuid, vemos que aparece en la función start(), es decir en el arranque del servicio; dada la situación lo primero era seguir la recomendación del WARNING, por lo tanto sustituí la opción, guardé los cambios y volví a ejecutar el servicio y solo con esto el servicio se ejecutó sin queja alguna.

Ahora ya tenemos el lector funcionando en el sistema, en la siguiente entrada comentaré el asalto con la instalación de lo que es el propio driver del DNI-E.

Hasta la próxima enfermos.