|
|
@ -14,6 +14,7 @@ from calculate.variables.loader import Datavars |
|
|
|
from .format.base_format import Format |
|
|
|
from ..utils.io_module import IOModule |
|
|
|
from collections import OrderedDict, abc |
|
|
|
from contextlib import contextmanager |
|
|
|
from ..utils.mount import Mounts |
|
|
|
import hashlib |
|
|
|
import fnmatch |
|
|
@ -357,7 +358,8 @@ class TemplateWrapper: |
|
|
|
# Если для шаблона и целевого файла никаким образом не удается |
|
|
|
# определить пакет и есть параметр append -- шаблон пропускаем. |
|
|
|
if parameter_package is None and file_package is None: |
|
|
|
if self.parameters.append and self.parameters.append != 'skip': |
|
|
|
if (self.parameters.append and self.parameters.append != 'skip' |
|
|
|
and not self.parameters.handler): |
|
|
|
raise TemplateCollisionError( |
|
|
|
"'package' parameter is not defined for" |
|
|
|
" template with 'append' parameter.") |
|
|
@ -367,6 +369,12 @@ class TemplateWrapper: |
|
|
|
self.target_package_name = file_package |
|
|
|
|
|
|
|
elif file_package is None: |
|
|
|
if self.parameters.handler: |
|
|
|
raise TemplateCollisionError(( |
|
|
|
"The template is a handler while target" |
|
|
|
" file belongs {} package").format( |
|
|
|
file_package.atom |
|
|
|
)) |
|
|
|
self.target_package_name = parameter_package |
|
|
|
|
|
|
|
elif file_package != parameter_package and self.template_type != DIR: |
|
|
@ -393,7 +401,7 @@ class TemplateWrapper: |
|
|
|
|
|
|
|
# Проверим, является ли файл защищенным. |
|
|
|
# Сначала проверяем по переменной CONFIG_PROTECT. |
|
|
|
if self.dbpkg: |
|
|
|
if self.dbpkg and not self.parameters.handler: |
|
|
|
for protected_path in self._protected_set: |
|
|
|
if self.target_path.startswith(protected_path): |
|
|
|
self.protected = True |
|
|
@ -1689,7 +1697,9 @@ class DirectoryProcessor: |
|
|
|
self.packages_file_trees = {} |
|
|
|
|
|
|
|
# Список обработчиков. |
|
|
|
self.handlers = OrderedDict() |
|
|
|
self._handlers = {} |
|
|
|
self._handlers_queue = [] |
|
|
|
self._handling = None |
|
|
|
|
|
|
|
def _get_cl_ignore_files(self) -> list: |
|
|
|
'''Метод для получения из соответствующей переменной списка паттернов |
|
|
@ -1756,11 +1766,69 @@ class DirectoryProcessor: |
|
|
|
self.processed_packages.append(self.for_package) |
|
|
|
self._merge_packages() |
|
|
|
|
|
|
|
if self._handlers_queue: |
|
|
|
self._execute_handlers() |
|
|
|
|
|
|
|
if self.template_executor.execute_files: |
|
|
|
self._run_exec_files() |
|
|
|
|
|
|
|
self.template_executor.save_changes() |
|
|
|
|
|
|
|
def _execute_handlers(self): |
|
|
|
self.output.set_info('Processing handlers...') |
|
|
|
print('CURRENT HANDLERS QUEUE:', ', '.join(self._handlers_queue)) |
|
|
|
index = 0 |
|
|
|
while index < len(self._handlers_queue): |
|
|
|
handler = self._handlers_queue[index] |
|
|
|
index += 1 |
|
|
|
if handler in self._handlers: |
|
|
|
handler_type, handler_path = self._handlers[handler] |
|
|
|
else: |
|
|
|
self.output.set_warning( |
|
|
|
f"Handler '{handler}' is not found.") |
|
|
|
continue |
|
|
|
|
|
|
|
with self._start_handling(handler): |
|
|
|
if handler_type is DIR: |
|
|
|
self.directory_tree = {} |
|
|
|
self._walk_directory_tree( |
|
|
|
handler_path, |
|
|
|
self.cl_chroot_path, |
|
|
|
ParametersContainer(), |
|
|
|
directory_tree=self.directory_tree) |
|
|
|
self.output.set_success( |
|
|
|
f"Processed handler directory '{handler}'." |
|
|
|
f"Path: '{handler_path}'") |
|
|
|
elif handler_type is FILE: |
|
|
|
handler_dir, handler_name = os.path.split(handler_path) |
|
|
|
self.template_engine.change_directory(handler_dir) |
|
|
|
parameters = ParametersContainer() |
|
|
|
|
|
|
|
handler_text = self._parse_template(parameters, |
|
|
|
handler_name, |
|
|
|
FILE, handler_dir) |
|
|
|
if handler_text is False: |
|
|
|
continue |
|
|
|
|
|
|
|
if parameters.notify: |
|
|
|
for handler_id in parameters.notify: |
|
|
|
if handler_id not in self._handlers_queue: |
|
|
|
self._handlers_queue.append(handler_id) |
|
|
|
|
|
|
|
# Корректируем путь к целевому файлу. |
|
|
|
target_file_path = self._make_target_path( |
|
|
|
self.cl_chroot_path, |
|
|
|
handler_name, |
|
|
|
parameters) |
|
|
|
|
|
|
|
# Выполняем действия, указанные в обработчике. |
|
|
|
self._execute_template(target_file_path, parameters, |
|
|
|
FILE, handler_path, |
|
|
|
template_text=handler_text) |
|
|
|
self.output.set_success( |
|
|
|
f"Processed handler file '{handler}'." |
|
|
|
f" Path: '{handler_path}'") |
|
|
|
|
|
|
|
def _merge_packages(self): |
|
|
|
'''Метод для выполнения шаблонов относящихся к пакетам, указанным во |
|
|
|
всех встреченных значениях параметра merge.''' |
|
|
@ -1877,15 +1945,26 @@ class DirectoryProcessor: |
|
|
|
|
|
|
|
# Если нужно заполнять дерево директорий, отправляем в метод для |
|
|
|
# проверки параметров package и action текущее дерево. |
|
|
|
if not self._check_package_and_action( |
|
|
|
directory_parameters, |
|
|
|
current_directory_path, |
|
|
|
directory_tree=(directory_tree if |
|
|
|
self.fill_trees else None)): |
|
|
|
# Если проверка не пройдена и включено заполнение дерева, то, |
|
|
|
# используя нынешнее состояние дерева директорий, обновляем |
|
|
|
# дерево пакета текущего шаблона директории. |
|
|
|
if self.fill_trees: |
|
|
|
if (self._handling is None |
|
|
|
and not self._check_package_and_action( |
|
|
|
directory_parameters, |
|
|
|
current_directory_path, |
|
|
|
directory_tree=(directory_tree if |
|
|
|
self.fill_trees else None))): |
|
|
|
if directory_parameters.handler: |
|
|
|
# Если директория шаблонов является обработчиком и параметр |
|
|
|
# handler -- не унаследован, что свидетельствует о том, |
|
|
|
# что директория не расположена внутри другой |
|
|
|
# директории-обработчика добавляем ее в словарь |
|
|
|
# обработчиков и пропускаем ее. |
|
|
|
self._handlers.update({directory_parameters.handler: |
|
|
|
(DIR, current_directory_path)}) |
|
|
|
if self.fill_trees: |
|
|
|
directory_tree = {} |
|
|
|
elif self.fill_trees: |
|
|
|
# Если проверка не пройдена и включено заполнение дерева, |
|
|
|
# то, используя нынешнее состояние дерева директорий, |
|
|
|
# обновляем дерево пакета текущего шаблона директории. |
|
|
|
self._update_package_tree(directory_parameters.package, |
|
|
|
directory_tree[directory_name]) |
|
|
|
# Перед выходом из директории очищаем текущий уровень |
|
|
@ -1893,11 +1972,23 @@ class DirectoryProcessor: |
|
|
|
directory_tree = {} |
|
|
|
return |
|
|
|
|
|
|
|
if self._handling is not None and directory_parameters.handler: |
|
|
|
if directory_parameters.handler != self._handling: |
|
|
|
self.output.set_error("'handler' parameter is not" |
|
|
|
" available in other handler" |
|
|
|
f" '{self._handling}'") |
|
|
|
return |
|
|
|
|
|
|
|
# Если есть параметр merge -- сохраняем присутствующие в нем пакеты |
|
|
|
# для последующей обработки. |
|
|
|
if self.for_package and directory_parameters.merge: |
|
|
|
self.packages_to_merge.extend(directory_parameters.merge) |
|
|
|
|
|
|
|
if directory_parameters.notify: |
|
|
|
for handler_id in directory_parameters.notify: |
|
|
|
if handler_id not in self._handlers_queue: |
|
|
|
self._handlers_queue.append(handler_id) |
|
|
|
|
|
|
|
# Если присутствует параметр package -- проверяем, изменился ли он |
|
|
|
# и был ли задан до этого. Если не был задан или изменился, меняем |
|
|
|
# текущий пакет ветки шаблонов на этот. |
|
|
@ -1909,20 +2000,6 @@ class DirectoryProcessor: |
|
|
|
else: |
|
|
|
# Если .calculate_directory отсутствует -- создаем директорию, |
|
|
|
# используя унаследованные параметры и имя самой директории. |
|
|
|
if not self._check_package_and_action( |
|
|
|
directory_parameters, |
|
|
|
current_directory_path, |
|
|
|
directory_tree=(directory_tree if |
|
|
|
self.fill_trees else None)): |
|
|
|
# Обновляем дерево директорий для данного пакета. |
|
|
|
if self.fill_trees: |
|
|
|
self._update_package_tree(directory_parameters.package, |
|
|
|
directory_tree[directory_name]) |
|
|
|
# Перед выходом из директории очищаем текущий уровень |
|
|
|
# дерева. |
|
|
|
directory_tree = {} |
|
|
|
return |
|
|
|
|
|
|
|
# Для того чтобы директория была создана, просто добавляем параметр |
|
|
|
# append = join. |
|
|
|
directory_parameters.set_parameter({'append': 'join'}) |
|
|
@ -1971,18 +2048,36 @@ class DirectoryProcessor: |
|
|
|
|
|
|
|
# Если находимся на стадии заполнения дерева директорий -- |
|
|
|
# проверяем параметры package и action с заполнением дерева. |
|
|
|
if not self._check_package_and_action( |
|
|
|
if (self._handling is None |
|
|
|
and not self._check_package_and_action( |
|
|
|
template_parameters, |
|
|
|
template_path, |
|
|
|
directory_tree=(directory_tree[directory_name] if |
|
|
|
self.fill_trees else None)): |
|
|
|
self.fill_trees else None))): |
|
|
|
if template_parameters.handler: |
|
|
|
# Если директория шаблонов является обработчиком -- |
|
|
|
# добавляем ее в словарь обработчиков и пропускаем ее. |
|
|
|
self._handlers.update({template_parameters.handler: |
|
|
|
(FILE, template_path)}) |
|
|
|
continue |
|
|
|
|
|
|
|
if self._handling is not None and template_parameters.handler: |
|
|
|
if template_parameters.handler != self._handling: |
|
|
|
self.output.set_error("'handler' parameter is not" |
|
|
|
" available in other handler" |
|
|
|
f" '{self._handling}'") |
|
|
|
continue |
|
|
|
|
|
|
|
# Если есть параметр merge добавляем его содержимое в список |
|
|
|
# пакетов для последующей обработки. |
|
|
|
if self.for_package and template_parameters.merge: |
|
|
|
self.packages_to_merge.extend(template_parameters.merge) |
|
|
|
|
|
|
|
if template_parameters.notify: |
|
|
|
for handler_id in template_parameters.notify: |
|
|
|
if handler_id not in self._handlers_queue: |
|
|
|
self._handlers_queue.append(handler_id) |
|
|
|
|
|
|
|
# Корректируем путь к целевому файлу. |
|
|
|
target_file_path = self._make_target_path(current_target_path, |
|
|
|
template_name, |
|
|
@ -2216,6 +2311,12 @@ class DirectoryProcessor: |
|
|
|
каталогов с шаблонами. Если среди аргументов указано также |
|
|
|
дерево каталогов, то в случае несовпадения значений package для файла |
|
|
|
или директории, им в дереве присваивается значение None.''' |
|
|
|
if parameters.handler: |
|
|
|
print('\nHANDLER WAS FOUND:', template_path) |
|
|
|
print('NOW HANDLERS:', *list(self._handlers.keys())) |
|
|
|
print() |
|
|
|
return False |
|
|
|
|
|
|
|
if parameters.append != 'skip' or parameters.action: |
|
|
|
if not parameters.action: |
|
|
|
self.output.set_warning( |
|
|
@ -2233,10 +2334,6 @@ class DirectoryProcessor: |
|
|
|
template_path)) |
|
|
|
return False |
|
|
|
|
|
|
|
if parameters.handler: |
|
|
|
self.handlers.update({parameters.handler: template_path}) |
|
|
|
return False |
|
|
|
|
|
|
|
if self.for_package: |
|
|
|
if not parameters.package: |
|
|
|
if self.for_package is not NonePackage: |
|
|
@ -2260,3 +2357,11 @@ class DirectoryProcessor: |
|
|
|
return False |
|
|
|
|
|
|
|
return True |
|
|
|
|
|
|
|
@contextmanager |
|
|
|
def _start_handling(self, handler): |
|
|
|
try: |
|
|
|
self._handling = handler |
|
|
|
yield self |
|
|
|
finally: |
|
|
|
self._handling = None |