class TestReceiver(unittest.TestCase):
    def setUp(self):
        # TODO : properly mock this later
        cfg = {}
        self.amr = AirtimeMessageReceiver(cfg, Manager())

    def test_supported(self):
        # Every supported message should fire something
        for event_type in self.amr.dispatch_table.keys():
            msg = { 'event_type' : event_type, 'extra_param' : 123 }
            filtered = filter_ev(msg)
            # There should be a better way to test the following without
            # patching private methods
            with patch.object(self.amr, '_execute_message') as mock_method:
                mock_method.side_effect = None
                ret = self.amr.message(msg)
                self.assertTrue(ret)
                mock_method.assert_called_with(event_type, filtered)

    def test_no_mod_message(self):
        ev = { 'event_type' : 'new_watch', 'directory' : 'something here' }
        filtered = filter_ev(ev)
        with patch.object(self.amr, '_execute_message') as mock_method:
            mock_method.return_value = "tested"
            ret = self.amr.message(ev)
            self.assertTrue( ret ) # message passing worked
            mock_method.assert_called_with(ev['event_type'], filtered)
            # test that our copy of the message does not get modified
            self.assertTrue( 'event_type' in ev )
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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 setUp(self):
     # TODO : properly mock this later
     cfg = {}
     self.amr = AirtimeMessageReceiver(cfg, Manager())
Exemplo n.º 5
0
def main(global_config, api_client_config, log_config,
        index_create_attempt=False):
    for cfg in [global_config, api_client_config]:
        if not os.path.exists(cfg): raise NoConfigFile(cfg)
    # MMConfig is a proxy around ConfigObj instances. it does not allow
    # itself users of MMConfig instances to modify any config options
    # directly through the dictionary. Users of this object muse use the
    # correct methods designated for modification
    try: config = MMConfig(global_config)
    except NoConfigFile as e:
        print("Cannot run mediamonitor2 without configuration file.")
        print("Current config path: '%s'" % global_config)
        sys.exit(1)
    except Exception as e:
        print("Unknown error reading configuration file: '%s'" % global_config)
        print(str(e))


    logging.config.fileConfig(log_config)

    #need to wait for Python 2.7 for this..
    #logging.captureWarnings(True)

    logger = logging.getLogger()
    LogWriter.override_std_err(logger)
    logfile = unicode( config['logpath'] )
    setup_logging(logfile)
    log = get_logger()

    if not index_create_attempt:
        if not os.path.exists(config['index_path']):
            log.info("Attempting to create index file:...")
            try:
                with open(config['index_path'], 'w') as f: f.write(" ")
            except Exception as e:
                log.info("Failed to create index file with exception: %s" % str(e))
            else:
                log.info("Created index file, reloading configuration:")
                main( global_config,  api_client_config, log_config,
                        index_create_attempt=True )
    else:
        log.info("Already tried to create index. Will not try again ")

    if not os.path.exists(config['index_path']):
        log.info("Index file does not exist. Terminating")

    log.info("Attempting to set the locale...")

    try:
        mmp.configure_locale(mmp.get_system_locale())
    except FailedToSetLocale as e:
        log.info("Failed to set the locale...")
        sys.exit(1)
    except FailedToObtainLocale as e:
        log.info("Failed to obtain the locale form the default path: \
                '/etc/default/locale'")
        sys.exit(1)
    except Exception as e:
        log.info("Failed to set the locale for unknown reason. \
                Logging exception.")
        log.info(str(e))

    watch_syncer = WatchSyncer(signal='watch',
                               chunking_number=config['chunking_number'],
                               timeout=config['request_max_wait'])

    apiclient = apc.AirtimeApiClient.create_right_config(log=log,
            config_path=api_client_config)

    ReplayGainUpdater.start_reply_gain(apiclient)

    sdb = AirtimeDB(apiclient)

    manager = Manager()

    airtime_receiver = AirtimeMessageReceiver(config,manager)
    airtime_notifier = AirtimeNotifier(config, airtime_receiver)

    store = apiclient.setup_media_monitor()
    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 as e:
                log.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)

    bs = Bootstrapper( db=sdb, watch_signal='watch' )

    ed = EventDrainer(airtime_notifier.connection,
            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
    tt = ToucherThread(path=config['index_path'],
                       interval=int(config['touch_interval']))

    apiclient.register_component('media-monitor')

    manager.loop()