Ejemplo n.º 1
0
    def __init__(self, *args, **kwargs):
        """
        Конструктор.
        """
        # Менеджер настроек
        self.settings_manager = settings.icSettingsManager()

        # Словарь зарегистрированных объектов
        self.objects = dict()

        # После создания объекта прописываем его в конфиге для доступа из прикладного функционала
        config.set_cfg_var('ENGINE', self)
Ejemplo n.º 2
0
 def loadSectionList(self, ini_settings, section, name, cfg_name):
     """
     Загрузка списка секций из INI файла.
     @param ini_settings: Словарь содержания INI файла.
     @param section: Секция источника.
     @param name: Наименование параметра источника данных запрашиваемого списка секций.
     @param cfg_name: Имя списка секций в сонфигурационном файле.
     @return: True/False.
     """
     ini_names = ini_settings.get(section, dict()).get(name, list())
     cfg_sections = list()
     for ini_name in ini_names:
         # cfg_section = ini_settings.get(ini_name, dict())
         cfg_section = self.buildSection(ini_settings, ini_name)
         cfg_section['name'] = ini_name
         log.debug(u'Собранная секция %s' % cfg_section.keys())
         cfg_sections.append(cfg_section)
     config.set_cfg_var(cfg_name, cfg_sections)
Ejemplo n.º 3
0
    def loadSettings(self, sINIFileName=None):
        """
        Загрузка настроек из INI файла.
        @type sINIFileName: C{string}
        @param sINIFileName: Полное имя конфигурационного файла.
            Если None, то генерируется.
        @return: True - загрузка параметров прошла успешно,
            False - загрузка не прошла по какой-либо причине.
        """
        if sINIFileName is None:
            sINIFileName = self.genINIFileName()

        if os.path.exists(sINIFileName):
            settings = ini.INI2Dict(sINIFileName)
            settings = ini.toUnicodeINIValues(settings)
            if settings:
                # Инициализация переменных настроек
                self.loadSectionList(settings, 'OPTIONS', 'sources', 'SOURCES')
                self.loadSectionList(settings, 'OPTIONS', 'destinations',
                                     'DESTINATIONS')
                self.loadSectionList(settings, 'OPTIONS', 'queue', 'QUEUE')

                if 'run_mode' in settings.get('OPTIONS', dict()):
                    config.set_cfg_var(
                        'RUN_MODE',
                        settings.get('OPTIONS',
                                     dict()).get('run_mode', 'debug'))

                config.set_cfg_var(
                    'TICK_PERIOD',
                    settings.get('OPTIONS', dict()).get('tick', 300))

                log.info('LOAD SETTINGS')
                if utils.isDebugMode():
                    self.printSettings(settings)

                return True
            else:
                log.warning('Don\'t define settings. Ini file name: %s' %
                            sINIFileName)
        return False
Ejemplo n.º 4
0
        print(u'For help use --help option')
        sys.exit(2)

    registrator = engine.icRegistrator()

    for option, arg in options:
        if option in ('-h', '--help', '-?'):
            print(__doc__)
            sys.exit(0)
        elif option in ('-v', '--version'):
            print(u'icRegister version: %s' %
                  '.'.join([str(v) for v in __version__]))
            sys.exit(0)
        elif option in ('-d', '--debug'):
            # Установка режима отладки
            config.set_cfg_var('DEBUG_MODE', True)
        elif option in ('-l', '--log'):
            # Установка режима журналирования
            config.set_cfg_var('LOG_MODE', True)
        elif option in ('--alone', ):
            processes_txt = commands.getoutput(PROCESS_LIST_COMMAND)
            processes = processes_txt.strip().split('\n')
            find_processes = [
                process for process in processes
                if ALONE_CHECK_COMMAND in process
            ]
            if len(find_processes) > 1:
                print(u'Monopoly execute mode not imposible')
                print(u'Fileloader processes:')
                for process in find_processes:
                    print(process)
