1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 __doc__='''zenmail
17
18 Turn email messages into events.
19
20 '''
21
22 from EventServer import EventServer
23
24 from twisted.mail import smtp
25 from twisted.internet import reactor, protocol, defer
26 from zope.interface import implements
27
28 from email.Header import Header
29 import email
30
31 from MailProcessor import MailProcessor
32
33 import logging
34 log = logging.getLogger("zen.mail")
35
36
37 -class ZenossEventPoster(object):
38 implements(smtp.IMessage)
39
40 - def __init__(self, processor):
41 self.lines = []
42 self.processor = processor
43
44
45 - def lineReceived(self, line):
46 self.lines.append(line)
47
48
49 - def postEvent(self, messageStr):
50 email.message_from_string(messageStr)
51 self.processor.process(messageStr)
52
53
54 - def eomReceived(self):
55 log.info('message data completed.')
56 self.lines.append('')
57 messageData = '\n'.join(self.lines)
58
59 self.postEvent(messageData)
60
61 if True:
62 return defer.succeed(None)
63 else:
64 return defer.failure(None)
65
66
67 - def connectionLost(self):
68 log.info('connection lost unexpectedly')
69 del(self.lines)
70
71
73 implements(smtp.IMessageDelivery)
74
76 self.processor = processor
77
78
80 myHostname, self.clientIP = helo
81 date = smtp.rfc822date()
82
83 headerValue = 'by %s from %s with ESMTP ; %s' % (
84 myHostname, self.clientIP, date)
85
86 log.info('relayed (or sent directly) from: %s' % self.clientIP)
87
88 header = 'Received: %s' % Header(headerValue)
89 return header
90
91
95
96
97 - def makePoster(self):
98 return ZenossEventPoster(self.processor)
99
100
102 log.info("from: %s" % originAddress)
103 return originAddress
104
105
108 self.processor = processor
109
111 delivery = ZenossDelivery(self.processor)
112 smtpProtocol = smtp.SMTP(delivery)
113 smtpProtocol.factory = self
114 return smtpProtocol
115
116
118 name = 'zenmail'
119
121 EventServer.__init__(self)
122 if (self.options.useFileDescriptor < 0 and \
123 self.options.listenPort < 1024):
124 self.openPrivilegedPort('--listen',
125 '--proto=tcp', '--port=%s:%d' % (
126 self.options.listenip, self.options.listenPort))
127
128 self.changeUser()
129 self.processor = MailProcessor(self, self.options.eventseverity)
130
131 self.factory = SMTPFactory(self.processor)
132
133 log.info("listening on %s:%d" % (
134 self.options.listenip, self.options.listenPort))
135 if self.options.useFileDescriptor != -1:
136 self.useTcpFileDescriptor(int(self.options.useFileDescriptor),
137 self.factory)
138 else:
139 reactor.listenTCP(self.options.listenPort, self.factory,
140 interface=self.options.listenip)
141
142
148
149
152
153
155 EventServer.buildOptions(self)
156 self.parser.add_option('--useFileDescriptor',
157 dest='useFileDescriptor',
158 default=-1,
159 type="int",
160 help="File descriptor to use for listening")
161 self.parser.add_option('--listenPort',
162 dest='listenPort',
163 default="25",
164 type="int",
165 help="Alternative listen port to use")
166 self.parser.add_option('--eventseverity',
167 dest='eventseverity',
168 default="2",
169 type="int",
170 help="Severity for events created")
171 self.parser.add_option('--listenip',
172 dest='listenip',
173 default='0.0.0.0',
174 help='IP address to listen on. Default is 0.0.0.0')
175
176
177 if __name__ == '__main__':
178 ZenMail().run()
179