diff options
author | Narayan Desai <desai@mcs.anl.gov> | 2007-02-12 20:48:21 +0000 |
---|---|---|
committer | Narayan Desai <desai@mcs.anl.gov> | 2007-02-12 20:48:21 +0000 |
commit | 4f608872f119e6954779c4e96e356d8baa1c6017 (patch) | |
tree | 474f522f81c957baa74eb7c1148a0d1c040afd5f /src | |
parent | 0b3d33d8f07ea595aee82cec6e6a908dc1e6f20e (diff) | |
download | bcfg2-4f608872f119e6954779c4e96e356d8baa1c6017.tar.gz bcfg2-4f608872f119e6954779c4e96e356d8baa1c6017.tar.bz2 bcfg2-4f608872f119e6954779c4e96e356d8baa1c6017.zip |
Merge crosscheck script into bcfg2-admin
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2801 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src')
-rwxr-xr-x | src/sbin/bcfg2-admin | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/src/sbin/bcfg2-admin b/src/sbin/bcfg2-admin index a8236a55f..549d89176 100755 --- a/src/sbin/bcfg2-admin +++ b/src/sbin/bcfg2-admin @@ -159,6 +159,91 @@ def load_stats(client): err_exit("Could not find stats for client %s" % (client)) return hostent[0] +important = {'Package':['name', 'version'], + 'Service':['name', 'status'], + 'Directory':['name', 'owner', 'group', 'perms'], + 'SymLink':['name', 'to'], + 'ConfigFile':['name', 'owner', 'group', 'perms'], + 'Permissions':['name', 'perms'], + 'PostInstall':['name']} + +def compare(new, old): + for child in new.getchildren(): + equiv = old.xpath('%s[@name="%s"]' % (child.tag, child.get('name'))) + if not important.has_key(child.tag): + print "tag type %s not handled" % (child.tag) + continue + if len(equiv) == 0: + print "didn't find matching %s %s" % (child.tag, child.get('name')) + continue + elif len(equiv) >= 1: + if child.tag == 'ConfigFile': + if child.text != equiv[0].text: + print "%s %s contents differ" \ + % (child.tag, child.get('name')) + continue + noattrmatch = [field for field in important[child.tag] if \ + child.get(field) != equiv[0].get(field)] + if not noattrmatch: + new.remove(child) + old.remove(equiv[0]) + else: + print "%s %s attributes %s do not match" % \ + (child.tag, child.get('name'), noattrmatch) + if len(old.getchildren()) == 0 and len(new.getchildren()) == 0: + return True + if new.tag == 'Independant': + name = 'Indep' + else: + name = new.get('name') + both = [] + oldl = ["%s %s" % (entry.tag, entry.get('name')) for entry in old] + newl = ["%s %s" % (entry.tag, entry.get('name')) for entry in new] + for entry in newl: + if entry in oldl: + both.append(entry) + newl.remove(entry) + oldl.remove(entry) + for entry in both: + print "%s differs (in bundle %s)" % (entry, name) + for entry in oldl: + print "%s only in old configuration (in bundle %s)" % (entry, name) + for entry in newl: + print "%s only in new configuration (in bundle %s)" % (entry, name) + return False + +def do_compare(args): + '''run file comparison''' + try: + (old, new) = args + except IndexError: + print "Usage: bcfg2-admin compare <old> <new>" + raise SystemExit + + new = lxml.etree.parse(new).getroot() + old = lxml.etree.parse(old).getroot() + for src in [new, old]: + for bundle in src.findall('./Bundle'): + if bundle.get('name')[-4:] == '.xml': + bundle.set('name', bundle.get('name')[:-4]) + + for bundle in new.findall('./Bundle'): + equiv = old.xpath('Bundle[@name="%s"]' % (bundle.get('name'))) + if len(equiv) == 0: + print "couldnt find matching bundle for %s" % bundle.get('name') + continue + if len(equiv) == 1: + if compare(bundle, equiv[0]): + new.remove(bundle) + old.remove(equiv[0]) + else: + print "dunno what is going on for bundle %s" % (bundle.get('name')) + i1 = new.find('./Independant') + i2 = old.find('./Independant') + if compare(i1, i2): + new.remove(i1) + old.remove(i2) + def do_pull(client, etype, ename): '''Make currently recorded client state correct for entry''' cfile = '/etc/bcfg2.conf' @@ -320,7 +405,7 @@ def do_viz(args): for group in egroups: color = categories[group.get('category', 'default')] if group.get('profile', 'false') == 'true': - style="filled, bold" + style = "filled, bold" else: style = "filled" gseen.append(group.get('name')) @@ -376,6 +461,8 @@ if __name__ == '__main__': do_tidy(sys.argv[2:]) elif sys.argv[1] == 'viz': do_viz(sys.argv[2:]) + elif sys.argv[1] == 'compare': + do_compare(sys.argv[2:]) else: print usage |