Merge branch 'master' of /git/enigma2
[enigma2.git] / lib / python / Plugins / SystemPlugins / CrashlogAutoSubmit / plugin.py
index e58f19a01388b4078837f758200702b7ec82c328..cf998a791de1ff86ffc5f6c76b7fdaa81bff28f7 100755 (executable)
@@ -2,16 +2,18 @@ from Plugins.Plugin import PluginDescriptor
 from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigSelection, ConfigYesNo,ConfigText
 from Components.ConfigList import ConfigListScreen
 from Components.ActionMap import ActionMap
 from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigSelection, ConfigYesNo,ConfigText
 from Components.ConfigList import ConfigListScreen
 from Components.ActionMap import ActionMap
-from Components.Label import Label
+from Components.Sources.StaticText import StaticText
 from Components.Pixmap import Pixmap
 from Screens.Screen import Screen
 from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.ChoiceBox import ChoiceBox
 from Screens.MessageBox import MessageBox
 from enigma import ePoint
 from Components.Pixmap import Pixmap
 from Screens.Screen import Screen
 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 os
 from twisted.mail import smtp, relaymanager
+import MimeWriter, mimetools, StringIO
 
 config.plugins.crashlogautosubmit = ConfigSubsection()
 config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
 
 config.plugins.crashlogautosubmit = ConfigSubsection()
 config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
@@ -21,24 +23,25 @@ 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.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):
 
        oldMailEntryValue = config.plugins.crashlogautosubmit.sendmail.value
 
        skin = """
 
 class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
 
        oldMailEntryValue = config.plugins.crashlogautosubmit.sendmail.value
 
        skin = """
-               <screen name="CrashlogAutoSubmitConfiguration" position="80,80" size="560,400" title="CrashlogAutoSubmit settings..." >
-                       <widget name="config" zPosition="2" position="5,5" size="550,360" scrollbarMode="showOnDemand" transparent="1" />
-                       <ePixmap pixmap="skin_default/div-h.png" position="0,300" zPosition="10" size="560,2" transparent="1" alphatest="on" />
-                       <widget name="status" position="10,300" zPosition="10" size="540,50" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
-                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,360" zPosition="2" size="140,40" transparent="1" alphatest="on" />
-                       <widget name="closetext" position="0,360" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
-                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,360" zPosition="2" size="140,40" transparent="1" alphatest="on" />
-                       <widget name="installtext" position="140,360" zPosition="10" size="140,40" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
-                       <widget name="VKeyButton" pixmap="skin_default/buttons/button_yellow.png" position="285,370" zPosition="2" size="15,16" transparent="1" alphatest="on" />
-                       <widget name="VKeyIcon" pixmap="skin_default/vkey_icon.png" position="300,355" zPosition="10" size="60,48" transparent="1" alphatest="on" />
-                       <widget name="HelpWindow" position="175,250" zPosition="1" size="1,1" transparent="1" />
+               <screen name="CrashlogAutoSubmitConfiguration" position="center,center" size="560,440" title="CrashlogAutoSubmit settings" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget name="config" zPosition="2" position="5,50" size="550,300" scrollbarMode="showOnDemand" transparent="1" />
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,390" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+                       <widget source="status" render="Label" position="10,400" size="540,40" zPosition="10" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
+                       <widget name="VKeyIcon" pixmap="skin_default/buttons/key_text.png" position="10,420" zPosition="10" size="35,25" transparent="1" alphatest="on" />
+                       <widget name="HelpWindow" pixmap="skin_default/vkey_icon.png" position="160,325" zPosition="1" size="1,1" transparent="1" alphatest="on" />
                </screen>"""
 
        def __init__(self, session):
                </screen>"""
 
        def __init__(self, session):
@@ -49,6 +52,9 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                self.addEmailEntry = None
                self.EmailEntry = None
                self.NameEntry = None
                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" ],
                self.msgCrashlogMailer = False
 
                self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions" ],
@@ -59,23 +65,21 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                        "green": self.keySave,
                }, -2)
 
                        "green": self.keySave,
                }, -2)
 
-               self["VirtualKB"] = ActionMap(["ColorActions" ],
+               self["VirtualKB"] = ActionMap(["VirtualKeyboardActions" ],
                {
                {
-                       "yellow": self.KeyYellow,
+                       "showVirtualKeyboard": self.KeyText,
                }, -1)
 
                self.list = []
                ConfigListScreen.__init__(self, self.list,session = self.session)
                self.createSetup()
 
                }, -1)
 
                self.list = []
                ConfigListScreen.__init__(self, self.list,session = self.session)
                self.createSetup()
 
-               self["VKeyButton"] = Pixmap()
+               self["key_red"] = StaticText(_("Close"))
+               self["key_green"] = StaticText(_("Save"))
+               self["status"] = StaticText()
                self["VKeyIcon"] = Pixmap()
                self["VKeyIcon"] = Pixmap()
