# 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

_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"]
	mysettings, items = _items.setdefault(config_root, (mysettings, {}))
	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["PORTAGE_ELOG_MAILFROM"]
	myfrom = myfrom.replace("${HOST}", socket.getfqdn())
	mysubject = mysettings["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
