diff options
Diffstat (limited to 'src/sbin/bcfg2-lint')
-rwxr-xr-x | src/sbin/bcfg2-lint | 134 |
1 files changed, 72 insertions, 62 deletions
diff --git a/src/sbin/bcfg2-lint b/src/sbin/bcfg2-lint index f1f91b7f4..0321d3045 100755 --- a/src/sbin/bcfg2-lint +++ b/src/sbin/bcfg2-lint @@ -9,108 +9,89 @@ import Bcfg2.Logger import Bcfg2.Options import Bcfg2.Server.Core import Bcfg2.Server.Lint -# Compatibility imports from Bcfg2.Compat import ConfigParser -logger = logging.getLogger('bcfg2-lint') +LOGGER = logging.getLogger('bcfg2-lint') -def run_serverless_plugins(plugins, config=None, setup=None, errorhandler=None): - logger.debug("Running serverless plugins") + +def run_serverless_plugins(plugins, setup=None, errorhandler=None, files=None): + """ Run serverless plugins """ + LOGGER.debug("Running serverless plugins") for plugin_name, plugin in list(plugins.items()): run_plugin(plugin, plugin_name, errorhandler=errorhandler, - setup=setup, config=config, files=files) + setup=setup, files=files) + -def run_server_plugins(plugins, config=None, setup=None, errorhandler=None): +def run_server_plugins(plugins, setup=None, errorhandler=None, files=None): + """ run plugins that require a running server to run """ core = load_server(setup) - logger.debug("Running server plugins") + LOGGER.debug("Running server plugins") for plugin_name, plugin in list(plugins.items()): run_plugin(plugin, plugin_name, args=[core], errorhandler=errorhandler, - setup=setup, config=config, files=files) + setup=setup, files=files) + def run_plugin(plugin, plugin_name, setup=None, errorhandler=None, - args=None, config=None, files=None): - logger.debug(" Running %s" % plugin_name) + args=None, files=None): + """ run a single plugin, server-ful or serverless. """ + LOGGER.debug(" Running %s" % plugin_name) if args is None: args = [] if errorhandler is None: - errorhandler = get_errorhandler(config) + errorhandler = get_errorhandler(setup) - if config is not None and config.has_section(plugin_name): + if setup is not None and setup.cfp.has_section(plugin_name): arg = setup - for key, val in config.items(plugin_name): + for key, val in setup.cfp.items(plugin_name): arg[key] = val args.append(arg) else: args.append(setup) - - # older versions of python do not support mixing *-magic and - # non-*-magic (e.g., "plugin(*args, files=files)", so we do this - # all with *-magic - kwargs = dict(files=files, errorhandler=errorhandler) - - return plugin(*args, **kwargs).Run() - -def get_errorhandler(config): + + return plugin(*args, files=files, errorhandler=errorhandler).Run() + + +def get_errorhandler(setup): """ get a Bcfg2.Server.Lint.ErrorHandler object """ - if config.has_section("errors"): - conf = dict(config.items("errors")) + if setup.cfp.has_section("errors"): + conf = dict(setup.cfp.items("errors")) else: conf = None return Bcfg2.Server.Lint.ErrorHandler(config=conf) + def load_server(setup): """ load server """ core = Bcfg2.Server.Core.BaseCore(setup) core.fam.handle_events_in_interval(4) return core + def load_plugin(module, obj_name=None): + """ load a single plugin """ parts = module.split(".") if obj_name is None: obj_name = parts[-1] mod = __import__(module) - for p in parts[1:]: - mod = getattr(mod, p) + for part in parts[1:]: + mod = getattr(mod, part) return getattr(mod, obj_name) -if __name__ == '__main__': - optinfo = dict(config=Bcfg2.Options.LINT_CONFIG, - showerrors=Bcfg2.Options.LINT_SHOW_ERRORS, - stdin=Bcfg2.Options.LINT_FILES_ON_STDIN, - schema=Bcfg2.Options.SCHEMA_PATH, - plugins=Bcfg2.Options.SERVER_PLUGINS) - optinfo.update(Bcfg2.Options.CLI_COMMON_OPTIONS) - optinfo.update(Bcfg2.Options.SERVER_COMMON_OPTIONS) - setup = Bcfg2.Options.OptionParser(optinfo) - setup.parse(sys.argv[1:]) - - log_args = dict(to_syslog=setup['syslog'], to_console=logging.WARNING) - if setup['verbose']: - log_args['to_console'] = logging.DEBUG - Bcfg2.Logger.setup_logging('bcfg2-info', **log_args) - - config = ConfigParser.SafeConfigParser() - config.read(setup['configfile']) - config.read(setup['config']) - # get list of plugins to run +def load_plugins(setup): + """ get list of plugins to run """ if setup['args']: plugin_list = setup['args'] elif "bcfg2-repo-validate" in sys.argv[0]: plugin_list = 'Duplicates,RequiredAttrs,Validate'.split(',') else: try: - plugin_list = config.get('lint', 'plugins').split(',') + plugin_list = setup.cfp.get('lint', 'plugins').split(',') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): plugin_list = Bcfg2.Server.Lint.__all__ - if setup['stdin']: - files = [s.strip() for s in sys.stdin.readlines()] - else: - files = None - allplugins = dict() for plugin in plugin_list: try: @@ -121,12 +102,12 @@ if __name__ == '__main__': load_plugin("Bcfg2.Server.Plugins." + plugin, obj_name=plugin + "Lint") except (ImportError, AttributeError): - err = sys.exc_info()[1] - logger.error("Failed to load plugin %s: %s" % - (plugin + "Lint", err)) + err = sys.exc_info()[1] + LOGGER.error("Failed to load plugin %s: %s" % + (plugin + "Lint", err)) except AttributeError: err = sys.exc_info()[1] - logger.error("Failed to load plugin %s: %s" % (plugin, err)) + LOGGER.error("Failed to load plugin %s: %s" % (plugin, err)) serverplugins = dict() serverlessplugins = dict() @@ -136,21 +117,47 @@ if __name__ == '__main__': serverplugins[plugin_name] = plugin else: serverlessplugins[plugin_name] = plugin + return (serverlessplugins, serverplugins) + + +def main(): + optinfo = dict(lint_config=Bcfg2.Options.LINT_CONFIG, + showerrors=Bcfg2.Options.LINT_SHOW_ERRORS, + stdin=Bcfg2.Options.LINT_FILES_ON_STDIN, + schema=Bcfg2.Options.SCHEMA_PATH, + plugins=Bcfg2.Options.SERVER_PLUGINS) + optinfo.update(Bcfg2.Options.CLI_COMMON_OPTIONS) + optinfo.update(Bcfg2.Options.SERVER_COMMON_OPTIONS) + setup = Bcfg2.Options.OptionParser(optinfo) + setup.parse(sys.argv[1:]) + + log_args = dict(to_syslog=setup['syslog'], to_console=logging.WARNING) + if setup['verbose']: + log_args['to_console'] = logging.DEBUG + Bcfg2.Logger.setup_logging('bcfg2-info', **log_args) - errorhandler = get_errorhandler(config) + setup.cfp.read(setup['lint_config']) + + if setup['stdin']: + files = [s.strip() for s in sys.stdin.readlines()] + else: + files = None + + (serverlessplugins, serverplugins) = load_plugins(setup) + + errorhandler = get_errorhandler(setup) if setup['showerrors']: for plugin in serverplugins.values() + serverlessplugins.values(): errorhandler.RegisterErrors(getattr(plugin, 'Errors')()) print("%-35s %-35s" % ("Error name", "Handler")) - for err, handler in errorhandler._handlers.items(): + for err, handler in errorhandler.errors.items(): print("%-35s %-35s" % (err, handler.__name__)) raise SystemExit(0) - run_serverless_plugins(serverlessplugins, - errorhandler=errorhandler, - config=config, setup=setup) + run_serverless_plugins(serverlessplugins, errorhandler=errorhandler, + setup=setup, files=files) if serverplugins: if errorhandler.errors: @@ -166,7 +173,7 @@ if __name__ == '__main__': "plugins") else: run_server_plugins(serverplugins, errorhandler=errorhandler, - config=config, setup=setup) + setup=setup, files=files) if errorhandler.errors or errorhandler.warnings or setup['verbose']: print("%d errors" % errorhandler.errors) @@ -176,3 +183,6 @@ if __name__ == '__main__': raise SystemExit(2) elif errorhandler.warnings: raise SystemExit(3) + +if __name__ == '__main__': + sys.exit(main()) |