|
|
|
@ -13,10 +13,14 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
_initialized = False
|
|
|
|
|
|
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
|
|
|
if not cls._initialized:
|
|
|
|
|
cls._initialize_parser()
|
|
|
|
|
return super().__new__(cls)
|
|
|
|
|
|
|
|
|
|
def __init__(self, document_text: str,
|
|
|
|
|
ignore_comments=False,
|
|
|
|
|
join_before=False,
|
|
|
|
|
comment_symbol=''):
|
|
|
|
|
join_before=False):
|
|
|
|
|
processing_methods = [self._parse_comment_line,
|
|
|
|
|
self._parse_type_line,
|
|
|
|
|
self._parse_access_line,
|
|
|
|
@ -43,8 +47,6 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
self._current_type = ('', 'global')
|
|
|
|
|
|
|
|
|
|
self._last_comments_list = []
|
|
|
|
|
if not self._initialized:
|
|
|
|
|
self._initialize_parser()
|
|
|
|
|
|
|
|
|
|
if document_text == '':
|
|
|
|
|
self._document_dictionary = OrderedDict()
|
|
|
|
@ -54,6 +56,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def _initialize_parser(cls):
|
|
|
|
|
'''Метод для инициализации парсеров.'''
|
|
|
|
|
cls._comment_line = originalTextFor(
|
|
|
|
|
Literal('#')
|
|
|
|
|
+ ZeroOrMore(Word(printables
|
|
|
|
@ -215,6 +218,9 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
cls._initialized = True
|
|
|
|
|
|
|
|
|
|
def _get_list_of_logic_lines(self, text):
|
|
|
|
|
'''Метод для разбиения исходного документа на список логических строк,
|
|
|
|
|
то есть с учетом того, что строка ldap файла начинающаяся с отступа
|
|
|
|
|
является продолжением предыдущей.'''
|
|
|
|
|
list_of_lines = []
|
|
|
|
|
lines_to_join = []
|
|
|
|
|
for line in text.splitlines():
|
|
|
|
@ -239,6 +245,8 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
return list_of_lines
|
|
|
|
|
|
|
|
|
|
def _parse_type_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк с объявлением областей backend или database
|
|
|
|
|
'''
|
|
|
|
|
try:
|
|
|
|
|
self._item_to_add = OrderedDict()
|
|
|
|
|
parsing_result = self._type_line.parseString(line)
|
|
|
|
@ -273,8 +281,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_notunique_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк c директивами неуникальными для секции.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
Их приходится парсить полностью как ключ словаря.'''
|
|
|
|
|
try:
|
|
|
|
|
self._item_to_add = OrderedDict()
|
|
|
|
|
parsing_result = self._not_unique_parser.parseString(line)
|
|
|
|
@ -293,9 +300,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_access_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк содержащих конструкцию
|
|
|
|
|
access to <what> by <who>|<access level>|<control>.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
access to <what> by <who>|<access level>|<control>.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._access_line_parser.parseString(line)
|
|
|
|
|
self._match = True
|
|
|
|
@ -335,9 +340,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_access_line_to_delete(self, line):
|
|
|
|
|
'''Метод для парсинга строк, предписывающих удаление конструкций
|
|
|
|
|
access to, если указано только ее название и значение What.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
access to, если указано только ее название и значение What.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._access_line_to_delete_parser.parseString(
|
|
|
|
|
line
|
|
|
|
@ -357,9 +360,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_syncrepl_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк содержащих конструкцию syncrepl
|
|
|
|
|
rep=<ReplicaID>.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
rep=<ReplicaID>.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._syncrepl_line_parser.parseString(line)
|
|
|
|
|
self._match = True
|
|
|
|
@ -398,9 +399,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
def _parse_syncrepl_line_to_delete(self, line):
|
|
|
|
|
'''Метод для парсинга строк, предписывающих удаление конструкций
|
|
|
|
|
syncrepl rid=<ReplicaID>, если указано только ее название и значение
|
|
|
|
|
ReplicaID.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
ReplicaID.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._syncrepl_line_to_delete_parser.parseString(
|
|
|
|
|
line
|
|
|
|
@ -419,9 +418,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
def _parse_index_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк с директивами index.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
'''Метод для парсинга строк с директивами index.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._index_line_parser.parseString(line)
|
|
|
|
|
self._match = True
|
|
|
|
@ -438,9 +435,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_index_line_to_delete(self, line):
|
|
|
|
|
'''Метод для парсинга строк, предписывающих удаление директив index,
|
|
|
|
|
если указано только из имя, но отсутвует значение.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
если указано только из имя, но отсутвует значение.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._index_line_to_delete_parser.parseString(
|
|
|
|
|
line
|
|
|
|
@ -460,9 +455,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_plain_directive_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк с простыми уникальными для секции
|
|
|
|
|
директивами.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
директивами.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._directive_line_parser.parseString(line)
|
|
|
|
|
self._match = True
|
|
|
|
@ -478,9 +471,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
|
|
|
|
|
def _parse_plain_directive_line_to_delete(self, line):
|
|
|
|
|
'''Метод для парсинга строк, предписывающих удаление простых уникальных
|
|
|
|
|
директив, если указано только их имя, но отсутствует значение.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.
|
|
|
|
|
'''
|
|
|
|
|
директив, если указано только их имя, но отсутствует значение.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._directive_line_to_delete_parser.parseString(
|
|
|
|
|
line
|
|
|
|
@ -501,8 +492,7 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
def _parse_comment_line(self, line):
|
|
|
|
|
'''Метод для парсинга строк с комментариями и добавления их в список
|
|
|
|
|
комментариев _last_comments_list, предназначенный для сбора
|
|
|
|
|
комментариев и последующего их присваивания параметрам и секциям.
|
|
|
|
|
Аргументы: line -- строка, которую нужно распарсить.'''
|
|
|
|
|
комментариев и последующего их присваивания параметрам и секциям.'''
|
|
|
|
|
try:
|
|
|
|
|
parsing_result = self._comment_line.parseString(line)
|
|
|
|
|
self._match = True
|
|
|
|
@ -522,6 +512,8 @@ class LDAPFormat(BaseFormat):
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
def _finish_method(self):
|
|
|
|
|
'''Метод для завершения парсинга. В данном случае добавляет в итоговый
|
|
|
|
|
словарь последнюю разобранную область.'''
|
|
|
|
|
self._item_to_add = OrderedDict()
|
|
|
|
|
if self._current_type in self._document_dictionary.keys():
|
|
|
|
|
self._document_dictionary[self._current_type].update(
|
|
|
|
|