1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import time
18 import sys
19 try:
20
21 import xmlrpclib
22 except ImportError:
23
24 import xmlrpc.client as xmlrpclib
25
26 from rhn.connections import idn_puny_to_unicode
27
28 from spacewalk.common import apache
29
30 from spacewalk.common.usix import raise_with_tb
31 from spacewalk.common import rhnFlags
32 from spacewalk.common.rhnLog import log_debug, log_error, log_setreq, initLOG
33 from spacewalk.common.rhnConfig import CFG, initCFG
34 from spacewalk.common.rhnTranslate import _
35 from spacewalk.common.rhnTB import Traceback
36 from spacewalk.common.rhnException import rhnException, rhnFault
37 from spacewalk.server import rhnSQL, rhnImport
38 from spacewalk.satellite_tools.disk_dumper.dumper import ClosedConnectionError
39 from spacewalk.satellite_tools import constants
43
49
89
92
100
102
103 self.server = None
104 self.server_classes = None
105 self.server_instance = {}
106
107
108
111
114
117
132
145
147 if not self.start_time:
148 return 0
149 log_debug(2, "%.2f sec" % (time.time() - self.start_time))
150 return 0
151
154
157
162
164 log_debug(3, "Method", req.method)
165
166
167 data = req.read()
168 log_debug(7, "Received", data)
169
170
171 try:
172 params, methodname = xmlrpclib.loads(data)
173 except:
174 raise
175
176 log_debug(5, params, methodname)
177
178 try:
179 f = self.get_function(methodname, req)
180 except FunctionRetrievalError:
181 e = sys.exc_info()[1]
182 Traceback(methodname, req)
183 return self._send_xmlrpc(req, rhnFault(3008, str(e), explain=0))
184
185 if len(params) < 2:
186 params = []
187 else:
188 params = params[1:]
189
190 result = f(*params)
191
192 if result:
193
194 return self._send_xmlrpc(req, rhnFault(3009))
195
196
197 log_debug(4, "Exiting OK")
198 return apache.OK
199
200
202 iss_slave_condition = self.auth_system(req)
203
204 idx = method_name.rfind('.')
205 module_name, function_name = method_name[:idx], method_name[idx + 1:]
206 log_debug(5, module_name, function_name)
207
208 handler_classes = self.server_classes[self.server]
209 if module_name not in handler_classes:
210 raise FunctionRetrievalError("Module %s not found" % module_name)
211
212 mod = handler_classes[module_name](req)
213 mod.set_exportable_orgs(iss_slave_condition)
214 f = mod.get_function(function_name)
215 if f is None:
216 raise FunctionRetrievalError(
217 "Module %s: function %s not found" %
218 (module_name, function_name))
219 return f
220
222 if CFG.DISABLE_ISS:
223 raise rhnFault(2005, _('ISS is disabled on this satellite.'))
224
225 remote_hostname = req.get_remote_host(apache.REMOTE_DOUBLE_REV)
226 row = rhnSQL.fetchone_dict("""
227 select id, allow_all_orgs
228 from rhnISSSlave
229 where slave = :hostname
230 and enabled = 'Y'
231 """, hostname=idn_puny_to_unicode(remote_hostname))
232 if not row:
233 raise rhnFault(2004,
234 _('Server "%s" is not enabled for ISS.')
235 % remote_hostname)
236 iss_slave_condition = "select id from web_customer"
237 if not(row['allow_all_orgs'] == 'Y'):
238 iss_slave_condition = "select rhnISSSlaveOrgs.org_id from rhnISSSlaveOrgs where slave_id = %d" % row['id']
239 return iss_slave_condition
240
241 @staticmethod
243 server_version = constants.PROTOCOL_VERSION
244 vstr = 'X-RHN-Satellite-XML-Dump-Version'
245 if vstr not in req.headers_in:
246 raise rhnFault(3010, "Missing version string")
247 client_version = req.headers_in[vstr]
248
249
250 rhnFlags.set('X-RHN-Satellite-XML-Dump-Version', client_version)
251
252 log_debug(1, "Server version", server_version, "Client version",
253 client_version)
254
255 client_ver_arr = str(client_version).split(".")
256 server_ver_arr = str(server_version).split(".")
257 client_major = client_ver_arr[0]
258 server_major = server_ver_arr[0]
259 if len(client_ver_arr) >= 2:
260 client_minor = client_ver_arr[1]
261 else:
262 client_minor = 0
263
264 server_minor = server_ver_arr[1]
265
266 try:
267 client_major = int(client_major)
268 client_minor = int(client_minor)
269 except ValueError:
270 raise_with_tb(rhnFault(3011, "Invalid version string %s" % client_version), sys.exc_info()[2])
271
272 try:
273 server_major = int(server_major)
274 server_minor = int(server_minor)
275 except ValueError:
276 raise_with_tb(rhnException("Invalid server version string %s"
277 % server_version), sys.exc_info()[2])
278
279 if client_major != server_major:
280 raise rhnFault(3012, "Client version %s does not match"
281 " server version %s" % (client_version, server_version),
282 explain=0)
283
287
288
289 apache_server = ApacheServer()
290 HeaderParserHandler = apache_server.headerParserHandler
291 Handler = apache_server.handler
292 CleanupHandler = apache_server.cleanupHandler
293