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)]