Ejemplo n.º 5
0
    def run(self, mode=None):
        """
        Основная процедура запуска регистрации.
        @param mode: Режим запуска регистратора.
        @return: True/False.
        """
        # Проинициализировать конфигурационные переменные в соответствии с настройками.
        self.init_settings()

        if mode is None:
            mode = config.get_cfg_var('RUN_MODE')

        if mode == config.RUN_MODE_SINGLE:
            # Одноразовый запуск
            self.run_tick()
            config.set_cfg_var('TICK_DT_STOP', datetime.datetime.now())

        elif mode == config.RUN_MODE_LOOP:
            # Запуск регистратора в цикле

            # Запуск цикла обработки
            do_exit = False
            tick = config.get_cfg_var('TICK_PERIOD')
            log.info(u'Период цикла обработки: <%d>...' % tick)
            i_tick = 1
            while not do_exit:
                start_tick = time.time()
                end_tick = start_tick + tick

                self.run_tick(i_tick)

                if tick > 0:
                    log.warning(u'Для выхода нажмите <ESC>')
                    cur_time = time.time()
                    while end_tick > cur_time:
                        ch_key = keyboardfunc.getchAsync()
                        if keyboardfunc.same_key(ch_key, keyboardfunc.ESC_KEY):
                            do_exit = True
                            log.info(u'Выход из цикла обработки')
                            break
                        cur_time = time.time()
                        # log.debug(u'test tick %d : %d' % (cur_time, end_tick))
                else:
                    log.warning(u'Для выхода нажмите <Ctrl+C>')

                config.set_cfg_var('TICK_DT_STOP', datetime.datetime.now())
                log.info(u'...Конец периода цикла обработки [%d]' % i_tick)
                i_tick += 1

        elif mode == config.RUN_MODE_SRC_DIAGNOSTIC:
            # Запуск регистратора в режиме диагностики источников данных
            self.do_diagnostic(config.SOURCES)

        elif mode == config.RUN_MODE_DST_DIAGNOSTIC:
            # Запуск регистратора в режиме диагностики получателя данных
            self.do_diagnostic(config.DESTINATIONS)

        elif mode == config.RUN_MODE_DEBUG:
            # Запуск в режиме отладки
            for src_properties in config.SOURCES:
                src_obj = self.create_src(**src_properties)
                if src_obj:
                    result = src_obj.read_as_dict(*src_obj.values)
                    log.info(u'Результат чтения данных из контроллера %s' %
                             result)
        else:
            log.warning(
                u'Режим запуска регистратра <%s> не поддерживается системой' %
                mode)
        return False
Ejemplo n.º 6
0
    def run_tick(self, n_tick=1):
        """
        Запуск всех объектов для выполнения 1 тика.
        @param n_tick: Номер текущего тика.
        @return: True/False.
        """
        try:
            config.set_cfg_var('TICK_DT_START', datetime.datetime.now())
            # ВНИМАНИЕ! Необходимо с начале каждого тика надо создавать объекты
            # чтобы не контролировать актуальность их состояния
            log.info(u'Создание объектов...')
            src_objects = list()
            for properties in config.SOURCES:
                # Создаем объекты источников данных
                obj = self.create(**properties)
                if obj:
                    src_objects.append(obj)
            dst_objects = list()
            for properties in config.DESTINATIONS:
                # Создаем объекты получателей данных
                obj = self.create(**properties)
                if obj:
                    dst_objects.append(obj)

            if not config.QUEUE:
                log.info(u'Порядок обработки штатный')
                log.info(u'Начало обработки...')
                journal.write_msg(u'Начало обработки...')
                for src_object in src_objects:
                    log.info(u'Чтение данных из <%s>' % src_object.name)
                    journal.write_msg(u'\tЧтение данных из <%s>' %
                                      src_object.description)
                    src_object.read_as_dict()
                for dst_object in dst_objects:
                    log.info(u'Запись данных в <%s>' % dst_object.name)
                    journal.write_msg(u'\tЗапись данных в <%s>' %
                                      dst_object.description)
                    dst_object.write_as_dict()
                log.info(u'...Конец обработки [%d]' % n_tick)
                journal.write_msg(u'...Конец обработки')
            else:
                log.info(u'Порядок обработки задан явно %s' % config.QUEUE)
                log.info(u'Начало обработки...')
                journal.write_msg(u'Начало обработки...')
                for obj_properties in config.QUEUE:
                    obj_name = obj_properties['name']
                    obj = self.find_object(obj_name)
                    if obj:
                        obj_type = obj_properties['type']
                        if obj_type in src.DATA_SOURCES.keys():
                            # Это источник данных
                            log.info(u'Чтение данных из <%s>' % obj.name)
                            journal.write_msg(u'\tЧтение данных из <%s>' %
                                              obj.description)
                            obj.read_as_dict()
                        elif obj_type in dst.DATA_DESTINATIONS.keys():
                            # Это получатель данных
                            log.info(u'Запись данных в <%s>' % obj.name)
                            journal.write_msg(u'\tЗапись данных в <%s>' %
                                              obj.description)
                            obj.write_as_dict()
                        else:
                            # Вообще не определенный тип
                            log.warning(
                                u'Не поддерживаемый тип <%s> объекта <%s>' %
                                (obj_type, obj_name))
                log.info(u'...Конец обработки [%d]' % n_tick)
                journal.write_msg(u'...Конец обработки')

            # Сбросить кеш состояния в конце такта
            # obj_list = src_objects + dst_objects
            # self.clear_all_state_chaches(*obj_list)
            return True
        except:
            log.fatal(u'Ошибка выполнения тика [%d]' % n_tick)
        return False