1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 __doc__='''zenpop3
18
19 Turn email messages into events.
20
21 $Id$
22 '''
23
24 import Globals
25
26 from Products.ZenEvents.EventServer import EventServer
27 from Products.ZenEvents.MailProcessor import POPProcessor
28
29 from twisted.mail.pop3client import POP3Client
30 from twisted.internet import reactor, protocol, defer, error
31
32 import logging
33 log = logging.getLogger("zen.pop3")
34
35
37 ''' protocol that is responsible for conversing with a pop server
38 after a connection has been established. downloads messages (and
39 deletes them by default), and passes the messages back up to the
40 factory to process (and turn into events)'''
41
42 allowInsecureLogin = True
43 timeout = 15
44
52
53
57
58
64
65
67 log.info('messages to retrieve: %d' % len(sizes))
68
69 self.sizes = sizes
70
71 retreivers = []
72 for i in range(len(sizes)):
73 log.info('retrieving message #%d...' % i)
74 d = self.retrieve(i)
75 d.addCallback(self._gotMessageLines)
76 retreivers.append(d)
77
78 deferreds = defer.DeferredList(retreivers)
79 deferreds.addCallback(self._delete)
80 return deferreds.addCallback(self.scanComplete)
81
82
86
87
89 deleters = []
90 if not self.factory.nodelete:
91 for index in range(len(self.sizes)):
92 log.info('deleting message #%d...' % index)
93 d = self.delete(index)
94 deleters.append(d)
95
96 deferreds = defer.DeferredList(deleters)
97 return deferreds
98
99
101 log.info("scan complete")
102 self.quit()
103
104
106 """ factory that stores the configuration the protocol uses to do it's
107 job."""
108
109 protocol = POPProtocol
110
111 - def __init__(self, user, passwd, processor, nodelete):
112 self.user = user
113 self.passwd = passwd
114 self.processor = processor
115 self.deferred = defer.Deferred()
116 self.nodelete = nodelete
117
118
120 self.processor.process(messageData)
121
122
125
126
128 name = 'zenpop3'
129
140
141
146
147
150
151
165
166
168 if err.type == error.TimeoutError:
169 log.error("Timed out connecting to %s:%d",
170 self.options.pophost, self.options.popport)
171 elif err.type == error.ConnectionRefusedError:
172 log.error("Connection refused by %s:%d",
173 self.options.pophost, self.options.popport)
174 elif err.type == error.ConnectError:
175 log.error("Connection failed to %s:%d",
176 self.options.pophost, self.options.popport)
177 else:
178 log.error(err.getErrorMessage())
179 self.stop()
180
181 self.makeFactory()
182
183
185 EventServer.buildOptions(self)
186 self.parser.add_option('--usessl',
187 dest='usessl',
188 default=False,
189 action="store_true",
190 help="Use SSL when connecting to POP server")
191 self.parser.add_option('--nodelete',
192 dest='nodelete',
193 default=False,
194 action="store_true",
195 help="Leave messages on POP server")
196 self.parser.add_option('--pophost',
197 dest='pophost',
198 default="pop.zenoss.com",
199 help="POP server to auth against")
200 self.parser.add_option('--popport',
201 dest='popport',
202 default="110",
203 type="int",
204 help="POP port to auth against")
205 self.parser.add_option('--popuser',
206 dest='popuser',
207 default="zenoss",
208 help="POP user to auth using")
209 self.parser.add_option('--poppass',
210 dest='poppass',
211 default="zenoss",
212 help="POP password to auth using")
213 self.parser.add_option('--cycletime',
214 dest='cycletime',
215 type="int",
216 default=60,
217 help="Frequency (in secs) to poll POP server")
218 self.parser.add_option('--eventseverity',
219 dest='eventseverity',
220 default="2",
221 type="int",
222 help="Severity for events created")
223
224
225
226 if __name__ == '__main__':
227 ZenPOP3().run()
228