1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 __doc__ = """zenpop3
18
19 Turn email messages obtained from POP3 accounts into events.
20
21 """
22
23 import logging
24 import socket
25
26 import Globals
27 import zope.interface
28
29 from twisted.mail.pop3client import POP3Client
30 from twisted.internet.ssl import ClientContextFactory
31 from twisted.internet import reactor, protocol, defer, error
32
33 from Products.ZenCollector.daemon import CollectorDaemon
34 from Products.ZenCollector.interfaces import ICollector, ICollectorPreferences,\
35 IEventService, \
36 IScheduledTask
37 from Products.ZenCollector.tasks import NullTaskSplitter,\
38 BaseTask, TaskStates
39
40 from Products.ZenEvents.MailProcessor import POPProcessor
41
42
43 COLLECTOR_NAME = 'zenpop3'
44 log = logging.getLogger("zen.%s" % COLLECTOR_NAME)
45
46
48 zope.interface.implements(ICollectorPreferences)
49
68
72
74 """
75 Command-line options to be supported
76 """
77 POP3_PORT = 110
78 try:
79 POP3_PORT = socket.getservbyname('pop3', 'tcp')
80 except socket.error:
81 pass
82
83 parser.add_option('--usessl',
84 dest='usessl',
85 default=False,
86 action="store_true",
87 help="Use SSL when connecting to POP server")
88 parser.add_option('--nodelete',
89 dest='nodelete',
90 default=False,
91 action="store_true",
92 help="Leave messages on POP server")
93 parser.add_option('--pophost',
94 dest='pophost',
95 default="pop.zenoss.com",
96 help="POP server from which emails are to be read")
97 parser.add_option('--popport',
98 dest='popport',
99 default=POP3_PORT,
100 type="int",
101 help="POP port from which emails are to be read")
102 parser.add_option('--popuser',
103 dest='popuser',
104 default="zenoss",
105 help="POP user")
106 parser.add_option('--poppass',
107 dest='poppass',
108 default="zenoss",
109 help="POP password")
110 parser.add_option('--cycletime',
111 dest='cycletime',
112 type="int",
113 default=60,
114 help="Frequency (in seconds) to poll the POP server")
115 parser.add_option('--eventseverity',
116 dest='eventseverity',
117 default="2",
118 type="int",
119 help="Severity for events created")
120
121 - def postStartup(self):
123
124
126 """
127 Protocol that is responsible for conversing with a POP server
128 after a connection has been established. Downloads messages (and
129 deletes them by default), and passes the messages back up to the
130 factory to process and turn into events.
131 """
132
133 allowInsecureLogin = True
134 timeout = 15
135 totalMessages = 0
136
143
147
149 d = self.listSize()
150 d.addCallback(self._gotMessageSizes)
151
152 return d
153
155 self.totalMessages = len(sizes)
156 log.info('Messages to retrieve: %d', self.totalMessages)
157
158 self.sizes = sizes
159
160 retreivers = []
161 for i in range(len(sizes)):
162 log.debug('Retrieving message #%d...' % i)
163 d = self.retrieve(i)
164 d.addCallback(self._gotMessageLines)
165 retreivers.append(d)
166
167 deferreds = defer.DeferredList(retreivers)
168 deferreds.addCallback(self._delete)
169 return deferreds.addCallback(self.scanComplete)
170
174
176 deleters = []
177 if not self.factory.nodelete:
178 for index in range(len(self.sizes)):
179 log.info('Deleting message #%d...' % index)
180 d = self.delete(index)
181 deleters.append(d)
182
183 deferreds = defer.DeferredList(deleters)
184 return deferreds
185
187 log.debug("Scan complete")
188 self.quit()
189
190
192 """
193 Factory that stores the configuration the protocol uses to do
194 its job.
195 """
196 protocol = POPProtocol
197
198 - def __init__(self, user, passwd, processor, nodelete):
199 self.user = user
200 self.passwd = passwd
201 self.processor = processor
202 self.deferred = defer.Deferred()
203 self.nodelete = nodelete
204
206 self.processor.process(messageData)
207
210
211
213 zope.interface.implements(IScheduledTask)
214
215 STATE_COLLECTING = 'COLLECTING'
216
217 - def __init__(self, taskName, configId,
218 scheduleIntervalSeconds=60, taskConfig=None):
219 BaseTask.__init__(self, taskName, configId,
220 scheduleIntervalSeconds, taskConfig)
221 self.log = log
222
223
224 self.name = taskName
225 self.configId = configId
226 self.state = TaskStates.STATE_IDLE
227 self._preferences = taskConfig
228 self._daemon = zope.component.getUtility(ICollector)
229 self._eventService = zope.component.queryUtility(IEventService)
230 self._preferences = self._daemon
231
232 self.options = self._daemon.options
233
234
235 self.interval = self.options.cycletime
236
237
238 self.sendEvent = self._eventService.sendEvent
239
240 self._daemon.changeUser()
241 self.processor = POPProcessor(self,self.options.eventseverity)
242 self._connection = None
243
247
252
269
278
306
309
310
311 if __name__=='__main__':
312 myPreferences = MailPreferences()
313 myTaskSplitter = NullTaskSplitter()
314 daemon = CollectorDaemon(myPreferences, myTaskSplitter)
315 daemon.run()
316