diff options
author | Yves-Alexis Perez <corsac@corsac.net> | 2017-09-01 17:21:25 +0200 |
---|---|---|
committer | Yves-Alexis Perez <corsac@corsac.net> | 2017-09-01 17:21:25 +0200 |
commit | 11d6b62db969bdd808d0f56706cb18f113927a31 (patch) | |
tree | 8aa7d8fb611c3da6a3523cb78a082f62ffd0dac8 /conf/format-options.py | |
parent | bba25e2ff6c4a193acb54560ea4417537bd2954e (diff) | |
download | vyos-strongswan-11d6b62db969bdd808d0f56706cb18f113927a31.tar.gz vyos-strongswan-11d6b62db969bdd808d0f56706cb18f113927a31.zip |
New upstream version 5.6.0
Diffstat (limited to 'conf/format-options.py')
-rwxr-xr-x | conf/format-options.py | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/conf/format-options.py b/conf/format-options.py index 307394399..592bf6706 100755 --- a/conf/format-options.py +++ b/conf/format-options.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -# Copyright (C) 2014-2015 Tobias Brunner -# Hochschule fuer Technik Rapperswil +# Copyright (C) 2014-2017 Tobias Brunner +# HSR Hochschule fuer Technik Rapperswil # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -49,6 +49,12 @@ full.section.name {[#]} If a # is added between the curly braces the section header will be commented out in the configuration file snippet, which is useful for example sections. +To add include statements to generated config files (ignored when generating +man pages) the following format can be used: + +full.section.name.include files/to/include + Description of this include statement + Dots in section/option names may be escaped with a backslash. For instance, with the following section description @@ -62,17 +68,18 @@ import sys import re from textwrap import TextWrapper from optparse import OptionParser -from operator import attrgetter +from functools import cmp_to_key class ConfigOption: """Representing a configuration option or described section in strongswan.conf""" - def __init__(self, path, default = None, section = False, commented = False): + def __init__(self, path, default = None, section = False, commented = False, include = False): self.path = path self.name = path[-1] self.fullname = '.'.join(path) self.default = default self.section = section self.commented = commented + self.include = include self.desc = [] self.options = [] @@ -99,6 +106,13 @@ class ConfigOption: self.commented = other.commented self.desc = other.desc + @staticmethod + def cmp(a, b): + # order options before sections and includes last + if a.include or b.include: + return a.include - b.include + return a.section - b.section + class Parser: """Parses one or more files of configuration options""" def __init__(self, sort = True): @@ -135,6 +149,14 @@ class Parser: self.__current = ConfigOption(path, section = True, commented = m.group('comment')) return + # include definition + m = re.match(r'^(?P<name>\S+\.include|include)\s+(?P<pattern>\S+)\s*$', line) + if m: + if self.__current: + self.__add_option(self.__current) + path = self.__split_name(m.group('name')) + self.__current = ConfigOption(path, m.group('pattern'), include = True) + return # paragraph separator m = re.match(r'^\s*$', line) if m and self.__current: @@ -195,7 +217,7 @@ class TagReplacer: return re.compile(r''' (^|\s|(?P<brack>[(\[])) # prefix with optional opening bracket (?P<tag>''' + tag + r''') # start tag - (?P<text>\w|\S.*?\S) # text + (?P<text>\S|\S.*?\S) # text ''' + tag + r''' # end tag (?P<punct>([.,!:)\]]|\(\d+\))*) # punctuation (?=$|\s) # suffix (don't consume it so that subsequent tags can match) @@ -248,7 +270,9 @@ class ConfFormatter: """Print a single option with description and default value""" comment = "# " if commented or opt.commented else "" self.__print_description(opt, indent) - if opt.default: + if opt.include: + print('{0}{1} {2}'.format(self.__indent * indent, opt.name, opt.default)) + elif opt.default: print('{0}{1}{2} = {3}'.format(self.__indent * indent, comment, opt.name, opt.default)) else: print('{0}{1}{2} ='.format(self.__indent * indent, comment, opt.name)) @@ -261,7 +285,7 @@ class ConfFormatter: self.__print_description(section, indent) print('{0}{1}{2} {{'.format(self.__indent * indent, comment, section.name)) print('') - for o in sorted(section.options, key=attrgetter('section')): + for o in sorted(section.options, key=cmp_to_key(ConfigOption.cmp)): if o.section: self.__print_section(o, indent + 1, commented) else: @@ -273,7 +297,7 @@ class ConfFormatter: """Print a list of options""" if not options: return - for option in sorted(options, key=attrgetter('section')): + for option in sorted(options, key=cmp_to_key(ConfigOption.cmp)): if option.section: self.__print_section(option, 0, False) else: @@ -297,6 +321,8 @@ class ManFormatter: """Print a single option""" if option.section and not len(option.desc): return + if option.include: + return if option.section: print('.TP\n.B {0}\n.br'.format(option.fullname)) else: |