summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey C. Ollie <jeff@ocjtech.us>2008-12-12 21:44:35 -0600
committerJeffrey C. Ollie <jeff@ocjtech.us>2008-12-12 21:44:35 -0600
commit5d11ab7da50c9334d616878890e96569ca5e2fab (patch)
treea7cd30bedec4265d9ffc97a08298e512d8f8ab74
parentb994df88eb63beb6b7ce6972a26bd6b48a18c86a (diff)
downloadcvsmessaging-5d11ab7da50c9334d616878890e96569ca5e2fab.tar.gz
cvsmessaging-5d11ab7da50c9334d616878890e96569ca5e2fab.tar.xz
cvsmessaging-5d11ab7da50c9334d616878890e96569ca5e2fab.zip
A number of different cleanups, plus actually build the email and send
it out.
-rwxr-xr-xloginfo-consumer109
-rwxr-xr-xloginfo-producer23
2 files changed, 88 insertions, 44 deletions
diff --git a/loginfo-consumer b/loginfo-consumer
index 036be88..332d7e8 100755
--- a/loginfo-consumer
+++ b/loginfo-consumer
@@ -19,6 +19,7 @@
import os
import re
+import smtplib
from qpid.util import connect
from qpid.connection import Connection
@@ -27,19 +28,29 @@ from qpid.queue import Empty
from lxml import etree
-def get_diff(cvsroot, directory, filename, old_version, new_version):
- #diffcmd = '/usr/bin/cvs -f -d "%s" diff -kk -u -N -r %s -r %s "%s" 2>/dev/null' % (cvsroot,
- # old_version,
- # new_version,
- # os.path.join(directory,
- # filename))
-
- diff = u'Index: %s\n' % os.path.join(directory, filename)
- diffcmd = u'/usr/bin/rcsdiff -kk -u -r%s -r%s "%s,v" 2>&1' % (old_version,
- new_version,
- os.path.join(cvsroot,
- directory,
- filename))
+from email.mime.text import MIMEText
+from email import utils
+from email import Header
+from email.encoders import encode_quopri
+
+def get_diff(cvsserver, cvsroot, directory, filename, old_version, new_version):
+ diff = u''
+
+ if cvsserver == socket.gethostname():
+ diff += u'Index: %s\n' % filename
+ diffcmd = '/usr/bin/rcsdiff -kk -u -r%s -r%s "%s,v" 2>&1' % (old_version,
+ new_version,
+ os.path.join(cvsroot,
+ directory,
+ filename))
+ else:
+ diffcmd = '/usr/bin/cvs -f -d ":pserver:anonymous@%s:%s" diff -kk -u -N -r %s -r %s "%s" 2>/dev/null' % (cvsserver,
+ cvsroot,
+ old_version,
+ new_version,
+ os.path.join(directory,
+ filename))
+
fp = os.popen(diffcmd)
diff += fp.read().decode('utf-8')
status = fp.close()
@@ -47,10 +58,13 @@ def get_diff(cvsroot, directory, filename, old_version, new_version):
package_re = re.compile(r'^(?:rpms|devel)/([^/]+)(?:/([^/]+))?')
-def append_package_owner_email(directory, to):
+def append_package_owner_email(directory, recipients):
+ global package_re
+
package_match = package_re.match(directory)
+
if package_match and package_match.group(1):
- to.append('%s-owner@fedoraproject.org' % package_match.group(1))
+ recipients.append('%s-owner@fedoraproject.org' % package_match.group(1))
host = '127.0.0.1'
port = 5672
@@ -69,47 +83,72 @@ local_queue.start()
message = None
while True:
try:
- message = local_queue.get()
+ message = local_queue.get(timeout=10)
root_element = etree.fromstring(message.body)
+ cvsserver = root_element.xpath('/loginfo/cvsserver')[0].text
cvsroot = root_element.xpath('/loginfo/cvsroot')[0].text
directory = root_element.xpath('/loginfo/directory')[0].text
username = root_element.xpath('/loginfo/username')[0].text
fullname = root_element.xpath('/loginfo/fullname')[0].text
-
- email_body = u'Author: "%s" <%s@fedoraproject.org>\n\n' % (username, fullname)
- email_body += root_element.xpath('/loginfo/message')[0].text
- email_body += '\n\n'
+ timestamp = float(root_element.xpath('/loginfo/timestamp')[0].text)
+ email_sender = 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 += u'\n\n'
+
+ email_subject = directory
+
for file_element in root_element.xpath('/loginfo/files/file'):
filename = file_element.xpath('filename')[0].text
old_version = file_element.xpath('old-version')[0].text
new_version = file_element.xpath('new-version')[0].text
- diff = get_diff(cvsroot, directory, filename, old_version, new_version)
- diff_element = etree.SubElement(file_element, 'diff')
+ diff = get_diff(cvsserver, cvsroot, directory, filename, old_version, new_version)
+ diff_element = etree.SubElement(file_element, u'diff')
diff_element.text = diff
email_body += diff
- email_body += '\n\n'
+ email_body += u'\n\n'
- session.message_accept(RangedSet(message.id))
+ email_subject += u' %s,%s,%s' % (filename,old_version,new_version)
- print email_body
+ # build the list of recipients
- print etree.tostring(root_element, pretty_print = True)
-
- to = []
- for email_element in root_element.xpath('/loginfo/notification/email'):
- email = email_element.text
- if email == '%%OWNER%%':
- append_package_owner_email(directory, to)
+ email_recipients = []
+ for notification_element in root_element.xpath('/loginfo/notifications/notification'):
+ notification = email_element.text
+ if notification == u'%%OWNER%%':
+ append_package_owner_email(directory, email_recipients)
else:
- to.append(email)
+ email_recipients.append(notification)
+
+ # 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['X-CVSROOT'] = cvsroot
+ msg['X-CVS-Module'] = directory.split('/', 1)[0]
+ msg['X-CVS-Directory'] = directory
+ msg['X-CVS-User'] = username
+ msg['X-CVS-Server'] = cvsserver
+ msg['Precedence'] = 'first-class'
+
+ # and send it out
+
+ s = smtplib.SMTP()
+ s.connect()
+ s.sendmail(email_sender, email_recipients, msg.as_string())
+ s.close()
+
+ session.message_accept(RangedSet(message.id))
- print to
-
except Empty:
print 'No more messages!'
break
diff --git a/loginfo-producer b/loginfo-producer
index d1b7842..7195213 100755
--- a/loginfo-producer
+++ b/loginfo-producer
@@ -22,6 +22,7 @@ import re
import os
import time
import pwd
+import socket
from qpid.util import connect
from qpid.connection import Connection
@@ -50,22 +51,21 @@ fullname = pwd_entry[4].decode('utf-8')
fullname_element = etree.SubElement(root_element, 'fullname')
fullname_element.text = fullname
-notification_element = etree.SubElement(root_element, 'notification')
-for arg in sys.argv[2:]:
- email_element = etree.SubElement(notification_element, 'email')
- email_element.text = arg
-
-socket = connect(host, port)
-connection = Connection(sock = socket)
-connection.start()
-session = connection.session(str(uuid4()))
+cvsserver_element = etree.SubElement(root_element, 'cvsserver')
+cvsserver_element.text = socket.gethostname()
cvsroot = os.environ['CVSROOT']
cvsroot_element = etree.SubElement(root_element, 'cvsroot')
cvsroot_element.text = cvsroot
+notifications_element = etree.SubElement(root_element, 'notifications')
+
+for arg in sys.argv[2:]:
+ notification_element = etree.SubElement(notification_element, 'notification')
+ notification_element.text = arg
+
directory_re = re.compile(r'^Update of %s/(.*)$' % (cvsroot,), re.M)
message = sys.stdin.read().decode('utf-8')
@@ -107,6 +107,11 @@ while len(filespecs) > 0:
message_element = etree.SubElement(root_element, 'message')
message_element.text = message
+socket = connect(host, port)
+connection = Connection(sock = socket)
+connection.start()
+session = connection.session(str(uuid4()))
+
properties = session.delivery_properties(routing_key = 'loginfo')
session.message_transfer(destination='cvs_exchange',
message = Message(properties,