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

miércoles, 21 de septiembre de 2016

Depurar errores de importación en controlies

Estamos a principios de curso y nuestro controlies echa humo con la importación de alumnos y profesores desde Rayuela. Antes de seguir, unos consejos para refrescar lo importante:
  • Controlies sólo importa ficheros de profesores y de alumnos. No de grupos, ya que esos datos van implícitamente dentro de los alumnos. El fichero XML de Grupos bajado de Rayuela no tiene ningún valor para controlies.
  • El formulario para importar los datos es el mismo tanto profesores como para alumnos...¿cómo distingue entre unos y otros?: pues por la extensión: si el fichero es un XML interpreta que es de profesores, si es un ZIP (que contiene un XML y las fotos) se interpreta que es de alumnos.
  • La casilla de "Borrar datos" solo debe marcarse en la primera importación del curso (normalmente hay varias importaciones a lo largo del año ya que las matriculaciones se realizan en varias oleadas) ya que borra todos los profesores/alumnos (según el caso) previos del árbol ldap antes de iniciar el proceso a modo de limpieza de datos obsoletos.
  • Si no se marca la casilla "Borrar datos" se integrarán los datos importados con los ya existentes previamente, siendo ignorados los profesores/alumnos que ya estuvieran en ldap. Por eso es aconsejable marcar la casilla al menos una vez con los alumnos y así deshacernos de aquellos que hayan abandonado el centro.
  • No hay que olvidar lanzar después el script crearCarpetas en el servidor principal para crear los homes Linux de los usuarios añadidos a ldap.

Cuando se realiza la importación no es infrecuente que se aborte con un "Internal server error" o similar. Veamos como solucionar esto o al menos saber que ha pasado:
  • Debemos asegurarnos de que no hay ninguna partición al 100% en el servidor principal. La importación se hace descomprimiendo datos en /tmp/rayuela-ldap y si la partición que contiene esta ruta se llena todo se va al traste.
  • Borrar /tmp/rayuela-ldap antes de importar tampoco viene mal, para liberar espacio y quitar "basura" de importaciones antiguas que pudieron quedar a medias.
  • Si sigue fallando hay que depurar, para ello borramos /var/web2py/applications/controlies/errors/* y lanzamos la importación para que se produzca de nuevo el error. En /var/web2py/applications/controlies/errors/... debería haberse creado un fichero con el volcado del error y en /tmp/rayuela-ldap deben estar además los ficheros temporales usados durante la importación.

El fichero en /var/web2py/applications/controlies/errors/... es un típico fichero de volcado de pila de web2py horrible y farragoso:
(dp1
S'output'
p2
S" 'ascii' codec can't encode character u'\\xe2' in position 2: ordinal not in range(128)"
p3
sS'layer'
p4
S'/var/web2py/applications/init/controllers/gestion.py'
p5
sS'code'
p6
S'# coding: utf8\nfrom applications.controlies.modules.Hosts import Hosts\nfrom applications.controlies.modules.Rayuela2Ldap import Rayuela  \nfrom applications.controlies.modules.SQLiteConnection import SQLiteConnection\nfrom applications.controlies.modules.Laptops import Laptops\nfrom applications.controlies.modules.LaptopsHistory import LaptopsHistory\nfrom applications.controlies.modules.Config import Config\nfrom applications.controlies.modules.Thinclients import Thinclients\nfrom applications.controlies.modules.Utils import Utils\nfrom applications.controlies.modules.Utils import LdapUtils\nimpo
......
......
......
S"u'Jo\\xe2o'"
p7197
sS'resultado'
p7198
S"u'Jo\\xe2o'"
p7199
sS'self'
p7200
S''
p7201
sssS'traceback'
p7202
S'Traceback (most recent call last):\n  File "/usr/lib/pymodules/python2.7/gluon/restricted.py", line 205, in restricted\n    exec ccode in environment\n  File "/var/web2py/applications/init/controllers/gestion.py", line 748, in \n  File "/usr/lib/pymodules/python2.7/gluon/globals.py", line 173, in \n    self._caller = lambda f: f()\n  File "/usr/lib/pymodules/python2.7/gluon/tools.py", line 2575, in f\n    return action(*a, **b)\n  File "/var/web2py/applications/init/controllers/gestion.py", line 218, in rayuela\n    todos=rayuela.gestiona_archivo()\n  File "applications/controlies/modules/Rayuela2Ldap.py", line 437, in gestiona_archivo\n
self.parsea_archivo("/tmp/rayuela-ldap/Alumnos.xml","alumno")\n  File "applications/controlies/modules/Rayuela2Ldap.py", line 249, in parsea_archivo\n    self.parse_nodo(nodo)\n  File "applications/controlies/modules/Rayuela2Ldap.py", line 236, in parse_nodo\n    usuario[info.nodeName]=self.asegura_codigos(dato)\n  File "applications/controlies/modules/Rayuela2Ldap.py", line 121, in asegura_codigos\n    return str(resultado).strip()\
nUnicodeEncodeError: \'ascii\' codec can\'t encode character u\'\\xe2\' in position 2: ordinal not in range(128)\n'
p7203
s.
La parte final es la interesante, he puesto en negrita lo relevante: se produce un error en /tmp/rayuela-ldap/Alumnos.xml, relacionado con la codificación Unicode de la cadena que aparece mas arriba S"u'Jo\\xe2o'. Habría que buscar esa cadena en Alumnos.xml por ver si viene en alguna codificación extraña y arreglarlo mano. Esto pasa a veces ya que los datos vienen desde Rayuela con codificaciones o caracteres extraños que controlies no sabe manejar.

Si no encontramos nada queda una última opción: seguir una estrategia "divide y vencerás" y realizar la importación grupo a grupo, en lugar de todo el alumnado completo, hasta dar con el que produce el error. Luego, dentro de ese grupo, hacerlo alumna a alumno hasta pillar al "culpable" y depurar.

Una vez localizado el dato erróneo será cuestión de editar el XML a mano para quitar lo que causa el fallo y lanzar de nuevo la importación. Si es el fichero de Alumnos no olvidar volver a meter Alumnos.xml dentro del ZIP para importar, respetando la estructura del ZIP original: el fichero Alumnos.xml en la raíz del mismo y las fotos en un directorio.

Bueno, pues esperemos que este año no haya muchos errores en estas lides.

No hay comentarios:

Publicar un comentario