-               self["closetext"] = Label(_("Close"))
-               self["installtext"] = Label(_("Save"))
-               self["HelpWindow"] = Label()
-               self["status"] = Label()
+               self["HelpWindow"] = Pixmap()
 
 
-               self["VKeyButton"].hide()
                self["VKeyIcon"].hide()
                self["VirtualKB"].setEnabled(False)
                self.onShown.append(self.setWindowTitle)
                self["VKeyIcon"].hide()
                self["VirtualKB"].setEnabled(False)
                self.onShown.append(self.setWindowTitle)
@@ -93,7 +97,7 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                ConfigListScreen.keyRight(self)
                self.newConfig()
 
                ConfigListScreen.keyRight(self)
                self.newConfig()
 
-       def KeyYellow(self):
+       def KeyText(self):
                        if self["config"].getCurrent() == self.EmailEntry:
                                self.session.openWithCallback(self.EmailCallback, VirtualKeyBoard, title = (_("Please enter your email address here:")), text = config.plugins.crashlogautosubmit.email.value)
                        if self["config"].getCurrent() == self.NameEntry:
                        if self["config"].getCurrent() == self.EmailEntry:
                                self.session.openWithCallback(self.EmailCallback, VirtualKeyBoard, title = (_("Please enter your email address here:")), text = config.plugins.crashlogautosubmit.email.value)
                        if self["config"].getCurrent() == self.NameEntry:
@@ -116,6 +120,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.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 )
                self.list.append( self.MailEntry )
                if config.plugins.crashlogautosubmit.sendmail.value is not "send_never":
                        self.list.append( self.LogEntry )
@@ -123,6 +131,9 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                        if config.plugins.crashlogautosubmit.attachemail.value is True:
                                self.list.append( self.EmailEntry )
                                self.list.append( self.NameEntry )
                        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)
 
                self["config"].list = self.list
                self["config"].l.setList(self.list)
@@ -163,9 +174,17 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                        self["status"].setText(_("Optionally enter your name if you want to."))
                        self.enableVKeyIcon()
                        self.showKeypad()
                        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):
 
        def enableVKeyIcon(self):
-               self["VKeyButton"].show()
                self["VKeyIcon"].show()
                self["VirtualKB"].setEnabled(True)
 
                self["VKeyIcon"].show()
                self["VirtualKB"].setEnabled(True)
 
@@ -178,7 +197,6 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
                                current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
 
        def disableVKeyIcon(self):
                                current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
 
        def disableVKeyIcon(self):
-               self["VKeyButton"].hide()
                self["VKeyIcon"].hide()
                self["VirtualKB"].setEnabled(False)
 
                self["VKeyIcon"].hide()
                self["VirtualKB"].setEnabled(False)
 
@@ -219,13 +237,28 @@ class CrashlogAutoSubmitConfiguration(Screen, ConfigListScreen):
 
 def mxServerFound(mxServer,session):
        print "[CrashlogAutoSubmit] - mxServerFound -->", mxServer
 
 def mxServerFound(mxServer,session):
        print "[CrashlogAutoSubmit] - mxServerFound -->", mxServer
-       attachments = []
        crashLogFilelist = []
        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"
        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:
        if  str(config.plugins.crashlogautosubmit.email.value) == "myemail@home.com":
                user_email = ""
        else:
@@ -234,11 +267,9 @@ def mxServerFound(mxServer,session):
                user_name = ""
        else:
                user_name = "\n\nOptional supplied name: " + str(config.plugins.crashlogautosubmit.name.value)
                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"),
 
        list = (
                (_("Yes"), "send"),
@@ -263,16 +294,17 @@ def mxServerFound(mxServer,session):
 
        def send_mail():
                print "[CrashlogAutoSubmit] - send_mail"
 
        def send_mail():
                print "[CrashlogAutoSubmit] - send_mail"
-               attachments = []
                if len(crashLogFilelist):
                        for crashlog in crashLogFilelist:
                                filename = str(os.path.basename(crashlog))
                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):
                sending.addCallback(handleSuccess).addErrback(handleError)
 
        def handleAnswer(answer):
@@ -296,7 +328,6 @@ def mxServerFound(mxServer,session):
                elif answer == "send_not":
                        print "[CrashlogAutoSubmit] - not sending crashlogs for this time."
 
                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)
        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 +335,7 @@ def mxServerFound(mxServer,session):
 
        if len(crashLogFilelist):
                if config.plugins.crashlogautosubmit.sendmail.value == "send":
 
        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:
                elif config.plugins.crashlogautosubmit.sendmail.value == "send_always":
                        send_mail()
        else:
@@ -313,14 +344,10 @@ def mxServerFound(mxServer,session):
 
 def getMailExchange(host):
        print "[CrashlogAutoSubmit] - getMailExchange"
 
 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):
 
 
 def startMailer(session):
@@ -328,8 +355,15 @@ def startMailer(session):
                print "[CrashlogAutoSubmit] - not starting CrashlogAutoSubmit"
                return False
 
                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:
        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):
 
 
 def callCrashMailer(result,session):