|
|
|
@ -18,8 +18,12 @@ import copy
|
|
|
|
|
import re
|
|
|
|
|
import os
|
|
|
|
|
import stat
|
|
|
|
|
from typing import Union, Any, List
|
|
|
|
|
|
|
|
|
|
from typing import (
|
|
|
|
|
Union,
|
|
|
|
|
Any,
|
|
|
|
|
List,
|
|
|
|
|
Tuple
|
|
|
|
|
)
|
|
|
|
|
from ..utils.package import (
|
|
|
|
|
PackageAtomName,
|
|
|
|
|
PackageAtomParser,
|
|
|
|
@ -151,7 +155,7 @@ class ParametersProcessor:
|
|
|
|
|
format_is_inspected: bool = False
|
|
|
|
|
|
|
|
|
|
chmod_value_regular = re.compile(
|
|
|
|
|
r'([r-][w-][x-])([r-][w-][x-])([r-][w-][x-])')
|
|
|
|
|
r'([r-][w-][Xx-])([r-][w-][Xx-])([r-][w-][Xx-])')
|
|
|
|
|
|
|
|
|
|
def __init__(self,
|
|
|
|
|
parameters_container: Union["ParametersContainer",
|
|
|
|
@ -398,17 +402,17 @@ class ParametersProcessor:
|
|
|
|
|
raise IncorrectParameter(
|
|
|
|
|
"'restart' parameter value is not correct")
|
|
|
|
|
|
|
|
|
|
def check_stop_parameter(self, parameter_value):
|
|
|
|
|
def check_stop_parameter(self, parameter_value: Any):
|
|
|
|
|
if not parameter_value and isinstance(parameter_value, bool):
|
|
|
|
|
raise IncorrectParameter("'stop' parameter value is empty")
|
|
|
|
|
return parameter_value
|
|
|
|
|
|
|
|
|
|
def check_start_parameter(self, parameter_value):
|
|
|
|
|
def check_start_parameter(self, parameter_value: Any):
|
|
|
|
|
if not parameter_value and isinstance(parameter_value, bool):
|
|
|
|
|
raise IncorrectParameter("'start' parameter value is empty")
|
|
|
|
|
return parameter_value
|
|
|
|
|
|
|
|
|
|
def check_run_parameter(self, parameter_value):
|
|
|
|
|
def check_run_parameter(self, parameter_value: Any):
|
|
|
|
|
if self.template_type == DIR:
|
|
|
|
|
raise IncorrectParameter("'run' parameter is not available in"
|
|
|
|
|
" directory templates")
|
|
|
|
@ -421,7 +425,7 @@ class ParametersProcessor:
|
|
|
|
|
" found")
|
|
|
|
|
return interpreter_path
|
|
|
|
|
|
|
|
|
|
def check_exec_parameter(self, parameter_value):
|
|
|
|
|
def check_exec_parameter(self, parameter_value: Any):
|
|
|
|
|
if self.template_type == DIR:
|
|
|
|
|
raise IncorrectParameter("'exec' parameter is not available in"
|
|
|
|
|
" directory templates")
|
|
|
|
@ -434,38 +438,47 @@ class ParametersProcessor:
|
|
|
|
|
" found")
|
|
|
|
|
return interpreter_path
|
|
|
|
|
|
|
|
|
|
def check_chown_parameter(self, parameter_value):
|
|
|
|
|
def check_chown_parameter(self, parameter_value: Any):
|
|
|
|
|
if not parameter_value or isinstance(parameter_value, bool):
|
|
|
|
|
raise IncorrectParameter("'chown' parameter value is empty.")
|
|
|
|
|
parameter_value = self.get_chown_values(parameter_value)
|
|
|
|
|
return parameter_value
|
|
|
|
|
|
|
|
|
|
def check_chmod_parameter(self, parameter_value):
|
|
|
|
|
print('check chmod value:', parameter_value)
|
|
|
|
|
def check_chmod_parameter(self, parameter_value: Any) -> Union[int, tuple]:
|
|
|
|
|
result = self.chmod_value_regular.search(parameter_value)
|
|
|
|
|
if result:
|
|
|
|
|
print("chmod is alphas")
|
|
|
|
|
parameter_value = ''
|
|
|
|
|
for group_number in range(3):
|
|
|
|
|
current_group = result.groups()[group_number]
|
|
|
|
|
num = ''
|
|
|
|
|
for sym_number in range(3):
|
|
|
|
|
if current_group[sym_number] != '-':
|
|
|
|
|
num = num + '1'
|
|
|
|
|
else:
|
|
|
|
|
num = num + '0'
|
|
|
|
|
|
|
|
|
|
parameter_value = parameter_value + num
|
|
|
|
|
return int(parameter_value, 2)
|
|
|
|
|
return self._translate_symbol_chmod(result)
|
|
|
|
|
elif parameter_value.isdigit():
|
|
|
|
|
parameter_value = int(parameter_value, 8)
|
|
|
|
|
print("chmod is digits:", parameter_value)
|
|
|
|
|
|
|
|
|
|
return parameter_value
|
|
|
|
|
else:
|
|
|
|
|
raise IncorrectParameter("'chmod' parameter value is not correct")
|
|
|
|
|
|
|
|
|
|
def check_source_parameter(self, parameter_value):
|
|
|
|
|
def _translate_symbol_chmod(self, result) -> Tuple[int, int]:
|
|
|
|
|
'''Метод для перевода буквенного значения chmod в числовое.
|
|
|
|
|
Возвращает кортеж (chmod, x_mask):
|
|
|
|
|
chmod -- число, полученное из последовательности битов, где
|
|
|
|
|
"r", "w" и "x" -> 1, "-" и "X" -> 0;
|
|
|
|
|
x_mask -- маска, полученная из последовательности битов, где
|
|
|
|
|
"X" -> 1, "r", "w", "-" и "x" -> 0. Она необходима для получения
|
|
|
|
|
значения chmod для файлов.'''
|
|
|
|
|
chmod = ''
|
|
|
|
|
x_mask = ''
|
|
|
|
|
for group_index in range(3):
|
|
|
|
|
group = result.groups()[group_index]
|
|
|
|
|
for sym_index in range(3):
|
|
|
|
|
if group[sym_index] in {'-', 'X'}:
|
|
|
|
|
chmod = chmod + '0'
|
|
|
|
|
else:
|
|
|
|
|
chmod = chmod + '1'
|
|
|
|
|
|
|
|
|
|
if group[sym_index] == 'X':
|
|
|
|
|
x_mask = x_mask + "1"
|
|
|
|
|
else:
|
|
|
|
|
x_mask = x_mask + "0"
|
|
|
|
|
return (int(chmod, 2), int(x_mask, 2))
|
|
|
|
|
|
|
|
|
|
def check_source_parameter(self, parameter_value: Any):
|
|
|
|
|
if not parameter_value or isinstance(parameter_value, bool):
|
|
|
|
|
raise IncorrectParameter("'source' parameter value is empty")
|
|
|
|
|
|
|
|
|
@ -497,7 +510,7 @@ class ParametersProcessor:
|
|
|
|
|
|
|
|
|
|
return os.path.normpath(real_path)
|
|
|
|
|
|
|
|
|
|
def check_env_parameter(self, parameter_value):
|
|
|
|
|
def check_env_parameter(self, parameter_value: Any):
|
|
|
|
|
env_set = set()
|
|
|
|
|
|
|
|
|
|
for env_value in parameter_value.split(','):
|
|
|
|
@ -525,20 +538,20 @@ class ParametersProcessor:
|
|
|
|
|
|
|
|
|
|
return env_set
|
|
|
|
|
|
|
|
|
|
def check_force_parameter(self, parameter_value):
|
|
|
|
|
def check_force_parameter(self, parameter_value: Any):
|
|
|
|
|
if isinstance(parameter_value, bool):
|
|
|
|
|
return parameter_value
|
|
|
|
|
else:
|
|
|
|
|
raise IncorrectParameter("'force' parameter value is not bool")
|
|
|
|
|
|
|
|
|
|
def check_autoupdate_parameter(self, parameter_value):
|
|
|
|
|
def check_autoupdate_parameter(self, parameter_value: Any):
|
|
|
|
|
if isinstance(parameter_value, bool):
|
|
|
|
|
return parameter_value
|
|
|
|
|
else:
|
|
|
|
|
raise IncorrectParameter(
|
|
|
|
|
"'autoupdate' parameter value is not bool.")
|
|
|
|
|
|
|
|
|
|
def check_format_parameter(self, parameter_value):
|
|
|
|
|
def check_format_parameter(self, parameter_value: Any):
|
|
|
|
|
if self.template_type == DIR:
|
|
|
|
|
raise IncorrectParameter("'format' parameter is redundant for"
|
|
|
|
|
" directory templates.")
|
|
|
|
@ -551,13 +564,13 @@ class ParametersProcessor:
|
|
|
|
|
raise IncorrectParameter("'format' parameter must be string value not"
|
|
|
|
|
f" {type(parameter_value)}.")
|
|
|
|
|
|
|
|
|
|
def check_handler_parameter(self, parameter_value):
|
|
|
|
|
def check_handler_parameter(self, parameter_value: Any):
|
|
|
|
|
if not isinstance(parameter_value, str):
|
|
|
|
|
raise IncorrectParameter("'handler' parameter must be string"
|
|
|
|
|
f" value not {type(parameter_value)}.")
|
|
|
|
|
return parameter_value
|
|
|
|
|
|
|
|
|
|
def check_notify_parameter(self, parameter_value):
|
|
|
|
|
def check_notify_parameter(self, parameter_value: Any):
|
|
|
|
|
if isinstance(parameter_value, list):
|
|
|
|
|
return parameter_value
|
|
|
|
|
elif isinstance(parameter_value, str):
|
|
|
|
@ -627,11 +640,11 @@ class ParametersProcessor:
|
|
|
|
|
def check_postparse_handler(self, parameter_value):
|
|
|
|
|
if self._parameters_container.merge:
|
|
|
|
|
raise IncorrectParameter("'merge' parameter is not available"
|
|
|
|
|
" in handler templates.")
|
|
|
|
|
" in handler templates")
|
|
|
|
|
elif (self._parameters_container.package and
|
|
|
|
|
not self._parameters_container.is_inherited('package')):
|
|
|
|
|
raise IncorrectParameter("'package' parameter is not available"
|
|
|
|
|
" in handler templates.")
|
|
|
|
|
" in handler templates")
|
|
|
|
|
|
|
|
|
|
def check_postparse_package(self, parameter_value):
|
|
|
|
|
groups = []
|
|
|
|
|