diff --git a/src/rougail/annotator.py b/src/rougail/annotator.py
index 7de9f08dc..0aac5c49d 100644
--- a/src/rougail/annotator.py
+++ b/src/rougail/annotator.py
@@ -129,7 +129,8 @@ class ServiceAnnotator:
family = self.gen_family(eltname)
if isinstance(values, dict):
values = list(values.values())
- family.family = self.make_group_from_elts(elttype,
+ family.family = self.make_group_from_elts(service_name,
+ elttype,
values,
f'services.{service_name}.{eltname}',
)
@@ -138,6 +139,7 @@ class ServiceAnnotator:
self.space.services.service = families
def make_group_from_elts(self,
+ service_name,
name,
elts,
path,
@@ -156,7 +158,11 @@ class ServiceAnnotator:
# try to launch _update_xxxx() function
update_elt = '_update_' + elt_name
if hasattr(self, update_elt):
- getattr(self, update_elt)(elt, index, path)
+ getattr(self, update_elt)(elt,
+ index,
+ path,
+ service_name,
+ )
if hasattr(elt, 'source'):
c_name = elt.source
@@ -256,13 +262,29 @@ class ServiceAnnotator:
result_elts.append({'elt_name': name, 'elt': elt})
return result_elts
- def _update_override(self, *args):
- self._update_file(*args)
+ def _update_override(self,
+ file_,
+ index,
+ service_path,
+ service_name,
+ ):
+ file_.name = f'/systemd/system/{service_name}.service.d/rougail.conf'
+ # retrieve default value from File object
+ for attr in ['owner', 'group', 'mode']:
+ setattr(file_, attr, getattr(self.objectspace.file, attr))
+ if not hasattr(file_, 'source'):
+ file_.source = f'{service_name}.service'
+ self._update_file(file_,
+ index,
+ service_path,
+ service_name,
+ )
def _update_file(self,
file_,
index,
service_path,
+ service_name,
):
if not hasattr(file_, 'file_type') or file_.file_type == "UnicodeOption":
if not hasattr(file_, 'source'):
diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd
index f26fffcad..f82d452fe 100644
--- a/src/rougail/data/rougail.dtd
+++ b/src/rougail/data/rougail.dtd
@@ -83,7 +83,7 @@
-
+
diff --git a/src/rougail/template.py b/src/rougail/template.py
index 25013de5d..a64f4b81a 100644
--- a/src/rougail/template.py
+++ b/src/rougail/template.py
@@ -254,6 +254,9 @@ class CreoleExtra:
def __repr__(self):
return self.suboption.__str__()
+ def __iter__(self):
+ return iter(self.suboption.values())
+
class CreoleTemplateEngine:
"""Engine to process Creole cheetah template
@@ -264,17 +267,11 @@ class CreoleTemplateEngine:
distrib_dir: str,
tmp_dir: str,
dest_dir: str,
- override_dest_dir: str,
- tmpfile_name: str,
- factory_prefix: str,
) -> None:
self.config = config
self.dest_dir = dest_dir
- self.override_dest_dir = override_dest_dir
self.tmp_dir = tmp_dir
self.distrib_dir = distrib_dir
- self.tmpfile_name = tmpfile_name
- self.factory_prefix = factory_prefix
eos = {}
if eosfunc_file is not None:
eosfunc = imp.load_source('eosfunc', eosfunc_file)
@@ -309,20 +306,26 @@ class CreoleTemplateEngine:
for family in await optiondescription.list('all'):
variables = {}
for variable in await family.list('all'):
- if await variable.option.isoptiondescription() and await variable.option.isleadership():
- for idx, suboption in enumerate(await variable.list('all')):
- if idx == 0:
- leader = CreoleLeader(await suboption.value.get())
- leader_name = await suboption.option.name()
- else:
- await leader.add_follower(self.config,
- await suboption.option.name(),
- await suboption.option.path())
- variables[leader_name] = leader
+ if await variable.option.isoptiondescription():
+ if await variable.option.isleadership():
+ for idx, suboption in enumerate(await variable.list('all')):
+ if idx == 0:
+ leader = CreoleLeader(await suboption.value.get())
+ leader_name = await suboption.option.name()
+ else:
+ await leader.add_follower(self.config,
+ await suboption.option.name(),
+ await suboption.option.path())
+ variables[leader_name] = leader
+ else:
+ subfamilies = await self.load_eole_variables(await variable.option.name(),
+ variable,
+ )
+ variables[await variable.option.name()] = subfamilies
else:
variables[await variable.option.name()] = await variable.value.get()
families[await family.option.name()] = CreoleExtra(variables)
- self.rougail_variables_dict[namespace] = CreoleExtra(families)
+ return CreoleExtra(families)
def patch_template(self,
filename: str):
@@ -352,6 +355,7 @@ class CreoleTemplateEngine:
def process(self,
source: str,
+ true_destfilename: str,
destfilename: str,
filevar: Dict,
variable: Any):
@@ -363,7 +367,7 @@ class CreoleTemplateEngine:
cheetah_template = CheetahTemplate(source,
self.rougail_variables_dict,
self.eosfunc,
- destfilename,
+ true_destfilename,
variable,
)
data = str(cheetah_template)
@@ -378,8 +382,6 @@ class CreoleTemplateEngine:
def instance_file(self,
filevar: Dict,
- systemd_rights: list,
- override: bool,
service_name: str) -> None:
"""Run templatisation on one file
"""
@@ -388,19 +390,13 @@ class CreoleTemplateEngine:
variable = filevar['variable']
else:
variable = None
- if override:
- filenames = [f'/systemd/system/{service_name}.service.d/rougail.conf']
- else:
- filenames = filevar['name']
- if not isinstance(filenames, list):
- filenames = [filenames]
- if variable:
- variable = [variable]
+ filenames = filevar['name']
+ if not isinstance(filenames, list):
+ filenames = [filenames]
+ if variable:
+ variable = [variable]
for idx, filename in enumerate(filenames):
- if override:
- destfilename = join(self.override_dest_dir, filename[1:])
- else:
- destfilename = join(self.dest_dir, filename[1:])
+ destfilename = join(self.dest_dir, filename[1:])
makedirs(dirname(destfilename), exist_ok=True)
if variable:
var = variable[idx]
@@ -409,30 +405,29 @@ class CreoleTemplateEngine:
source = join(self.tmp_dir, filevar['source'])
if filevar['templating']:
self.process(source,
+ filename,
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"]} - {self.factory_prefix}{filename}')
- systemd_rights.append(f'z {filename} - - - - -')
+ # if self.tmpfile_name:
+ # systemd_rights.append(f'C {filename} {filevar["mode"]} {filevar["owner"]} {filevar["group"]} - {self.factory_prefix}{filename}')
+ # systemd_rights.append(f'z {filename} - - - - -')
async def instance_files(self) -> None:
"""Run templatisation on all files
"""
for option in await self.config.option.list(type='all'):
namespace = await option.option.name()
- if namespace in ['services', 'actions']:
- continue
- elif namespace == VARIABLE_NAMESPACE:
+ if namespace == VARIABLE_NAMESPACE:
await self.load_eole_variables_rougail(option)
else:
- await self.load_eole_variables(namespace,
- option)
+ families = await self.load_eole_variables(namespace,
+ option)
+ self.rougail_variables_dict[namespace] = families
for template in listdir(self.distrib_dir):
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'):
@@ -443,20 +438,17 @@ class CreoleTemplateEngine:
distib_file = join(self.distrib_dir, filename)
if not isfile(distib_file):
raise FileNotFound(_(f"File {distib_file} does not exist."))
- override = await fills.option.name() == 'overrides'
- if override or fill.get('activate', False):
+ if fill.get('activate', False):
self.instance_file(fill,
- systemd_rights,
- override,
service_name,
)
else:
log.debug(_("Instantiation of file '{filename}' disabled"))
- if self.tmpfile_name:
- with open(self.tmpfile_name, '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,
@@ -464,22 +456,11 @@ async def generate(config: Config,
distrib_dir: str,
tmp_dir: str,
dest_dir: str,
- override_dest_dir: str,
- tmpfile_name: str=None,
- factory_prefix: str=None,
) -> None:
- if not tmpfile_name and factory_prefix:
- raise Exception(_(f'only specify factory_prefix if tmpfile_name is set'))
- if tmpfile_name and not factory_prefix:
- raise Exception(_(f'if tmpfile_name is specify, set factory_prefix too'))
-
engine = CreoleTemplateEngine(config,
eosfunc_file,
distrib_dir,
tmp_dir,
dest_dir,
- override_dest_dir,
- tmpfile_name,
- factory_prefix,
)
await engine.instance_files()
diff --git a/tests/flattener_dicos/20override/00-base.xml b/tests/flattener_dicos/20override/00-base.xml
index f3606bf77..a2dd8e97d 100644
--- a/tests/flattener_dicos/20override/00-base.xml
+++ b/tests/flattener_dicos/20override/00-base.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/tests/flattener_dicos/20override/makedict/base.json b/tests/flattener_dicos/20override/makedict/base.json
index 5a4ee4032..4ea93c68a 100644
--- a/tests/flattener_dicos/20override/makedict/base.json
+++ b/tests/flattener_dicos/20override/makedict/base.json
@@ -1 +1 @@
-{"rougail.general.mode_conteneur_actif": "non", "services.test.overrides.test_service.name": "test.service", "services.test.overrides.test_service.source": "test.service", "services.test.overrides.test_service.templating": true, "services.test.overrides.test_service.activate": true}
+{"rougail.general.mode_conteneur_actif": "non", "services.test.overrides.test_service.group": "root", "services.test.overrides.test_service.mode": "0644", "services.test.overrides.test_service.name": "/systemd/system/test.service.d/rougail.conf", "services.test.overrides.test_service.owner": "root", "services.test.overrides.test_service.source": "test.service", "services.test.overrides.test_service.templating": true, "services.test.overrides.test_service.activate": true}
diff --git a/tests/flattener_dicos/20override/result/00-base.xml b/tests/flattener_dicos/20override/result/00-base.xml
index 46bca2d18..37d114f33 100644
--- a/tests/flattener_dicos/20override/result/00-base.xml
+++ b/tests/flattener_dicos/20override/result/00-base.xml
@@ -5,8 +5,17 @@
+
+ root
+
+
+ 0644
+
- test.service
+ /systemd/system/test.service.d/rougail.conf
+
+
+ root
test.service
diff --git a/tests/flattener_dicos/70container_files/00-base.xml b/tests/flattener_dicos/70container_files/00-base.xml
index 33c10c0d3..d07f06d05 100644
--- a/tests/flattener_dicos/70container_files/00-base.xml
+++ b/tests/flattener_dicos/70container_files/00-base.xml
@@ -5,6 +5,7 @@
+
diff --git a/tests/flattener_dicos/70container_files/makedict/base.json b/tests/flattener_dicos/70container_files/makedict/base.json
index b3f851ab8..bfd55284f 100644
--- a/tests/flattener_dicos/70container_files/makedict/base.json
+++ b/tests/flattener_dicos/70container_files/makedict/base.json
@@ -1 +1 @@
-{"rougail.general.mode_conteneur_actif": "oui", "services.test.files.mailname.group": "root", "services.test.files.mailname.mode": "0644", "services.test.files.mailname.name": "/etc/mailname", "services.test.files.mailname.owner": "root", "services.test.files.mailname.source": "mailname", "services.test.files.mailname.templating": true, "services.test.files.mailname.activate": true}
+{"rougail.general.mode_conteneur_actif": "oui", "services.test.files.mailname.group": "root", "services.test.files.mailname.mode": "0644", "services.test.files.mailname.name": "/etc/mailname", "services.test.files.mailname.owner": "root", "services.test.files.mailname.source": "mailname", "services.test.files.mailname.templating": true, "services.test.files.mailname.activate": true, "services.test.files.rougail_conf.group": "root", "services.test.files.rougail_conf.mode": "0644", "services.test.files.rougail_conf.name": "/rougail.conf", "services.test.files.rougail_conf.owner": "root", "services.test.files.rougail_conf.source": "rougail.conf", "services.test.files.rougail_conf.templating": true, "services.test.files.rougail_conf.activate": true}
diff --git a/tests/flattener_dicos/70container_files/result/00-base.xml b/tests/flattener_dicos/70container_files/result/00-base.xml
index a18a9bcf6..0a228f654 100644
--- a/tests/flattener_dicos/70container_files/result/00-base.xml
+++ b/tests/flattener_dicos/70container_files/result/00-base.xml
@@ -27,6 +27,29 @@
True
+
+
+ root
+
+
+ 0644
+
+
+ /rougail.conf
+
+
+ root
+
+
+ rougail.conf
+
+
+ True
+
+
+ True
+
+
diff --git a/tests/templates/11disabled_if_in_filelist/result/rougail.conf b/tests/templates/11disabled_if_in_filelist/result/rougail.conf
deleted file mode 100644
index a56057fa4..000000000
--- a/tests/templates/11disabled_if_in_filelist/result/rougail.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-C /etc/file 0644 root root - rougail.conf/etc/file
-z /etc/file - - - - -
diff --git a/tests/templates/11disabled_if_in_filelist_disabled/result/rougail.conf b/tests/templates/11disabled_if_in_filelist_disabled/result/rougail.conf
deleted file mode 100644
index 8b1378917..000000000
--- a/tests/templates/11disabled_if_in_filelist_disabled/result/rougail.conf
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/tests/templates/20notemplating/result/rougail.conf b/tests/templates/20notemplating/result/rougail.conf
deleted file mode 100644
index a56057fa4..000000000
--- a/tests/templates/20notemplating/result/rougail.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-C /etc/file 0644 root root - rougail.conf/etc/file
-z /etc/file - - - - -
diff --git a/tests/templates/20override/00-base.xml b/tests/templates/20override/00-base.xml
index 46bca2d18..37d114f33 100644
--- a/tests/templates/20override/00-base.xml
+++ b/tests/templates/20override/00-base.xml
@@ -5,8 +5,17 @@
+
+ root
+
+
+ 0644
+
- test.service
+ /systemd/system/test.service.d/rougail.conf
+
+
+ root
test.service
diff --git a/tests/templates/20override/result/rougail.conf b/tests/templates/20override/result/rougail.conf
deleted file mode 100644
index 8b1378917..000000000
--- a/tests/templates/20override/result/rougail.conf
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/tests/templates/60extra_group/result/rougail.conf b/tests/templates/60extra_group/result/rougail.conf
deleted file mode 100644
index 7b927977f..000000000
--- a/tests/templates/60extra_group/result/rougail.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-C /etc/mailname 0644 root root - rougail.conf/etc/mailname
-z /etc/mailname - - - - -
diff --git a/tests/templates/70container_files/00-base.xml b/tests/templates/70container_files/00-base.xml
index a18a9bcf6..0a228f654 100644
--- a/tests/templates/70container_files/00-base.xml
+++ b/tests/templates/70container_files/00-base.xml
@@ -27,6 +27,29 @@
True
+
+
+ root
+
+
+ 0644
+
+
+ /rougail.conf
+
+
+ root
+
+
+ rougail.conf
+
+
+ True
+
+
+ True
+
+
diff --git a/tests/templates/70container_files/result/rougail.conf b/tests/templates/70container_files/result/rougail.conf
index 7b927977f..b8f8a226c 100644
--- a/tests/templates/70container_files/result/rougail.conf
+++ b/tests/templates/70container_files/result/rougail.conf
@@ -1,2 +1,2 @@
-C /etc/mailname 0644 root root - rougail.conf/etc/mailname
+C /etc/mailname 0644 root root - /usr/local/share/factory/etc/mailname
z /etc/mailname - - - - -
diff --git a/tests/templates/70container_files/tmpl/rougail.conf b/tests/templates/70container_files/tmpl/rougail.conf
new file mode 100644
index 000000000..cd853a0e9
--- /dev/null
+++ b/tests/templates/70container_files/tmpl/rougail.conf
@@ -0,0 +1,10 @@
+%for %%service in %%services
+ %if %%hasattr(%%service, 'files')
+ %for %%file in %%service.files
+ %if %%file.name != %%rougail_filename and %%hasattr(%%file, 'activate') and %%file.activate == True
+C %%file.name %%file.mode %%file.owner %%file.group - /usr/local/share/factory%%file.name
+z %%file.name - - - - -
+ %end if
+ %end for
+ %end if
+%end for
diff --git a/tests/templates/70container_files_symlink_multi/result/etc/mailname b/tests/templates/70container_files_symlink_multi/result/etc/mailname
index 4c58298a3..1a03818dc 100644
--- a/tests/templates/70container_files_symlink_multi/result/etc/mailname
+++ b/tests/templates/70container_files_symlink_multi/result/etc/mailname
@@ -1 +1 @@
-tests/templates/70container_files_symlink_multi/dest/etc/mailname
+/etc/mailname
diff --git a/tests/templates/70container_files_symlink_multi/result/etc/mailname2 b/tests/templates/70container_files_symlink_multi/result/etc/mailname2
index 19594bb49..03e217966 100644
--- a/tests/templates/70container_files_symlink_multi/result/etc/mailname2
+++ b/tests/templates/70container_files_symlink_multi/result/etc/mailname2
@@ -1 +1 @@
-tests/templates/70container_files_symlink_multi/dest/etc/mailname2
+/etc/mailname2
diff --git a/tests/templates/70container_files_symlink_multi/result/rougail.conf b/tests/templates/70container_files_symlink_multi/result/rougail.conf
deleted file mode 100644
index 6914c0bd4..000000000
--- a/tests/templates/70container_files_symlink_multi/result/rougail.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-C /etc/mailname 0644 root root - rougail.conf/etc/mailname
-z /etc/mailname - - - - -
-C /etc/mailname2 0644 root root - rougail.conf/etc/mailname2
-z /etc/mailname2 - - - - -
diff --git a/tests/templates/70container_files_symlink_multi_variable/result/rougail.conf b/tests/templates/70container_files_symlink_multi_variable/result/rougail.conf
deleted file mode 100644
index 6914c0bd4..000000000
--- a/tests/templates/70container_files_symlink_multi_variable/result/rougail.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-C /etc/mailname 0644 root root - rougail.conf/etc/mailname
-z /etc/mailname - - - - -
-C /etc/mailname2 0644 root root - rougail.conf/etc/mailname2
-z /etc/mailname2 - - - - -
diff --git a/tests/test_template.py b/tests/test_template.py
index 30d749bca..ca03230a6 100644
--- a/tests/test_template.py
+++ b/tests/test_template.py
@@ -61,9 +61,6 @@ async def test_dictionary(test_dir):
distrib_dir,
tmp_dir,
dest_dir,
- dest_dir,
- join(dest_dir, 'rougail.conf'),
- 'rougail.conf',
)
list_templates = set()
if isdir(dest_dir):