add exception handling about unsafe code in plugins.
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / CrashReport / sender.py
1 import os, mimetypes
2
3 from twisted.internet import reactor
4 from twisted.mail import smtp, relaymanager
5
6 from email import Encoders
7 from email.MIMEBase import MIMEBase
8 from email.MIMEText import MIMEText
9 from email.MIMEMultipart import MIMEMultipart
10
11 g_config_after_file_status = ""
12
13 def getMailExchange(H):
14     def cbMX(mxRecord):
15         return str(mxRecord.name)
16     return relaymanager.MXCalculator().getMX(H).addCallback(cbMX)
17
18 def getLogList(d):
19     l = []
20     if d is None or d == "":
21         return l
22     try:
23         for f in os.listdir(d):
24             if f.startswith("enigma2_crash_") and f.endswith(".log"):
25                 print "[CrashReport] found : ", os.path.basename(f)
26                 l.append(d + '/' + f)
27     except:
28         pass
29     return l
30
31 def sendEmail(F, T, M, S="", FL=[]):
32     def cbError(e):
33         print "[CrashReport] Error >> \n", e.getErrorMessage()
34         reactor.stop()
35
36     def cbSuccess(r):
37         print "[CrashReport] Success >> after action : [%s], success message : [%s]" % (g_config_after_file_status, r)
38         global g_config_after_file_status
39         for f in FL:
40             if f.startswith("/tmp/"):
41                 continue
42             if g_config_after_file_status == "rename":
43                 n = "%s/%s.summited" % (os.path.dirname(f), os.path.basename(f))
44                 print "[CrashReport] rename : [%s] to [%s]" % (f,n)
45                 os.rename(f, n)
46             elif g_config_after_file_status == "delete":
47                 print "[CrashReport] remove : [%s]" % (f)
48                 os.remove(f)
49         reactor.stop()
50
51     def cbSend(H):
52         context = MIMEMultipart('alternative')
53         context['From']    = F
54         context['To']      = T
55         context['Subject'] = S
56         #context['Date']    = smtp.rfc822date()
57         context['MIME-Version'] = '1.0'
58         context.attach(MIMEText(M, 'plain'))
59
60         for f in FL:
61             ctype, encoding = mimetypes.guess_type(f)
62             if ctype is None or encoding is not None:
63                 ctype = 'application/octet-stream'
64             maintype, subtype = ctype.split('/', 1)
65
66             tmp = MIMEBase(maintype, subtype)
67             tmp.set_payload(file(f).read())
68             Encoders.encode_base64(tmp)
69     
70             tmp.add_header("Content-Transfer-Encoding", 'base64')
71             tmp.add_header('Content-Disposition', 'attachment', filename=os.path.basename(f))
72             tmp.add_header('Content-Description', 'vuplus crashlog')
73             context.attach(tmp)
74
75         print "[CrashReport] host:[%s], from:[%s], to:[%s]" % (H, F, T)
76         sending = smtp.sendmail(str(H), F, T, context.as_string())
77         sending.addCallback(cbSuccess).addErrback(cbError)
78     return getMailExchange(T.split("@")[1]).addCallback(cbSend)
79
80 def doSummit(summitTo, summitFrom, summitName, afterFileStatus="rename"):
81     fileList = getLogList('/media/hdd')
82     if len(fileList) == 0:
83         return
84
85     fileListLen = len(fileList)
86     if os.path.exists("/tmp/machine.info"):
87         fileList.append("/tmp/machine.info")
88
89     global g_config_after_file_status
90     g_config_after_file_status = afterFileStatus
91     summitText  = "There are %d crash logs found for you.\n" % (fileListLen)
92     if summitName is not None or summitName != "":
93         summitText += "\nSubmitter : %s (%s)\n" % (summitName, summitFrom)
94     summitText += "\nThis is an automatically generated email from the CrashlogReport-Plugin.\nGood luck.\n"
95     summitSubject = "Submit automatically generated crashlog."
96     sendEmail(summitFrom, summitTo, summitText, summitSubject, fileList)
97     reactor.run()
98
99 import sys
100 print "[CrashReport] argvs : ", sys.argv
101 if len(sys.argv) == 4:
102         doSummit(summitTo='vuplus@code.vuplus.com', summitFrom=sys.argv[1], summitName=sys.argv[2], afterFileStatus=sys.argv[3])
103