mirror of
https://github.com/kakwa/ldapcherry
synced 2024-11-25 18:54:29 +01:00
small code reorganization
* extraction of exception decorator * extraction of log handling
This commit is contained in:
parent
d32b0625ed
commit
53676db341
@ -18,6 +18,7 @@ from socket import error as socket_error
|
|||||||
import base64
|
import base64
|
||||||
|
|
||||||
from exceptions import *
|
from exceptions import *
|
||||||
|
from ldapcherry.lclogging import *
|
||||||
from ldapcherry.roles import Roles
|
from ldapcherry.roles import Roles
|
||||||
from ldapcherry.attributes import Attributes
|
from ldapcherry.attributes import Attributes
|
||||||
|
|
||||||
@ -33,85 +34,6 @@ from sets import Set
|
|||||||
SESSION_KEY = '_cp_username'
|
SESSION_KEY = '_cp_username'
|
||||||
|
|
||||||
|
|
||||||
# Custom log function to override weird error.log function
|
|
||||||
# of cherrypy
|
|
||||||
def syslog_error(
|
|
||||||
msg='',
|
|
||||||
context='',
|
|
||||||
severity=logging.INFO,
|
|
||||||
traceback=False
|
|
||||||
):
|
|
||||||
|
|
||||||
if traceback and msg == '':
|
|
||||||
msg = 'Python Exception:'
|
|
||||||
if context == '':
|
|
||||||
cherrypy.log.error_log.log(severity, msg)
|
|
||||||
else:
|
|
||||||
cherrypy.log.error_log.log(
|
|
||||||
severity,
|
|
||||||
' '.join((context, msg))
|
|
||||||
)
|
|
||||||
if traceback:
|
|
||||||
import traceback
|
|
||||||
try:
|
|
||||||
exc = sys.exc_info()
|
|
||||||
if exc == (None, None, None):
|
|
||||||
cherrypy.log.error_log.log(severity, msg)
|
|
||||||
# log each line of the exception
|
|
||||||
# in a separate log for lisibility
|
|
||||||
for l in traceback.format_exception(*exc):
|
|
||||||
cherrypy.log.error_log.log(severity, l)
|
|
||||||
finally:
|
|
||||||
del exc
|
|
||||||
|
|
||||||
|
|
||||||
def exception_decorator(func):
|
|
||||||
def ret(self, *args, **kwargs):
|
|
||||||
try:
|
|
||||||
return func(self, *args, **kwargs)
|
|
||||||
except cherrypy.HTTPRedirect as e:
|
|
||||||
raise e
|
|
||||||
except cherrypy.HTTPError as e:
|
|
||||||
raise e
|
|
||||||
except Exception as e:
|
|
||||||
cherrypy.response.status = 500
|
|
||||||
self._handle_exception(e)
|
|
||||||
username = self._check_session()
|
|
||||||
if not username:
|
|
||||||
return self.temp_service_unavailable.render()
|
|
||||||
is_admin = self._check_admin()
|
|
||||||
et = type(e)
|
|
||||||
if et is UserDoesntExist:
|
|
||||||
user = e.user
|
|
||||||
return self.temp_error.render(
|
|
||||||
is_admin=is_admin,
|
|
||||||
alert='danger',
|
|
||||||
message="User '" + user + "' does not exist"
|
|
||||||
)
|
|
||||||
elif et is UserAlreadyExists:
|
|
||||||
user = e.user
|
|
||||||
cherrypy.response.status = 400
|
|
||||||
return self.temp_error.render(
|
|
||||||
is_admin=is_admin,
|
|
||||||
alert='warning',
|
|
||||||
message="User '" + user + "' already exist"
|
|
||||||
)
|
|
||||||
elif et is GroupDoesntExist:
|
|
||||||
group = e.group
|
|
||||||
return self.temp_error.render(
|
|
||||||
is_admin=is_admin,
|
|
||||||
alert='danger',
|
|
||||||
message="Missing group, please check logs for details"
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
return self.temp_error.render(
|
|
||||||
is_admin=is_admin,
|
|
||||||
alert='danger',
|
|
||||||
message="An error occured, please check logs for details"
|
|
||||||
)
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
class LdapCherry(object):
|
class LdapCherry(object):
|
||||||
|
|
||||||
def _handle_exception(self, e):
|
def _handle_exception(self, e):
|
||||||
@ -383,32 +305,6 @@ class LdapCherry(object):
|
|||||||
# set log level
|
# set log level
|
||||||
cherrypy.log.error_log.setLevel(level)
|
cherrypy.log.error_log.setLevel(level)
|
||||||
|
|
||||||
def _get_loglevel(self, level):
|
|
||||||
""" return logging level object
|
|
||||||
corresponding to a given level passed as
|
|
||||||
a string
|
|
||||||
@str level: name of a syslog log level
|
|
||||||
@rtype: logging, logging level from logging module
|
|
||||||
"""
|
|
||||||
if level == 'debug':
|
|
||||||
return logging.DEBUG
|
|
||||||
elif level == 'notice':
|
|
||||||
return logging.INFO
|
|
||||||
elif level == 'info':
|
|
||||||
return logging.INFO
|
|
||||||
elif level == 'warning' or level == 'warn':
|
|
||||||
return logging.WARNING
|
|
||||||
elif level == 'error' or level == 'err':
|
|
||||||
return logging.ERROR
|
|
||||||
elif level == 'critical' or level == 'crit':
|
|
||||||
return logging.CRITICAL
|
|
||||||
elif level == 'alert':
|
|
||||||
return logging.CRITICAL
|
|
||||||
elif level == 'emergency' or level == 'emerg':
|
|
||||||
return logging.CRITICAL
|
|
||||||
else:
|
|
||||||
return logging.INFO
|
|
||||||
|
|
||||||
def _auth(self, user, password):
|
def _auth(self, user, password):
|
||||||
""" authenticate a user
|
""" authenticate a user
|
||||||
@str user: login of the user
|
@str user: login of the user
|
||||||
@ -488,7 +384,7 @@ class LdapCherry(object):
|
|||||||
# log configuration handling
|
# log configuration handling
|
||||||
# get log level
|
# get log level
|
||||||
# (if not in configuration file, log level is set to debug)
|
# (if not in configuration file, log level is set to debug)
|
||||||
level = self._get_loglevel(
|
level = get_loglevel(
|
||||||
self._get_param(
|
self._get_param(
|
||||||
'global',
|
'global',
|
||||||
'log.level',
|
'log.level',
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
# Copyright (c) 2014 Carpentier Pierre-Francois
|
# Copyright (c) 2014 Carpentier Pierre-Francois
|
||||||
|
|
||||||
import string
|
import string
|
||||||
|
import cherrypy
|
||||||
|
|
||||||
|
|
||||||
class MissingParameter(Exception):
|
class MissingParameter(Exception):
|
||||||
@ -214,3 +215,50 @@ class GroupDoesntExist(Exception):
|
|||||||
"group '" + group + "'" \
|
"group '" + group + "'" \
|
||||||
" does not exist" \
|
" does not exist" \
|
||||||
" in backend '" + backend + "'"
|
" in backend '" + backend + "'"
|
||||||
|
|
||||||
|
|
||||||
|
def exception_decorator(func):
|
||||||
|
def ret(self, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
return func(self, *args, **kwargs)
|
||||||
|
except cherrypy.HTTPRedirect as e:
|
||||||
|
raise e
|
||||||
|
except cherrypy.HTTPError as e:
|
||||||
|
raise e
|
||||||
|
except Exception as e:
|
||||||
|
cherrypy.response.status = 500
|
||||||
|
self._handle_exception(e)
|
||||||
|
username = self._check_session()
|
||||||
|
if not username:
|
||||||
|
return self.temp_service_unavailable.render()
|
||||||
|
is_admin = self._check_admin()
|
||||||
|
et = type(e)
|
||||||
|
if et is UserDoesntExist:
|
||||||
|
user = e.user
|
||||||
|
return self.temp_error.render(
|
||||||
|
is_admin=is_admin,
|
||||||
|
alert='danger',
|
||||||
|
message="User '" + user + "' does not exist"
|
||||||
|
)
|
||||||
|
elif et is UserAlreadyExists:
|
||||||
|
user = e.user
|
||||||
|
cherrypy.response.status = 400
|
||||||
|
return self.temp_error.render(
|
||||||
|
is_admin=is_admin,
|
||||||
|
alert='warning',
|
||||||
|
message="User '" + user + "' already exist"
|
||||||
|
)
|
||||||
|
elif et is GroupDoesntExist:
|
||||||
|
group = e.group
|
||||||
|
return self.temp_error.render(
|
||||||
|
is_admin=is_admin,
|
||||||
|
alert='danger',
|
||||||
|
message="Missing group, please check logs for details"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return self.temp_error.render(
|
||||||
|
is_admin=is_admin,
|
||||||
|
alert='danger',
|
||||||
|
message="An error occured, please check logs for details"
|
||||||
|
)
|
||||||
|
return ret
|
||||||
|
74
ldapcherry/lclogging.py
Normal file
74
ldapcherry/lclogging.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim:set expandtab tabstop=4 shiftwidth=4:
|
||||||
|
#
|
||||||
|
# The MIT License (MIT)
|
||||||
|
# ldapCherry
|
||||||
|
# Copyright (c) 2014 Carpentier Pierre-Francois
|
||||||
|
|
||||||
|
# Generic imports
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
import logging
|
||||||
|
import logging.handlers
|
||||||
|
import cherrypy
|
||||||
|
|
||||||
|
# Custom log function to override weird error.log function
|
||||||
|
# of cherrypy
|
||||||
|
def syslog_error(
|
||||||
|
msg='',
|
||||||
|
context='',
|
||||||
|
severity=logging.INFO,
|
||||||
|
traceback=False
|
||||||
|
):
|
||||||
|
|
||||||
|
if traceback and msg == '':
|
||||||
|
msg = 'Python Exception:'
|
||||||
|
if context == '':
|
||||||
|
cherrypy.log.error_log.log(severity, msg)
|
||||||
|
else:
|
||||||
|
cherrypy.log.error_log.log(
|
||||||
|
severity,
|
||||||
|
' '.join((context, msg))
|
||||||
|
)
|
||||||
|
if traceback:
|
||||||
|
import traceback
|
||||||
|
try:
|
||||||
|
exc = sys.exc_info()
|
||||||
|
if exc == (None, None, None):
|
||||||
|
cherrypy.log.error_log.log(severity, msg)
|
||||||
|
# log each line of the exception
|
||||||
|
# in a separate log for lisibility
|
||||||
|
for l in traceback.format_exception(*exc):
|
||||||
|
cherrypy.log.error_log.log(severity, l)
|
||||||
|
finally:
|
||||||
|
del exc
|
||||||
|
|
||||||
|
|
||||||
|
def get_loglevel(level):
|
||||||
|
""" return logging level object
|
||||||
|
corresponding to a given level passed as
|
||||||
|
a string
|
||||||
|
@str level: name of a syslog log level
|
||||||
|
@rtype: logging, logging level from logging module
|
||||||
|
"""
|
||||||
|
if level == 'debug':
|
||||||
|
return logging.DEBUG
|
||||||
|
elif level == 'notice':
|
||||||
|
return logging.INFO
|
||||||
|
elif level == 'info':
|
||||||
|
return logging.INFO
|
||||||
|
elif level == 'warning' or level == 'warn':
|
||||||
|
return logging.WARNING
|
||||||
|
elif level == 'error' or level == 'err':
|
||||||
|
return logging.ERROR
|
||||||
|
elif level == 'critical' or level == 'crit':
|
||||||
|
return logging.CRITICAL
|
||||||
|
elif level == 'alert':
|
||||||
|
return logging.CRITICAL
|
||||||
|
elif level == 'emergency' or level == 'emerg':
|
||||||
|
return logging.CRITICAL
|
||||||
|
else:
|
||||||
|
return logging.INFO
|
||||||
|
|
||||||
|
|
@ -18,6 +18,7 @@ import cherrypy
|
|||||||
from cherrypy.process import plugins, servers
|
from cherrypy.process import plugins, servers
|
||||||
from cherrypy import Application
|
from cherrypy import Application
|
||||||
import logging
|
import logging
|
||||||
|
from ldapcherry.lclogging import *
|
||||||
|
|
||||||
cherrypy.session = {}
|
cherrypy.session = {}
|
||||||
|
|
||||||
@ -240,13 +241,13 @@ class TestError(object):
|
|||||||
def testLogger(self):
|
def testLogger(self):
|
||||||
app = LdapCherry()
|
app = LdapCherry()
|
||||||
loadconf('./tests/cfg/ldapcherry.ini', app)
|
loadconf('./tests/cfg/ldapcherry.ini', app)
|
||||||
assert app._get_loglevel('debug') is logging.DEBUG and \
|
assert get_loglevel('debug') is logging.DEBUG and \
|
||||||
app._get_loglevel('notice') is logging.INFO and \
|
get_loglevel('notice') is logging.INFO and \
|
||||||
app._get_loglevel('info') is logging.INFO and \
|
get_loglevel('info') is logging.INFO and \
|
||||||
app._get_loglevel('warning') is logging.WARNING and \
|
get_loglevel('warning') is logging.WARNING and \
|
||||||
app._get_loglevel('err') is logging.ERROR and \
|
get_loglevel('err') is logging.ERROR and \
|
||||||
app._get_loglevel('critical') is logging.CRITICAL and \
|
get_loglevel('critical') is logging.CRITICAL and \
|
||||||
app._get_loglevel('alert') is logging.CRITICAL and \
|
get_loglevel('alert') is logging.CRITICAL and \
|
||||||
app._get_loglevel('emergency') is logging.CRITICAL and \
|
get_loglevel('emergency') is logging.CRITICAL and \
|
||||||
app._get_loglevel('notalevel') is logging.INFO
|
get_loglevel('notalevel') is logging.INFO
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user