1 | #!/usr/bin/python
|
---|
2 | # -*- coding: utf-8 -*-
|
---|
3 | """Classes and functions for configuration file handling
|
---|
4 | """
|
---|
5 |
|
---|
6 | import sys
|
---|
7 | import re
|
---|
8 | import resource
|
---|
9 | import directive
|
---|
10 |
|
---|
11 | RESOURCE_TYPES = ('dird', 'console', 'filed', 'stored')
|
---|
12 |
|
---|
13 | rxp_item = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*\\=(.*)') # xxx = xxx matchen
|
---|
14 | rxp_item2 = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*\\=\\s*{(.*)}\\s*') # match key = { a = 1; b= 2}
|
---|
15 | rxp_openbrace = re.compile('^\\s*(\\w[\\w ]*\\w+)\\s*\\=?\\s*\\{\\s*') # match xxx {
|
---|
16 | rxp_closebrace = re.compile('[^{]*}.*') # match }
|
---|
17 | rxp_comment = re.compile('^\s*#.*')
|
---|
18 |
|
---|
19 |
|
---|
20 |
|
---|
21 | #'dird', 'console', 'filed' or 'stored'
|
---|
22 | class Config(object):
|
---|
23 | """Class for bacula configuration access"""
|
---|
24 |
|
---|
25 | def __init__(self, resource_type, filename=""):
|
---|
26 | self.resource_type = resource_type
|
---|
27 | self.filename = filename
|
---|
28 | self.resources = resource.Resource(level=0)
|
---|
29 | self.resources.name="<root>"
|
---|
30 |
|
---|
31 | def read(self):
|
---|
32 | self.parse(self.resources,open(self.filename,"r"),0)
|
---|
33 | #print self.resources
|
---|
34 |
|
---|
35 | def write(self):
|
---|
36 | pass
|
---|
37 |
|
---|
38 | def getResourceById(self,theid):
|
---|
39 | return self.resources.getById(theid)
|
---|
40 |
|
---|
41 | def getResourceByName(self,name):
|
---|
42 | return self.resources.getByName(name)
|
---|
43 |
|
---|
44 | def getRoot(self):
|
---|
45 | return self.resources
|
---|
46 |
|
---|
47 | def parse(self,curRes,f,level):
|
---|
48 | #print "START",curRes.name
|
---|
49 |
|
---|
50 | while True:
|
---|
51 | line=f.readline()
|
---|
52 | if not line:
|
---|
53 | break
|
---|
54 |
|
---|
55 | inlinecomment=None
|
---|
56 |
|
---|
57 | commentStart=line.find("#")
|
---|
58 | if commentStart!=-1:
|
---|
59 | inlinecomment=line[commentStart:]
|
---|
60 | line=line[:commentStart].strip()
|
---|
61 | #curRes.add_comment(inlinecomment)
|
---|
62 |
|
---|
63 | if rxp_closebrace.match(line):
|
---|
64 | #print "closebraceline"
|
---|
65 | break
|
---|
66 |
|
---|
67 | item2 = rxp_item2.match(line)
|
---|
68 | if item2:
|
---|
69 | #print "item2"
|
---|
70 | name = item2.group(1)
|
---|
71 | value = item2.group(2)
|
---|
72 | #print "item:",name,value
|
---|
73 | newRes=resource.Resource(level+1)
|
---|
74 | newRes.name=name
|
---|
75 | newRes.value="{"+value+"}"
|
---|
76 | curRes.add_item(newRes)
|
---|
77 | continue
|
---|
78 |
|
---|
79 | openbraceline = rxp_openbrace.match(line)
|
---|
80 | if openbraceline:
|
---|
81 | #print "openbraceline"
|
---|
82 | resname = openbraceline.group(1)
|
---|
83 | try:
|
---|
84 | resClass = getattr(resource,resname);
|
---|
85 | except:
|
---|
86 | resClass = resource.Resource
|
---|
87 |
|
---|
88 | newRes=resClass(level+1)
|
---|
89 | newRes.name=resname
|
---|
90 | curRes.add_item(newRes);
|
---|
91 | self.parse(newRes,f,level+1);
|
---|
92 |
|
---|
93 | continue
|
---|
94 |
|
---|
95 | item = rxp_item.match(line)
|
---|
96 | if item:
|
---|
97 | name = item.group(1)
|
---|
98 | value = item.group(2)
|
---|
99 | #print "item:",name,value
|
---|
100 | newRes=resource.Resource(level+1)
|
---|
101 | newRes.name=name
|
---|
102 | newRes.value=value
|
---|
103 | curRes.add_item(newRes)
|
---|
104 | continue
|
---|
105 |
|
---|
106 | #print "END",curRes.name
|
---|
107 |
|
---|
108 | class DirdConfig(Config):
|
---|
109 |
|
---|
110 | def __init__(self, filename=""):
|
---|
111 | Config.__init__(self, 'dird', filename)
|
---|
112 |
|
---|
113 | class ConsoleConfig(Config):
|
---|
114 | pass
|
---|
115 |
|
---|
116 | class FiledConfig(Config):
|
---|
117 | pass
|
---|
118 |
|
---|
119 | class StoredConfig(Config):
|
---|
120 | pass
|
---|
121 |
|
---|
122 | if __name__ == "__main__":
|
---|
123 |
|
---|
124 | dirdcfg = DirdConfig("test.conf")
|
---|
125 | dirdcfg.read()
|
---|
126 | #print dirdcfg.getResourceById(174)
|
---|
127 | jobs=dirdcfg.getResourceByName("Job")
|
---|
128 | for j in jobs:
|
---|
129 | print j.getByName("Name")[0].value
|
---|
130 | d=dirdcfg.getResourceByName("ip")[1]
|
---|
131 | print d
|
---|
132 |
|
---|
133 | job=resource.Job(1,"Job")
|
---|
134 | job.add("Name",'"test2"')
|
---|
135 | job.add("Client",'"test2"')
|
---|
136 | job.add("JobDefs",'"testdefs"')
|
---|
137 | job.add("FileSet",'"Full Set"')
|
---|
138 |
|
---|
139 | root=dirdcfg.getRoot()
|
---|
140 | root.add_item(job)
|
---|
141 |
|
---|
142 | print root
|
---|
143 | sys.exit(0)
|
---|