1 from Plugins.Plugin import PluginDescriptor
2 from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigSelection
3 from Components.ConfigList import ConfigListScreen
4 from Components.ActionMap import ActionMap
5 from Components.Label import Label
6 from Screens.ChoiceBox import ChoiceBox
7 from Screens.Screen import Screen
9 from twisted.mail import smtp, relaymanager
11 config.plugins.crashlogautosubmit = ConfigSubsection()
12 config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
13 ("send", _("Always ask before sending")), ("send_always", _("Don't ask, just send")), ("send_never", _("Disable crashlog reporting"))])
14 config.plugins.crashlogautosubmit.sendlog = ConfigSelection(default = "rename", choices = [
15 ("delete", _("Delete crashlogs")), ("rename", _("Rename crashlogs"))])
18 class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
20 <screen name="CrashlogAutoSubmitConfiguration" position="80,80" size="560,400" title="CrashlogAutoSubmitConfiguration..." >
21 <widget name="config" zPosition="2" position="5,5" size="550,360" scrollbarMode="showOnDemand" transparent="1" />
22 <ePixmap pixmap="skin_default/buttons/red.png" position="0,370" zPosition="2" size="140,40" transparent="1" alphatest="on" />
23 <widget name="closetext" position="0,370" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
24 <ePixmap pixmap="skin_default/buttons/green.png" position="140,370" zPosition="2" size="140,40" transparent="1" alphatest="on" />
25 <widget name="installtext" position="140,370" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
28 def __init__(self, session):
29 Screen.__init__(self, session)
30 self.session = session
34 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions" ],
37 "back": self.keyCancel,
38 "red": self.keyCancel,
39 "green": self.keySave,
43 ConfigListScreen.__init__(self, self.list,session = self.session)
46 self["closetext"] = Label(_("Close"))
47 self["installtext"] = Label(_("Save"))
48 self.onShown.append(self.setWindowTitle)
50 def setWindowTitle(self):
51 self.setTitle(_("CrashlogAutoSubmitConfiguration"))
54 self.close(False, self.session)
57 ConfigListScreen.keyLeft(self)
61 ConfigListScreen.keyRight(self)
64 def createSetup(self):
66 self.MailEntry = getConfigListEntry(_("How to handle found crashlogs:"), config.plugins.crashlogautosubmit.sendmail)
67 self.LogEntry = getConfigListEntry(_("What to do with sent crashlogs:"), config.plugins.crashlogautosubmit.sendlog)
68 self.list.append(self.MailEntry)
69 if config.plugins.crashlogautosubmit.sendmail.value is not "send_never":
70 self.list.append(self.LogEntry )
71 self["config"].list = self.list
72 self["config"].l.setList(self.list)
75 if self["config"].getCurrent() == self.MailEntry:
80 for x in self["config"].list:
82 self.close(False, self.session)
86 config.plugins.crashlogautosubmit.sendmail.save()
87 config.plugins.crashlogautosubmit.sendlog.save()
88 for x in self["config"].list:
90 config.plugins.crashlogautosubmit.save()
92 self.close(True, self.session)
95 def mxServerFound(mxServer,session):
96 print "[CrashlogAutoSubmit] - mxServerFound -->", mxServer
97 mailFrom = "enigma2@crashlog.dream-multimedia-tv.de"
98 mailTo = "enigma2@crashlog.dream-multimedia-tv.de"
99 subject = "Automatically generated crashlogmail"
100 mailtext = "\nHello\n\nHere are some crashlogs i found for you.\n\n"
101 mailfooter = "This is an automatically generated email. You cant answer!!!"
102 headers = { 'from': 'CrashlogAutoSubmitter <enigma2@crashlog.dream-multimedia-tv.de>', 'to': 'dream-multimedia-crashlogs <enigma2@crashlog.dream-multimedia-tv.de>', 'subject' : str(subject) }
103 mailData = mailtext + mailfooter
104 attachments = [] #(filename, mimetype, attachment as string)
105 crashLogFilelist = []
109 (_("Yes, and don't ask again."), "send_always"),
110 (_("No, send them never."), "send_never")
113 def handleError(error):
114 print "[CrashlogAutoSubmit] - Message send Error -->", error.getErrorMessage()
116 def handleSuccess(result):
117 print "[CrashlogAutoSubmit] - Message sent successfully -->",result
118 if len(crashLogFilelist):
119 for crashlog in crashLogFilelist:
120 if config.plugins.crashlogautosubmit.sendlog.value == "delete":
122 elif config.plugins.crashlogautosubmit.sendlog.value == "rename":
123 currfilename = str(os.path.basename(crashlog))
124 newfilename = "/media/hdd/" + currfilename + ".sent"
125 os.rename(crashlog,newfilename)
128 print "[CrashlogAutoSubmit] - send_mail"
130 if len(crashLogFilelist):
131 for crashlog in crashLogFilelist:
132 filename = str(os.path.basename(crashlog))
133 mimetype = "text/plain"
134 f = open (crashlog, 'r')
135 attachment = str(f.read())
137 attachments.append ((filename,mimetype,attachment))
138 sending = smtp.sendEmail(str(mxServer), mailFrom, mailTo, str(mailData), headers, attachments)
139 sending.addCallback(handleSuccess).addErrback(handleError)
141 def handleAnswer(answer):
142 answer = answer and answer[1]
143 print "[CrashlogAutoSubmit] - handleAnswer --> ",answer
146 elif answer == "send_always":
147 config.plugins.crashlogautosubmit.sendmail.value = "send_always"
148 config.plugins.crashlogautosubmit.sendmail.save()
149 config.plugins.crashlogautosubmit.save()
150 config.plugins.save()
153 elif answer in ( None, "send_never"):
154 config.plugins.crashlogautosubmit.sendmail.value = "send_never"
155 config.plugins.crashlogautosubmit.sendmail.save()
156 config.plugins.crashlogautosubmit.save()
157 config.plugins.save()
160 for crashlog in os.listdir('/media/hdd'):
161 if crashlog.startswith("enigma2_crash_") and crashlog.endswith(".log"):
162 print "[CrashlogAutoSubmit] - found crashlog: ",os.path.basename(crashlog)
163 crashLogFilelist.append('/media/hdd/' + crashlog)
165 if len(crashLogFilelist):
166 if config.plugins.crashlogautosubmit.sendmail.value == "send":
167 session.openWithCallback(handleAnswer, ChoiceBox, title=_("Crashlogs found!\nSend them to Dream Multimedia ?"), list = list)
168 elif config.plugins.crashlogautosubmit.sendmail.value == "send_always":
172 def getMailExchange(host):
173 print "[CrashlogAutoSubmit] - getMailExchange"
175 def handleMXError(error):
176 print "[CrashlogAutoSubmit] - DNS-Error, sending aborted -->", error.getErrorMessage()
179 return str(mxRecord.name)
181 return relaymanager.MXCalculator().getMX(host).addCallback(cbMX).addErrback(handleMXError)
184 def startMailer(session):
185 if config.plugins.crashlogautosubmit.sendmail.value == "send_never":
186 print "[CrashlogAutoSubmit] - not starting CrashlogAutoSubmit"
189 getMailExchange('crashlog.dream-multimedia-tv.de').addCallback(mxServerFound,session)
192 def autostart(reason, **kwargs):
193 print "[CrashlogAutoSubmit] - autostart"
194 if "session" in kwargs:
196 startMailer(kwargs["session"])
197 except ImportError, e:
198 print "[CrashlogAutoSubmit] Twisted-mail not available, not starting CrashlogAutoSubmitter", e
200 def openconfig(session, **kwargs):
201 session.openWithCallback(configCB, CrashlogAutoSubmitConfiguration)
203 def configCB(result, session):
205 print "[CrashlogAutoSubmit] - config changed"
208 print "[CrashlogAutoSubmit] - config not changed"
211 def Plugins(**kwargs):
212 return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
213 PluginDescriptor(name=_("CrashlogAutoSubmit"), description=_("Configuration for the CrashlogAutoSubmitter"),
214 where=[PluginDescriptor.WHERE_PLUGINMENU], fnc=openconfig)]