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/0b5c8aaa6e3eaa8d6f7cb1da2d221ab1929
e8f83
– 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 problemas
moodledata/4561/DATOSALUMNO/evaluación.pdf
moodledata/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 Tzo2OiJvYmplY3QiOjY6e3M6MTk6ImRpc3BsYXlfZGVzY3JpcHRpb24iO3M6MT
oiMSI7czoxNDoic2hvd251bWVudHJpZXMiO3M6MToiMyI7czo1OiJyc3NpZCI7YT
oxOntpOjA7czozOiIxMTEiO31zOjU6InRpdGxlIjtzOjA6IiI7czozNDoiYmxvY2tfcnN
zX2NsaWVudF9zaG93X2NoYW5uZWxfbGluayI7czoxOiIwIjtzOjM1OiJibG9ja19y
c3NfY2xpZW50X3Nob3dfY2hhbm5lbF9pbWFnZSI7czoxOiIxIjt9
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?
Info. contacto
● Inko Perurena
– Twitter: @inkoperurena
– Email: inko@elurnet.net
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

Actualización Moodle 1.9 a Moodle 2.4: Planificación, consejos y problemas

  • 2.
    Actualización Moodle 1.9a Moodle 2.4: Planificación, consejos y problemas
  • 3.
    Índice ● Características deun 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
  • 4.
  • 5.
    Características de laplataforma (I) ● 1.980 cursos ● 28.000 usuarios ● 375.000 archivos en el directorio moodledata (unos 56GB) ● Base de datos de 18GB
  • 6.
    Características de laplataforma (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
  • 7.
    Características de laplataforma (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
  • 8.
  • 9.
    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
  • 10.
    ¿Es un Moodleestá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
  • 11.
    ¿Es un Moodleestá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
  • 12.
    ¿Es un Moodleestá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?
  • 13.
    ¿Es un Moodleestándar? (IV) ● Análisis de base de datos – diff mediante MySQL Workbench
  • 14.
    ¿Es un Moodleestándar? (V) Esquema limpio Esquema que teníamos Delta, diferencia entre ambos Delta + Esquema que teníamos = Esquema limpio
  • 15.
    ¿Es un Moodleestándar? (VI)
  • 16.
    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
  • 17.
  • 18.
    Temas ● Los themespara 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
  • 19.
    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
  • 20.
    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)
  • 21.
    Sistema de archivos(III) ● Moodle 2.x – Mover a carpeta indexada (tabla hash de doble nivel) moodledata/filedir/0b/5c/0b5c8aaa6e3eaa8d6f7cb1da2d221ab1929 e8f83 – 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
  • 22.
    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
  • 23.
    Transacciones DB ● Moodle1.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
  • 24.
    HTML estricto ● Moodle1.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
  • 25.
  • 26.
    Antes de empezar... ●Activar el Modo Mantenimiento – Acceso sólo disponible para admins ● Activar el nivel de debugging máximo
  • 27.
    Desinstalar todo loque 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 ● ...
  • 28.
    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
  • 29.
    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'));
  • 30.
    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.
  • 31.
    Limpiar moodledata (II) ●Caso extremo – Si en la ruta de un curso tenemos dos carpetas con mismo nombre, pero distinto case, podemos tener problemas moodledata/4561/DATOSALUMNO/evaluación.pdf moodledata/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
  • 32.
    ¿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 Tzo2OiJvYmplY3QiOjY6e3M6MTk6ImRpc3BsYXlfZGVzY3JpcHRpb24iO3M6MT oiMSI7czoxNDoic2hvd251bWVudHJpZXMiO3M6MToiMyI7czo1OiJyc3NpZCI7YT oxOntpOjA7czozOiIxMTEiO31zOjU6InRpdGxlIjtzOjA6IiI7czozNDoiYmxvY2tfcnN zX2NsaWVudF9zaG93X2NoYW5uZWxfbGluayI7czoxOiIwIjtzOjM1OiJibG9ja19y c3NfY2xpZW50X3Nob3dfY2hhbm5lbF9pbWFnZSI7czoxOiIxIjt9
  • 33.
    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
  • 34.
  • 35.
  • 36.
  • 37.
    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
  • 38.
    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
  • 39.
    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
  • 40.
  • 41.
    Tareas posteriores ● Planificarscript 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
  • 42.
    Tareas posteriores (II) ●Herramientas diagnóstico admin – Diagnóstico de roles – Conversión a InnoDB – Profiling de plataforma – ...
  • 43.
    Tareas posteriores ● Eliminardirectorios 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
  • 44.
  • 45.
  • 46.
    Info. contacto ● InkoPerurena – Twitter: @inkoperurena – Email: inko@elurnet.net
  • 47.
  • 48.
    Malas prácticas enPlugins (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
  • 49.
    Malas prácticas enPlugins (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
  • 50.
    Malas prácticas enPlugins (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; }
  • 52.
    Referencias ● Fuentes dedatos adicionales – Moodle docs – http://docs.moodle.org – Wikipedia – http://www.wikipedia.org
  • 53.
    Licencia ● Todas lasfotos 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