From 3274577cd608f947d6b07e6dfcbde393edf5a249 Mon Sep 17 00:00:00 2001 From: Jason Gerard DeRose Date: Fri, 30 Jan 2009 23:46:51 -0700 Subject: Finished small tweaks to get new ipaserver.xmlrpc() mod_python handler working --- ipalib/config.py | 1 - ipalib/rpc.py | 2 ++ ipaserver/__init__.py | 30 +++++++++++++++++++++++++++--- ipaserver/mod_python_xmlrpc.py | 2 ++ ipaserver/rpcserver.py | 10 +++++----- lite-xmlrpc.py | 15 +-------------- setup.py | 5 +++-- 7 files changed, 40 insertions(+), 25 deletions(-) diff --git a/ipalib/config.py b/ipalib/config.py index 42d7ab578..39c4238cf 100644 --- a/ipalib/config.py +++ b/ipalib/config.py @@ -433,7 +433,6 @@ class Env(object): self.script = path.abspath(sys.argv[0]) self.bin = path.dirname(self.script) self.home = os.environ.get('HOME', None) - self.etc = path.join('/', 'etc', 'ipa') self.dot_ipa = self._join('home', '.ipa') self._merge(**overrides) if 'in_tree' not in self: diff --git a/ipalib/rpc.py b/ipalib/rpc.py index 5a1f9e1ed..938c30e64 100644 --- a/ipalib/rpc.py +++ b/ipalib/rpc.py @@ -137,12 +137,14 @@ def xml_dumps(params, methodname=None, methodresponse=False, encoding='UTF-8'): allow_none=True, ) + def decode_fault(e, encoding='UTF-8'): assert isinstance(e, Fault) if type(e.faultString) is str: return Fault(e.faultCode, e.faultString.decode(encoding)) return e + def xml_loads(data, encoding='UTF-8'): """ Decode the XML-RPC packet in ``data``, transparently unwrapping its params. diff --git a/ipaserver/__init__.py b/ipaserver/__init__.py index 35f96c7f6..ec2a53649 100644 --- a/ipaserver/__init__.py +++ b/ipaserver/__init__.py @@ -24,27 +24,51 @@ Package containing server backend. from xmlrpclib import dumps, Fault from ipalib import api + +# This is a simple way to ensure that ipalib.api is only initialized +# when ipaserver is imported from within the Apache process: try: from mod_python import apache - api.bootstrap(context='server', log=None, debug=True) + api.bootstrap(context='server', debug=True, log=None) api.finalize() + api.log.info('*** PROCESS START ***') except ImportError: pass def xmlrpc(req): + """ + mod_python handler for XML-RPC requests. + """ if req.method != 'POST': req.allow_methods(['POST'], 1) return apache.HTTP_METHOD_NOT_ALLOWED if apache.mpm_query(apache.AP_MPMQ_IS_THREADED): response = dumps( - Fault(3, 'Apache must use the forked model'), methodresponse=True + Fault(3, 'Apache must use the forked model'), + methodresponse=True, ) else: - response = api.Backend.xmlserver.marshaled_dispatch(req.read(), None) + req.add_common_vars() + response = api.Backend.xmlserver.marshaled_dispatch( + req.read(), + req.subprocess_env.get('KRB5CCNAME'), + ) req.content_type = 'text/xml' req.set_content_length(len(response)) req.write(response) return apache.OK + + +def jsonrpc(req): + """ + mod_python handler for JSON-RPC requests (place holder). + """ + + +def webui(req): + """ + mod_python handler for web-UI requests (place holder). + """ diff --git a/ipaserver/mod_python_xmlrpc.py b/ipaserver/mod_python_xmlrpc.py index 42a7c28c7..0f631f744 100755 --- a/ipaserver/mod_python_xmlrpc.py +++ b/ipaserver/mod_python_xmlrpc.py @@ -25,6 +25,8 @@ """ Production XML-RPC server using mod_python. + +This module is depreciated. See the `ipaserver.xmlrpc()` function. """ import sys diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py index 36742b094..2ad233dc1 100644 --- a/ipaserver/rpcserver.py +++ b/ipaserver/rpcserver.py @@ -55,20 +55,20 @@ class xmlserver(Executioner): super(xmlserver, self).finalize() def listMethods(self, *params): - return tuple(name.encode('UTF-8') for name in self.Command) + return tuple(name.decode('UTF-8') for name in self.Command) def methodSignature(self, *params): - return 'methodSignature not supported' + return u'methodSignature not implemented' def methodHelp(self, *params): - return 'methodHelp not supported' + return u'methodHelp not implemented' def marshaled_dispatch(self, data, ccache): """ - Execute the XML-RPC request in contained in ``data``. + Execute the XML-RPC request contained in ``data``. """ try: - #self.create_context(ccache=ccache) + self.create_context(ccache=ccache) (params, name) = xml_loads(data) if name in self.__system: response = (self.__system[name](*params),) diff --git a/lite-xmlrpc.py b/lite-xmlrpc.py index 55babf9ef..976393738 100755 --- a/lite-xmlrpc.py +++ b/lite-xmlrpc.py @@ -29,18 +29,6 @@ import krbV from ipalib import api -class Instance(object): - """ - Just used for `Instance._listMethods()`. - """ - - def _listMethods(self): - """ - Provides list of names for ``system.listMethods``. - """ - return list(api.Command) - - class Server(SimpleXMLRPCServer): """ Custom server implementing `Server._marshaled_dispatch()`. @@ -79,8 +67,7 @@ server = Server(('', api.env.lite_xmlrpc_port), **kw) api.log.info('Logging to file %r', api.env.log) api.log.info('Listening on port %d', api.env.lite_xmlrpc_port) -server.register_introspection_functions() -server.register_instance(Instance()) + try: server.serve_forever() diff --git a/setup.py b/setup.py index 012ad5036..6676b1786 100755 --- a/setup.py +++ b/setup.py @@ -23,11 +23,12 @@ Python-level packaging using distutils. """ -from distutils.core import setup +from setuptools import setup +import ipalib setup( name='freeipa', - version='1.99.1', + version=ipalib.__version__, license='GPLv2+', url='http://freeipa.org/', packages=[ -- cgit