| # elog/mod_mail_summary.py - elog dispatch module |
| # Copyright 2006-2010 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| import portage |
| from portage.exception import AlarmSignal, PortageException |
| from portage.localization import _ |
| from portage.util import writemsg |
| from portage import os |
| from portage import _encodings |
| from portage import _unicode_decode |
| |
| import socket |
| import time |
| |
| _config_keys = ('PORTAGE_ELOG_MAILURI', 'PORTAGE_ELOG_MAILFROM', |
| 'PORTAGE_ELOG_MAILSUBJECT',) |
| _items = {} |
| def process(mysettings, key, logentries, fulltext): |
| global _items |
| time_str = _unicode_decode( |
| time.strftime("%Y%m%d-%H%M%S %Z", time.localtime(time.time())), |
| encoding=_encodings['content'], errors='replace') |
| header = _(">>> Messages generated for package %(pkg)s by process %(pid)d on %(time)s:\n\n") % \ |
| {"pkg": key, "pid": os.getpid(), "time": time_str} |
| config_root = mysettings["PORTAGE_CONFIGROOT"] |
| |
| # Copy needed variables from the config instance, |
| # since we don't need to hold a reference for the |
| # whole thing. This also makes it possible to |
| # rely on per-package variable settings that may |
| # have come from /etc/portage/package.env, since |
| # we'll be isolated from any future mutations of |
| # mysettings. |
| config_dict = {} |
| for k in _config_keys: |
| v = mysettings.get(k) |
| if v is not None: |
| config_dict[k] = v |
| |
| config_dict, items = _items.setdefault(config_root, (config_dict, {})) |
| items[key] = header + fulltext |
| |
| def finalize(): |
| global _items |
| for mysettings, items in _items.values(): |
| _finalize(mysettings, items) |
| _items.clear() |
| |
| def _finalize(mysettings, items): |
| if len(items) == 0: |
| return |
| elif len(items) == 1: |
| count = _("one package") |
| else: |
| count = _("multiple packages") |
| if "PORTAGE_ELOG_MAILURI" in mysettings: |
| myrecipient = mysettings["PORTAGE_ELOG_MAILURI"].split()[0] |
| else: |
| myrecipient = "root@localhost" |
| |
| myfrom = mysettings.get("PORTAGE_ELOG_MAILFROM", "") |
| myfrom = myfrom.replace("${HOST}", socket.getfqdn()) |
| mysubject = mysettings.get("PORTAGE_ELOG_MAILSUBJECT", "") |
| mysubject = mysubject.replace("${PACKAGE}", count) |
| mysubject = mysubject.replace("${HOST}", socket.getfqdn()) |
| |
| mybody = _("elog messages for the following packages generated by " |
| "process %(pid)d on host %(host)s:\n") % {"pid": os.getpid(), "host": socket.getfqdn()} |
| for key in items: |
| mybody += "- %s\n" % key |
| |
| mymessage = portage.mail.create_message(myfrom, myrecipient, mysubject, |
| mybody, attachments=list(items.values())) |
| |
| # Timeout after one minute in case send_mail() blocks indefinitely. |
| try: |
| try: |
| AlarmSignal.register(60) |
| portage.mail.send_mail(mysettings, mymessage) |
| finally: |
| AlarmSignal.unregister() |
| except AlarmSignal: |
| writemsg("Timeout in finalize() for elog system 'mail_summary'\n", |
| noiselevel=-1) |
| except PortageException as e: |
| writemsg("%s\n" % (e,), noiselevel=-1) |
| |
| return |