summaryrefslogtreecommitdiffstats
path: root/ipa-server/ipa-gui/ipagui/controllers.py
diff options
context:
space:
mode:
authorKevin McCarthy <kmccarth@redhat.com>2007-10-18 09:46:13 -0700
committerKevin McCarthy <kmccarth@redhat.com>2007-10-18 09:46:13 -0700
commit12047b529a7fcfcf83ab3a85d419f6af7ff9c6be (patch)
tree088bc71379baca39ef59ada32b90d230e9ae1d15 /ipa-server/ipa-gui/ipagui/controllers.py
parent6b0587726aa69cb1f4b1f983b4551bcd61440c1b (diff)
downloadfreeipa-12047b529a7fcfcf83ab3a85d419f6af7ff9c6be.tar.gz
freeipa-12047b529a7fcfcf83ab3a85d419f6af7ff9c6be.tar.xz
freeipa-12047b529a7fcfcf83ab3a85d419f6af7ff9c6be.zip
Add an exception/error handler to the web gui.
Diffstat (limited to 'ipa-server/ipa-gui/ipagui/controllers.py')
-rw-r--r--ipa-server/ipa-gui/ipagui/controllers.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/ipa-server/ipa-gui/ipagui/controllers.py b/ipa-server/ipa-gui/ipagui/controllers.py
index 1025b6c36..5d0bfee03 100644
--- a/ipa-server/ipa-gui/ipagui/controllers.py
+++ b/ipa-server/ipa-gui/ipagui/controllers.py
@@ -1,8 +1,11 @@
import logging
+import StringIO
+import traceback
import cherrypy
import turbogears
from turbogears import controllers, expose, flash
+from turbogears import config
from turbogears import validators, validate
from turbogears import widgets, paginate
from turbogears import error_handler
@@ -41,3 +44,61 @@ class Root(controllers.RootController):
@expose("ipagui.templates.loginfailed")
def loginfailed(self, **kw):
return dict()
+
+
+ _error_codes = {
+ None: u'General Error',
+ 400: u'400 - Bad Request',
+ 401: u'401 - Unauthorized',
+ 403: u'403 - Forbidden',
+ 404: u'404 - Not Found',
+ 500: u'500 - Internal Server Error',
+ 501: u'501 - Not Implemented',
+ 502: u'502 - Bad Gateway',
+ }
+
+ def handle_error(self, status, message):
+ """This method is derived from the sample error catcher on
+ http://docs.turbogears.org/1.0/ErrorReporting."""
+ try:
+ cherrypy._cputil._cp_on_http_error(status, message)
+ error_msg = self._error_codes.get(status, self._error_codes[None])
+ url = "%s %s" % (cherrypy.request.method, cherrypy.request.path)
+ log.exception("CherryPy %s error (%s) for request '%s'", status,
+ error_msg, url)
+
+ if config.get('server.environment') == 'production':
+ details = ''
+ else:
+ buf = StringIO.StringIO()
+ traceback.print_exc(file=buf)
+ details = buf.getvalue()
+ buf.close()
+
+ data = dict(
+ status = status,
+ message = message,
+ error_msg = error_msg,
+ url = url,
+ details = details,
+ )
+
+ body = controllers._process_output(
+ data,
+ 'ipagui.templates.unhandled_exception',
+ 'html',
+ 'text/html',
+ None
+ )
+ cherrypy.response.headers['Content-Length'] = len(body)
+ cherrypy.response.body = body
+
+ # don't catch SystemExit
+ except StandardError, exc:
+ log.exception('Error handler failed: %s', exc)
+
+ # To hook in error handler for production only:
+ # if config.get('server.environment') == 'production':
+ # _cp_on_http_error = handle_error
+
+ _cp_on_http_error = handle_error