from Plugins.Plugin import PluginDescriptor
from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigSelection
from Components.ConfigList import ConfigListScreen
from Components.ActionMap import ActionMap
from Components.Label import Label
from Screens.ChoiceBox import ChoiceBox
from Screens.Screen import Screen
import os
from twisted.mail import smtp, relaymanager
config.plugins.crashlogautosubmit = ConfigSubsection()
config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
("send", _("Always ask before sending")), ("send_always", _("Don't ask, just send")), ("send_never", _("Disable crashlog reporting"))])
config.plugins.crashlogautosubmit.sendlog = ConfigSelection(default = "rename", choices = [
("delete", _("Delete crashlogs")), ("rename", _("Rename crashlogs"))])
class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
skin = """
"""
def __init__(self, session):
Screen.__init__(self, session)
self.session = session
self.MailEntry = None
self.LogEntry = None
self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions" ],
{
"ok": self.keySave,
"back": self.keyCancel,
"red": self.keyCancel,
"green": self.keySave,
}, -1)
self.list = []
ConfigListScreen.__init__(self, self.list,session = self.session)
self.createSetup()
self["closetext"] = Label(_("Close"))
self["installtext"] = Label(_("Save"))
self.onShown.append(self.setWindowTitle)
def setWindowTitle(self):
self.setTitle(_("CrashlogAutoSubmitConfiguration"))
def exit(self):
self.close(False, self.session)
def keyLeft(self):
ConfigListScreen.keyLeft(self)
self.newConfig()
def keyRight(self):
ConfigListScreen.keyRight(self)
self.newConfig()
def createSetup(self):
self.list = []
self.MailEntry = getConfigListEntry(_("How to handle found crashlogs:"), config.plugins.crashlogautosubmit.sendmail)
self.LogEntry = getConfigListEntry(_("What to do with sent crashlogs:"), config.plugins.crashlogautosubmit.sendlog)
self.list.append(self.MailEntry)
if config.plugins.crashlogautosubmit.sendmail.value is not "send_never":
self.list.append(self.LogEntry )
self["config"].list = self.list
self["config"].l.setList(self.list)
def newConfig(self):
if self["config"].getCurrent() == self.MailEntry:
self.createSetup()
def keyCancel(self):
print "cancel"
for x in self["config"].list:
x[1].cancel()
self.close(False, self.session)
def keySave(self):
print "saving"
config.plugins.crashlogautosubmit.sendmail.save()
config.plugins.crashlogautosubmit.sendlog.save()
for x in self["config"].list:
x[1].save()
config.plugins.crashlogautosubmit.save()
config.plugins.save()
self.close(True, self.session)
def mxServerFound(mxServer,session):
print "[CrashlogAutoSubmit] - mxServerFound -->", mxServer
mailFrom = "enigma2@crashlog.dream-multimedia-tv.de"
mailTo = "enigma2@crashlog.dream-multimedia-tv.de"
subject = "Automatically generated crashlogmail"
mailtext = "\nHello\n\nHere are some crashlogs i found for you.\n\n"
mailfooter = "This is an automatically generated email. You cant answer!!!"
headers = { 'from': 'CrashlogAutoSubmitter ', 'to': 'dream-multimedia-crashlogs ', 'subject' : str(subject) }
mailData = mailtext + mailfooter
attachments = [] #(filename, mimetype, attachment as string)
crashLogFilelist = []
list = (
(_("Yes"), "send"),
(_("Yes, and don't ask again."), "send_always"),
(_("No, send them never."), "send_never")
)
def handleError(error):
print "[CrashlogAutoSubmit] - Message send Error -->", error.getErrorMessage()
def handleSuccess(result):
print "[CrashlogAutoSubmit] - Message sent successfully -->",result
if len(crashLogFilelist):
for crashlog in crashLogFilelist:
if config.plugins.crashlogautosubmit.sendlog.value == "delete":
os.remove(crashlog)
elif config.plugins.crashlogautosubmit.sendlog.value == "rename":
currfilename = str(os.path.basename(crashlog))
newfilename = "/media/hdd/" + currfilename + ".sent"
os.rename(crashlog,newfilename)
def send_mail():
print "[CrashlogAutoSubmit] - send_mail"
attachments = []
if len(crashLogFilelist):
for crashlog in crashLogFilelist:
filename = str(os.path.basename(crashlog))
mimetype = "text/plain"
f = open (crashlog, 'r')
attachment = str(f.read())
f.close()
attachments.append ((filename,mimetype,attachment))
sending = smtp.sendEmail(str(mxServer), mailFrom, mailTo, str(mailData), headers, attachments)
sending.addCallback(handleSuccess).addErrback(handleError)
def handleAnswer(answer):
answer = answer and answer[1]
print "[CrashlogAutoSubmit] - handleAnswer --> ",answer
if answer == "send":
send_mail()
elif answer == "send_always":
config.plugins.crashlogautosubmit.sendmail.value = "send_always"
config.plugins.crashlogautosubmit.sendmail.save()
config.plugins.crashlogautosubmit.save()
config.plugins.save()
config.save()
send_mail()
elif answer in ( None, "send_never"):
config.plugins.crashlogautosubmit.sendmail.value = "send_never"
config.plugins.crashlogautosubmit.sendmail.save()
config.plugins.crashlogautosubmit.save()
config.plugins.save()
config.save()
for crashlog in os.listdir('/media/hdd'):
if crashlog.startswith("enigma2_crash_") and crashlog.endswith(".log"):
print "[CrashlogAutoSubmit] - found crashlog: ",os.path.basename(crashlog)
crashLogFilelist.append('/media/hdd/' + crashlog)
if len(crashLogFilelist):
if config.plugins.crashlogautosubmit.sendmail.value == "send":
session.openWithCallback(handleAnswer, ChoiceBox, title=_("Crashlogs found!\nSend them to Dream Multimedia ?"), list = list)
elif config.plugins.crashlogautosubmit.sendmail.value == "send_always":
send_mail()
def getMailExchange(host):
print "[CrashlogAutoSubmit] - getMailExchange"
def handleMXError(error):
print "[CrashlogAutoSubmit] - DNS-Error, sending aborted -->", error.getErrorMessage()
def cbMX(mxRecord):
return str(mxRecord.name)
return relaymanager.MXCalculator().getMX(host).addCallback(cbMX).addErrback(handleMXError)
def startMailer(session):
if config.plugins.crashlogautosubmit.sendmail.value == "send_never":
print "[CrashlogAutoSubmit] - not starting CrashlogAutoSubmit"
return False
getMailExchange('crashlog.dream-multimedia-tv.de').addCallback(mxServerFound,session)
def autostart(reason, **kwargs):
print "[CrashlogAutoSubmit] - autostart"
if "session" in kwargs:
try:
startMailer(kwargs["session"])
except ImportError, e:
print "[CrashlogAutoSubmit] Twisted-mail not available, not starting CrashlogAutoSubmitter", e
def openconfig(session, **kwargs):
session.openWithCallback(configCB, CrashlogAutoSubmitConfiguration)
def configCB(result, session):
if result is True:
print "[CrashlogAutoSubmit] - config changed"
startMailer(session)
else:
print "[CrashlogAutoSubmit] - config not changed"
def Plugins(**kwargs):
return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
PluginDescriptor(name=_("CrashlogAutoSubmit"), description=_("Configuration for the CrashlogAutoSubmitter"),
where=[PluginDescriptor.WHERE_PLUGINMENU], fnc=openconfig)]