summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Structures/Base.py
blob: 9c6eaf5732dd333e2e67f22f463163a256077e4f (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
49
50
51
#!/usr/bin/env python
'''This module sets up a base list of configuration entries'''
__revision__ = '$Revision$'

from copy import deepcopy

from Bcfg2.Server.Generator import SingleXMLFileBacked
from Bcfg2.Server.Structure import Structure

from elementtree.ElementTree import Element, XML

class BaseFile(SingleXMLFileBacked):
    '''The Base file contains unstructured/independent configuration elements'''
    
    def Index(self):
        '''Store XML data in reasonable structures'''
        self.store = {}
        for entry in XML(self.data).getchildren():
            self.store[entry.tag][entry.get('name')] = {'all':[], 'Class':{}}
            for child in entry.getchildren():
                if child.tag in ['Image', 'Class']:
                    self.store[entry.tag][child.tag][child.get('name')] = child.getchildren()
                else:
                    self.store[entry.tag]['all'].append(child)

    def Construct(self, metadata):
        '''Build structures for client described by metadata'''
        ret = Element("Independant", version='2.0')
        idata = self.store['Image'].get(metadata.image, {'all':[], 'Class':{}})
        for entry in idata['all']:
            ret.append(deepcopy(entry))
        for cls in metadata.classes:
            for entry in idata['Class'].get(cls, []):
                ret.append(deepcopy(entry))
            cdata = self.store['Class'].get(cls, {'all':[], 'Image':{}})
            for entry in cdata['all']:
                ret.append(deepcopy(entry))
            for entry in cdata['Image'].get(metadata.image, []):
                ret.append(deepcopy(entry))
        return [ret]

class Base(Structure):
    '''This Structure is good for the pile of independent configs needed for most actual systems'''
    __name__ =  'Base'
    __version__ = '$Id$'
    
    '''base creates independent clauses based on client metadata'''
    def __init__(self, core, datastore):
        Structure.__init__(self, core, datastore)
        self.base = BaseFile("%s/etc/base.xml"%(datastore), self.core.fam)
        self.Construct = self.base.Construct