def run(self): sender = self.destination.get_sender() if self.is_error: level = AlertLevels.ERROR message_context = Source.error_context(self.event.context) else: level = None # set via options or Sender message_context = Source.message_context(self.event.context, self.event.trigger_result) message = self.destination.get_message(message_context) options = self.destination.options if options: level = AlertLevels.find(options.get('level', None)) alert = Alert(event=self.event, level=level or sender.level, sender=self.destination.sender, message=message, options=options) # need to save to get datetime assigned alert.save() logger.debug('Sending Alert %s via Destination %s' % (alert, self.destination)) try: sender.send(alert) except: logger.exception("An error occurred while sending alert %s" " via Destination %s" % (alert, self.destination))
def setup_snmp_trap(self, alert): oid = self.eoid # cascade enterprise Object ID trapid = self.trapid # base string for trap indicators self.trapname = '.'.join([oid, trapid]) severity = self.severity description = alert.message or self.default_description alert_level = AlertLevels.get_integer(self.level) now = timeutils.datetime_to_seconds(alert.timestamp) self.binds = ( ('1.3.6.1.2.1.1.3.0', rfc1902.Integer(0)), # Uptime ('1.3.6.1.4.1.7054.71.2.1.0', rfc1902.Integer(severity)), # Severity ('1.3.6.1.4.1.7054.71.2.3.0', rfc1902.OctetString(description)), ('1.3.6.1.4.1.7054.71.2.4.0', rfc1902.Integer(0)), # Event ID ('1.3.6.1.4.1.7054.71.2.5.0', rfc1902.OctetString(self.trap_url)), ('1.3.6.1.4.1.7054.71.2.7.0', rfc1902.Integer(alert_level)), # Alert Level ('1.3.6.1.4.1.7054.71.2.8.0', rfc1902.Integer(now)), # Start Time ('1.3.6.1.4.1.7054.71.2.16.0', rfc1902.Integer(0)), # Source Count ('1.3.6.1.4.1.7054.71.2.18.0', rfc1902.Integer(0)), # Destination Count ('1.3.6.1.4.1.7054.71.2.20.0', rfc1902.Integer(0)), # Protocol Count ('1.3.6.1.4.1.7054.71.2.22.0', rfc1902.Integer(0)), # Port Count )
class Alert(models.Model): """Individual notification sent by a Sender for a specific Event.""" timestamp = models.DateTimeField(auto_now=True) event = models.ForeignKey('Event', related_name='alerts') level = models.CharField(max_length=50, choices=AlertLevels.get_choices()) sender = models.CharField(max_length=100) options = PickledObjectField(blank=True, null=True) message = models.TextField() def __unicode__(self): msg = self.message if len(msg) > 20: msg = '%s...' % msg[:20] return '<Alert %s (%s/%s)>' % (self.id or 'X', self.sender, msg) def __repr__(self): return unicode(self) def get_details(self): """Return details in a string""" msg = [] fmt = '{0:15}: {1}' msg.append(fmt.format('ID', self.id)) msg.append(fmt.format('EventID', self.event.eventid)) msg.append(fmt.format('Timestamp', self.timestamp)) msg.append(fmt.format('Level', self.level)) msg.append(fmt.format('Sender', self.sender)) msg.append(fmt.format('Dest options', self.options)) msg.append(fmt.format('Message', self.message)) return '\n'.join(msg)
def run(self): sender = self.destination.get_sender() logger.debug('XXX here - event/sender: %s/%s' % (self.event, sender)) if self.is_error: level = AlertLevels.ERROR message_context = Source.error_context(self.event.context) else: level = None # set via options or Sender message_context = Source.message_context(self.event.context, self.event.trigger_result) message = self.destination.get_message(message_context) options = self.destination.options logger.debug('XXX here - message/options: %s/%s' % (message, options)) if options: level = AlertLevels.find(options.get('level', None)) try: alert = Alert(event=self.event, level=level or sender.level, sender=self.destination.sender, message=message, options=options) # need to save to get datetime assigned alert.save() logger.debug('Sending Alert %s via Destination %s' % (alert, self.destination)) except Exception as e: logger.error('Error saving Alert: %s' % e) try: # even if we had an error saving, may be able to still send alert sender.send(alert) except: logger.exception("An error occurred while sending alert %s" " via Destination %s" % (alert, self.destination))