#!/usr/bin/env python '''ValidateBcfg2Repo checks all xml files in Bcfg2 repos against their respective XML schemas''' __revision__ = '0.7.3' from glob import glob from lxml.etree import parse, XMLSchema from os import system from sys import argv from ConfigParser import ConfigParser, NoSectionError, NoOptionError if __name__ == '__main__': cf = ConfigParser() schemadir = '/usr/share/bcfg2/schemas' cf.read(['/etc/bcfg2.conf']) try: repo = cf.get('server', 'repository') except (NoSectionError, NoOptionError): if len(argv) == 1: print "Repository location not specified in config file or on command line" print "Usage: validate_repo " raise SystemExit, 1 repo = argv[1] # add more validation as more schemas get written filesets = {'metadata':("%s/etc/metadata.xml", "%s/metadata.xsd"), 'bundle':("%s/Bundler/*.xml", "%s/bundle.xsd"), 'pkglist':("%s/Pkgmgr/*.xml", "%s/pkglist.xsd"), 'base':("%s/etc/base.xml", "%s/base.xsd"), 'imageinfo':("%s/etc/imageinfo.xml", "%s/translation.xsd"), 'imageinfo':("%s/etc/reports.xml", "%s/report-configuration.xsd"), 'services':("%s/etc/services.xml", "%s/services.xsd")} for k, (spec, schemaname) in filesets.iteritems(): schema = XMLSchema(parse(open(schemaname%(schemadir)))) for filename in glob(spec%(repo)): try: datafile = parse(open(filename)) except SyntaxError: print "%s ***FAILS*** to parse \t\t<----" % (filename) system("xmllint %s" % filename) continue except IOError: print "Failed to open file %s \t\t<---" % (filename) continue if schema.validate(datafile): if '-v' in argv: print "%s checks out" % (filename) else: print "%s ***FAILS*** to verify \t\t<----" % (filename) system("xmllint --schema %s %s" % (schemaname % schemadir, filename))