1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """
23 Parsing of configuration files.
24 """
25
26 import os
27 from xml.dom import minidom, Node
28 from xml.parsers import expat
29
30 from flumotion.common import log, common
31
32 __version__ = "$Rev: 6125 $"
33
34
37
39 "I represent a <manager> entry in a worker config file"
40 - def __init__(self, host, port, transport):
41 self.host = host
42 self.port = port
43 self.transport = transport
44
46 "I represent a <authentication> entry in a worker config file"
47 - def __init__(self, username, password):
50
52 logCategory = 'config'
53
54 - def __init__(self, filename, string=None):
55 self.name = None
56 self.manager = None
57 self.authentication = None
58 self.feederports = None
59 self.fludebug = None
60 self.randomFeederports = False
61
62 try:
63 if filename != None:
64 self.debug('Loading configuration file `%s\'' % filename)
65 self.doc = minidom.parse(filename)
66 else:
67 self.doc = minidom.parseString(string)
68 except expat.ExpatError, e:
69 raise ConfigError("XML parser error: %s" % e)
70
71 if filename != None:
72 self.path = os.path.split(filename)[0]
73 else:
74 self.path = None
75
76 self.parse()
77
78
80
81
82
83
84
85
86 root = self.doc.documentElement
87
88 if not root.nodeName == 'worker':
89 raise ConfigError("unexpected root node': %s" % root.nodeName)
90
91 if root.hasAttribute('name'):
92 self.name = str(root.getAttribute('name'))
93
94 for node in root.childNodes:
95 if (node.nodeType == Node.TEXT_NODE or
96 node.nodeType == Node.COMMENT_NODE):
97 continue
98 if node.nodeName == 'manager':
99 self.manager = self.parseManager(node)
100 elif node.nodeName == 'authentication':
101 self.authentication = self.parseAuthentication(node)
102 elif node.nodeName == 'feederports':
103 self.feederports, self.randomFeederports = \
104 self.parseFeederports(node)
105 elif node.nodeName == 'debug':
106 self.fludebug = str(node.firstChild.nodeValue)
107 else:
108 raise ConfigError("unexpected node under '%s': %s" % (root.nodeName, node.nodeName))
109
111
112
113
114
115
116
117 host = None
118 port = None
119 transport = None
120 for child in node.childNodes:
121 if (child.nodeType == Node.TEXT_NODE or
122 child.nodeType == Node.COMMENT_NODE):
123 continue
124
125 if child.nodeName == "host":
126 if child.firstChild:
127 host = str(child.firstChild.nodeValue)
128 else:
129 host = 'localhost'
130 elif child.nodeName == "port":
131 try:
132 port = int(child.firstChild.nodeValue)
133 except ValueError:
134 raise ConfigError("<port> value must be an integer")
135 elif child.nodeName == "transport":
136 transport = str(child.firstChild.nodeValue)
137 if not transport in ('tcp', 'ssl'):
138 raise ConfigError("<transport> must be ssl or tcp")
139
140 else:
141 raise ConfigError("unexpected '%s' node: %s" % (node.nodeName, child.nodeName))
142
143 return ConfigEntryManager(host, port, transport)
144
146
147
148
149
150
151 username = None
152 password = None
153 for child in node.childNodes:
154 if (child.nodeType == Node.TEXT_NODE or
155 child.nodeType == Node.COMMENT_NODE):
156 continue
157
158 if child.nodeName == "username":
159 username = str(child.firstChild.nodeValue)
160 elif child.nodeName == "password":
161 password = str(child.firstChild.nodeValue)
162 else:
163 raise ConfigError("unexpected '%s' node: %s" % (node.nodeName, child.nodeName))
164
165 return ConfigEntryAuthentication(username, password)
166
168 """
169 Returns a list of feeder ports to use (possibly empty),
170 and whether or not to use random feeder ports.
171
172 @rtype: (list, bool)
173 """
174
175
176
177
178
179
180 random = False
181 if node.hasAttribute('random'):
182 random = common.strToBool(node.getAttribute('random'))
183 ports = []
184 if not node.firstChild:
185 return (ports, random)
186 terms = str(node.firstChild.nodeValue).split(',')
187 for term in terms:
188 if '-' in term:
189 (lower, upper) = [int(x) for x in term.split('-')]
190 for port in range(lower, upper+1):
191 if port not in ports:
192 ports.append(port)
193 else:
194 port = int(term)
195 if port not in ports:
196 ports.append(port)
197 return (ports, random)
198