default send anonymized crashlogs
[enigma2.git] / lib / python / Plugins / SystemPlugins / CrashlogAutoSubmit / plugin.py
index e58f19a01388b4078837f758200702b7ec82c328..2ef65829aa2618febd7a10ba5fa071e8a14770ce 100755 (executable)
@@ -9,9 +9,11 @@ from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.ChoiceBox import ChoiceBox
 from Screens.MessageBox import MessageBox
 from enigma import ePoint
+from Tools import Notifications
 
 import os
 from twisted.mail import smtp, relaymanager
+import MimeWriter, mimetools, StringIO
 
 config.plugins.crashlogautosubmit = ConfigSubsection()
 config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
@@ -21,7 +23,9 @@ config.plugins.crashlogautosubmit.sendlog = ConfigSelection(default = "rename",
 config.plugins.crashlogautosubmit.attachemail = ConfigYesNo(default = False)
 config.plugins.crashlogautosubmit.email = ConfigText(default = "myemail@home.com", fixed_size = False)
 config.plugins.crashlogautosubmit.name = ConfigText(default = "Dreambox User", fixed_size = False)
-
+config.plugins.crashlogautosubmit.sendAnonCrashlog = ConfigYesNo(default = True)
+config.plugins.crashlogautosubmit.addNetwork = ConfigYesNo(default = False)
+config.plugins.crashlogautosubmit.addWlan = ConfigYesNo(default = False)
 
 class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
 
@@ -49,6 +53,9 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                self.addEmailEntry = None
                self.EmailEntry = None
                self.NameEntry = None
+               self.AnonCrashlogEntry = None
+               self.NetworkEntry = None
+               self.WlanEntry = None
                self.msgCrashlogMailer = False
 
                self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions" ],
@@ -116,6 +123,10 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                self.addEmailEntry = getConfigListEntry(_("Include your email and name (optional) in the mail?"), config.plugins.crashlogautosubmit.attachemail)
                self.EmailEntry = getConfigListEntry(_("Your email address:"), config.plugins.crashlogautosubmit.email)
                self.NameEntry = getConfigListEntry(_("Your name (optional):"), config.plugins.crashlogautosubmit.name)
+               self.AnonCrashlogEntry = getConfigListEntry(_("Anonymize crashlog?"), config.plugins.crashlogautosubmit.sendAnonCrashlog)
+               self.NetworkEntry = getConfigListEntry(_("Add network configuration?"), config.plugins.crashlogautosubmit.addNetwork)
+               self.WlanEntry = getConfigListEntry(_("Add WLAN configuration?"), config.plugins.crashlogautosubmit.addWlan)
+
                self.list.append( self.MailEntry )
                if config.plugins.crashlogautosubmit.sendmail.value is not "send_never":
                        self.list.append( self.LogEntry )
@@ -123,6 +134,9 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                        if config.plugins.crashlogautosubmit.attachemail.value is True:
                                self.list.append( self.EmailEntry )
                                self.list.append( self.NameEntry )
+                       self.list.append( self.AnonCrashlogEntry )
+                       self.list.append( self.NetworkEntry )
+                       self.list.append( self.WlanEntry )
 
                self["config"].list = self.list
                self["config"].l.setList(self.list)
@@ -163,6 +177,15 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                        self["status"].setText(_("Optionally enter your name if you want to."))
                        self.enableVKeyIcon()
                        self.showKeypad()
+               elif current == self.AnonCrashlogEntry:
+                       self["status"].setText(_("Adds enigma2 settings and dreambox model informations like SN, rev... if enabled."))
+                       self.disableVKeyIcon()
+               elif current == self.NetworkEntry:
+                       self["status"].setText(_("Adds network configuration if enabled."))
+                       self.disableVKeyIcon()
+               elif current == self.WlanEntry:
+                       self["status"].setText(_("Adds wlan configuration if enabled."))
+                       self.disableVKeyIcon()
 
        def enableVKeyIcon(self):
                self["VKeyButton"].show()
@@ -219,13 +242,28 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
 
 def mxServerFound(mxServer,session):
        print "[CrashlogAutoSubmit] - mxServerFound -->", mxServer
-       attachments = []
        crashLogFilelist = []
+       message = StringIO.StringIO()
+       writer = MimeWriter.MimeWriter(message)
        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"
-       mailfooter = "\n\nThis is an automatically generated email from the CrashlogAutoSubmit plugin.\n\n\nHave a nice day.\n"
+       # Define the main body headers.
+       writer.addheader('To', "dream-multimedia-crashlogs <enigma2@crashlog.dream-multimedia-tv.de>")
+       writer.addheader('From', "CrashlogAutoSubmitter <enigma2@crashlog.dream-multimedia-tv.de>")
+       writer.addheader('Subject', str(subject))
+       writer.addheader('Date', smtp.rfc822date())
+       if config.plugins.crashlogautosubmit.attachemail.value is True:
+               if  str(config.plugins.crashlogautosubmit.email.value) != "myemail@home.com":
+                       writer.addheader('Reply-To', str(str(config.plugins.crashlogautosubmit.email.value)))
+       writer.addheader('MIME-Version', '1.0')
+       writer.startmultipartbody('mixed')
+       # start with a text/plain part
+       part = writer.nextpart()
+       body = part.startbody('text/plain')
+       part.flushheaders()
+       # Define the message body
+       body_text1 = "\nHello\n\nHere are some crashlogs i found for you.\n"
        if  str(config.plugins.crashlogautosubmit.email.value) == "myemail@home.com":
                user_email = ""
        else:
@@ -234,11 +272,9 @@ def mxServerFound(mxServer,session):
                user_name = ""
        else:
                user_name = "\n\nOptional supplied name: " + str(config.plugins.crashlogautosubmit.name.value)
-       headers = { 'from': 'CrashlogAutoSubmitter <enigma2@crashlog.dream-multimedia-tv.de>', 'to': 'dream-multimedia-crashlogs <enigma2@crashlog.dream-multimedia-tv.de>', 'subject' : str(subject) }
-       mailData = mailtext + user_email + user_name + mailfooter
-       if config.plugins.crashlogautosubmit.attachemail.value is True:
-               if  str(config.plugins.crashlogautosubmit.email.value) != "myemail@home.com":
-                       headers["reply-to"] = str(config.plugins.crashlogautosubmit.email.value)
+       body_text2 = "\n\nThis is an automatically generated email from the CrashlogAutoSubmit plugin.\n\n\nHave a nice day.\n"
+       body_text = body_text1 + user_email + user_name + body_text2
+       body.write(body_text)
 
        list = (
                (_("Yes"), "send"),
@@ -263,16 +299,17 @@ def mxServerFound(mxServer,session):
 
        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)
+                               subpart = writer.nextpart()
+                               subpart.addheader("Content-Transfer-Encoding", 'base64')
+                               subpart.addheader("Content-Disposition",'attachment; filename="%s"' % filename)
+                               subpart.addheader('Content-Description', 'Enigma2 crashlog')
+                               body = subpart.startbody("%s; name=%s" % ('application/octet-stream', filename))
+                               mimetools.encode(open(crashlog, 'rb'), body, 'base64')
+               writer.lastpart()
+               sending = smtp.sendmail(str(mxServer), mailFrom, mailTo, message.getvalue())
                sending.addCallback(handleSuccess).addErrback(handleError)
 
        def handleAnswer(answer):
@@ -296,7 +333,6 @@ def mxServerFound(mxServer,session):
                elif answer == "send_not":
                        print "[CrashlogAutoSubmit] - not sending crashlogs for this time."
 
-
        for crashlog in os.listdir('/media/hdd'):
                if crashlog.startswith("enigma2_crash_") and crashlog.endswith(".log"):
                        print "[CrashlogAutoSubmit] - found crashlog: ",os.path.basename(crashlog)
@@ -304,7 +340,7 @@ def mxServerFound(mxServer,session):
 
        if len(crashLogFilelist):
                if config.plugins.crashlogautosubmit.sendmail.value == "send":
-                       session.openWithCallback(handleAnswer, ChoiceBox, title=_("Crashlogs found!\nSend them to Dream Multimedia ?"), list = list)
+                       Notifications.AddNotificationWithCallback(handleAnswer, ChoiceBox, title=_("Crashlogs found!\nSend them to Dream Multimedia?"), list = list)
                elif config.plugins.crashlogautosubmit.sendmail.value == "send_always":
                        send_mail()
        else:
@@ -313,14 +349,10 @@ def mxServerFound(mxServer,session):
 
 def getMailExchange(host):
        print "[CrashlogAutoSubmit] - getMailExchange"
+       return relaymanager.MXCalculator().getMX(host).addCallback(_gotMXRecord)
 
-       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 _gotMXRecord(mxRecord):
+       return str(mxRecord.name)
 
 
 def startMailer(session):
@@ -328,8 +360,15 @@ def startMailer(session):
                print "[CrashlogAutoSubmit] - not starting CrashlogAutoSubmit"
                return False
 
+       def gotMXServer(mxServer):
+               print "[CrashlogAutoSubmit] gotMXServer: ",mxServer
+               mxServerFound(mxServer,session)
+
+       def handleMXError(error):
+               print "[CrashlogAutoSubmit] - MX resolve ERROR:", error.getErrorMessage()
+
        if not config.misc.firstrun.value:
-               getMailExchange('crashlog.dream-multimedia-tv.de').addCallback(mxServerFound,session)
+               getMailExchange('crashlog.dream-multimedia-tv.de').addCallback(gotMXServer).addErrback(handleMXError)
 
 
 def callCrashMailer(result,session):