Como soy bastante perro suelo pensar siempre en general de que forma podría trabajar menos. Este proyecto, como casi todos los que hago sigue esa filosofía :)
Os pongo en situación. Moodle es la plataforma que utilizo para dar clases desde hace unos años y la que me facilita la vida para agilizar todos los procesos de enseñanza. En teoría lo ideal sería tener un servidor Moodle y que los alumnos accedieran a él tanto desde fuera como desde la red interna del centro. Esto es en teoría porque en la práctica las conexiones de internet de la mayoría de los centros impiden que esto sea viable.
La solución improvisada es que no haya acceso por internet. El servidor se instala en el ordenador del profesor y solo se puede acceder desde el centro. Algún avispado habrá pensado que por que no hago redirección de puertos y con dns dinámico doy acceso al servidor desde internet. Se podría hacer pero las normas de Conselleria lo prohiben, así que hay que pensar en otra cosa.
El año pasado cree un script llamado Moodlesync, que si bien no solucionaba este problema si que permitía transportar la base de datos y los ficheros de Moodle en un lapiz usb y sincronizar un equipo en casa, con lo que podía elaborar material y en determinados momentos dar acceso a los alumnos a mi ordenador.
Esto puede funcionar en determinados casos pero dadas las restricciones lo ideal es tener un servidor Moodle en Internet, a ser posible controlado por uno mismo y sincronizar el servidor Moodle del centro con el servidor propio. De esta forma tenemos la autonomía de controlar un servidor y poder reusar el material facilmente en otros centros, y además tenemos la velocidad de dar una clase de Moodle en un entorno de red local.
Bien, pues un primer paso en este proyecto es cambiar Moodlesync para que pueda sincronizar Moodle's remotos. Parecía que iba a ser sencillo porque mysqldump permite elegir el servidor con el que se quiere operar. Contraté un servidor baratillo y comencé a hacer pruebas. Por desgracia me di cuenta de que realizar una operación de exportación/importación con mysqldump sin comprimir era más lento que el caballo del malo. Siempre había usado mysqldump en local y no me había percatado de este problema. La información entre el cliente y el servidor va sin comprimir!
Mal rollo, la única forma de realizar una importación o exportación comprimida, y por lo tanto más o menos rápida, me la ofrecía phpmyadmin. El único problema es que era una aplicación web. "Bueno", pensé, "tendrá que haber algún tipo de aplicación que automatice la navegación de un usuario y que pueda incluir de alguna forma en el script de Moodlesync". Y así es como llegué a CURL.
Curl es una aplicación que permite automatizar mediante script las acciones que realiza un navegador y imitar de esa forma la navegación por internet. Es una herramienta altamente utilizada por spammers, hackers y tejedores de internet en general. También dispone de bindings para varios lenguajes de modo que tenemos mayor control sobre su operativa.
Yo he empezado a hacer pruebas con libcurl para PHP, y como resultado de mis investigaciones he fabricado un script que permite importar un archivo previamente exportado con phpmyadmin, tal y como si lo hicieramos desde la interfaz de phpmyadmin:
// Entramos por primera vez en la web para obtener la cookie
$cookiefile = "/tmp/phpmyadmin.cookie";
$url = "http://localhost/phpmyadmin/index.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIESESSION, True);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$data = curl_exec($ch);
curl_close($ch);
// Vamos a recuperar el token de la sesión
$flag = preg_match("/name=\"token\" value=\"([a-zA-Z0-9_]{1,})\"/", $data, $matches);
$phptoken = $matches['1'];
// Entramos por segunda vez para autenticarnos
$url = "http://localhost/phpmyadmin/index.php";
$postfields = "pma_username=root&pma_password=xxxxxxxxx&server=1&token=" . $phptoken;
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, True);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$data = curl_exec($ch);
curl_close($ch);
// Subimos el fichero a importar
$fichero = "test.sql.gz";
$url = "http://localhost/phpmyadmin/import.php";
$ch = curl_init();
set_time_limit(0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('token' => $phptoken,
'import_file' => '@' . $fichero,
'import_type' => 'db', // server, db, tbl
'MAX_FILE_SIZE' => '2097152',
'charset_of_file' => 'utf8' ,
'allow_interrupt' => 'yes',
'skip_queries' => '0',
'format' => 'sql'
));
$data = curl_exec($ch);
echo $data;
curl_close($ch);
Este es un primer paso para realizar una restauración de un servidor Moodle alojado remotamente. El próximo paso será probar la exportación. Y todavía queda pensar en como sincronizar los ficheros del directorio moodledata sin que tarde una eternidad. Todo esto sin disponer de ssh remoto...
En fin, seguiremos investigando y informando, espero que pronto en un nuevo post!