summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Server/Lint/InfoXML.py
blob: 7b89e86b27b2ca00a59b102357e3e56b2c3decbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import os.path
import Bcfg2.Options
import Bcfg2.Server.Lint

class InfoXML(Bcfg2.Server.Lint.ServerPlugin):
    """ ensure that all config files have an info.xml file"""
    def Run(self):
        if 'Cfg' in self.core.plugins:
            for filename, entryset in self.core.plugins['Cfg'].entries.items():
                infoxml_fname = os.path.join(entryset.path, "info.xml")
                if self.HandlesFile(infoxml_fname):
                    if (hasattr(entryset, "infoxml") and
                        entryset.infoxml is not None):
                        self.check_infoxml(infoxml_fname,
                                           entryset.infoxml.pnode.data)
                    else:
                        self.LintError("no-infoxml",
                                       "No info.xml found for %s" % filename)

    @classmethod
    def Errors(cls):
        return {"no-infoxml":"warning",
                "paranoid-false":"warning",
                "broken-xinclude-chain":"warning",
                "required-infoxml-attrs-missing":"error"}

    def check_infoxml(self, fname, xdata):
        for info in xdata.getroottree().findall("//Info"):
            required = []
            if "required_attrs" in self.config:
                required = self.config["required_attrs"].split(",")

            missing = [attr for attr in required if info.get(attr) is None]
            if missing:
                self.LintError("required-infoxml-attrs-missing",
                               "Required attribute(s) %s not found in %s:%s" %
                               (",".join(missing), fname, self.RenderXML(info)))

            if ((Bcfg2.Options.MDATA_PARANOID.value and
                 info.get("paranoid") is not None and
                 info.get("paranoid").lower() == "false") or
                (not Bcfg2.Options.MDATA_PARANOID.value and
                 (info.get("paranoid") is None or
                  info.get("paranoid").lower() != "true"))):
                self.LintError("paranoid-false",
                               "Paranoid must be true in %s:%s" %
                               (fname, self.RenderXML(info)))