diff options
author | Sol Jerome <sol.jerome@gmail.com> | 2012-03-23 10:51:32 -0500 |
---|---|---|
committer | Sol Jerome <sol.jerome@gmail.com> | 2012-03-23 10:51:32 -0500 |
commit | 3063e41f480a6143b42a0eff6e4ca17bbfc0d1db (patch) | |
tree | 204e6b486ab7c7a8f9c29ad3ec77a4e344272098 /src/lib | |
parent | 397c17ffc5755d2b41ccfa01225d4f42cb9545c1 (diff) | |
parent | 746293b2f242c099037aac19f14f65e68d036270 (diff) | |
download | bcfg2-3063e41f480a6143b42a0eff6e4ca17bbfc0d1db.tar.gz bcfg2-3063e41f480a6143b42a0eff6e4ca17bbfc0d1db.tar.bz2 bcfg2-3063e41f480a6143b42a0eff6e4ca17bbfc0d1db.zip |
Merge branch 'maint'
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/Server/Plugin.py | 27 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Bundler.py | 34 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Cfg.py | 4 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Packages/Yum.py | 70 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Pkgmgr.py | 7 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Probes.py | 10 |
6 files changed, 95 insertions, 57 deletions
diff --git a/src/lib/Server/Plugin.py b/src/lib/Server/Plugin.py index f423bea2e..06de18f29 100644 --- a/src/lib/Server/Plugin.py +++ b/src/lib/Server/Plugin.py @@ -1199,27 +1199,32 @@ class SimpleConfig(FileBacked, self.remove_section(section) self.read(self.name) - def get(self, section, option, default=None): + 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) + 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, default=None): + 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) - except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): - if default is not None: - return default - else: - raise - except ValueError: + return ConfigParser.SafeConfigParser.getboolean(self, section, + option, **kwargs) + except (ConfigParser.NoSectionError, ConfigParser.NoOptionError, + ValueError): if default is not None: return default else: diff --git a/src/lib/Server/Plugins/Bundler.py b/src/lib/Server/Plugins/Bundler.py index 5b5b0d698..ccb99481e 100644 --- a/src/lib/Server/Plugins/Bundler.py +++ b/src/lib/Server/Plugins/Bundler.py @@ -76,24 +76,24 @@ class Bundler(Bcfg2.Server.Plugin.Plugin, bundle_entries = {} for key, item in self.entries.items(): - bundle_entries.setdefault(self.patterns.match(os.path.basename(key)).group('name'), []).append(item) + bundle_entries.setdefault(self.patterns.match(os.path.basename(key)).group('name'), + []).append(item) for bundlename in metadata.bundles: - entries = bundle_entries[bundlename] - if len(entries) == 0: + try: + entries = bundle_entries[bundlename] + except KeyError: + self.logger.error("Bundler: Bundle %s does not exist" % + bundlename) continue - elif len(entries) == 1: - try: - bundleset.append(entries[0].get_xml_value(metadata)) - except genshi.template.base.TemplateError: - t = sys.exc_info()[1] - self.logger.error("Bundler: Failed to template genshi bundle %s" \ - % (bundlename)) - self.logger.error(t) - except: - self.logger.error("Bundler: Unexpected bundler error for %s" \ - % (bundlename), exc_info=1) - else: - self.logger.error("Got multiple matches for bundle %s" \ - % (bundlename)) + try: + bundleset.append(entries[0].get_xml_value(metadata)) + except genshi.template.base.TemplateError: + t = sys.exc_info()[1] + self.logger.error("Bundler: Failed to template genshi bundle %s" + % bundlename) + self.logger.error(t) + except: + self.logger.error("Bundler: Unexpected bundler error for %s" % + bundlename, exc_info=1) return bundleset diff --git a/src/lib/Server/Plugins/Cfg.py b/src/lib/Server/Plugins/Cfg.py index 03d56fdc2..917f27e20 100644 --- a/src/lib/Server/Plugins/Cfg.py +++ b/src/lib/Server/Plugins/Cfg.py @@ -100,6 +100,10 @@ class CfgEntrySet(Bcfg2.Server.Plugin.EntrySet): self.specific = CfgMatcher(path.split('/')[-1]) path = path + def debug_log(self, message, flag=None): + if (flag is None and self.debug_flag) or flag: + self.logger.error(message) + def sort_by_specific(self, one, other): return cmp(one.specific, other.specific) diff --git a/src/lib/Server/Plugins/Packages/Yum.py b/src/lib/Server/Plugins/Packages/Yum.py index 416602b27..e13b28251 100644 --- a/src/lib/Server/Plugins/Packages/Yum.py +++ b/src/lib/Server/Plugins/Packages/Yum.py @@ -197,8 +197,21 @@ class YumCollection(Collection): needkeys.add(key) if len(needkeys): - keypkg = lxml.etree.Element('BoundPackage', name="gpg-pubkey", - type=self.ptype, origin='Packages') + if has_yum: + # this must be be has_yum, not use_yum, because + # regardless of whether the user wants to use the yum + # resolver we want to include gpg key data + keypkg = lxml.etree.Element('BoundPackage', name="gpg-pubkey", + type=self.ptype, origin='Packages') + else: + self.logger.warning("GPGKeys were specified for yum sources in " + "sources.xml, but no yum libraries were " + "found") + self.logger.warning("GPG key version/release data cannot be " + "determined automatically") + self.logger.warning("Install yum libraries, or manage GPG keys " + "manually") + keypkg = None for key in needkeys: # figure out the path of the key on the client @@ -219,7 +232,8 @@ class YumCollection(Collection): # hook to add version/release info if possible self._add_gpg_instances(keypkg, kdata, localkey, remotekey) independent.append(keypath) - independent.append(keypkg) + if keypkg is not None: + independent.append(keypkg) # see if there are any pulp sources to handle has_pulp_sources = False @@ -274,20 +288,25 @@ class YumCollection(Collection): def _add_gpg_instances(self, keyentry, keydata, localkey, remotekey): """ add gpg keys to the specification to ensure they get installed """ - if self.use_yum: - try: - kinfo = yum.misc.getgpgkeyinfo(keydata) - version = yum.misc.keyIdToRPMVer(kinfo['keyid']) - release = yum.misc.keyIdToRPMVer(kinfo['timestamp']) - - lxml.etree.SubElement(keyentry, 'Instance', - version=version, - release=release, - simplefile=remotekey) - except ValueError: - err = sys.exc_info()[1] - self.logger.error("Packages: Could not read GPG key %s: %s" % - (localkey, err)) + # this must be be has_yum, not use_yum, because regardless of + # whether the user wants to use the yum resolver we want to + # include gpg key data + if not has_yum: + return + + try: + kinfo = yum.misc.getgpgkeyinfo(keydata) + version = yum.misc.keyIdToRPMVer(kinfo['keyid']) + release = yum.misc.keyIdToRPMVer(kinfo['timestamp']) + + lxml.etree.SubElement(keyentry, 'Instance', + version=version, + release=release, + simplefile=remotekey) + except ValueError: + err = sys.exc_info()[1] + self.logger.error("Packages: Could not read GPG key %s: %s" % + (localkey, err)) def is_package(self, package): if not self.use_yum: @@ -396,10 +415,8 @@ class YumCollection(Collection): self.logger.error("Packages: error running bcfg2-yum-helper " "(returned %d): %s" % (rv, stderr)) elif self.debug_flag: - self.logger.debug("Packages: debug info from bcfg2-yum-helper: %s" % - stderr) - self.logger.debug("Packages: output from bcfg2-yum-helper: %s" % - stderr) + self.debug_log("Packages: debug info from bcfg2-yum-helper: %s" % + stderr) try: return json.loads(stdout) except ValueError: @@ -438,19 +455,18 @@ class YumSource(Source): repoapi = RepositoryAPI() try: self.repo = repoapi.repository(self.pulp_id) - self.gpgkeys = ["%s/%s" % (PULPCONFIG.cds['keyurl'], key) + self.gpgkeys = [os.path.join(PULPCONFIG.cds['keyurl'], key) for key in repoapi.listkeys(self.pulp_id)] except server.ServerRequestError: err = sys.exc_info()[1] if err[0] == 401: msg = "Packages: Error authenticating to Pulp: %s" % err[1] elif err[0] == 404: - msg = "Packages: Pulp repo id %s not found: %s" % (self.pulp_id, - err[1]) + msg = "Packages: Pulp repo id %s not found: %s" % \ + (self.pulp_id, err[1]) else: - msg = "Packages: Error %d fetching pulp repo %s: %s" % (err[0], - self.pulp_id, - err[1]) + msg = "Packages: Error %d fetching pulp repo %s: %s" % \ + (err[0], self.pulp_id, err[1]) raise SourceInitError(msg) except socket.error: err = sys.exc_info()[1] diff --git a/src/lib/Server/Plugins/Pkgmgr.py b/src/lib/Server/Plugins/Pkgmgr.py index 5a2106ea6..e9254cdcc 100644 --- a/src/lib/Server/Plugins/Pkgmgr.py +++ b/src/lib/Server/Plugins/Pkgmgr.py @@ -4,7 +4,10 @@ import logging import re import Bcfg2.Server.Plugin import lxml -from sets import Set +try: + set +except NameError: + from sets import Set as set logger = logging.getLogger('Bcfg2.Plugins.Pkgmgr') @@ -63,7 +66,7 @@ class PNode(Bcfg2.Server.Plugin.INode): if 'Package' not in pdict: pdict['Package'] = set() for child in data.getchildren(): - attrs = Set(data.attrib.keys()).difference(child.attrib.keys() + ['name']) + attrs = set(data.attrib.keys()).difference(child.attrib.keys() + ['name']) for attr in attrs: try: child.set(attr, data.get(attr)) diff --git a/src/lib/Server/Plugins/Probes.py b/src/lib/Server/Plugins/Probes.py index ced18ee42..2af3635e9 100644 --- a/src/lib/Server/Plugins/Probes.py +++ b/src/lib/Server/Plugins/Probes.py @@ -137,6 +137,16 @@ class ProbeSet(Bcfg2.Server.Plugin.EntrySet): def HandleEvent(self, event): if event.filename != self.path: + if (event.code2str == 'changed' and + event.filename.endswith("probed.xml") and + event.filename not in self.entries): + # for some reason, probed.xml is particularly prone to + # getting changed events before created events, + # because gamin is the worst ever. anyhow, we + # specifically handle it here to avoid a warning on + # every single server startup. + self.entry_init(event) + return return self.handle_event(event) def get_probe_data(self, metadata): |