]> TLD Linux GIT Repositories - tld-builder.git/blob - TLD_Builder/mailer.py
7725a60710f76576f3fff2b1022c2b0004c1a012
[tld-builder.git] / TLD_Builder / mailer.py
1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
2
3 import time
4 import os
5 import sys
6 if sys.version_info[0] == 2:
7     import StringIO
8 else:
9     from io import StringIO
10
11 from config import config
12 import util
13 import log
14
15 def recode(s):
16     if s.__class__ == ''.__class__:
17         return s.encode('iso-8859-1', 'replace').decode('us-ascii', 'replace')
18     else:
19         return s.decode('us-ascii', 'replace')
20
21 class Message:
22     def __init__(self):
23         self.headers = {}
24         self.body = StringIO()
25         self.set_std_headers()
26
27     def set_header(self, n, v):
28         self.headers[n] = v
29
30     def set_headers(self, to = None, cc = None, subject = None):
31         if to != None:
32             self.set_header("To", to)
33         if cc != None:
34             self.set_header("Cc", cc)
35         if subject != None:
36             self.set_header("Subject", subject)
37
38     def remove_header(self, n):
39         if n in self.headers:
40             del self.headers[n]
41
42     def write_line(self, l):
43         self.body.write(recode("%s\n" % l))
44
45     def write(self, s):
46         self.body.write(recode(s))
47
48     def append_log(self, log):
49         s = os.stat(log)
50         if s.st_size > 50000:
51             # just head and tail
52             f = open(log)
53             line_cnt = 0
54             for l in f:
55                 line_cnt += 1
56             f.seek(0)
57             line = 0
58             for l in f:
59                 if line < 100 or line > line_cnt - 100:
60                     self.body.write(recode(l))
61                 if line == line_cnt - 100:
62                     self.body.write("\n\n[...]\n\n")
63                 line += 1
64         else:
65             util.sendfile(open(log), self.body)
66
67     def set_std_headers(self):
68         self.headers["Date"] = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
69         self.headers["Message-ID"] = "<tld-builder.%f.%d@%s>" \
70                 % (time.time(), os.getpid(), os.uname()[1])
71         self.headers["From"] = "TLD %s builder <%s>" \
72                 % (config.builder, config.email)
73         self.headers["X-TLD-Builder"] = config.builder
74
75     def write_to(self, f):
76         for k, v in self.headers.items():
77             f.write("%s: %s\n" % (k, v))
78         f.write("\n")
79         self.body.seek(0)
80         util.sendfile(self.body, f)
81
82     def send(self):
83         if not os.path.exists("/usr/lib/sendmail"):
84             # TODO: dump to file?
85             log.alert("/usr/lib/sendmail doesn't exist: Can't send email")
86             return False
87         send_sendmail = "/usr/lib/sendmail -i -t -f %s" % config.admin_email
88         f = os.popen(send_sendmail, "w")
89         try:
90             self.write_to(f)
91         except IOError as e:
92             log.alert("sending email message failed: %s" % e)
93             f.close()
94             return False
95         return f.close()