#!/usr/bin/env python import os import glob from watchdog.events import FileSystemEventHandler from dm.common.utility.loggingManager import LoggingManager class DmFileSystemEventHandler(FileSystemEventHandler): def __init__(self, fileSystemObserver, dataDirectory, experiment): FileSystemEventHandler.__init__(self) self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__) self.fileSystemObserver = fileSystemObserver self.dataDirectory = dataDirectory self.experiment = experiment def dispatch(self, event): FileSystemEventHandler.dispatch(self, event) def on_any_event(self, event): FileSystemEventHandler.on_any_event(self, event) self.logger.debug('File system any_event event: %s' % (event.__dict__)) def on_created(self, event): FileSystemEventHandler.on_created(self, event) self.logger.debug('File system created event: %s' % (event.__dict__)) self.processEvent(event) def on_moved(self, event): FileSystemEventHandler.on_moved(self, event) self.logger.debug('File system moved event: %s' % (event.__dict__)) def on_deleted(self, event): FileSystemEventHandler.on_deleted(self, event) self.logger.debug('File system deleted event: %s' % (event.__dict__)) def on_modified(self, event): FileSystemEventHandler.on_modified(self, event) self.logger.debug('File system directory modified event: %s' % (event.__dict__)) self.processEvent(event) def processEvent(self, event): if event.is_directory: try: files = glob.glob(os.path.join(event.src_path,'*')) self.logger.debug('Processing directory event: %s , src path: %s' % (event.__dict__, event.src_path)) if len(files) > 0: sortedFiles = sorted(files, key=os.path.getctime, reverse=True) for filePath in sortedFiles: if os.path.isfile(filePath): self.logger.debug('Latest file: %s' % (filePath)) self.fileSystemObserver.fileUpdated(filePath, self.dataDirectory, self.experiment) return self.logger.debug('No new files found in %s' % (event.src_path)) except Exception, ex: self.logger.error('Exception occured when searching for file in directory %s: %s' % (event.__dict__, ex)) else: filePath = event.src_path self.logger.debug('Processing file event: %s' % (event.__dict__)) self.fileSystemObserver.fileUpdated(filePath, self.dataDirectory, self.experiment) #################################################################### # Testing if __name__ == '__main__': import sys import time import logging from watchdog.observers import Observer from watchdog.observers.polling import PollingObserver from watchdog.observers.api import ObservedWatch from watchdog.observers.api import EventQueue from watchdog.observers.api import EventEmitter from watchdog.events import LoggingEventHandler logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') path = sys.argv[1] if len(sys.argv) > 1 else '.' eventHandler = DmFileSystemEventHandler() observer = PollingObserver() observedWatch = observer.schedule(eventHandler, path, recursive=True) print 'OBSERVED WATCH: ', observedWatch #observer.add_handler_for_watch(eventHandler2, observedWatch) #observer._clear_emitters() print observer.emitters observer.start() try: while True: time.sleep(1) print time.time() except KeyboardInterrupt: observer.stop() observer.join()