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