aa63222274b953cb7b284240c56bbc665900b914
[enigma2.git] / lib / python / Plugins / SystemPlugins / CrashlogAutoSubmit / plugin.py
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
8 import os
9 from twisted.mail import smtp, relaymanager
10
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"))])
16
17
18 class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
19         skin = """
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" />
26                 </screen>"""
27
28         def __init__(self, session):
29                 Screen.__init__(self, session)
30                 self.session = session
31                 self.MailEntry = None
32                 self.LogEntry = None
33
34                 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions" ],
35                 {
36                         "ok": self.keySave,
37                         "back": self.keyCancel,
38                         "red": self.keyCancel,
39                         "green": self.keySave,
40                 }, -1)
41
42                 self.list = []
43                 ConfigListScreen.__init__(self, self.list,session = self.session)
44                 self.createSetup()
45
46                 self["closetext"] = Label(_("Close"))
47                 self["installtext"] = Label(_("Save"))
48                 self.onShown.append(self.setWindowTitle)
49
50         def setWindowTitle(self):
51                 self.setTitle(_("CrashlogAutoSubmitConfiguration"))
52
53         def exit(self):
54                 self.close(False, self.session)
55
56         def keyLeft(self):
57                 ConfigListScreen.keyLeft(self)
58                 self.newConfig()
59
60         def keyRight(self):
61                 ConfigListScreen.keyRight(self)
62                 self.newConfig()
63
64         def createSetup(self):
65                 self.list = []
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)
73
74         def newConfig(self):
75                 if self["config"].getCurrent() == self.MailEntry:
76                         self.createSetup()
77
78         def keyCancel(self):
79                 print "cancel"
80                 for x in self["config"].list:
81                         x[1].cancel()
82                 self.close(False, self.session)
83
84         def keySave(self):
85                 print "saving"
86                 config.plugins.crashlogautosubmit.sendmail.save()
87                 config.plugins.crashlogautosubmit.sendlog.save()
88                 for x in self["config"].list:
89                         x[1].save()
90                 config.plugins.crashlogautosubmit.save()
91                 config.plugins.save()
92                 self.close(True, self.session)
93
94
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 = []
106
107         list = (
108                 (_("Yes"), "send"),
109                 (_("Yes, and don't ask again."), "send_always"),
110                 (_("No, send them never."), "send_never")
111         )
112
113         def handleError(error):
114                 print "[CrashlogAutoSubmit] - Message send Error -->", error.getErrorMessage()
115
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":
121                                         os.remove(crashlog)
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)
126
127         def send_mail():
128                 print "[CrashlogAutoSubmit] - send_mail"
129                 attachments = []
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())
136                                 f.close()
137                                 attachments.append ((filename,mimetype,attachment))
138                 sending = smtp.sendEmail(str(mxServer), mailFrom, mailTo, str(mailData), headers, attachments)
139                 sending.addCallback(handleSuccess).addErrback(handleError)
140
141         def handleAnswer(answer):
142                 answer = answer and answer[1]
143                 print "[CrashlogAutoSubmit] - handleAnswer --> ",answer
144                 if answer == "send":
145                         send_mail()
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()
151                         config.save()
152                         send_mail()
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()
158                         config.save()
159
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)
164
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":
169                         send_mail()
170
171
172 def getMailExchange(host):
173         print "[CrashlogAutoSubmit] - getMailExchange"
174
175         def handleMXError(error):
176                 print "[CrashlogAutoSubmit] - DNS-Error, sending aborted -->", error.getErrorMessage()
177
178         def cbMX(mxRecord):
179                 return str(mxRecord.name)
180
181         return relaymanager.MXCalculator().getMX(host).addCallback(cbMX).addErrback(handleMXError)
182
183
184 def startMailer(session):
185         if config.plugins.crashlogautosubmit.sendmail.value == "send_never":
186                 print "[CrashlogAutoSubmit] - not starting CrashlogAutoSubmit"
187                 return False
188
189         getMailExchange('crashlog.dream-multimedia-tv.de').addCallback(mxServerFound,session)
190
191
192 def autostart(reason, **kwargs):
193         print "[CrashlogAutoSubmit] - autostart"
194         if "session" in kwargs:
195                 try:
196                         startMailer(kwargs["session"])
197                 except ImportError, e:
198                         print "[CrashlogAutoSubmit] Twisted-mail not available, not starting CrashlogAutoSubmitter", e
199
200 def openconfig(session, **kwargs):
201         session.openWithCallback(configCB, CrashlogAutoSubmitConfiguration)
202
203 def configCB(result, session):
204         if result is True:
205                 print "[CrashlogAutoSubmit] - config changed"
206                 startMailer(session)
207         else:
208                 print "[CrashlogAutoSubmit] - config not changed"
209
210
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)]
215