[PATCH 3/3] parsemail: Mail error information to ADMINS when parsing fails

Damien Lespiau damien.lespiau at intel.com
Sun Sep 27 00:06:28 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.

Signed-off-by: Damien Lespiau <damien.lespiau at intel.com>
---
 patchwork/bin/parsemail.py | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/patchwork/bin/parsemail.py b/patchwork/bin/parsemail.py
index e66b557..e743189 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,41 @@ 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