source: vanHelsing/trunk/src/bcfg.py @ 816

Last change on this file since 816 was 816, checked in by slederer, 13 years ago

Aufräumen, Funktionen zum Filtern nach Ressourcen-Typ

  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-python
File size: 6.8 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3"""Classes and functions for configuration file handling
4"""
5
6import sys
7import re
8import resource
9import directive
10import random
11
12RESOURCE_TYPES = ('dird', 'console', 'filed', 'stored')
13
14rxp_item = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*\\=(.*)') # xxx = xxx matchen
15rxp_item2 = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*\\=\\s*{(.*)}\\s*') # match type = { a = 1; b= 2}
16rxp_openbrace = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*\\=?\\s*\\{\\s*')    # match xxx {
17rxp_open = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*$')    # match xxx
18rxp_closebrace = re.compile('[^{]*}.*')               # match }
19rxp_comment = re.compile('^\s*#.*')
20
21
22
23#'dird', 'console', 'filed' or 'stored'
24class Config(object):
25    """Class for bacula configuration access"""
26   
27    def __init__(self, resource_type, filename=""):
28        self.resource_type = resource_type
29        self.filename = filename
30        self.resources = resource.Root(level=0)
31        self.resources.type="<root>"
32
33    def read(self):
34        self.parse(self.resources,open(self.filename,"r"),0)
35        #print self.resources
36       
37    def write(self, filename=None):
38        if(filename==None):
39            filename=self.filename
40        f=open(filename,"w")
41        f.write(str(self.getRoot()))
42        f.close()
43
44    def getRoot(self):
45        return self.resources
46
47    def addResource(self,resname,level,curRes):
48        try:
49                resClass = getattr(resource,resname);
50        except:
51                resClass = resource.Resource
52
53        newRes=resClass(level+1)
54        newRes.type=resname
55        curRes.add_item(newRes);
56        return newRes
57
58    def parse(self,curRes,f,level):
59        #print "START",curRes.type
60
61        while True:
62            line=f.readline()
63            if not line:
64                break
65
66            inlinecomment=None
67         
68            commentStart=line.find("#")
69            if commentStart!=-1:
70                inlinecomment=line[commentStart:]
71                line=line[:commentStart].strip()
72                #curRes.add_comment(inlinecomment)
73
74            include=line.strip()
75            if include.startswith("@"):
76                includepath=include[1:].strip()
77                print "include " +includepath
78                self.parse(curRes,open(includepath,"r"),level)
79
80            if rxp_closebrace.match(line):
81                #print "closebraceline"
82                break
83
84            item2 = rxp_item2.match(line)
85            if item2:
86                #print "item2"
87                name = item2.group(1)
88                value = item2.group(2)
89                #print "item:",name,value
90                newRes=resource.Resource(level+1)
91                newRes.type=name
92                newRes.value="{"+value+"}"
93                curRes.add_item(newRes)
94                continue
95
96            openbraceline = rxp_openbrace.match(line)
97            if openbraceline:
98                #print "openbraceline"
99                resname = openbraceline.group(1)
100                newRes=self.addResource(resname,level,curRes)
101                self.parse(newRes,f,level+1);
102                continue
103
104            open = rxp_open.match(line)
105            if open:
106                resname = open.group(1)
107                newRes=self.addResource(resname,level,curRes)
108                self.parse(newRes,f,level+1);
109                continue
110
111            item = rxp_item.match(line)
112            if item:
113                name = item.group(1)
114                value = item.group(2).strip()
115                #print "item:",name,value
116                newRes=resource.Resource(level+1)
117                newRes.type=name
118                newRes.value=value
119                curRes.add_item(newRes)
120                continue
121
122        #print "END",curRes.name
123   
124class DirdConfig(Config):
125   
126    def __init__(self, filename=""):
127        Config.__init__(self, 'dird', filename)
128       
129class ConsoleConfig(Config):
130    pass
131
132class FiledConfig(Config):
133    def __init__(self, filename=""):
134        Config.__init__(self, 'fd', filename)
135
136    def setDefaults(self,directorName,directorPassword,myName):
137        director=resource.Director(1,"Director")
138        director.add("Name",directorName)
139        director.add("Password",'"'+directorPassword+'"')
140        self.getRoot().add_item(director)
141       
142        fileDaemon=resource.FileDaemon(1,"FileDaemon")
143        fileDaemon.add("Name",myName)
144        #fileDaemon.add("FDport","9102")
145        fileDaemon.add("WorkingDirectory","/var/lib/bacula")
146        fileDaemon.add("Pid Directory","/var/run")
147        fileDaemon.add("Maximum Concurrent Jobs","20")
148        self.getRoot().add_item(fileDaemon)
149
150        messages=resource.Messages(1,"Messages")
151        messages.add("Name","Standard")
152        messages.add("director",directorName+" = all, !skipped, !restored")
153        self.getRoot().add_item(messages)
154       
155class StoredConfig(Config):
156    pass
157
158def genpasswd(len=32):
159    charset="01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!/%()=?@"
160    password=""
161    for a in xrange(0,len):
162       password += random.choice(charset)
163    return password
164
165
166def createClientConfig(dirdcfg,clientName,clientPassword=genpasswd()):
167    director=dirdcfg.getRoot().getByType("Director")[0]
168    dirdName=director.getName()
169    r=dirdcfg.getRoot().getByName(clientName)
170    if len(r)==1:
171        client=r[0]
172    else:
173        return
174   
175    filename=clientName+".conf"
176    fdcfg=FiledConfig(filename)
177    fdcfg.setDefaults(dirdName,clientPassword,clientName)
178    fdcfg.write()
179
180def createAllClientConfigs(dirdcfg):
181    clients=dirdcfg.getRoot().getByType("Client",1)
182    director=dirdcfg.getRoot().getByType("Director")[0]
183    dirdName=director.getName()
184
185    for c in clients:
186        print c
187        clientName=c.getName()
188        if clientName!=None:
189            r=c.getByType("Password")
190            if len(r)>0:
191                clientPassword=r[0].value
192                clientPassword=clientPassword.replace('"','')
193            else:
194                clientPassword=""
195            filename=clientName+".conf"
196            fdcfg=FiledConfig(filename)
197            fdcfg.setDefaults(dirdName,clientPassword,clientName)
198            fdcfg.write()
199
200 
201if __name__ == "__main__":
202    if len(sys.argv) < 2:
203        filename="test.conf"
204    else:
205        filename=sys.argv[1]   
206
207    dirdcfg = DirdConfig(filename)
208    dirdcfg.read()
209
210    root=dirdcfg.getRoot()
211
212    job=resource.Job(1,"Job")
213    job.setDefaults("test2-job","test2","testdefs","Full Set")
214
215    root.add_item(job)
216
217    pwd=genpasswd()
218    newclient=resource.Client(1,"Client")
219    newclient.setDefaults("test-fd","testclient","MyCatalog",pwd)
220    root.add_item(newclient)
221
222    dirdcfg.write("test.conf.out")
223
224    fdcfg=FiledConfig("test-fd.conf")
225    fdcfg.setDefaults("bacula-dird",pwd,"test-fd")
226    fdcfg.write()
227
228
229    createClientConfig(dirdcfg,"gaffel-fd")
230    createClientConfig(dirdcfg,"test-fd")
231
232    createAllClientConfigs(dirdcfg)
233    sys.exit(0)
Note: See TracBrowser for help on using the repository browser.