154 lines
5.0 KiB
Plaintext
154 lines
5.0 KiB
Plaintext
|
#!/usr/bin/env python
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
|
|||
|
"""Run templatisation on a template name or file
|
|||
|
|
|||
|
`CreoleCat` support two modes:
|
|||
|
|
|||
|
- run on a template name with option -t: the name is looked up in
|
|||
|
``/usr/share/eole/creole/distrib/``. The output files are
|
|||
|
calculated unless you explicitely specify ``-o``.
|
|||
|
|
|||
|
- run on a file with options -s: this mode requires the use of
|
|||
|
``-o`` option.
|
|||
|
|
|||
|
"""
|
|||
|
|
|||
|
import sys
|
|||
|
import os
|
|||
|
import argparse
|
|||
|
|
|||
|
from os.path import basename, join, split
|
|||
|
|
|||
|
from pyeole import scriptargs
|
|||
|
from pyeole.log import init_logging
|
|||
|
|
|||
|
from creole.template import CreoleTemplateEngine
|
|||
|
import creole.config as cfg
|
|||
|
from creole.client import CreoleClient, CreoleClientError
|
|||
|
from pyeole.ihm import only_root
|
|||
|
|
|||
|
only_root()
|
|||
|
|
|||
|
client = CreoleClient()
|
|||
|
|
|||
|
def parse_cmdline():
|
|||
|
"""Parse commande line.
|
|||
|
"""
|
|||
|
parser = argparse.ArgumentParser(description="Instancie un template creole",
|
|||
|
parents=[scriptargs.container(),
|
|||
|
scriptargs.logging()])
|
|||
|
parser.add_argument("-t", "--template", metavar="NAME",
|
|||
|
help=u"nom du fichier template creole présent "
|
|||
|
"dans /usr/share/eole/creole/distrib")
|
|||
|
parser.add_argument("-s", "--source", metavar="PATH",
|
|||
|
help=u"chemin d’un fichier template")
|
|||
|
parser.add_argument("-o", "--output", metavar="OUTPUTFILE",
|
|||
|
help=u"chemin du fichier généré")
|
|||
|
|
|||
|
opts = parser.parse_args()
|
|||
|
|
|||
|
if (opts.template is None and opts.source is None) \
|
|||
|
or (opts.template and opts.source):
|
|||
|
parser.error("Vous devez spécifier une des options"
|
|||
|
"'--template' ou '--source'.")
|
|||
|
|
|||
|
if opts.source is not None and not os.access(opts.source, os.F_OK):
|
|||
|
parser.error("Fichier source inexistant"
|
|||
|
" ou illisible: {0}".format(opts.source))
|
|||
|
|
|||
|
if opts.output is None:
|
|||
|
if opts.source is not None:
|
|||
|
opts.output = ""
|
|||
|
else:
|
|||
|
if opts.template is not None \
|
|||
|
and opts.output == join(cfg.distrib_dir, opts.template):
|
|||
|
parser.error("Le fichier de sortie ne peut écraser"
|
|||
|
" le fichier template: {0}".format(opts.output) )
|
|||
|
if opts.source is not None and opts.output == opts.source:
|
|||
|
parser.error("Le fichier de sortie ne peut écraser"
|
|||
|
" le fichier source: {0}".format(opts.output) )
|
|||
|
|
|||
|
if opts.verbose:
|
|||
|
opts.log_level = 'info'
|
|||
|
if opts.debug:
|
|||
|
opts.log_level = 'debug'
|
|||
|
|
|||
|
return opts
|
|||
|
|
|||
|
|
|||
|
def _find_file(name, ctx):
|
|||
|
candidates = client.to_grouped_lists(ctx['files'], keyname='source')
|
|||
|
for source, filevar in candidates.items():
|
|||
|
if name != basename(source):
|
|||
|
continue
|
|||
|
elif filevar[0].get('activate', False):
|
|||
|
return filevar[0]
|
|||
|
|
|||
|
|
|||
|
def main():
|
|||
|
"""Setup environnment and run templatisation.
|
|||
|
"""
|
|||
|
|
|||
|
options = parse_cmdline()
|
|||
|
try:
|
|||
|
log = init_logging(level=options.log_level)
|
|||
|
|
|||
|
engine = CreoleTemplateEngine()
|
|||
|
|
|||
|
filevar = { 'source': options.source,
|
|||
|
'name': options.output,
|
|||
|
'full_name': options.output,
|
|||
|
'activate' : True,
|
|||
|
'del_comment': u'',
|
|||
|
'mkdir' : False,
|
|||
|
'rm' : False,
|
|||
|
}
|
|||
|
|
|||
|
if options.container is not None:
|
|||
|
# force container context
|
|||
|
groups = [client.get_container_infos(options.container)]
|
|||
|
elif options.output is not None:
|
|||
|
# Source without container, for root context
|
|||
|
groups = [client.get_container_infos('root')]
|
|||
|
else:
|
|||
|
groups = []
|
|||
|
for group in client.get_groups():
|
|||
|
groups.append(client.get_group_infos(group))
|
|||
|
|
|||
|
instanciated_files = []
|
|||
|
for group in groups:
|
|||
|
if filevar['source'] is not None:
|
|||
|
instanciated_files.append(filevar)
|
|||
|
engine.process(filevar, group)
|
|||
|
elif options.template is not None:
|
|||
|
found_file = _find_file(options.template, group)
|
|||
|
if found_file:
|
|||
|
instanciated_files.append(found_file)
|
|||
|
if options.output is None:
|
|||
|
engine._instance_file(found_file, group)
|
|||
|
else:
|
|||
|
# Override output
|
|||
|
found_file['name'] = options.output
|
|||
|
found_file['full_name'] = options.output
|
|||
|
# Do not get through verify and
|
|||
|
# change_properties
|
|||
|
engine._copy_to_template_dir(found_file)
|
|||
|
engine.process(found_file, group)
|
|||
|
|
|||
|
if not instanciated_files:
|
|||
|
# No file get instanciated
|
|||
|
raise CreoleClientError("Fichier template inexistant:"
|
|||
|
" {0}".format(options.template))
|
|||
|
|
|||
|
except Exception, err:
|
|||
|
if options.debug:
|
|||
|
log.debug(err, exc_info=True)
|
|||
|
else:
|
|||
|
log.error(err)
|
|||
|
sys.exit(1)
|
|||
|
sys.exit(0)
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
main()
|