Package ZenEvents :: Module zenmail
[hide private]
[frames] | no frames]

Source Code for Module ZenEvents.zenmail

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, Zenoss Inc. 
  5  # 
  6  # This program is free software; you can redistribute it and/or modify it 
  7  # under the terms of the GNU General Public License version 2 as published by 
  8  # the Free Software Foundation. 
  9  # 
 10  # For complete information please visit: http://www.zenoss.com/oss/ 
 11  # 
 12  ########################################################################### 
 13  # Notes: database wants events in UTC time 
 14  # Events page shows local time, as determined on the server where zenoss runs 
 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
72 -class ZenossDelivery(object):
73 implements(smtp.IMessageDelivery) 74
75 - def __init__(self, processor):
76 self.processor = processor
77 78
79 - def receivedHeader(self, helo, unused, ignored):
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
92 - def validateTo(self, user):
93 log.info('to: %s' % user.dest) 94 return self.makePoster
95 96
97 - def makePoster(self):
98 return ZenossEventPoster(self.processor)
99 100
101 - def validateFrom(self, unused, originAddress):
102 log.info("from: %s" % originAddress) 103 return originAddress
104 105
106 -class SMTPFactory(protocol.ServerFactory):
107 - def __init__(self, processor):
108 self.processor = processor
109
110 - def buildProtocol(self, unused):
111 delivery = ZenossDelivery(self.processor) 112 smtpProtocol = smtp.SMTP(delivery) 113 smtpProtocol.factory = self 114 return smtpProtocol
115 116
117 -class ZenMail(EventServer):
118 name = 'zenmail' 119
120 - def __init__(self):
121 EventServer.__init__(self) 122 if (self.options.useFileDescriptor < 0 and \ 123 self.options.listenPort < 1024): 124 self.openPrivilegedPort('--listen', 125 '--proto=tcp', 126 '--port=%d' % self.options.listenPort) 127 128 self.changeUser() 129 self.processor = MailProcessor(self, self.options.eventseverity) 130 131 self.factory = SMTPFactory(self.processor) 132 133 if self.options.useFileDescriptor != -1: 134 self.useTcpFileDescriptor(int(self.options.useFileDescriptor), 135 self.factory) 136 else: 137 log.info("listening on port: %d" % self.options.listenPort) 138 reactor.listenTCP(self.options.listenPort, self.factory)
139 140
141 - def handleError(self, error):
142 log.error(error) 143 log.error(error.getErrorMessage()) 144 145 self.finish()
146 147
148 - def _finish(self):
149 self.finish()
150 151
152 - def buildOptions(self):
153 EventServer.buildOptions(self) 154 self.parser.add_option('--useFileDescriptor', 155 dest='useFileDescriptor', 156 default=-1, 157 type="int", 158 help="File descriptor to use for listening") 159 self.parser.add_option('--listenPort', 160 dest='listenPort', 161 default="25", 162 type="int", 163 help="Alternative listen port to use") 164 self.parser.add_option('--eventseverity', 165 dest='eventseverity', 166 default="2", 167 type="int", 168 help="Severity for events created")
169 170 171 if __name__ == '__main__': 172 ZenMail().run() 173