summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Server/Lint/Metadata.py
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2013-09-23 10:58:02 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2013-09-23 10:58:02 -0400
commitd1e8d4652a30343d29d482163fa71f93ad03ec4d (patch)
tree788aefc1674dbc4cdcd3e4f98a1cb1b4c8664191 /src/lib/Bcfg2/Server/Lint/Metadata.py
parent8c4fbd1e8429937847adc98a4487b7367a218ce7 (diff)
parent5b2af26603d3ea01378561429179cdd895c42ec0 (diff)
downloadbcfg2-d1e8d4652a30343d29d482163fa71f93ad03ec4d.tar.gz
bcfg2-d1e8d4652a30343d29d482163fa71f93ad03ec4d.tar.bz2
bcfg2-d1e8d4652a30343d29d482163fa71f93ad03ec4d.zip
Merge branch 'maint'
Conflicts: src/lib/Bcfg2/Server/Plugins/GroupLogic.py src/lib/Bcfg2/Server/Plugins/Metadata.py tools/posixusers_baseline.py
Diffstat (limited to 'src/lib/Bcfg2/Server/Lint/Metadata.py')
-rw-r--r--src/lib/Bcfg2/Server/Lint/Metadata.py38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/lib/Bcfg2/Server/Lint/Metadata.py b/src/lib/Bcfg2/Server/Lint/Metadata.py
index bf19c25fc..248b1610c 100644
--- a/src/lib/Bcfg2/Server/Lint/Metadata.py
+++ b/src/lib/Bcfg2/Server/Lint/Metadata.py
@@ -106,15 +106,35 @@ class Metadata(ServerPlugin):
"client")
def duplicate_groups(self):
- """ Check for groups that are defined more than once. We
- count a group tag as a definition if it a) has profile or
- public set; or b) has any children."""
- allgroups = [
- g
- for g in self.metadata.groups_xml.xdata.xpath("//Groups/Group") +
- self.metadata.groups_xml.xdata.xpath("//Groups/Group//Group")
- if g.get("profile") or g.get("public") or g.getchildren()]
- self.duplicate_entries(allgroups, "group")
+ """ Check for groups that are defined more than once. There
+ are two ways this can happen:
+
+ 1. The group is listed twice with contradictory options.
+ 2. The group is listed with no options *first*, and then with
+ options later.
+
+ In this context, 'first' refers to the order in which groups
+ are parsed; see the loop condition below and
+ _handle_groups_xml_event above for details. """
+ groups = dict()
+ duplicates = dict()
+ for grp in self.metadata.groups_xml.xdata.xpath("//Groups/Group") + \
+ self.metadata.groups_xml.xdata.xpath("//Groups/Group//Group"):
+ grpname = grp.get("name")
+ if grpname in duplicates:
+ duplicates[grpname].append(grp)
+ elif len(grp.attrib) > 1: # group has options
+ if grpname in groups:
+ duplicates[grpname] = [grp, groups[grpname]]
+ else:
+ groups[grpname] = grp
+ else: # group has no options
+ groups[grpname] = grp
+ for grpname, grps in duplicates.items():
+ self.LintError("duplicate-group",
+ "Group %s is defined multiple times:\n%s" %
+ (grpname,
+ "\n".join(self.RenderXML(g) for g in grps)))
def duplicate_entries(self, allentries, etype):
""" Generic duplicate entry finder.