diff options
-rwxr-xr-x | loginfo-consumer | 70 | ||||
-rwxr-xr-x | loginfo-producer | 2 |
2 files changed, 44 insertions, 28 deletions
diff --git a/loginfo-consumer b/loginfo-consumer index 15ca8cd..c369004 100755 --- a/loginfo-consumer +++ b/loginfo-consumer @@ -29,10 +29,17 @@ from qpid.queue import Empty from lxml import etree -from email.mime.text import MIMEText -from email import utils -from email import Header -from email.encoders import encode_quopri +import email.generator +import email.message +import email.header +import email.utils +import email.charset + +from cStringIO import StringIO + +utf8 = email.charset.Charset('utf-8') +utf8.body_encoding = None +utf8.header_encoding = email.charset.SHORTEST def get_diff(cvsserver, cvsroot, directory, filename, old_version, new_version): diff = u'' @@ -53,13 +60,13 @@ def get_diff(cvsserver, cvsroot, directory, filename, old_version, new_version): filename)) fp = os.popen(diffcmd) - diff += fp.read().decode('utf-8') + diff += fp.read().decode('utf-8', 'replace') status = fp.close() return diff package_re = re.compile(r'^(?:rpms|devel)/([^/]+)(?:/([^/]+))?') -def append_package_owner_email(directory, recipients): +def append_package_owner_email(directory, log_message, recipients): global package_re package_match = package_re.match(directory) @@ -79,29 +86,30 @@ directory_based_notifications = [(re.compile(r'^rpms'), [append_package_owner_em (re.compile(r'^comps'), ['cvsextras@fedoraproject.org', 'katzj@redhat.com', 'notting@redhat.com', - 'jkeating@redhat.com'])] + 'jkeating@redhat.com']), + (re.compile(r'^example'), ['jeff@ocjtech.us'])] message_based_notifications = [(re.compile(r'docs'), ['relnotes@fedoraproject.org'])] -def process_notifications(directory, message, recipients, notifications): +def process_notifications(directory, log_message, recipients, notifications): for notification in notifications: if isinstance(notification, basestring): recipients.add(notification) elif callable(notification): - notification(directory, message, recipients) + notification(directory, log_message, recipients) -def compute_directory_based_notifications(directory, message, recipients): +def compute_directory_based_notifications(directory, log_message, recipients): for pattern, notifications in directory_based_notifications: match = pattern.match(directory) if match: - process_notifications(directory, message, recipients, notifications) + process_notifications(directory, log_message, recipients, notifications) -def compute_message_based_notifications(directory, message, email_recipient_set): +def compute_message_based_notifications(directory, log_message, email_recipient_set): for pattern, notifications in message_based_notifications: - match = pattern.search(message) + match = pattern.search(log_message) if match: - process_notifications(directory, message, recipients, notifications) + process_notifications(directory, log_message, recipients, notifications) host = '127.0.0.1' port = 5672 @@ -130,14 +138,15 @@ while True: username = root_element.xpath('/loginfo/username')[0].text fullname = root_element.xpath('/loginfo/fullname')[0].text timestamp = float(root_element.xpath('/loginfo/timestamp')[0].text) + log_message = root_element.xpath('/loginfo/message')[0].text - email_sender = utils.formataddr((fullname, username + '@fedoraproject.org')) + email_sender = email.utils.formataddr((fullname, username + '@fedoraproject.org')) email_body = u'Author: %s\n\n' % email_sender - email_body += root_element.xpath('/loginfo/message')[0].text + email_body += unicode(log_message) email_body += u'\n\n' - - email_subject = directory + + email_subject = unicode(directory) for file_element in root_element.xpath('/loginfo/files/file'): filename = file_element.xpath('filename')[0].text @@ -151,13 +160,13 @@ while True: email_body += diff email_body += u'\n\n' - email_subject += u' %s,%s,%s' % (filename,old_version,new_version) + email_subject += u' %s,%s,%s' % (filename, old_version, new_version) # build the list of recipients recipients = set() - compute_directory_based_notifications(directory, message, recipients) - compute_message_based_notifications(directory, message, recipients) + compute_directory_based_notifications(directory, log_message, recipients) + compute_message_based_notifications(directory, log_message, recipients) if len(recipients) == 0: recipients.add('admin@fedoraproject.org') @@ -167,11 +176,14 @@ while True: # Build the email object - msg = MIMEText(email_body.encode('utf-8'), _charset='utf-8') - msg['From'] = Header.Header(email_sender) - msg['To'] = Header.Header(u', '.join(email_recipients)) - msg['Subject'] = Header.Header(email_subject) - msg['Date'] = utils.formatdate(timestamp) + msg = email.message.Message() + msg.set_charset(utf8) + msg.set_payload(email_body.encode('utf-8')) + + msg['From'] = email.header.Header(unicode(email_sender), utf8) + msg['To'] = email.header.Header(u', '.join(email_recipients), utf8) + msg['Subject'] = email.header.Header(email_subject, utf8) + msg['Date'] = email.utils.formatdate(timestamp) msg['X-CVSROOT'] = cvsroot msg['X-CVS-Module'] = directory.split('/', 1)[0] msg['X-CVS-Directory'] = directory @@ -181,9 +193,13 @@ while True: # and send it out + msg_fp = StringIO() + msg_g = email.generator.Generator(msg_fp, False) + msg_g.flatten(msg) + s = smtplib.SMTP() s.connect() - s.sendmail(email_sender, email_recipients, msg.as_string()) + s.sendmail(email_sender, email_recipients, msg_fp.getvalue()) s.close() session.message_accept(RangedSet(message.id)) diff --git a/loginfo-producer b/loginfo-producer index f927168..556aaf8 100755 --- a/loginfo-producer +++ b/loginfo-producer @@ -62,7 +62,7 @@ cvsroot_element.text = cvsroot directory_re = re.compile(r'^Update of %s/(.*)$' % (cvsroot,), re.M) -message = sys.stdin.read().decode('utf-8') +message = sys.stdin.read().decode('utf-8', 'replace') directory_match = directory_re.search(message) assert(directory_match) |