From afeeb2b6430875cc3979ae4ad690d2a3efc0ac68 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 11 May 2012 13:27:07 -0400 Subject: moved plugin-specific configs to main config file; propagate "setup" object to server Core --- src/lib/Bcfg2/Server/Admin/__init__.py | 3 +- src/lib/Bcfg2/Server/Core.py | 8 ++- src/lib/Bcfg2/Server/Plugin.py | 62 ---------------------- .../Server/Plugins/Packages/PackagesConfig.py | 15 ------ .../Server/Plugins/Packages/PackagesSources.py | 8 +-- src/lib/Bcfg2/Server/Plugins/Packages/Source.py | 8 +-- src/lib/Bcfg2/Server/Plugins/Packages/Yum.py | 42 +++++++-------- src/lib/Bcfg2/Server/Plugins/Packages/__init__.py | 47 ++++++++-------- src/lib/Bcfg2/Server/Plugins/Rules.py | 6 +-- 9 files changed, 62 insertions(+), 137 deletions(-) delete mode 100644 src/lib/Bcfg2/Server/Plugins/Packages/PackagesConfig.py (limited to 'src/lib/Bcfg2/Server') diff --git a/src/lib/Bcfg2/Server/Admin/__init__.py b/src/lib/Bcfg2/Server/Admin/__init__.py index fdb9a0972..618fa450e 100644 --- a/src/lib/Bcfg2/Server/Admin/__init__.py +++ b/src/lib/Bcfg2/Server/Admin/__init__.py @@ -122,7 +122,8 @@ class MetadataCore(Mode): setup['plugins'], setup['password'], setup['encoding'], - filemonitor=setup['filemonitor']) + filemonitor=setup['filemonitor'], + setup=setup) if setup['event debug']: self.bcore.fam.debug = True except Bcfg2.Server.Core.CoreInitError: diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py index a253fd367..8482925b7 100644 --- a/src/lib/Bcfg2/Server/Core.py +++ b/src/lib/Bcfg2/Server/Core.py @@ -62,7 +62,7 @@ class Core(Component): implementation = 'bcfg2-server' def __init__(self, repo, plugins, password, encoding, - cfile='/etc/bcfg2.conf', ca=None, + cfile='/etc/bcfg2.conf', ca=None, setup=None, filemonitor='default', start_fam_thread=False): Component.__init__(self) self.datastore = repo @@ -85,6 +85,7 @@ class Core(Component): self.revision = '-1' self.password = password self.encoding = encoding + self.setup = setup atexit.register(self.shutdown) # Create an event to signal worker threads to shutdown self.terminate = threading.Event() @@ -131,6 +132,11 @@ class Core(Component): self.fam_thread = threading.Thread(target=self._file_monitor_thread) if start_fam_thread: self.fam_thread.start() + self.monitor_cfile() + + def monitor_cfile(self): + if self.setup: + self.fam.AddMonitor(self.cfile, self.setup) def plugins_by_type(self, base_cls): """Return a list of loaded plugins that match the passed type. diff --git a/src/lib/Bcfg2/Server/Plugin.py b/src/lib/Bcfg2/Server/Plugin.py index d7b4baf45..ca37431a2 100644 --- a/src/lib/Bcfg2/Server/Plugin.py +++ b/src/lib/Bcfg2/Server/Plugin.py @@ -1211,65 +1211,3 @@ class GroupSpool(Plugin, Generator): return reqid = self.core.fam.AddMonitor(name, self) self.handles[reqid] = relative - -class SimpleConfig(FileBacked, - ConfigParser.SafeConfigParser): - ''' a simple plugin config using ConfigParser ''' - _required = True - - def __init__(self, plugin): - filename = os.path.join(plugin.data, plugin.name.lower() + ".conf") - self.plugin = plugin - self.fam = self.plugin.core.fam - self.read_files = set() - Bcfg2.Server.Plugin.FileBacked.__init__(self, filename) - ConfigParser.SafeConfigParser.__init__(self) - - if (self._required or - (not self._required and os.path.exists(self.name))): - self.fam.AddMonitor(self.name, self) - - def Index(self): - """ Build local data structures """ - for section in self.sections(): - self.remove_section(section) - self.read_files.update(self.read(self.name)) - - def get(self, section, option, **kwargs): - """ convenience method for getting config items """ - default = None - if 'default' in kwargs: - default = kwargs['default'] - del kwargs['default'] - try: - return ConfigParser.SafeConfigParser.get(self, section, option, - **kwargs) - except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): - if default is not None: - return default - else: - raise - - def getboolean(self, section, option, **kwargs): - """ convenience method for getting boolean config items """ - default = None - if 'default' in kwargs: - default = kwargs['default'] - del kwargs['default'] - try: - return ConfigParser.SafeConfigParser.getboolean(self, section, - option, **kwargs) - except (ConfigParser.NoSectionError, ConfigParser.NoOptionError, - ValueError): - if default is not None: - return default - else: - raise - - @property - def loaded(self): - if os.path.exists(self.name): - return self.name in self.read_files - else: - return True - diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/PackagesConfig.py b/src/lib/Bcfg2/Server/Plugins/Packages/PackagesConfig.py deleted file mode 100644 index 3846c06ce..000000000 --- a/src/lib/Bcfg2/Server/Plugins/Packages/PackagesConfig.py +++ /dev/null @@ -1,15 +0,0 @@ -import Bcfg2.Server.Plugin - -class PackagesConfig(Bcfg2.Server.Plugin.SimpleConfig): - _required = False - - def Index(self): - """ Build local data structures """ - Bcfg2.Server.Plugin.SimpleConfig.Index(self) - - if hasattr(self.plugin, "sources") and self.plugin.sources.loaded: - # only reload Packages plugin if sources have been loaded. - # otherwise, this is getting called on server startup, and - # we have to wait until all sources have been indexed - # before we can call Packages.Reload() - self.plugin.Reload() diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/PackagesSources.py b/src/lib/Bcfg2/Server/Plugins/Packages/PackagesSources.py index a966268c0..7796b9e34 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/PackagesSources.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/PackagesSources.py @@ -9,7 +9,7 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, Bcfg2.Server.Plugin.Debuggable): __identifier__ = None - def __init__(self, filename, cachepath, fam, packages, config): + def __init__(self, filename, cachepath, fam, packages, setup): Bcfg2.Server.Plugin.Debuggable.__init__(self) try: Bcfg2.Server.Plugin.SingleXMLFileBacked.__init__(self, @@ -24,7 +24,7 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, raise Bcfg2.Server.Plugin.PluginInitError(msg) Bcfg2.Server.Plugin.StructFile.__init__(self, filename) self.cachepath = cachepath - self.config = config + self.setup = setup if not os.path.exists(self.cachepath): # create cache directory if needed try: @@ -56,7 +56,7 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, self.parsed.add(fname) break - if self.config.loaded and self.loaded: + if self.loaded: self.logger.info("Reloading Packages plugin") self.pkg_obj.Reload() @@ -91,7 +91,7 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, return None try: - source = cls(self.cachepath, xsource, self.config) + source = cls(self.cachepath, xsource, self.setup) except SourceInitError: err = sys.exc_info()[1] self.logger.error("Packages: %s" % err) diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Source.py b/src/lib/Bcfg2/Server/Plugins/Packages/Source.py index ada04c067..edcdcd9f2 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/Source.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Source.py @@ -36,11 +36,11 @@ class Source(Bcfg2.Server.Plugin.Debuggable): genericrepo_re = re.compile('https?://.*?/([^/]+)/?$') basegroups = [] - def __init__(self, basepath, xsource, config): + def __init__(self, basepath, xsource, setup): Bcfg2.Server.Plugin.Debuggable.__init__(self) self.basepath = basepath self.xsource = xsource - self.config = config + self.setup = setup self.essentialpkgs = set() try: @@ -272,8 +272,8 @@ class Source(Bcfg2.Server.Plugin.Debuggable): if not found_arch: return False - if self.config.getboolean("global", "magic_groups", - default=True) == False: + if not self.setup.cfp.getboolean("packages", "magic_groups", + default=True): return True else: for group in self.basegroups: diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py b/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py index 941203db3..53344e200 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py @@ -15,7 +15,6 @@ from Bcfg2.Bcfg2Py3k import StringIO, cPickle, HTTPError, ConfigParser, file from Bcfg2.Server.Plugins.Packages.Collection import Collection from Bcfg2.Server.Plugins.Packages.Source import SourceInitError, Source, \ fetch_url -from Bcfg2.Server.Plugins.Packages.PackagesConfig import PackagesConfig logger = logging.getLogger(__name__) @@ -50,7 +49,7 @@ PULPSERVER = None PULPCONFIG = None -def _setup_pulp(config): +def _setup_pulp(setup): global PULPSERVER, PULPCONFIG if not has_pulp: msg = "Packages: Cannot create Pulp collection: Pulp libraries not found" @@ -59,8 +58,8 @@ def _setup_pulp(config): if PULPSERVER is None: try: - username = config.get("pulp", "username") - password = config.get("pulp", "password") + username = setup.cfp.get("packages:pulp", "username") + password = setup.cfp.get("packages:pulp", "password") except ConfigParser.NoSectionError: msg = "Packages: No [pulp] section found in Packages/packages.conf" logger.error(msg) @@ -91,11 +90,6 @@ class YumCollection(Collection): Collection.__init__(self, metadata, sources, basepath, debug=debug) self.keypath = os.path.join(self.basepath, "keys") - if len(sources): - self.config = sources[0].config - else: - self.config = PackageConfig('Packages') - if self.use_yum: self.cachefile = os.path.join(self.cachepath, "cache-%s" % self.cachekey) @@ -109,17 +103,18 @@ class YumCollection(Collection): "%s-yum.conf" % self.cachekey) self.write_config() if has_pulp and self.has_pulp_sources: - _setup_pulp(self.config) + _setup_pulp(self.setup) @property def helper(self): - return self.config.get("yum", "helper", - default="/usr/sbin/bcfg2-yum-helper") + return self.setup.cfp.get("packages:yum", "helper", + default="/usr/sbin/bcfg2-yum-helper") @property def use_yum(self): - return has_yum and self.config.getboolean("yum", "use_yum_libraries", - default=False) + return has_yum and self.setup.cfp.getboolean("packages:yum", + "use_yum_libraries", + default=False) @property def has_pulp_sources(self): @@ -140,9 +135,9 @@ class YumCollection(Collection): debuglevel="0", reposdir="/dev/null") try: - for opt in self.config.options("yum"): + for opt in self.setup.cfp.options("packages:yum"): if opt not in self.option_blacklist: - mainopts[opt] = self.config.get("yum", opt) + mainopts[opt] = self.setup.cfp.get("packages:yum", opt) except ConfigParser.NoSectionError: pass @@ -228,8 +223,8 @@ class YumCollection(Collection): for key in needkeys: # figure out the path of the key on the client - keydir = self.config.get("global", "gpg_keypath", - default="/etc/pki/rpm-gpg") + keydir = self.setup.cfp.get("global", "gpg_keypath", + default="/etc/pki/rpm-gpg") remotekey = os.path.join(keydir, os.path.basename(key)) localkey = os.path.join(self.keypath, os.path.basename(key)) kdata = open(localkey).read() @@ -451,13 +446,13 @@ class YumSource(Source): basegroups = ['yum', 'redhat', 'centos', 'fedora'] ptype = 'yum' - def __init__(self, basepath, xsource, config): - Source.__init__(self, basepath, xsource, config) + def __init__(self, basepath, xsource, setup): + Source.__init__(self, basepath, xsource, setup) self.pulp_id = None if has_pulp and xsource.get("pulp_id"): self.pulp_id = xsource.get("pulp_id") - _setup_pulp(self.config) + _setup_pulp(self.setup) repoapi = RepositoryAPI() try: self.repo = repoapi.repository(self.pulp_id) @@ -499,8 +494,9 @@ class YumSource(Source): @property def use_yum(self): - return has_yum and self.config.getboolean("yum", "use_yum_libraries", - default=False) + return has_yum and self.setup.cfp.getboolean("packages:yum", + "use_yum_libraries", + default=False) def save_state(self): if not self.use_yum: diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py b/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py index 4070b13ca..d789a6d39 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py @@ -10,7 +10,6 @@ import Bcfg2.Server.Plugin from Bcfg2.Bcfg2Py3k import ConfigParser, urlopen from Bcfg2.Server.Plugins.Packages import Collection from Bcfg2.Server.Plugins.Packages.PackagesSources import PackagesSources -from Bcfg2.Server.Plugins.Packages.PackagesConfig import PackagesConfig class Packages(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.StructureValidator, @@ -36,11 +35,9 @@ class Packages(Bcfg2.Server.Plugin.Plugin, # create key directory if needed os.makedirs(self.keypath) - # set up config files - self.config = PackagesConfig(self) self.sources = PackagesSources(os.path.join(self.data, "sources.xml"), self.cachepath, core.fam, self, - self.config) + self.core.setup) def toggle_debug(self): Bcfg2.Server.Plugin.Plugin.toggle_debug(self) @@ -49,7 +46,7 @@ class Packages(Bcfg2.Server.Plugin.Plugin, @property def disableResolver(self): try: - return not self.config.getboolean("global", "resolver") + return not self.core.setup.cfp.getboolean("packages", "resolver") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): return False except ValueError: @@ -57,20 +54,20 @@ class Packages(Bcfg2.Server.Plugin.Plugin, # "disabled", which are not handled according to the # Python docs but appear to be handled properly by # ConfigParser in at least some versions - return self.config.get("global", "resolver", - default="enabled").lower() == "disabled" + return self.core.setup.cfp.get("packages", "resolver", + default="enabled").lower() == "disabled" @property def disableMetaData(self): try: - return not self.config.getboolean("global", "resolver") + return not self.core.setup.cfp.getboolean("packages", "resolver") except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): return False except ValueError: # for historical reasons we also accept "enabled" and # "disabled" - return self.config.get("global", "metadata", - default="enabled").lower() == "disabled" + return self.core.setup.cfp.get("packages", "metadata", + default="enabled").lower() == "disabled" def create_config(self, entry, metadata): """ create yum/apt config for the specified host """ @@ -89,20 +86,23 @@ class Packages(Bcfg2.Server.Plugin.Plugin, def HandleEntry(self, entry, metadata): if entry.tag == 'Package': collection = self._get_collection(metadata) - entry.set('version', self.config.get("global", + entry.set('version', self.core.setup.cfp.get("packages", "version", default="auto")) entry.set('type', collection.ptype) elif entry.tag == 'Path': - if (entry.get("name") == self.config.get("global", "yum_config", - default="") or - entry.get("name") == self.config.get("global", "apt_config", - default="")): + if (entry.get("name") == self.core.setup.cfp.get("packages", + "yum_config", + default="") or + entry.get("name") == self.core.setup.cfp.get("packages", + "apt_config", + default="")): self.create_config(entry, metadata) def HandlesEntry(self, entry, metadata): if entry.tag == 'Package': - if self.config.getboolean("global", "magic_groups", default=True): + if self.core.setup.cfp.getboolean("packages", "magic_groups", + default=True): collection = self._get_collection(metadata) if collection.magic_groups_match(): return True @@ -110,10 +110,12 @@ class Packages(Bcfg2.Server.Plugin.Plugin, return True elif entry.tag == 'Path': # managed entries for yum/apt configs - if (entry.get("name") == self.config.get("global", "yum_config", - default="") or - entry.get("name") == self.config.get("global", "apt_config", - default="")): + if (entry.get("name") == self.core.setup.cfp.get("packages", + "yum_config", + default="") or + entry.get("name") == self.core.setup.cfp.get("packages", + "apt_config", + default="")): return True return False @@ -183,8 +185,9 @@ class Packages(Bcfg2.Server.Plugin.Plugin, newpkgs.sort() for pkg in newpkgs: lxml.etree.SubElement(independent, 'BoundPackage', name=pkg, - version=self.config.get("global", "version", - default="auto"), + version=self.core.setup.cfp.get("packages", + "version", + default="auto"), type=collection.ptype, origin='Packages') def Refresh(self): diff --git a/src/lib/Bcfg2/Server/Plugins/Rules.py b/src/lib/Bcfg2/Server/Plugins/Rules.py index b80ef351a..e77d08653 100644 --- a/src/lib/Bcfg2/Server/Plugins/Rules.py +++ b/src/lib/Bcfg2/Server/Plugins/Rules.py @@ -3,9 +3,6 @@ import re import Bcfg2.Server.Plugin -class RulesConfig(Bcfg2.Server.Plugin.SimpleConfig): - _required = False - class Rules(Bcfg2.Server.Plugin.PrioDir): """This is a generator that handles service assignments.""" name = 'Rules' @@ -13,7 +10,6 @@ class Rules(Bcfg2.Server.Plugin.PrioDir): def __init__(self, core, datastore): Bcfg2.Server.Plugin.PrioDir.__init__(self, core, datastore) - self.config = RulesConfig(self) self._regex_cache = dict() def HandlesEntry(self, entry, metadata): @@ -52,4 +48,4 @@ class Rules(Bcfg2.Server.Plugin.PrioDir): return False def _regex_enabled(self): - return self.config.getboolean("rules", "regex", default=False) + return self.core.setup.cfp.getboolean("rules", "regex", default=False) -- cgit v1.2.3-1-g7c22