[PATCH 3/3] parsemail: Mail error information to ADMINS when parsing fails
Damien Lespiau
damien.lespiau at intel.com
Mon Sep 28 20:58:33 AEST 2015
We can use the built-in mechanism from django to send error emails when
failing to parse a mail. The error mails will have contain the full
guitly mail and the corresponding backtrace for debugging purposes.
v2: Add 2 PEP8 blank lines (Stephen Finucane)
Signed-off-by: Damien Lespiau <damien.lespiau at intel.com>
---
patchwork/bin/parsemail.py | 38 +++++++++++++++++++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/patchwork/bin/parsemail.py b/patchwork/bin/parsemail.py
index e66b557..201a310 100755
--- a/patchwork/bin/parsemail.py
+++ b/patchwork/bin/parsemail.py
@@ -28,12 +28,15 @@ import codecs
from email import message_from_file
from email.header import Header, decode_header
from email.utils import parsedate_tz, mktime_tz
+import logging
from patchwork.parser import parse_patch
from patchwork.models import Patch, Project, Person, Comment, State, \
get_default_initial_patch_state
import django
+from django.conf import settings
from django.contrib.auth.models import User
+from django.utils.log import AdminEmailHandler
list_id_headers = ['List-ID', 'X-Mailing-List', 'X-list']
@@ -401,10 +404,43 @@ def parse_mail(mail):
return 0
+extra_error_message = '''
+== Mail
+
+%(mail)s
+
+
+== Traceback
+
+'''
+
+
+# Send emails to settings.ADMINS when encountering errors
+def setup_error_handler():
+ if settings.DEBUG:
+ return None
+
+ mail_handler = AdminEmailHandler()
+ mail_handler.setLevel(logging.ERROR)
+ mail_handler.setFormatter(logging.Formatter(extra_error_message))
+
+ logger = logging.getLogger('patchwork')
+ logger.addHandler(mail_handler)
+
+ return logger
+
def main(args):
django.setup()
+ logger = setup_error_handler()
mail = message_from_file(sys.stdin)
- return parse_mail(mail)
+ try:
+ return parse_mail(mail)
+ except:
+ if logger:
+ logger.exception('Error when parsing incoming email', extra={
+ 'mail': mail.as_string(),
+ })
+ raise
if __name__ == '__main__':
sys.exit(main(sys.argv))
--
2.1.0
More information about the Patchwork
mailing list