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