Actualización Moodle 1.9 a Moodle 2.4:Planificación, consejos y problemas
Índice
● Características de un caso práctico● Pasos iniciales. Determinar si Moodle ha sido modificado● Cambios en Moodle 2.x que afectan a la actualización● Limpieza previa de DB y moodledata● Actualización por fases● Tareas posteriores
Un caso práctico
Características de la plataforma (I)
● 1.980 cursos● 28.000 usuarios● 375.000 archivos en el directorio moodledata (unos 56GB)● Base de datos de 18GB
Características de la plataforma (II)
● Moodle 1.9.1– Actualización previa desde Moodle 1.7
– Código core de Moodle modificado, no existe documentación al respecto
– Plugins para versiones posteriores de Moodle
Características de la plataforma (II)
● Moodle 1.9.1– Base de datos no estándar, tipos de datos e índices incorrectos
– Parches puntuales para arreglar compatibilidad con xAMP
Moodle 1.9.1 + PHP 5.3 = formularios NO funcionan
¿Por dónde empiezo?
Preparar el entorno
● Copia de seguridad completa de la plataforma● Clonar servidor de producción para actualización de prueba
– Las operaciones de actualización consumen muchos recursos. Si virtualizas, establece cuotas de CPU, E/S y RAM para evitar la degradación del servicio
¿Es un Moodle estándar? (I)
● Determinar versión exacta de Moodle– Editar version.php
– $release = '1.9.1+ (Build: 20080604)'
● Encontrar copia de código fuente sin alterar en el repositorio de Moodle– git log –grep='20080604'
● diff entre ambos excluyendo mods, filters y themes
¿Es un Moodle estándar? (II)
● Análisis de código alterado– ¿Para qué sirve?
– ¿Es necesario?
– ¿Misma funcionalidad alcanzable mediante plugins en versiones 2.x?● Plugins de matriculación● Plugins para repositorios
● Planificación de tareas adicionales para estas alteraciones
¿Es un Moodle estándar? (III)
● Análisis de la base de datos– ¿Tablas personalizadas?
● Cuáles son de mods y cuáles personalizaciones del core
– ¿Son correctos los tipos de datos e índices?
– ¿Juego de caracteres correcto (UTF-8 vs. LATIN-1)?
– ¿Se puede eliminar alguna tabla?
¿Es un Moodle estándar? (IV)
● Análisis de base de datos– diff mediante
MySQL Workbench
¿Es un Moodle estándar? (V)
Esquema limpio
Esquema que teníamos
Delta, diferencia entre ambos
Delta + Esquema que teníamos = Esquema limpio
¿Es un Moodle estándar? (VI)
Análisis de Plugins
● ¿Qué plugins hay instalados?● ¿Funcionan correctamente?● ¿Existe versión para Moodle 2.x?
– No hay versión o mecanismo de actualización: Nanogong
● ¿No se utiliza? Mejor desinstalar que actualizar
Cambios en Moodle 2.x
Temas
● Los themes para 1.9 no son compatibles con 2.x● ¿Realmente los necesitamos?
– Muchos profesores prefieren el theme por defecto de las nuevas versiones de Moodle
– Actualizar un número X de themes supone más tiempo y dinero● Es “recomendable” que los themes 2.x sean adaptables y compatibles con
dispositivos móviles
Sistema de archivos (I)
● Moodle 1.9– moodledata/<id-curso>/{archivos curso}
– moodledata/<id-curso>/moddata/<nombre-mod>/{archivos mod}
– No hay sistema de referenciación explícito en la DB● Archivos borrados de sistema de archivos, movidos a otro directorio y mal
referenciados● Duplicidad de archivos● Problemas con rutas demasiado largas● Dependencia de dominio web
Son problemas del propio Moodle 1.9,No de migración
Sistema de archivos (II)
● Moodle 2.x– Hash de ruta: sha1(ruta)
– Hash de contenido: sha1_file(“misdatos.txt”)
0b5c8aaa6e3eaa8d6f7cb1da2d221ab1929e8f83
– Renombrar archivo$hash_contenido = sha1_file($archivo_usuario)rename($archivo_usuario, $hash_contenido)
Sistema de archivos (III)
● Moodle 2.x– Mover a carpeta indexada (tabla hash de doble nivel)
moodledata/filedir/0b/5c/0b5c8aaa6e3eaa8d6f7cb1da2d221ab1929e8f83
– Tabla específica para referenciar todos los archivos: mdl_file● Se evita duplicidad → ahorro de espacio● Archivos correctamente referenciados en todo momento● Aislar las operaciones del usuario del sistema de ficheros subyacente (capa de
abstracción)
– Independencia respecto a dominio web
Matriculación
● Moodle 1.9– Muchas veces implicaba hacer cambios en el core
● Moodle 2.x– Posibilidad de desarrollar plugins para cubrir necesidades
específicas de la institución
Transacciones DB
● Moodle 1.9:– Ideado para Mysql con MyISAM
– No hay transacciones
● Moodle 2.x:– Se añaden más SGBD: PostgreSQL, MariaDB...
– Opción de transacciones con MySQL + InnoDB
HTML estricto
● Moodle 1.9 y anteriores– Normas de limpieza de input de usuario menos tajantes
● Moodle 2.x– Limpieza y formateo estricto de código HTML introducido por
usuarios
Limpieza de primavera
Antes de empezar...
● Activar el Modo Mantenimiento– Acceso sólo disponible para admins
● Activar el nivel de debugging máximo
Desinstalar todo lo que se pueda
● Plugins que no se utlicen● Filtros rotos o innecesarios● Roles personalizados que no se vayan a utilizar● Usuarios inactivos desde hace tiempo● Cursos que ya no sirven● ...
Limpiar la DB (I)
● Moodle NO dispone de integridad referencial– Se borra curso con 10 topics, pero no todo lo relacionado:
actividades, recursos ...
● Conviene hacer un modelo entidad/relación esquemático a mano para saber cómo están relacionadas las tablas
Limpiar la DB (II)
● Eliminar todas las instancias de módulos no referenciados en ningún curso. Por ejemplo, para el módulo forum:
SELECT id, course, name FROM mdl_forum WHERE id NOT IN (SELECT instance FROM mdl_course_modules WHERE module = (SELECT id FROM mdl_modules WHERE name = 'forum'));
Limpiar moodledata (I)
● Eliminar directorios de cursos que ya no existan en la plataforma– Por ejemplo, si en la tabla mdl_course no existe ningún curso con
el id=45, eliminaremos el directorio moodledata/45 y todas sus subcarpetas.
Limpiar moodledata (II)
● Caso extremo– Si en la ruta de un curso tenemos dos carpetas con mismo nombre,
pero distinto case, podemos tener problemasmoodledata/4561/DATOSALUMNO/evaluación.pdfmoodledata/4561/Datosalumno/Evaluación.pdf
– Para Moodle 1.9, para Moodle 2.x iguales
– Solución: crear script para detectar casos problemáticos, buscar esos casos en DB, renombrar y actualizar DB
¿Cambio de dominio?
● Los enlaces de Moodle 1.9 son absolutos– Herramienta administrativa replace para búsqueda y reemplazo
masivo: http://dominiomoodle/admin/tool/replace.php
– Caso extremo: Bloque de tipo HTML en Moodle● ¿El reemplazo masivo no funciona, por qué?● Contenidos se guardan codificados en BASE64 y serializados
mdl_block_instance
pagetype configdata
course-view Tzo2OiJvYmplY3QiOjY6e3M6MTk6ImRpc3BsYXlfZGVzY3JpcHRpb24iO3M6MToiMSI7czoxNDoic2hvd251bWVudHJpZXMiO3M6MToiMyI7czo1OiJyc3NpZCI7YToxOntpOjA7czozOiIxMTEiO31zOjU6InRpdGxlIjtzOjA6IiI7czozNDoiYmxvY2tfcnNzX2NsaWVudF9zaG93X2NoYW5uZWxfbGluayI7czoxOiIwIjtzOjM1OiJibG9ja19yc3NfY2xpZW50X3Nob3dfY2hhbm5lbF9pbWFnZSI7czoxOiIxIjt9
HTML incorrecto (I)
● Todos los campos de input de texto almacenados en DB pueden contener HTML no-estricto– En Moodle 2.x puede que estos campos rompan el estilo de los
cursos por completo, incluso pueden romper la funcionalidad del mismo
● Solución: búsqueda masiva de inputs de texto en DB, filtrado mediante limpiador HTML, y actualización de campos
HTML incorrecto (II)
HTML incorrecto (III)
Actualizar por fases
Moodle 1.9.1 → 1.9.19+
● ¿Moodle no estándar?– Deshacer cambios sobreescribiendo con versión limpia
● Cambios a tener en cuenta– Salt para contraseñas
– Políticas de passwords
– Versión más reciente de TinyMCE● Hasta 1.9.9 no se muestra en Chrome
Moodle 1.9 → 2.2
● Conservar sólo config.php● La fase que más tiempo consumirá● Utilizar la versión CLI del actualizador
– Evitar timeouts y problemas de conectividad
– <moodle>/admin/cli/upgrade.php
● Tomarse un tiempo para revisar los logs y que los módulos funcionan correctamente
Moodle 2.2 → 2.3 → 2.4
● Se añade el plugin Book al core de Moodle● Se añade una nueva versión del módulo assignment llamado assign– Usar el asistente de conversión
– NOTA: plugins de tipo assignment, intentar actualizarlos antes de realizar esta fase
¿Hemos acabado?
Tareas posteriores
● Planificar script cron.php y desactivar acceso desde web– crontab -u apache -e
● Activar soporte reCAPTCHA– Eliminar SPAM previo usando herr. adm.
http://moodle/admin/tool/spamcleaner.php
● Comprobar el correcto funcionamiento de los cursos– Reconstruir caché del curso: borrar campo modinfo de mdl_course
– Plugin rebuildcoursecache: https://moodle.org/plugins/view.php?plugin=tool_rebuildcoursecache
Tareas posteriores (II)
● Herramientas diagnóstico admin– Diagnóstico de roles
– Conversión a InnoDB
– Profiling de plataforma
– ...
Tareas posteriores
● Eliminar directorios vacíos de moodledata● Hacer pruebas de carga y activar módulos de cacheo
– Memcache, MongoDB ...
● Requerir cambio de password a todos los usuarios– Políticas de password reforzadas + salt
¡Hemos acabado!
¿Preguntas?
Bonus
Malas prácticas en Plugins (I)
● Nanogong– Se publica versión para Moodle 1.9
– Se detiene el desarrollo durante 2-3 años
– Se anuncia nueva y mejorada versión de Nanogong● Compatible con Moodle 1.9 y con Moodle 2.x● Múltiples optimizaciones de rendimiento y nuevas opciones
Malas prácticas en Plugins (II)
● Nanogong– ¿Dónde está la pega?
– Tengo ejercicios hechos con la versión vieja de Nanogong
– Instalo la versión nueva de Nanogong● Instalación → OK● Ejercicios previos → Mal
Malas prácticas en Plugins (III)
● Nanogong– ¡Función de upgrade.php vacía!
/** * Execute nanogong upgrade from the given old version * * @param int $oldversion * @return bool */function xmldb_nanogong_upgrade($oldversion) { return true;}
Referencias
● Fuentes de datos adicionales– Moodle docs – http://docs.moodle.org
– Wikipedia – http://www.wikipedia.org
Licencia
● Todas las fotos e imágenes de esta presentación pertenecen a sus respectivos dueños. Véase:
Elurnet SL, Moodle, Stéfan (flickr), 20th Century Fox, ...
● El resto de contenidos está sujeto a CC-BY-SA 3.0
– Eres libre de copiar, distribuir y presentar esta obra en público
– Eres libre de crear obras derivadas
– Tienes que reconocer la autoría de la obra, de la manera que te indica el autor
– Tienes que mantener la misma licencia al distribuir esta obra o sus derivados