Iside - MutakamwoyoCloud/MCloud GitHub Wiki

3.3.3.3 Iside

La clase iside es una de las mas importantes de la zona proveedor de MCloud, en ella esta el punto de entrada de el programa que se encargará de estar escuchando a posibles eventos del protocolo de comunicaciones de Mcloud.

Para poder crear esta especie de servidor, hemos utilizado una librería llamado Watchdog.

WatchDog

Watchdog es un API de Python y una utilidad de Shell para monitorizar los eventos de un sistema de archivos.

Como utilizarlo

Para crear un script sencillo de motorización de directorio simple necesitaremos:

  • Crear un instancia de la clase watchdog.observers.Observer para monitorizar cualquier cambio.
  • Implementar una subclase de watchdog.events.FileSystemEventHandler o utilizar una ya implementada como watchdog.events.LoggingEventHandler.
  • Si queremos un manejador personalizado utilizaremos watchdog.events.PatterMatchingHandler que es una clase que hereda de FileSystemEventHandler y nos proporciona algunos métodos útiles:
  1. on_any_event
  2. on_created
  3. on_modified
  4. on_moved
  5. on_deleted
Estructura de la clase

Iside esta pensado para que sea un servidor de escucha en el sistema de ficheros, el proceso python se dedicara a escuchar en una ruta esperando a recibir nuevos archivos (en nuestro caso peticiones de MCloud), una vez recibe cualquier tipo de cambio en el sistema de ficheros, Watchdog tiene preparados una serie de eventos que podemos utilizar para activar las funcionalidades:

Interfaz
        """
        event.event_type
            'modified' | 'created' | 'moved' | 'deleted'
        event.is_directory
            True | False
        event.src_path
            path/to/observed/file
Métodos

Watchdog nos deja esta interfaz de eventos para saber lo que ocurre en nuestro sistema de ficheros, como a nosotros nos interesa saber cuando llegan archivos por ftp, el evento usando principalmente sera on_created:

Evento de creación

El funcionamiento no podía ser mas simple, on_created nos indica si hay algún archivo nuevo en nuestra carpeta que no estuviera antes, si es así, lo único debemos hacer, es decirle a nuestra clase principal que encole ese archivo para su proceso posterior.

  def on_created(self, event):
        scheduler.enqueue(event.src_path)
Inicio del servidor

El servidor se basa en un bucle while true que está constantemente a la escucha con unos observadores de por medio que estan alerta a cualquier cambio, si hay alguna clase de petición en la cola se desencolara para procesarla.

def start_server(path):
    observer = Observer()
    observer.schedule(MyHandler(), path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
            if not scheduler.isEmpty():
                scheduler.process()
    except KeyboardInterrupt:
            observer.stop()
    observer.join()

Chequeando directorio

Esta función se ejecuta antes del inicio del servidor, sólo se dedica a comprobar en el sistema de ficheros si hay algún archivo que no haya podido ser atendido.

def check_directory(path):
    print "check_directory"
    print path
    print os.getcwd()
    for filename in os.listdir(path):
        scheduler.enqueue(path+filename)
        scheduler.process()
Documentación complementaria.

Documentación sobre la última versión liberada.