summaryrefslogtreecommitdiffstats
path: root/ipaserver
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2009-01-30 20:53:32 -0700
committerRob Crittenden <rcritten@redhat.com>2009-02-03 15:29:05 -0500
commitc2b0c801400fcb59be8687f9faf061aa85bcffd2 (patch)
tree434634987f8888ad5b0b66db78627f9e37206c84 /ipaserver
parent91ca06f079f4de1ca5e6c60cfdf7aae75f60821b (diff)
downloadfreeipa-c2b0c801400fcb59be8687f9faf061aa85bcffd2.tar.gz
freeipa-c2b0c801400fcb59be8687f9faf061aa85bcffd2.tar.xz
freeipa-c2b0c801400fcb59be8687f9faf061aa85bcffd2.zip
Started work on a much simplified mod_python server
Diffstat (limited to 'ipaserver')
-rw-r--r--ipaserver/__init__.py28
-rwxr-xr-xipaserver/mod_python_xmlrpc.py94
-rw-r--r--ipaserver/plugins/b_ldap.py2
-rw-r--r--ipaserver/plugins/b_ra.py3
-rw-r--r--ipaserver/rpcserver.py26
5 files changed, 69 insertions, 84 deletions
diff --git a/ipaserver/__init__.py b/ipaserver/__init__.py
index b0be96bd2..35f96c7f6 100644
--- a/ipaserver/__init__.py
+++ b/ipaserver/__init__.py
@@ -20,3 +20,31 @@
"""
Package containing server backend.
"""
+
+from xmlrpclib import dumps, Fault
+from ipalib import api
+
+try:
+ from mod_python import apache
+ api.bootstrap(context='server', log=None, debug=True)
+ api.finalize()
+except ImportError:
+ pass
+
+
+def xmlrpc(req):
+ 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
+ )
+ else:
+ response = api.Backend.xmlserver.marshaled_dispatch(req.read(), None)
+
+ req.content_type = 'text/xml'
+ req.set_content_length(len(response))
+ req.write(response)
+ return apache.OK
diff --git a/ipaserver/mod_python_xmlrpc.py b/ipaserver/mod_python_xmlrpc.py
index 372376aca..42a7c28c7 100755
--- a/ipaserver/mod_python_xmlrpc.py
+++ b/ipaserver/mod_python_xmlrpc.py
@@ -29,29 +29,21 @@ Production XML-RPC server using mod_python.
import sys
import os
-
-
import time
import traceback
import pprint
-from xmlrpclib import Marshaller,loads,dumps,Fault
+import logging
+import string
+from ipalib import api
+
+# We only initialize api when actually running under mod_python:
try:
from mod_python import apache
+ api.bootstrap(context='server', in_server=True, log=None)
+ api.finalize()
except ImportError:
pass
-import logging
-import ldap
-from ipalib import api
-from ipalib import config
-from ipaserver import conn
-from ipaserver.servercore import context
-from ipaserver.servercore import ipautil
-from ipalib.util import xmlrpc_unmarshal
-
-import string
-
-api.load_plugins()
# Global list of available functions
gfunctions = {}
@@ -116,57 +108,14 @@ class ModXMLRPCRequestHandler(object):
context.opts['remoteuser'] = req.user
- if req.subprocess_env.get("KRB5CCNAME") is not None:
- krbccache = req.subprocess_env.get("KRB5CCNAME")
- else:
- response = dumps(Fault(5, "Did not receive Kerberos credentials."))
- return response
-
- debuglevel = logging.INFO
- if pythonopts.get("IPADebug"):
- context.opts['ipadebug'] = pythonopts.get("IPADebug").lower()
-
- if context.opts['ipadebug'] == "on":
- debuglevel = logging.DEBUG
-
- if not context.opts.get('ipadebug'):
- context.opts['ipadebug'] = "off"
-
- logging.basicConfig(level=debuglevel,
- format='[%(asctime)s] [%(levelname)s] %(message)s',
- datefmt='%a %b %d %H:%M:%S %Y',
- stream=sys.stderr)
-
- logging.info("Interpreter: %s" % req.interpreter)
-
-
-# if opts['ipadebug'] == "on":
-# for o in opts:
-# logging.debug("IPA: setting option %s: %s" % (o, opts[o]))
-# for e in req.subprocess_env:
-# logging.debug("IPA: environment %s: %s" % (e, req.subprocess_env[e]))
-
- context.conn = conn.IPAConn(api.env.ldaphost, api.env.ldapport, krbccache, context.opts.get('ipadebug'))
-
- start = time.time()
- # generate response
try:
- response = self._dispatch(method, params)
- # wrap response in a singleton tuple
- response = (response,)
- response = dumps(response, methodresponse=1, allow_none=1)
- except Fault, e:
- response = dumps(Fault(e.faultCode, e.faultString))
- except:
- self.traceback = True
- # report exception back to server
- e_class, e = sys.exc_info()[:2]
- faultCode = getattr(e_class,'faultCode',1)
- tb_str = ''.join(traceback.format_exception(*sys.exc_info()))
- faultString = tb_str
- response = dumps(Fault(faultCode, faultString))
-
- return response
+ ccache = req.subprocess_env.get('KRB5CCNAME')
+ return api.Backend.xmlserver.marshaled_dispatch(data, ccache)
+ except Exception, e:
+ api.log.exception(
+ 'mod_python_xmlrpc: caught error in _marshaled_dispatch()'
+ )
+ raise e
def _dispatch(self,method,params):
func = self.funcs.get(method,None)
@@ -347,22 +296,7 @@ def load_modules():
PythonHandler ipaxmlrpc
"""
- # setup up the logger with a DEBUG level. It may get reset to INFO
- # once we start processing requests. We don't have access to the
- # Apache configuration yet.
- setup_logger(logging.DEBUG)
-
- api.finalize()
-
- # Initialize our environment
- config.set_default_env(api.env)
- env_dict = config.read_config()
- env_dict['server_context'] = True
- api.env.update(env_dict)
-
# Get and register all the methods
for cmd in api.Command:
logging.debug("registering XML-RPC call %s" % cmd)
register_function(api.Command[cmd], cmd)
-
- return
diff --git a/ipaserver/plugins/b_ldap.py b/ipaserver/plugins/b_ldap.py
index c1262f528..f12e6155d 100644
--- a/ipaserver/plugins/b_ldap.py
+++ b/ipaserver/plugins/b_ldap.py
@@ -42,6 +42,8 @@ class ldap(CrudBackend):
super(ldap, self).__init__()
def create_connection(self, ccache):
+ if ccache is None:
+ raise errors2.CCacheError()
conn = ipaldap.IPAdmin(self.env.ldap_host, self.env.ldap_port)
principle = krbV.CCache(
name=ccache, context=krbV.default_context()
diff --git a/ipaserver/plugins/b_ra.py b/ipaserver/plugins/b_ra.py
index f0363bf15..69674cd0a 100644
--- a/ipaserver/plugins/b_ra.py
+++ b/ipaserver/plugins/b_ra.py
@@ -67,6 +67,7 @@ class ra(Backend):
self.__create_nss_db()
self.__import_ca_chain()
self.__request_ipa_certificate(self.__generate_ipa_request())
+ assert False
super(ra, self).__init__()
@@ -404,4 +405,4 @@ class ra(Backend):
# api.log.debug("IPA-RA: stderr: '%s'" % stderr)
return (p.returncode, stdout, stderr)
-api.register(ra)
+#api.register(ra)
diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py
index cb0a464cc..36742b094 100644
--- a/ipaserver/rpcserver.py
+++ b/ipaserver/rpcserver.py
@@ -46,15 +46,35 @@ class xmlserver(Executioner):
Also see the `ipalib.rpc.xmlclient` plugin.
"""
+ def finalize(self):
+ self.__system = {
+ 'system.listMethods': self.listMethods,
+ 'system.methodSignature': self.methodSignature,
+ 'system.methodHelp': self.methodHelp,
+ }
+ super(xmlserver, self).finalize()
+
+ def listMethods(self, *params):
+ return tuple(name.encode('UTF-8') for name in self.Command)
+
+ def methodSignature(self, *params):
+ return 'methodSignature not supported'
+
+ def methodHelp(self, *params):
+ return 'methodHelp not supported'
+
def marshaled_dispatch(self, data, ccache):
"""
Execute the XML-RPC request in contained in ``data``.
"""
try:
- self.create_context(ccache=ccache)
+ #self.create_context(ccache=ccache)
(params, name) = xml_loads(data)
- (args, options) = params_2_args_options(params)
- response = (self.execute(name, *args, **options),)
+ if name in self.__system:
+ response = (self.__system[name](*params),)
+ else:
+ (args, options) = params_2_args_options(params)
+ response = (self.execute(name, *args, **options),)
except PublicError, e:
self.info('response: %s: %s', e.__class__.__name__, str(e))
response = Fault(e.errno, e.strerror)