Recientemente he desarrollado una pequeña aplicación para un cliente que está instalada en sus oficinas. He usado para ello w2000server, APACHE2, MySQL4.0 y PHP 4.3. El servidor es un Dell Power Edge 850 con raid 0, es decir, dos discos en espejo y driver SATA.
El problema que planteo aqui es como actualizar la aplicación sin tener que desplazarme fisicamente a las oficinas del cliente.
Supongo que alguna vez os a pasado que teneis un cliente donde cada cambio implica tener que ir a sus oficinas. Desde luego, si el cliente no tiene internet no hay nada que hacer, pero no es el caso.
Partimos del echo de que el problema es acceder de fuera a dentro.
Alternativas:
1. Tienen un router y una linea ADSL en su oficina, podríamos configura su router para poder entrar desde fuera y controlar el servidor. Es una ADSL básica con IP dínamica y eso es un problema por que sin intervención de ellos, yo no tengo forma simple de conocer su IP para conectarme remotamente. Hay otras opciones mas sencillas.
2. Que sea el propio servidor el que pida las actualizaciones, de forma automática o manual. Esta opción es sencilla.
3. Si la aplicación estuviera en Internet el mantenimiento sería bastante sencillo, junto a un certificado de seguridad SSL creo que sería para mí la mejor opción. Existe un problema básico, si el servicio de ADSL se cae (cosa nada extraña) adiós aplicación.
Creo que la segunda opción es la más idonea en nuestro caso.
Cúal es el sistema
He colocado en la aplicación un link que llama a un programita que se conecta a un servidor de Internet (mi servidor) via FTP para descargar las actualizaciones, similar a cualquier programa con actualizaciones, pero más básico.
El proceso
El proceso es muy fácil, fácil. Este programa, llamémosle, "Actualizador", se conecta a una máquina y descarga por FTP un fichero de instrucciones.
Este fichero tiene los nombres de ficheros que quiero copiar de servidor a servidor. Mi fichero de instrucciones es un simple PHP que define un array en el que cada elemento del array contiene ruta y nombre de un fichero.
Lo que se hace es descargar estos ficheros que he leido del fichero inicial de instrucciones. Simple ¿no?
Con esto se resuelve casi todo el problema. Pero nos falta algo más. Las actualizaciones de base de datos. Pero igual de sencillo lo vamos ha hacer. Siempre que descargo actualizaciones, si quiero hacer cualquier operación en la base de datos incluyo un fichero que llamo "alters.sql".
Este fichero es un script SQL, donde cada sentencia es el tipico insert, update, alter, etc. finalizada con un punto y coma, esto es importante. Solo tenemos que extraer cada sentencia y ejecutarla. La dificultad de procesar este fichero recae en el uso de expresiones regulares para separar las sentencias o instrucciones ya que tenemos que ejecutarlas de una en una, almenos, yo no he conseguido ejectura mas de una de golpe.
Realmente es sencillo, yo utilizo una regla que es buscar el punto y coma seguido del salto de linea para detectar una sentencia completa, pero mi regla no encontraria dos o mas sentencias en la misma linea, esto es, sin salto de línea. Lo dejo como mejora.
Al terminar todo el proceso borro los ficheros de instrucciones y de base de datos que ya no me sirven.
Os adjunto los ficheros del sistema de actualización. Sois libres de utilizarlos o modificarlos, lo que si os pediria es que hagais mención al autor y si haceis modificaciones me las comentarais aqui mismo o por email... bueno y si me enviais unos eurillos, mejor, jeje. ;))
Limitaciones
El sistema no borrar ficheros, pero ya he pensado como hacerlo en una versión posterior.
También ocurre que la aplicación siempre se actualiza sin comprobar si ya lo está y puede ser un problema en la parte de base de datos, pero tambien tengo pensada una solución.
Espero sacar pronto una nueva versión de estos ficheros.
Espero vuestros comentarios. Un saludo.