<file> is not necessarily a template + add <override> tag to override systemd service

This commit is contained in:
2020-04-23 07:34:34 +02:00
parent d47d1fde62
commit 5b4b43d5f4
61 changed files with 438 additions and 57 deletions

View File

@ -242,8 +242,11 @@ class ServiceAnnotator:
)
return variable
def _update_override(self, file_, index, service_path):
self._update_file(file_, index, service_path)
def _update_file(self, file_, index, service_path):
if file_.file_type == "UnicodeOption":
if not hasattr(file_, 'file_type') or file_.file_type == "UnicodeOption":
if not hasattr(file_, 'source'):
file_.source = basename(file_.name)
elif not hasattr(file_, 'source'):

View File

@ -66,7 +66,7 @@
<!ELEMENT services (service*)>
<!ELEMENT service ((port* | tcpwrapper* | ip* | interface* | package* | file* | digitalcertificate*)*) >
<!ELEMENT service ((port* | tcpwrapper* | ip* | interface* | package* | file* | digitalcertificate* | override*)*) >
<!ATTLIST service name CDATA #REQUIRED>
<!ATTLIST service method (systemd|none) "systemd">
@ -109,6 +109,7 @@
<!ATTLIST file mkdir (True|False) "False">
<!ATTLIST file rm (True|False) "False">
<!ATTLIST file redefine (True|False) "False">
<!ATTLIST file templating (True|False) "True">
<!ELEMENT digitalcertificate EMPTY>
<!ATTLIST digitalcertificate name CDATA #REQUIRED >
@ -118,6 +119,10 @@
<!ATTLIST digitalcertificate type CDATA #REQUIRED >
<!ATTLIST digitalcertificate ca CDATA #REQUIRED >
<!ELEMENT override EMPTY>
<!ATTLIST override name CDATA #REQUIRED >
<!ATTLIST override templating (True|False) "True">
<!ELEMENT variables (family*, separators*)>
<!ELEMENT family (#PCDATA | variable)*>
<!ATTLIST family name CDATA #REQUIRED>

View File

@ -261,11 +261,14 @@ class CreoleTemplateEngine:
eosfunc_file: str,
distrib_dir: str,
tmp_dir: str,
dest_dir:str) -> None:
dest_dir: str,
tmpfile_name: str,
) -> None:
self.config = config
self.dest_dir = dest_dir
self.tmp_dir = tmp_dir
self.distrib_dir = distrib_dir
self.tmpfile_name = tmpfile_name
eos = {}
if eosfunc_file is not None:
eosfunc = imp.load_source('eosfunc', eosfunc_file)
@ -342,6 +345,7 @@ class CreoleTemplateEngine:
self.patch_template(filename)
def process(self,
source: str,
destfilename: str,
filevar: Dict,
variable: Any):
@ -350,8 +354,7 @@ class CreoleTemplateEngine:
# full path of the destination file
log.info(_(f"Cheetah processing: '{destfilename}'"))
try:
cheetah_template = CheetahTemplate(join(self.tmp_dir,
filevar['source']),
cheetah_template = CheetahTemplate(source,
self.creole_variables_dict,
self.eosfunc,
destfilename,
@ -368,19 +371,24 @@ class CreoleTemplateEngine:
def instance_file(self,
filevar: Dict,
systemd_rights: list) -> None:
systemd_rights: list,
override: bool,
service_name: str) -> None:
"""Run templatisation on one file
"""
log.info(_("Instantiating file '{filename}'"))
filenames = filevar['name']
if 'variable' in filevar:
variable = filevar['variable']
else:
variable = None
if not isinstance(filenames, list):
filenames = [filenames]
if variable:
variable = [variable]
if override:
filenames = [f'/system/{service_name}.service.d/rougail.conf']
else:
filenames = filevar['name']
if not isinstance(filenames, list):
filenames = [filenames]
if variable:
variable = [variable]
for idx, filename in enumerate(filenames):
destfilename = join(self.dest_dir,
filename[1:])
@ -389,11 +397,17 @@ class CreoleTemplateEngine:
var = variable[idx]
else:
var = None
self.process(destfilename,
filevar,
var)
systemd_rights.append(f'C {filename} {filevar["mode"]} {filevar["owner"]} {filevar["group"]} - -')
systemd_rights.append(f'z {filename} - - - - -')
source = join(self.tmp_dir, filevar['source'])
if filevar['templating']:
self.process(source,
destfilename,
filevar,
var)
else:
copy(source, destfilename)
if not override and self.tmpfile_name:
systemd_rights.append(f'C {filename} {filevar["mode"]} {filevar["owner"]} {filevar["group"]} - -')
systemd_rights.append(f'z {filename} - - - - -')
async def instance_files(self) -> None:
"""Run templatisation on all files
@ -411,33 +425,41 @@ class CreoleTemplateEngine:
self.prepare_template(join(self.distrib_dir, template))
systemd_rights = []
for service_obj in await self.config.option('services').list('all'):
service_name = await service_obj.option.doc()
for fills in await service_obj.list('all'):
if await fills.option.name() == 'files':
if await fills.option.name() in ['files', 'overrides']:
for fill_obj in await fills.list('all'):
fill = await fill_obj.value.dict()
filename = fill['source']
distib_file = join(self.distrib_dir, filename)
if not isfile(distib_file):
raise FileNotFound(_(f"File {distib_file} does not exist."))
if fill.get('activate', False):
override = await fills.option.name() == 'overrides'
if override or fill.get('activate', False):
self.instance_file(fill,
systemd_rights)
systemd_rights,
override,
service_name,
)
else:
log.debug(_("Instantiation of file '{filename}' disabled"))
with open(join(self.dest_dir, 'rougail.conf'), 'w') as fh:
fh.write('\n'.join(systemd_rights))
fh.write('\n')
if self.tmpfile_name:
with open(self.tmpfile_name, 'w') as fh:
fh.write('\n'.join(systemd_rights))
fh.write('\n')
async def generate(config: Config,
eosfunc_file: str,
distrib_dir: str,
tmp_dir: str,
dest_dir: str) -> None:
eosfunc_file: str,
distrib_dir: str,
tmp_dir: str,
dest_dir: str,
tmpfile_name: str=None) -> None:
engine = CreoleTemplateEngine(config,
eosfunc_file,
distrib_dir,
tmp_dir,
dest_dir)
dest_dir,
tmpfile_name)
await engine.instance_files()