diff options
author | Jack Neely <jjneely@ncsu.edu> | 2011-03-03 15:41:10 -0500 |
---|---|---|
committer | Jack Neely <jjneely@ncsu.edu> | 2011-03-03 15:41:10 -0500 |
commit | 821a6d5c9244af924146c2e7d4caa0939885a84f (patch) | |
tree | 14d5d99bc7a60492361bbf600604865e52d361a1 /src | |
parent | 81fce09fb9671c652703c37a5f9b48d020a34307 (diff) | |
parent | 73a4e8648c501437b3b1f4bd95e9c4023da9b681 (diff) | |
download | bcfg2-821a6d5c9244af924146c2e7d4caa0939885a84f.tar.gz bcfg2-821a6d5c9244af924146c2e7d4caa0939885a84f.tar.bz2 bcfg2-821a6d5c9244af924146c2e7d4caa0939885a84f.zip |
Merge branch 'master' into yumng
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Client/Tools/APT.py | 2 | ||||
-rw-r--r-- | src/lib/Client/Tools/POSIX.py | 36 | ||||
-rw-r--r-- | src/lib/Client/Tools/SMF.py | 1 | ||||
-rw-r--r-- | src/lib/Client/Tools/YUMng.py | 9 | ||||
-rw-r--r-- | src/lib/Client/Tools/__init__.py | 6 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Bundler.py | 23 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Cfg.py | 26 | ||||
-rw-r--r-- | src/lib/Server/Reports/settings.py | 1 | ||||
-rwxr-xr-x | src/sbin/bcfg2-repo-validate | 2 | ||||
-rwxr-xr-x | src/sbin/bcfg2-reports | 2 |
10 files changed, 72 insertions, 36 deletions
diff --git a/src/lib/Client/Tools/APT.py b/src/lib/Client/Tools/APT.py index 156186091..fe1ef6fdd 100644 --- a/src/lib/Client/Tools/APT.py +++ b/src/lib/Client/Tools/APT.py @@ -119,7 +119,7 @@ class APT(Bcfg2.Client.Tools.Tool): if bad: self.logger.debug("It is suggested that you either manage these " "files, revert the changes, or ignore false " - "failures):") + "failures:") self.logger.info("Package %s failed validation. Bad files are:" % \ entry.get('name')) self.logger.info(bad) diff --git a/src/lib/Client/Tools/POSIX.py b/src/lib/Client/Tools/POSIX.py index d2611130c..c883fc17a 100644 --- a/src/lib/Client/Tools/POSIX.py +++ b/src/lib/Client/Tools/POSIX.py @@ -671,12 +671,36 @@ class POSIX(Bcfg2.Client.Tools.Tool): def Installnonexistent(self, entry): '''Remove nonexistent entries''' - try: - os.remove(entry.get('name')) - return True - except OSError: - self.logger.error('Failed to remove %s' % entry.get('name')) - return False + ename = entry.get('name') + if entry.get('recursive') in ['True', 'true']: + # ensure that configuration spec is consistent first + if [e for e in self.buildModlist() \ + if e.startswith(ename) and e != ename]: + self.logger.error('Not installing %s. One or more files ' + 'in this directory are specified in ' + 'your configuration.' % ename) + return False + try: + shutil.rmtree(ename) + except OSError, e: + self.logger.error('Failed to remove %s: %s' % (ename, + e.strerror)) + else: + if os.path.isdir(ename): + try: + os.rmdir(ename) + return True + except OSError, e: + self.logger.error('Failed to remove %s: %s' % (ename, + e.strerror)) + return False + try: + os.remove(ename) + return True + except OSError, e: + self.logger.error('Failed to remove %s: %s' % (ename, + e.strerror)) + return False def Verifypermissions(self, entry, _): """Verify Path type='permissions' entry""" diff --git a/src/lib/Client/Tools/SMF.py b/src/lib/Client/Tools/SMF.py index f0bc6bd05..96c7d9d28 100644 --- a/src/lib/Client/Tools/SMF.py +++ b/src/lib/Client/Tools/SMF.py @@ -66,6 +66,7 @@ class SMF(Bcfg2.Client.Tools.SvcTool): # Occurs when no lines are returned (service not installed) return False + entry.set('current_status', srvdata[0]) if entry.get('status') == 'on': return srvdata[0] == 'ON' else: diff --git a/src/lib/Client/Tools/YUMng.py b/src/lib/Client/Tools/YUMng.py index 3b5a62d97..8db1683e4 100644 --- a/src/lib/Client/Tools/YUMng.py +++ b/src/lib/Client/Tools/YUMng.py @@ -358,7 +358,12 @@ class YUMng(Bcfg2.Client.Tools.PkgTool): for po in packages: d = {} for i in ['name', 'epoch', 'version', 'release', 'arch']: - d[i] = getattr(po, i) + if i == 'arch' and getattr(po, i) is None: + d[i] = 'noarch' + elif i == 'epoch' and getattr(po, i) is None: + d[i] = '0' + else: + d[i] = getattr(po, i) self.installed.setdefault(po.name, []).append(d) def VerifyPackage(self, entry, modlist, pinned_version=None): @@ -530,7 +535,7 @@ class YUMng(Bcfg2.Client.Tools.PkgTool): package_fail = True self.logger.debug("It is suggested that you either manage " "these files, revert the changes, or ignore " - "false failures):") + "false failures:") self.logger.debug(" Verify Problems:") for fn, probs in stat['verify'].items(): self.logger.debug(" %s" % fn) diff --git a/src/lib/Client/Tools/__init__.py b/src/lib/Client/Tools/__init__.py index 8a90e130c..b5120db71 100644 --- a/src/lib/Client/Tools/__init__.py +++ b/src/lib/Client/Tools/__init__.py @@ -335,9 +335,7 @@ class SvcTool(Tool): def restart_service(self, service): self.logger.debug('Restarting service %s' % service.get('name')) - restart_target = 'restart' - if service.get('mode', 'default') == 'custom': - restart_target = service.get('target', 'restart') + restart_target = service.get('target', 'restart') return self.cmd.run(self.get_svc_command(service, restart_target))[0] def check_service(self, service): @@ -353,7 +351,7 @@ class SvcTool(Tool): if entry.get('mode', 'default') == 'manual': continue # need to handle servicemode = (build|default) - # need to handle mode = (default|supervised|custom) + # need to handle mode = (default|supervised) if entry.get('status') == 'on': if self.setup['servicemode'] == 'build': rc = self.stop_service(entry) diff --git a/src/lib/Server/Plugins/Bundler.py b/src/lib/Server/Plugins/Bundler.py index 47cd7e2c4..3f88fe26b 100644 --- a/src/lib/Server/Plugins/Bundler.py +++ b/src/lib/Server/Plugins/Bundler.py @@ -15,17 +15,22 @@ try: except: have_genshi = False + class BundleFile(Bcfg2.Server.Plugin.StructFile): + def get_xml_value(self, metadata): bundlename = self.name.split('/')[-1][:-4] bundle = lxml.etree.Element('Bundle', name=bundlename) [bundle.append(copy.deepcopy(item)) for item in self.Match(metadata)] return bundle + class Bundler(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.Structure, Bcfg2.Server.Plugin.XMLDirectoryBacked): - """The bundler creates dependent clauses based on the bundle/translation scheme from Bcfg1.""" + """The bundler creates dependent clauses based on the + bundle/translation scheme from Bcfg1. + """ name = 'Bundler' __version__ = '$Id$' __author__ = 'bcfg-dev@mcs.anl.gov' @@ -37,14 +42,26 @@ class Bundler(Bcfg2.Server.Plugin.Plugin, self.encoding = core.encoding self.__child__ = self.template_dispatch try: - Bcfg2.Server.Plugin.XMLDirectoryBacked.__init__(self, self.data, self.core.fam) + Bcfg2.Server.Plugin.XMLDirectoryBacked.__init__(self, + self.data, + self.core.fam) except OSError: self.logger.error("Failed to load Bundle repository") raise Bcfg2.Server.Plugin.PluginInitError def template_dispatch(self, name): + bundle = lxml.etree.parse(name) + nsmap = bundle.getroot().nsmap if name.endswith('.xml'): - return BundleFile(name) + if have_genshi and \ + (nsmap == {'py': 'http://genshi.edgewall.org/'}): + # allow for genshi bundles with .xml extensions + spec = Bcfg2.Server.Plugin.Specificity() + return Bcfg2.Server.Plugins.SGenshi.SGenshiTemplateFile(name, + spec, + self.encoding) + else: + return BundleFile(name) elif name.endswith('.genshi'): if have_genshi: spec = Bcfg2.Server.Plugin.Specificity() diff --git a/src/lib/Server/Plugins/Cfg.py b/src/lib/Server/Plugins/Cfg.py index e22102ffa..f851b7914 100644 --- a/src/lib/Server/Plugins/Cfg.py +++ b/src/lib/Server/Plugins/Cfg.py @@ -174,23 +174,15 @@ class CfgEntrySet(Bcfg2.Server.Plugin.EntrySet): metadata_updates.update(self.metadata) for attr in badattr: metadata_updates[attr] = new_entry.get(attr) - if self.infoxml: - infoxml = lxml.etree.Element('FileInfo') - infotag = lxml.etree.SubElement(infoxml, 'Info') - [infotag.attrib.__setitem__(attr, metadata_updates[attr]) \ - for attr in metadata_updates] - ofile = open(self.path + "/info.xml","w") - ofile.write(lxml.etree.tostring(infoxml, pretty_print=True)) - ofile.close() - if log: - logger.info("Wrote file %s" % (self.path + "/info.xml")) - else: - infofile = open(self.path + '/:info', 'w') - for x in metadata_updates.iteritems(): - infofile.write("%s: %s\n" % x) - infofile.close() - if log: - logger.info("Wrote file %s" % infofile.name) + infoxml = lxml.etree.Element('FileInfo') + infotag = lxml.etree.SubElement(infoxml, 'Info') + [infotag.attrib.__setitem__(attr, metadata_updates[attr]) \ + for attr in metadata_updates] + ofile = open(self.path + "/info.xml","w") + ofile.write(lxml.etree.tostring(infoxml, pretty_print=True)) + ofile.close() + if log: + logger.info("Wrote file %s" % (self.path + "/info.xml")) class Cfg(Bcfg2.Server.Plugin.GroupSpool, Bcfg2.Server.Plugin.PullTarget): diff --git a/src/lib/Server/Reports/settings.py b/src/lib/Server/Reports/settings.py index 9efe38552..66da7a8b1 100644 --- a/src/lib/Server/Reports/settings.py +++ b/src/lib/Server/Reports/settings.py @@ -81,7 +81,6 @@ SECRET_KEY = 'eb5+y%oy-qx*2+62vv=gtnnxg1yig_odu0se5$h0hh#pc*lmo7' TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', - 'django.template.loaders.eggs.load_template_source', ) MIDDLEWARE_CLASSES = ( diff --git a/src/sbin/bcfg2-repo-validate b/src/sbin/bcfg2-repo-validate index 3d5efb093..554e4f72b 100755 --- a/src/sbin/bcfg2-repo-validate +++ b/src/sbin/bcfg2-repo-validate @@ -94,7 +94,7 @@ if __name__ == '__main__': 'hardlink': ['name', 'to'], 'symlink': ['name', 'to'], 'ignore': ['name'], - 'nonexist': ['name'], + 'nonexistent': ['name'], 'permissions': ['name', 'owner', 'group', 'perms']} for rfile in rules_list: try: diff --git a/src/sbin/bcfg2-reports b/src/sbin/bcfg2-reports index f3e60d89e..d83e45e7c 100755 --- a/src/sbin/bcfg2-reports +++ b/src/sbin/bcfg2-reports @@ -138,7 +138,7 @@ if expire != "": c_inst.save() elif '-h' in args: - print """Usage: python bcfg2-reports [option] ... + print """Usage: bcfg2-reports [option] ... Options and arguments (and corresponding environment variables): -a : shows all hosts, including expired hosts |