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