def __init__(self): self.wm = pyinotify.WatchManager() # These two instance variables are assumed to be constant self.watch_channel = getsig('watch') self.organize_channel = getsig('organize') self.watch_listener = StoreWatchListener(signal = self.watch_channel) self.__timeout_thread = ManagerTimeout(self) self.__timeout_thread.daemon = True self.__timeout_thread.start() self.organize = { 'organize_path' : None, 'imported_path' : None, 'recorded_path' : None, 'problem_files_path' : None, 'organizer' : None, 'problem_handler' : None, 'organize_listener' : OrganizeListener(signal= self.organize_channel), } def dummy(sender, event): self.watch_move( event.path, sender=sender ) dispatcher.connect(dummy, signal=getsig('watch_move'), sender=dispatcher.Any, weak=False) def subwatch_add(sender, directory): self.__add_watch(directory, self.watch_listener) dispatcher.connect(subwatch_add, signal=getsig('add_subwatch'), sender=dispatcher.Any, weak=False) # A private mapping path => watch_descriptor # we use the same dictionary for organize, watch, store wd events. # this is a little hacky because we are unable to have multiple wd's # on the same path. self.__wd_path = {} # The following set isn't really necessary anymore. Should be # removed... self.watched_directories = set([])
def __init__(self, signal, weak=False): self.signal = getsig(signal) self.report_signal = getsig("badfile") def dummy(sender, event): self.handle(sender, event) dispatcher.connect(dummy, signal=self.signal, sender=dispatcher.Any, weak=weak)
def __init__(self, db, watch_signal): """ db - AirtimeDB object; small layer over api client last_ran - last time the program was ran. watch_signal - the signals should send events for every file on. """ self.db = db self.watch_signal = getsig(watch_signal)
def __init__(self,db,watch_signal): """ db - AirtimeDB object; small layer over api client last_ran - last time the program was ran. watch_signal - the signals should send events for every file on. """ self.db = db self.watch_signal = getsig(watch_signal)
def run(self): self.index_create() manager = Manager() apiclient = apc() config = user().mm_config WatchSyncer(signal=getsig('watch'), chunking_number=config['chunking_number'], timeout=config['request_max_wait']) airtime_receiver = AirtimeMessageReceiver(config, manager) airtime_notifier = AirtimeNotifier(config, airtime_receiver) adb = AirtimeDB(apiclient) store = { u'stor': adb.storage_path(), u'watched_dirs': adb.list_watched(), } self.logger.info("initializing mm with directories: %s" % str(store)) self.logger.info("Initing with the following airtime response:%s" % str(store)) airtime_receiver.change_storage({'directory': store[u'stor']}) for watch_dir in store[u'watched_dirs']: if not os.path.exists(watch_dir): # Create the watch_directory here try: os.makedirs(watch_dir) except Exception: self.logger.error("Could not create watch directory: '%s' \ (given from the database)." % watch_dir) if os.path.exists(watch_dir): airtime_receiver.new_watch({'directory': watch_dir}, restart=True) else: self.logger.info("Failed to add watch on %s" % str(watch_dir)) EventDrainer(airtime_notifier, interval=float(config['rmq_event_wait'])) # Launch the toucher that updates the last time when the script was # ran every n seconds. # TODO : verify that this does not interfere with bootstrapping because the # toucher thread might update the last_ran variable too fast ToucherThread(path=user().touch_file_path(), interval=int(config['touch_interval'])) success = False while not success: try: apiclient.register_component('media-monitor') success = True except Exception, e: self.logger.error(str(e)) import time time.sleep(10)
def run(self): self.index_create() manager = Manager() apiclient = apc() config = user().mm_config WatchSyncer(signal=getsig('watch'), chunking_number=config['chunking_number'], timeout=config['request_max_wait']) airtime_receiver = AirtimeMessageReceiver(config,manager) airtime_notifier = AirtimeNotifier(config, airtime_receiver) adb = AirtimeDB(apiclient) store = { u'stor' : adb.storage_path(), u'watched_dirs' : adb.list_watched(), } self.logger.info("initializing mm with directories: %s" % str(store)) self.logger.info( "Initing with the following airtime response:%s" % str(store)) airtime_receiver.change_storage({ 'directory':store[u'stor'] }) for watch_dir in store[u'watched_dirs']: if not os.path.exists(watch_dir): # Create the watch_directory here try: os.makedirs(watch_dir) except Exception: self.logger.error("Could not create watch directory: '%s' \ (given from the database)." % watch_dir) if os.path.exists(watch_dir): airtime_receiver.new_watch({ 'directory':watch_dir }, restart=True) else: self.logger.info("Failed to add watch on %s" % str(watch_dir)) EventDrainer(airtime_notifier, interval=float(config['rmq_event_wait'])) # Launch the toucher that updates the last time when the script was # ran every n seconds. # TODO : verify that this does not interfere with bootstrapping because the # toucher thread might update the last_ran variable too fast ToucherThread(path=user().touch_file_path(), interval=int(config['touch_interval'])) success = False while not success: try: apiclient.register_component('media-monitor') success = True except Exception, e: self.logger.error(str(e)) import time time.sleep(10)
def __init__(self, channel, **kwargs): self.channel = channel self.signal = getsig(self.channel.signal) self.problem_dir = self.channel.path def dummy(sender, event, exception): self.handle(sender, event, exception) dispatcher.connect(dummy, signal=self.signal, sender=dispatcher.Any, weak=False) mmp.create_dir( self.problem_dir ) self.logger.info("Initialized problem file handler. Problem dir: '%s'" % self.problem_dir)
def flush_events(self, path): """ organize the whole directory at path. (pretty much by doing what handle does to every file """ flushed = 0 for f in mmp.walk_supported(path, clean_empties=True): self.logger.info("Bootstrapping: File in 'organize' directory: \ '%s'" % f) if not mmp.file_locked(f): dispatcher.send(signal=getsig(self.signal), sender=self, event=OrganizeFile(f)) flushed += 1
def __init__(self, signal, chunking_number = 100, timeout=15): self.timeout = float(timeout) self.chunking_number = int(chunking_number) self.request_running = False self.__current_thread = None self.__requests = [] self.contractor = EventContractor() self.__reset_queue() tc = TimeoutWatcher(self, self.timeout) tc.daemon = True tc.start() super(WatchSyncer, self).__init__(signal=getsig(signal))
def flush_events(self, path): """ walk over path and send a NewFile event for every file in this directory. Not to be confused with bootstrapping which is a more careful process that involved figuring out what's in the database first. """ # Songs is a dictionary where every key is the watched the directory # and the value is a set with all the files in that directory. added = 0 for f in mmp.walk_supported(path, clean_empties=False): added += 1 dispatcher.send( signal=getsig(self.signal), sender=self, event=NewFile(f) ) self.logger.info( "Flushed watch directory. added = %d" % added )
def flush_events(self, path): """ walk over path and send a NewFile event for every file in this directory. Not to be confused with bootstrapping which is a more careful process that involved figuring out what's in the database first. """ # Songs is a dictionary where every key is the watched the directory # and the value is a set with all the files in that directory. added = 0 for f in mmp.walk_supported(path, clean_empties=False): added += 1 dispatcher.send(signal=getsig(self.signal), sender=self, event=NewFile(f)) self.logger.info("Flushed watch directory. added = %d" % added)
def __init__(self, channel, **kwargs): self.channel = channel self.signal = getsig(self.channel.signal) self.problem_dir = self.channel.path def dummy(sender, event, exception): self.handle(sender, event, exception) dispatcher.connect(dummy, signal=self.signal, sender=dispatcher.Any, weak=False) mmp.create_dir(self.problem_dir) self.logger.info( "Initialized problem file handler. Problem dir: '%s'" % self.problem_dir)
def process_delete(self, event): evt = None if event.dir: evt = DeleteDir(event) else: evt = DeleteFile(event) dispatcher.send(signal=getsig(self.signal), sender=self, event=evt) return evt
def __init__(self, signal, weak=False): self.signal = getsig(signal) self.report_signal = getsig("badfile") def dummy(sender, event): self.handle(sender,event) dispatcher.connect(dummy, signal=self.signal, sender=dispatcher.Any, weak=weak)
def process_delete_dir(self, event): evt = DeleteDir(event) dispatcher.send(signal=getsig(self.signal), sender=self, event=evt) return evt
def my_init(self, signal): self.signal = getsig(signal)
def cb(): dispatcher.send(signal=getsig("add_subwatch"), sender=self, directory=d)
def __init__(self, signal, path): self.signal = getsig(signal) self.path = path
def __init__(self, channel, target_path, recorded_path): self.channel = channel self.target_path = target_path self.recorded_path = recorded_path super(Organizer, self).__init__(signal=getsig(self.channel), weak=False)
def delete_watch_dir(self, event): e = DeleteDirWatch(event) dispatcher.send(signal=getsig('watch_move'), sender=self, event=e) dispatcher.send(signal=getsig(self.signal), sender=self, event=e)
def set_problem_files_path(self, new_path): """ Set the path where problem files should go """ self.organize["problem_files_path"] = new_path self.organize["problem_handler"] = ProblemFileHandler(PathChannel(signal=getsig("badfile"), path=new_path))
def set_problem_files_path(self, new_path): """ Set the path where problem files should go """ self.organize['problem_files_path'] = new_path self.organize['problem_handler'] = \ ProblemFileHandler( PathChannel(signal=getsig('badfile'), path=new_path) )
def process_create(self, event): evt = NewFile(event) dispatcher.send(signal=getsig(self.signal), sender=self, event=evt) return evt
def process_to_organize(self, event): dispatcher.send(signal=getsig(self.signal), sender=self, event=OrganizeFile(event))
def my_init(self, signal): self.signal = getsig(signal) class OrganizeListener(BaseListener, pyinotify.ProcessEvent, Loggable):
def cb(): self.logger.debug('cb(%s)' % d) dispatcher.send(signal=getsig("add_subwatch"), sender=self, directory=d)
def process_modify(self, event): evt = ModifyFile(event) dispatcher.send(signal=getsig(self.signal), sender=self, event=evt) return evt
def watch_signal(self): """ Return the signal string our watch_listener is reading events from """ return getsig(self.watch_listener.signal)
def process_delete(self, event): evt = None if event.dir : evt = DeleteDir(event) else : evt = DeleteFile(event) dispatcher.send(signal=getsig(self.signal), sender=self, event=evt) return evt