Migrando de Drupal 6 a Drupal 7 con doble tirabuzón.

Avión realizando un doble tirabuzón

Por esas cosas de la vida, y por la dejadez de los ayuntamientos con el dinero público, nos encontramos con un portal de un ayuntamiento que está hecho en Drupal 6.19 que tenemos que mantener, para ello, tendremos que actualizarlo dentro de la versión 6 y actualizar todos los módulos para posteriormente realizar la actualización a Drupal 7 y una vez en Drupal 7 aprovecharemos su orientación a objetos para migrar la base de datos a PostgreSQL.

Paso 1.- Replicamos el sitio:

Obviamente no podemos hacer los experimentos con gaseosa y lo primero que tenemos que hacer es realizar un duplicado del código y de la base de datos, para montar un servidor de desarrollo, con ese nuevo servidor podremos hacer todos los intentos que queramos.

Como en otros casos, simplemente copiamos el código y copiamos la base de datos:

tar -zcvf nombredelservidor.tar.gz nombredelservidor

scp nombredelservidor.tar.gz usuario@servidordepreproduccion:/home/usuario/

mysqldump nombrebbdd -u usuario -p > nombrebbdd.sql

gzip nombrebbdd.sql

scp nombrebbdd.sql.gz usuario@servidordepreproduccion:/home/usuario/

gunzip nombrebbdd.sql.gz

mysql -u usuario -p < 'CREATE DATABASE nombrebbdd'

mysql nombrebbdd -u usuario -p < nombrebbdd.sql

Solo nos queda reproducir el fichero de apache y ya tenemos reproducida la web en el entorno nuevo, ahora comienzan los problemas.

Paso 2.- Resucitamos el sitio:

Al tratarse de un sitio antiguo, no será nada tan fácil. El primer problema que nos podemos encontrar es de falta de compatibilidad de versiones de PHP, con cosas como esta:

Paso de variables como referencia.

En mi caso ha sido el módulo alfresco el que más guerra ha dado.

Una vez que podemos ejecutar el código sin error, seguramente nos saldrá sin estilos la web, esto es debido a la caché y las referencias al sitio antiguo, vamos a asegurarnos que la URL de base apunta al sitio correcto, en el caso de Drupal 6, esto se almacena en una variable ($base_url) en el fichero setting.php en la raiz del sitio en drupal, es decir en "sites/nombredelsite(o default)/settings.php"

Una vez que hemos cambiado la url de base, conviene limpiar la cache, para eso y para más cosas, necesitaremos instalar Drush, como ya hicimos con anterioridad, cabe destacar que, Drush es independiente de las versiones de Drupal (no del todo, pero casi) y que podremos utilizar la última versión estable de Drush en un sitio con Drupal 6.

Can Drush instalado, podemos limpiar la caché del sitio:

drush cc all

Y el sitio ya se verá limpito, en mi caso, hay algún módulo dando guerra, además de habernos llevado el sitio, pero no el alfresco del que se alimenta.

Paso 3.- Problemas con Drush:

Es bastante normal, que en un sitio de Drupal 6 hecho de aquella manera nos encontremos problemas con Drush, si al ejecutar Drush nos encontramos un:

Drush command terminated abnormally due to an unrecoverable error.

Esto se debe al uso de la función drupal_goto() en el código, o más bien del abuso, en versiones posteriores existe una función de control que ignora este problema, pero esta función no estaba disponible en los tiempos de drupal 6.

function drupal_is_cli() {
  return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

Tendremos que añadir la función al código y utilizar la condición para que no se ejecuten los "drupal_goto" si queremos utilizar drush para estos menesteres.

Paso 4.- Usuario administrador:

Es posible que no tengamos acceso al usuario administrador del sitio en producción, eso no es problema, en nuestra copia podemos cambiar el acceso de administrador con drush:

drush user-password USERNAME --password="SOMEPASSWORD"

O también directamente en la base de datos:

UPDATE users SET pass = md5('newpassword') WHERE uid = 1;

Paso 5.- Actualizando:

Ya tenemos listo el sistema para actualizar, ponemos el sitio en mantenimiento, y se aconseja desactivar los módulos para actualizar el core, si no todos, al menos los potencialmente peligrosos. En mi caso, desactivo el módulo de alfresco que tanta guerra estaba dando.

drush up drupal -v

Hay un pequeño problemilla con Drush 8 en drupal 6, si véis que se queda como parado, es que está esperando una respuesta pero no se ha mostrado la pregunta, dadle a 'y' y a 'enter' para que termine.

Project drupal was updated successfully. Installed version is now 6.38.

Ya tendremos el código de drupal actualizado. Ahora los módulos son otra guerra, dado que Drupal 6 no tiene mantenimiento, no podremos obtener directamente la información de las releases, aún así, si buscamos las últimas versiones de cada módulo instalado en la web de drupal podremos instalarlos directamente con Drush, p.e.:

drush dl admin_menu-6.x-1.9 -v

Si hacemos esto con cada módulo, tendremos el sitio actualizado en la rama 6 de Drupal. Obviamente, como con cualquier actualización es necesario ejecutar update.php con cada actualización (o grupo de ellas) para que se actualice la base de datos.

Paso 6.- El vértigo:

Ahora viene el paso más complicado, migrar de Drupal 6 a Drupal 7, con lo que necesitaremos primero hacernos un listado de módulos y temas instalados en nuestro sitio para verificar si todos están disponibles en Drupal 7.