From 4afe236b0c036f98d97a5d4bf30b630957599ef5 Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Mon, 21 Jun 2010 17:36:32 +0300 Subject: [PATCH 1/5] safe_eval: fix wrt whitespace on expressions. Regular eval() would not care about leading whitespace. But, compile() would break if lines start with space. Strip that. Also, allow some exceptions to pass through, so that we can examine the syntax errors etc. bzr revid: p_christ@hol.gr-20100621143632-0hvrck77lterxjtl --- bin/tools/safe_eval.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bin/tools/safe_eval.py b/bin/tools/safe_eval.py index ef26fbc4cbe..d933c53d574 100644 --- a/bin/tools/safe_eval.py +++ b/bin/tools/safe_eval.py @@ -86,8 +86,14 @@ def test_expr(expr, allowed_codes, mode="eval"): return the compiled code object. Otherwise raise a ValueError. """ try: + if mode == 'eval': + expr = expr.strip() code_obj = compile(expr, "", mode) - except: + except SyntaxError: + raise + except TypeError: + raise + except Exception, e: raise ValueError("%s is not a valid expression" % expr) for code in _get_opcodes(code_obj): if code not in allowed_codes: From 1ee1886dcdd0a9492190cbe55495c66074d32c7d Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Mon, 21 Jun 2010 17:37:01 +0300 Subject: [PATCH 2/5] rml2pdf: Log stray exceptions, use special when expected. If the eval() raises an exception, we should log that. Unless it's the one we expect to see (thus changed to a special type), where we can keep silently ignoring it. Note: the GeneratorExit requires python 2.5 . bzr revid: p_christ@hol.gr-20100621143701-oenf5fp57qs1bxz4 --- bin/report/render/rml2pdf/utils.py | 12 ++++++++++++ bin/report/report_sxw.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/bin/report/render/rml2pdf/utils.py b/bin/report/render/rml2pdf/utils.py index be8695e7eb3..9c781d302be 100644 --- a/bin/report/render/rml2pdf/utils.py +++ b/bin/report/render/rml2pdf/utils.py @@ -63,7 +63,10 @@ def _child_get(node, self=None, tagname=None): if n.get('rml_except', False): try: eval(n.get('rml_except'), {}, self.localcontext) + except GeneratorExit: + continue except: + logging.getLogger('report').exception() continue if n.get('rml_tag'): try: @@ -72,7 +75,10 @@ def _child_get(node, self=None, tagname=None): n2.tag = tag n2.attrib.update(attr) yield n2 + except GeneratorExit: + yield n except: + logging.getLogger('report').exception() yield n else: yield n @@ -81,7 +87,10 @@ def _child_get(node, self=None, tagname=None): if self and self.localcontext and n.get('rml_except'): try: eval(n.get('rml_except'), {}, self.localcontext) + except GeneratorExit: + continue except: + logging.getLogger('report').exception() continue if self and self.localcontext and n.get('rml_tag'): try: @@ -91,7 +100,10 @@ def _child_get(node, self=None, tagname=None): n2.attrib.update(attr or {}) yield n2 tagname = '' + except GeneratorExit: + pass except: + logging.getLogger('report').exception() pass if (tagname is None) or (n.tag==tagname): yield n diff --git a/bin/report/report_sxw.py b/bin/report/report_sxw.py index 9d2fb97362c..32857044cdd 100644 --- a/bin/report/report_sxw.py +++ b/bin/report/report_sxw.py @@ -192,7 +192,7 @@ class rml_parse(object): return text.strip() def removeParentNode(self, tag=None): - raise Exception('Skip') + raise GeneratorExit('Skip') def set_html_image(self,id,model=None,field=None,context=None): if not id : From 3c3833e824aa6fa0584c28df03c18db04de12c1f Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Tue, 22 Jun 2010 12:29:20 +0300 Subject: [PATCH 3/5] Logging: don't debug db, by default. bzr revid: p_christ@hol.gr-20100622092920-4q7eh8bp2vbg85b3 --- bin/netsvc.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bin/netsvc.py b/bin/netsvc.py index f0fe4687417..d2b6c564111 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -213,6 +213,11 @@ def init_logger(): # add the handler to the root logger logger.addHandler(handler) logger.setLevel(int(tools.config['log_level'] or '0')) + + # By default, don't log db connections, even at debug. + if int(tools.config['log_level'] or '0') <= logging.DEBUG: + logging.getLogger('db.connection').setLevel(logging.INFO) + logging.getLogger('db.connection_pool').setLevel(logging.INFO) From 285e307f256bfef4ccb198586fd9df32eb4e6d5f Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Tue, 22 Jun 2010 12:35:47 +0300 Subject: [PATCH 4/5] Logging: Allow rpc to set individual log levels. bzr revid: p_christ@hol.gr-20100622093547-jax4vg7vp0o6zfz2 --- bin/netsvc.py | 7 +++++-- bin/service/web_services.py | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index d2b6c564111..f3f86e958ed 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -268,8 +268,11 @@ class Logger(object): # better ignore the exception and carry on.. pass - def set_loglevel(self, level): - log = logging.getLogger() + def set_loglevel(self, level, *args): + if args and args[0]: + log = logging.getLogger(str(args[0])) + else: + log = logging.getLogger() log.setLevel(logging.INFO) # make sure next msg is printed log.info("Log level changed to %s" % logging.getLevelName(level)) log.setLevel(level) diff --git a/bin/service/web_services.py b/bin/service/web_services.py index 19b178c7caa..76f656d029c 100644 --- a/bin/service/web_services.py +++ b/bin/service/web_services.py @@ -556,9 +556,9 @@ GNU Public Licence. def exp_login_message(self): return tools.config.get('login_message', False) - def exp_set_loglevel(self,loglevel): + def exp_set_loglevel(self, loglevel, *args): l = netsvc.Logger() - l.set_loglevel(int(loglevel)) + l.set_loglevel(int(loglevel), *args) return True def exp_get_stats(self): From 09db16f52798562f02306c265102773a0222af29 Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Tue, 22 Jun 2010 14:15:49 +0300 Subject: [PATCH 5/5] Logger: use optional kwargs instead of positional args. bzr revid: p_christ@hol.gr-20100622111549-sff9q43ahcihgq91 --- bin/netsvc.py | 6 +++--- bin/service/web_services.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index f3f86e958ed..97d94058df5 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -268,9 +268,9 @@ class Logger(object): # better ignore the exception and carry on.. pass - def set_loglevel(self, level, *args): - if args and args[0]: - log = logging.getLogger(str(args[0])) + def set_loglevel(self, level, logger=None): + if logger is not None: + log = logging.getLogger(str(logger)) else: log = logging.getLogger() log.setLevel(logging.INFO) # make sure next msg is printed diff --git a/bin/service/web_services.py b/bin/service/web_services.py index 76f656d029c..3536cf6bb5f 100644 --- a/bin/service/web_services.py +++ b/bin/service/web_services.py @@ -556,9 +556,9 @@ GNU Public Licence. def exp_login_message(self): return tools.config.get('login_message', False) - def exp_set_loglevel(self, loglevel, *args): + def exp_set_loglevel(self, loglevel, logger=None): l = netsvc.Logger() - l.set_loglevel(int(loglevel), *args) + l.set_loglevel(int(loglevel), logger) return True def exp_get_stats(self):