Terminología
- Watch: objeto que nos permite monitorizar un fichero
Descripción del módulo InotifyHandler
InotifyHandler se encarga de monitorizar distintos tipos de eventos en ficheros y directorios y notificar estos cambios a los módulos que lo necesiten/soliciten
Los eventos que se notifican son modificaciones,borrados y creación de nuevos ficheros o directorios(en principio)
Este módulo debe ofrecer la posibilidad de añadir y eliminar ficheros y directorios a la lista de elementos monitorizados, gestionar los eventos que se producen en éstos y ofrecer la funcionalidad de monitorizar directorios recursivamente( al monitorizar un directorio, automáticamente los subdirectorios que contenga pasarán a estar monitorizados)
Abstracción al problema
Tenemos un conjunto de ficheros y directorios y queremos conocer instantáneamente si han sufrido modificaciones(ya sea de contenido en caso de ficheros, de estructura en caso de directorios o de eliminación en ambos). Además esta lista puede modificarse dinamicamente, añadiendo nuevos elementos o quitándolos. Existe también una "lista negra" con archivos que no se deben monitorizar que se debe tener en cuenta a la hora de enviar notificaciones a otros módulos de HD Lorean
Abstracción a la solución
Los ficheros y directorios que van a ser monitorizados se añaden a un vector y se añaden watchers a inotify para que se nos notifiquen los eventos deseados. Si en tiempo de ejecución se desean añadir o quitar elementos solamente será necesario añadir o quitar los watches correspondientes.
Las notificaciones serán procesadas para compartirlas con otros módulos, si un fichero de la lista negra notifica un evento no se propagará a otros módulos.
Tecnologías empleadas
Para la implementación de este modulo usaremos inotify-cxx, que ofrece una interfaz orientada a objetos para trabajar con inotify
Inotify
Inotify es una librería que permite conocer en tiempo real diversos eventos producidos en ficheros y directorios
Inotify-cxx
Esta librería aporta a orientación a objetos a las utilidades que ofrece inotify
Opciones investigadas
Inotify-cxx
Ejemplo de uso:
Vamos a monitorizar el borrado de un directorio. Para ello creamos un objeto InotifyWatch que contiene la información necesaria para controlar los eventos(la ruta del directorio y la máscara del evento a notificar).
Ese objeto se añade a un objeto Inotify que es quien se encarga de notificar los eventos, por medio de objetos del tipo InotifyEvent, en los que se almacena, entre otras cosas, quien provocó la notificación y por qué motivo
int main(){ InotifyWatch* watch; watch = new InotifyWatch("/home/user/prueba/",IN_DELETE); InotifyWatch* fichero; Inotify* n = new Inotify(); InotifyEvent* pEvt; pEvt = new InotifyEvent(); n->Add(watch); n->WaitForEvents(); n->GetEvent (pEvt); if(pEvt->IsType(IN_DELETE)) cout << "Borrado Directorio, saliendo" << '\n'; }
Conclusiones:
Nos hemos limitado a investigar la librería inotify-cxx ya que ofece la misma funcionalidad que la librería inotify(que era la primera opción que nos planteamos para resolver este problema) pero con la ventajas que ofrece la programación orientada a objetos. En contraposición a estas ventajas, la velocidad de ejecución del algoritmo al usar esta librería probablemente será inferior a usar directamente inotify
Opinión personal
Inotify no ofrece una solución completa. Los watches recursivos no están soportados. Si tenemos un directorio monitorizado solo se notificarían eventos ocurridos dentro de ese directorio, y no en los subdirectorios que estén contenidos en él.