148 lines
6.8 KiB
Python
148 lines
6.8 KiB
Python
"""Annotate variable
|
|
"""
|
|
from ..i18n import _
|
|
from ..utils import normalize_family
|
|
from ..error import DictConsistencyError
|
|
|
|
|
|
CONVERT_OPTION = {'number': dict(opttype="IntOption", func=int),
|
|
'float': dict(opttype="FloatOption", func=float),
|
|
'choice': dict(opttype="ChoiceOption"),
|
|
'string': dict(opttype="StrOption"),
|
|
'password': dict(opttype="PasswordOption"),
|
|
'mail': dict(opttype="EmailOption"),
|
|
'boolean': dict(opttype="BoolOption"),
|
|
'symlink': dict(opttype="SymLinkOption"),
|
|
'filename': dict(opttype="FilenameOption"),
|
|
'date': dict(opttype="DateOption"),
|
|
'unix_user': dict(opttype="UsernameOption"),
|
|
'ip': dict(opttype="IPOption", initkwargs={'allow_reserved': True}),
|
|
'local_ip': dict(opttype="IPOption", initkwargs={'private_only': True,
|
|
'warnings_only': True}),
|
|
'netmask': dict(opttype="NetmaskOption"),
|
|
'network': dict(opttype="NetworkOption"),
|
|
'broadcast': dict(opttype="BroadcastOption"),
|
|
'netbios': dict(opttype="DomainnameOption", initkwargs={'type': 'netbios',
|
|
'warnings_only': True}),
|
|
'domain': dict(opttype="DomainnameOption", initkwargs={'type': 'domainname',
|
|
'allow_ip': False}),
|
|
'hostname': dict(opttype="DomainnameOption", initkwargs={'type': 'hostname',
|
|
'allow_ip': False}),
|
|
'web_address': dict(opttype="URLOption", initkwargs={'allow_ip': True,
|
|
'allow_without_dot': True}),
|
|
'port': dict(opttype="PortOption", initkwargs={'allow_private': True}),
|
|
'mac': dict(opttype="MACOption"),
|
|
'cidr': dict(opttype="IPOption", initkwargs={'cidr': True}),
|
|
'network_cidr': dict(opttype="NetworkOption", initkwargs={'cidr': True}),
|
|
}
|
|
|
|
|
|
FORCE_CHOICE = {'schedule': ['none', 'daily', 'weekly', 'monthly'],
|
|
'schedulemod': ['pre', 'post'],
|
|
}
|
|
|
|
|
|
RENAME_ATTIBUTES = {'description': 'doc'}
|
|
|
|
|
|
class VariableAnnotator:
|
|
"""Annotate variable
|
|
"""
|
|
def __init__(self,
|
|
objectspace,
|
|
):
|
|
self.objectspace = objectspace
|
|
if hasattr(self.objectspace.space, 'variables'):
|
|
self.convert_variable()
|
|
self.convert_separators()
|
|
|
|
def _convert_variable(self,
|
|
namespace: str,
|
|
variable,
|
|
variable_type: str,
|
|
) -> None:
|
|
if variable.type != 'symlink' and not hasattr(variable, 'description'):
|
|
variable.description = variable.name
|
|
if hasattr(variable, 'value'):
|
|
for value in variable.value:
|
|
if not hasattr(value, 'type'):
|
|
value.type = variable.type
|
|
value.name = CONVERT_OPTION.get(value.type, {}).get('func', str)(value.name)
|
|
for key, value in RENAME_ATTIBUTES.items():
|
|
setattr(variable, value, getattr(variable, key))
|
|
setattr(variable, key, None)
|
|
if variable_type == 'follower':
|
|
if variable.multi is True:
|
|
variable.multi = 'submulti'
|
|
else:
|
|
variable.multi = True
|
|
self._convert_valid_enum(namespace,
|
|
variable,
|
|
)
|
|
|
|
def _convert_valid_enum(self,
|
|
namespace,
|
|
variable,
|
|
):
|
|
"""some types are, in fact, choices
|
|
convert this kind of variables into choice
|
|
"""
|
|
if variable.type in FORCE_CHOICE:
|
|
if not hasattr(self.objectspace.space, 'constraints'):
|
|
xmlfiles = variable.xmlfiles
|
|
self.objectspace.space.constraints = self.objectspace.constraints(xmlfiles)
|
|
self.objectspace.space.constraints.namespace = namespace
|
|
if not hasattr(self.objectspace.space.constraints, 'check'):
|
|
self.objectspace.space.constraints.check = []
|
|
check = self.objectspace.check(variable.xmlfiles)
|
|
check.name = 'valid_enum'
|
|
check.target = variable.path
|
|
check.namespace = namespace
|
|
check.param = []
|
|
for value in FORCE_CHOICE[variable.type]:
|
|
param = self.objectspace.param(variable.xmlfiles)
|
|
param.text = value
|
|
check.param.append(param)
|
|
self.objectspace.space.constraints.check.append(check)
|
|
variable.type = 'string'
|
|
|
|
def convert_variable(self):
|
|
"""convert variable
|
|
"""
|
|
for families in self.objectspace.space.variables.values():
|
|
families.doc = families.name
|
|
for family in families.family.values():
|
|
family.doc = family.name
|
|
family.name = normalize_family(family.name)
|
|
if not hasattr(family, 'variable'):
|
|
continue
|
|
for variable in family.variable.values():
|
|
if isinstance(variable, self.objectspace.leadership):
|
|
# first variable is a leader, others are follower
|
|
variable_type = 'leader'
|
|
for follower in variable.variable:
|
|
self._convert_variable(families.name,
|
|
follower,
|
|
variable_type,
|
|
)
|
|
variable_type = 'follower'
|
|
else:
|
|
self._convert_variable(families.name,
|
|
variable,
|
|
'variable',
|
|
)
|
|
|
|
def convert_separators(self): # pylint: disable=C0111,R0201
|
|
for family in self.objectspace.space.variables.values():
|
|
if not hasattr(family, 'separators'):
|
|
continue
|
|
if hasattr(family.separators, 'separator'):
|
|
for separator in family.separators.separator:
|
|
option = self.objectspace.paths.get_variable_obj(separator.name)
|
|
if hasattr(option, 'separator'):
|
|
xmlfiles = self.objectspace.display_xmlfiles(separator.xmlfiles)
|
|
msg = _(f'{separator.name} already has a separator in {xmlfiles}')
|
|
raise DictConsistencyError(msg, 35)
|
|
option.separator = separator.text
|
|
del family.separators
|