summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--schemas/clients.xsd5
-rw-r--r--schemas/metadata.xsd6
-rw-r--r--src/lib/Server/Plugins/Metadata.py35
-rwxr-xr-xsrc/sbin/bcfg2-repo-validate2
4 files changed, 39 insertions, 9 deletions
diff --git a/schemas/clients.xsd b/schemas/clients.xsd
index ba2618933..26da2483f 100644
--- a/schemas/clients.xsd
+++ b/schemas/clients.xsd
@@ -28,6 +28,11 @@
<xsd:complexType>
<xsd:choice minOccurs='0' maxOccurs='unbounded'>
<xsd:element name='Client' type='ClientType'/>
+ <xsd:element name='Clients'>
+ <xsd:choice>
+ <xsd:element name='Client' type='ClientType'/>
+ </xsd:choice>
+ </xsd:element>
</xsd:choice>
<xsd:attribute name='version' type='xsd:string'/>
</xsd:complexType>
diff --git a/schemas/metadata.xsd b/schemas/metadata.xsd
index 281bf72fd..b58a8f40c 100644
--- a/schemas/metadata.xsd
+++ b/schemas/metadata.xsd
@@ -40,12 +40,18 @@
<xsd:attribute type='xsd:string' name='name' use='required'/>
<xsd:attribute type='toolsetType' name='toolset' use='optional'/>
<xsd:attribute type='xsd:string' name='category' use='optional'/>
+ <xsd:attribute type='xsd:string' name='comment' use='optional'/>
</xsd:complexType>
<xsd:element name='Groups'>
<xsd:complexType>
<xsd:choice minOccurs='0' maxOccurs='unbounded'>
<xsd:element name='Group' type='groupType'/>
+ <xsd:element name='Groups'>
+ <xsd:choice>
+ <xsd:element name='Group' type='groupType'/>
+ </xsd:choice>
+ </xsd:element>
</xsd:choice>
<xsd:attribute name='version' type='xsd:string'/>
</xsd:complexType>
diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py
index 1f442feed..d416b8c89 100644
--- a/src/lib/Server/Plugins/Metadata.py
+++ b/src/lib/Server/Plugins/Metadata.py
@@ -54,24 +54,43 @@ class Metadata(Bcfg2.Server.Plugin.Plugin):
except:
self.probes = False
self.probedata = {}
+ self.extra = {'groups.xml':[], 'clients.xml':[]}
def HandleEvent(self, event):
'''Handle update events for data files'''
filename = event.filename.split('/')[-1]
- if filename not in ['groups.xml', 'clients.xml']:
+ if filename in ['groups.xml', 'clients.xml']:
+ dest = filename
+ elif filename in reduce(lambda x,y:x+y, self.extra.values()):
+ if event.code2str() == 'exists':
+ return
+ dest = [key for key, value in self.extra.iteritems() if filename in value][0]
+ else:
return
if event.code2str() == 'endExist':
return
try:
- xdata = lxml.etree.parse("%s/%s" % (self.data, filename))
+ xdata = lxml.etree.parse("%s/%s" % (self.data, dest))
except lxml.etree.XMLSyntaxError:
- self.logger.error('Failed to parse %s' % (filename))
+ self.logger.error('Failed to parse %s' % (dest))
return
- if filename == 'clients.xml':
+ included = [ent.get('href') for ent in \
+ xdata.findall('./{http://www.w3.org/2001/XInclude}include')]
+ if included:
+ for name in included:
+ if name not in self.extra[dest]:
+ self.core.fam.AddMonitor("%s/%s" % (self.data, name), self)
+ self.extra[dest].append(name)
+ try:
+ xdata.xinclude()
+ except lxml.etree.XIncludeError:
+ self.logger.error("Failed to process XInclude for file %s" % dest)
+
+ if dest == 'clients.xml':
self.clients = {}
self.aliases = {}
self.clientdata = xdata
- for client in xdata.findall('./Client'):
+ for client in xdata.findall('.//Client'):
if 'address' in client.attrib:
self.addresses[client.get('address')] = client.get('name')
for alias in [alias for alias in client.findall('Alias') if 'address' in alias.attrib]:
@@ -79,14 +98,14 @@ class Metadata(Bcfg2.Server.Plugin.Plugin):
self.clients.update({client.get('name'): client.get('profile')})
[self.aliases.update({alias.get('name'): client.get('name')}) for alias in client.findall('Alias')]
- elif filename == 'groups.xml':
+ elif dest == 'groups.xml':
self.public = []
self.profiles = []
self.toolsets = {}
self.groups = {}
grouptmp = {}
self.categories = {}
- for group in xdata.findall('./Group'):
+ for group in xdata.findall('.//Group'):
grouptmp[group.get('name')] = tuple([[item.get('name') for item in group.findall(spec)]
for spec in ['./Bundle', './Group']])
grouptmp[group.get('name')][1].append(group.get('name'))
@@ -118,7 +137,7 @@ class Metadata(Bcfg2.Server.Plugin.Plugin):
self.groups[group][2][self.categories[ggg]] = ggg
[self.groups[group][0].append(bund) for bund in bundles
if bund not in self.groups[group][0]]
- self.states[filename] = True
+ self.states[dest] = True
if False not in self.states.values():
# check that all client groups are real and complete
real = self.groups.keys()
diff --git a/src/sbin/bcfg2-repo-validate b/src/sbin/bcfg2-repo-validate
index 2efef0dc0..ab835f0a1 100755
--- a/src/sbin/bcfg2-repo-validate
+++ b/src/sbin/bcfg2-repo-validate
@@ -68,6 +68,6 @@ if __name__ == '__main__':
print "%s checks out" % (filename)
else:
print "%s ***FAILS*** to verify \t\t<----" % (filename)
- os.system("xmllint --schema %s %s" % (schemaname % schemadir, filename))
+ os.system("xmllint --xinclude --schema %s %s" % (schemaname % schemadir, filename))
failures = 1
raise SystemExit, failures