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:
- on_any_event
- on_created
- on_modified
- on_moved
- 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.