summaryrefslogtreecommitdiffstats
path: root/ipaserver
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2010-02-24 11:29:23 -0700
committerJason Gerard DeRose <jderose@redhat.com>2010-03-01 20:22:22 -0700
commit1d529a8d09a2577da9a3883572c2f8ae6dd04d58 (patch)
tree79f3ae824c739232b8c3ac835f04e3799ec4ce60 /ipaserver
parent942919bef77030b10a96cab66ab878a8a3d7ef10 (diff)
downloadfreeipa-1d529a8d09a2577da9a3883572c2f8ae6dd04d58.tar.gz
freeipa-1d529a8d09a2577da9a3883572c2f8ae6dd04d58.tar.xz
freeipa-1d529a8d09a2577da9a3883572c2f8ae6dd04d58.zip
Run ipaserver under mod_wsgi
Diffstat (limited to 'ipaserver')
-rw-r--r--ipaserver/__init__.py206
1 files changed, 0 insertions, 206 deletions
diff --git a/ipaserver/__init__.py b/ipaserver/__init__.py
index 874ac3e2..b0be96bd 100644
--- a/ipaserver/__init__.py
+++ b/ipaserver/__init__.py
@@ -20,209 +20,3 @@
"""
Package containing server backend.
"""
-
-import traceback
-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', debug=True, log=None)
- api.finalize()
- api.log.info('*** PROCESS START ***')
- import ipawebui
- ui = ipawebui.create_wsgi_app(api)
-except ImportError:
- pass
-
-
-# START code from paste
-# Red Hat does not hold the copyright to the following code. The following code
-# is from paste:
-# http://pythonpaste.org/
-# Which in turn was based on Robert Brewer's modpython_gateway:
-# http://projects.amor.org/misc/svn/modpython_gateway.py
-
-class InputWrapper(object):
-
- def __init__(self, req):
- self.req = req
-
- def close(self):
- pass
-
- def read(self, size=-1):
- return self.req.read(size)
-
- def readline(self, size=-1):
- return self.req.readline(size)
-
- def readlines(self, hint=-1):
- return self.req.readlines(hint)
-
- def __iter__(self):
- line = self.readline()
- while line:
- yield line
- # Notice this won't prefetch the next line; it only
- # gets called if the generator is resumed.
- line = self.readline()
-
-
-class ErrorWrapper(object):
-
- def __init__(self, req):
- self.req = req
-
- def flush(self):
- pass
-
- def write(self, msg):
- self.req.log_error(msg)
-
- def writelines(self, seq):
- self.write(''.join(seq))
-
-
-bad_value = ("You must provide a PythonOption '%s', either 'on' or 'off', "
- "when running a version of mod_python < 3.1")
-
-
-class Handler(object):
-
- def __init__(self, req):
- self.started = False
-
- options = req.get_options()
-
- # Threading and forking
- try:
- q = apache.mpm_query
- threaded = q(apache.AP_MPMQ_IS_THREADED)
- forked = q(apache.AP_MPMQ_IS_FORKED)
- except AttributeError:
- threaded = options.get('multithread', '').lower()
- if threaded == 'on':
- threaded = True
- elif threaded == 'off':
- threaded = False
- else:
- raise ValueError(bad_value % "multithread")
-
- forked = options.get('multiprocess', '').lower()
- if forked == 'on':
- forked = True
- elif forked == 'off':
- forked = False
- else:
- raise ValueError(bad_value % "multiprocess")
-
- env = self.environ = dict(apache.build_cgi_env(req))
-
- if 'SCRIPT_NAME' in options:
- # Override SCRIPT_NAME and PATH_INFO if requested.
- env['SCRIPT_NAME'] = options['SCRIPT_NAME']
- env['PATH_INFO'] = req.uri[len(options['SCRIPT_NAME']):]
- else:
- env['SCRIPT_NAME'] = ''
- env['PATH_INFO'] = req.uri
-
- env['wsgi.input'] = InputWrapper(req)
- env['wsgi.errors'] = ErrorWrapper(req)
- env['wsgi.version'] = (1, 0)
- env['wsgi.run_once'] = False
- if env.get("HTTPS") in ('yes', 'on', '1'):
- env['wsgi.url_scheme'] = 'https'
- else:
- env['wsgi.url_scheme'] = 'http'
- env['wsgi.multithread'] = threaded
- env['wsgi.multiprocess'] = forked
-
- self.request = req
-
- def run(self, application):
- try:
- result = application(self.environ, self.start_response)
- for data in result:
- self.write(data)
- if not self.started:
- self.request.set_content_length(0)
- if hasattr(result, 'close'):
- result.close()
- except:
- traceback.print_exc(None, self.environ['wsgi.errors'])
- if not self.started:
- self.request.status = 500
- self.request.content_type = 'text/plain'
- data = "A server error occurred. Please contact the administrator."
- self.request.set_content_length(len(data))
- self.request.write(data)
-
- def start_response(self, status, headers, exc_info=None):
- if exc_info:
- try:
- if self.started:
- raise exc_info[0], exc_info[1], exc_info[2]
- finally:
- exc_info = None
-
- self.request.status = int(status[:3])
-
- for key, val in headers:
- if key.lower() == 'content-length':
- self.request.set_content_length(int(val))
- elif key.lower() == 'content-type':
- self.request.content_type = val
- else:
- self.request.headers_out.add(key, val)
-
- return self.write
-
- def write(self, data):
- if not self.started:
- self.started = True
- self.request.write(data)
-
-# END code from paste
-
-
-def adapter(req, app):
- if apache.mpm_query(apache.AP_MPMQ_IS_THREADED):
- response = dumps(
- Fault(3, 'Apache must use the forked model'),
- methodresponse=True,
- )
- req.content_type = 'text/xml'
- req.set_content_length(len(response))
- req.write(response)
- else:
- Handler(req).run(app)
- return apache.OK
-
-
-def xmlrpc(req):
- """
- mod_python handler for XML-RPC requests.
- """
- return adapter(req, api.Backend.xmlserver)
-
-
-def jsonrpc(req):
- """
- mod_python handler for JSON-RPC requests (place holder).
- """
- return adapter(req, api.Backend.jsonserver)
-
-
-def webui(req):
- """
- mod_python handler for web-UI requests (place holder).
- """
- return adapter(req, ui)
-
-
-def handler(req):
- return adapter(req, api.Backend.session)