From dc63ebe24b7c76b721aa8ed7d8fae278f1a8aa11 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 11 May 2012 13:57:01 -0400 Subject: added ability to disable Cfg file validation --- src/lib/Bcfg2/Options.py | 12 ++++++- src/lib/Bcfg2/Server/Plugins/Cfg/__init__.py | 54 ++++++++++++++++------------ src/sbin/bcfg2-test | 1 + 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index 32c3c02e4..dfb062341 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -411,6 +411,11 @@ CLIENT_SYSTEM_ETC_PATH = Option('System etc path', cf=('APT', 'etc_path'), LOGGING_FILE_PATH = Option('Set path of file log', default=None, cmd='-o', odesc='', cf=('logging', 'path')) +# Plugin-specific options +CFG_VALIDATION = Option('Run validation on Cfg files', default=True, + cf=('cfg', 'validation'), cmd='--cfg-validation', + long_arg=True, cook=get_bool) + class OptionParser(OptionSet): """ OptionParser bootstraps option parsing, @@ -428,8 +433,13 @@ class OptionParser(OptionSet): return if event.code2str() == 'deleted': return - for key, opt in self.optinfo: + self.reparse() + + def reparse(self): + for key, opt in self.optinfo.items(): self[key] = opt + if "args" not in self.optinfo: + del self['args'] self.parse(self.argv, self.do_getopt) def parse(self, argv, do_getopt=True): diff --git a/src/lib/Bcfg2/Server/Plugins/Cfg/__init__.py b/src/lib/Bcfg2/Server/Plugins/Cfg/__init__.py index f59890574..6c7585993 100644 --- a/src/lib/Bcfg2/Server/Plugins/Cfg/__init__.py +++ b/src/lib/Bcfg2/Server/Plugins/Cfg/__init__.py @@ -8,12 +8,14 @@ import pkgutil import logging import binascii import lxml.etree +import Bcfg2.Options import Bcfg2.Server.Plugin from Bcfg2.Bcfg2Py3k import u_str logger = logging.getLogger(__name__) PROCESSORS = None +SETUP = None class CfgBaseFileMatcher(Bcfg2.Server.Plugin.SpecificData): __basenames__ = [] @@ -246,28 +248,26 @@ class CfgEntrySet(Bcfg2.Server.Plugin.EntrySet): for fltr in filters: data = fltr.modify_data(entry, metadata, data) - # TODO: disable runtime verification in config, but let - # bcfg2-test turn it back on dynamically. need to sort out - # config files first. - - # we can have multiple verifiers, but we only want to use the - # best matching verifier of each class - verifiers_by_class = dict() - for verifier in verifiers: - cls = verifier.__class__.__name__ - if cls not in verifiers_by_class: - verifiers_by_class[cls] = [verifier] - else: - verifiers_by_class[cls].append(verifier) - for verifiers in verifiers_by_class.values(): - verifier = self.best_matching(metadata, verifiers) - try: - verifier.verify_entry(entry, metadata, data) - except CfgVerificationError: - msg = "Data for %s for %s failed to verify: %s" % \ - (entry.get('name'), metadata.hostname, sys.exc_info()[1]) - logger.error(msg) - raise Bcfg2.Server.Plugin.PluginExecutionError(msg) + if SETUP['validate']: + # we can have multiple verifiers, but we only want to use the + # best matching verifier of each class + verifiers_by_class = dict() + for verifier in verifiers: + cls = verifier.__class__.__name__ + if cls not in verifiers_by_class: + verifiers_by_class[cls] = [verifier] + else: + verifiers_by_class[cls].append(verifier) + for verifiers in verifiers_by_class.values(): + verifier = self.best_matching(metadata, verifiers) + try: + verifier.verify_entry(entry, metadata, data) + except CfgVerificationError: + msg = "Data for %s for %s failed to verify: %s" % \ + (entry.get('name'), metadata.hostname, + sys.exc_info()[1]) + logger.error(msg) + raise Bcfg2.Server.Plugin.PluginExecutionError(msg) if entry.get('encoding') == 'base64': data = binascii.b2a_base64(data) @@ -378,6 +378,16 @@ class Cfg(Bcfg2.Server.Plugin.GroupSpool, es_cls = CfgEntrySet es_child_cls = Bcfg2.Server.Plugin.SpecificData + def __init__(self, core, datastore): + global SETUP + Bcfg2.Server.Plugin.GroupSpool.__init__(self, core, datastore) + Bcfg2.Server.Plugin.PullTarget.__init__(self) + + SETUP = core.setup + if 'validate' not in SETUP: + SETUP['validate'] = Bcfg2.Options.CFG_VALIDATION + SETUP.reparse() + def AcceptChoices(self, entry, metadata): return self.entries[entry.get('name')].list_accept_choices(entry, metadata) diff --git a/src/sbin/bcfg2-test b/src/sbin/bcfg2-test index 472534152..e3cfd27cc 100755 --- a/src/sbin/bcfg2-test +++ b/src/sbin/bcfg2-test @@ -71,6 +71,7 @@ def main(): 'verbose': Bcfg2.Options.VERBOSE, 'noseopts': Bcfg2.Options.TEST_NOSEOPTS, 'ignore': Bcfg2.Options.TEST_IGNORE, + 'validate': Bcfg2.Options.CFG_VALIDATION, } setup = Bcfg2.Options.OptionParser(optinfo) setup.hm = \ -- cgit v1.2.3-1-g7c22