Пример #1
0
    def evaluate_trigger(self, trigger):
        """Evaluate Trigger."""
        item = trigger.item

        alert_klass = ALERT_CLASS.get(item.itemtype.name)

        i = trigger.validate_rule(trigger.rule)
        if i is None:
            return False

        handler = trigger.trigger_handlers.get(i[0], None)

        if handler:
            alert = self.db_session.query(alert_klass)\
                .filter(alert_klass.trigger_id == trigger.id)\
                .filter(alert_klass.end_time.is_(None)).first()

            (is_active, time) = handler(trigger, self.db_session, i[1], i[2], i[3])

            if is_active:
                if not alert:
                    trigger.active_alert = True
                    alert = alert_klass(trigger_id=trigger.id,
                                        start_time=time,
                                        end_time=None)
                    self.db_session.add(alert)
            else:
                if alert:
                    trigger.active_alert = False
                    alert.end_time = time
        else:
            print("Handler not found")
            return False
Пример #2
0
    def evaluate_trigger(self, trigger):
        """Evaluate Trigger."""
        item = trigger.item

        alert_klass = ALERT_CLASS.get(item.itemtype.name)

        i = trigger.validate_rule(trigger.rule)
        if i is None:
            return False

        handler = trigger.trigger_handlers.get(i[0], None)

        if handler:
            alert = self.db_session.query(alert_klass)\
                .filter(alert_klass.trigger_id == trigger.id)\
                .filter(alert_klass.end_time.is_(None)).first()

            (is_active, time) = handler(trigger, self.db_session, i[1], i[2],
                                        i[3])

            if is_active:
                if not alert:
                    trigger.active_alert = True
                    alert = alert_klass(trigger_id=trigger.id,
                                        start_time=time,
                                        end_time=None)
                    self.db_session.add(alert)
            else:
                if alert:
                    trigger.active_alert = False
                    alert.end_time = time
        else:
            print("Handler not found")
            return False
Пример #3
0
    def get_active_alert_count(self, item):
        """Get number of active alerts."""
        alert_klass = ALERT_CLASS.get(item.itemtype.name)
        triggers = self.get_triggers(item)

        n_alerts = 0

        for trigger in triggers:
            n_alerts += self.db_session.query(alert_klass)\
                .filter(alert_klass.trigger_id == trigger.id)\
                .filter(alert_klass.end_time.is_(None))\
                .count()

        return n_alerts
Пример #4
0
    def get_alerts(self, item, active=True, inactive=False):
        """Query Alerts."""
        alert_klass = ALERT_CLASS.get(item.itemtype.name)
        alerts = []
        triggers = self.get_triggers(item)

        for trigger in triggers:
            active_alert = self.db_session.query(alert_klass)\
                .filter(alert_klass.trigger_id == trigger.id)\
                .filter(alert_klass.end_time.is_(None))

            alerts.extend(active_alert)

        return alerts
Пример #5
0
    def get_last_alert_for_trigger(self, trigger):
        """Return last alert for a trigger.

        This function is used for every trigger individually...
        It makes more sense if we could query it for all triggers at once.
        """
        alert_klass = ALERT_CLASS.get(trigger.item.itemtype.name)

        alert = self.db_session.query(alert_klass)\
            .filter(alert_klass.trigger_id == trigger.id)\
            .order_by(alert_klass.start_time.desc())\
            .first()

        return alert
Пример #6
0
    def get_last_alert_for_trigger(self, trigger):
        """Return last alert for a trigger.

        This function is used for every trigger individually...
        It makes more sense if we could query it for all triggers at once.
        """
        alert_klass = ALERT_CLASS.get(trigger.item.itemtype.name)

        alert = self.db_session.query(alert_klass)\
            .filter(alert_klass.trigger_id == trigger.id)\
            .order_by(alert_klass.start_time.desc())\
            .first()

        return alert
Пример #7
0
    def get_active_alert_count(self, item):
        """Get number of active alerts."""
        alert_klass = ALERT_CLASS.get(item.itemtype.name)
        triggers = self.get_triggers(item)

        n_alerts = 0

        for trigger in triggers:
            n_alerts += self.db_session.query(alert_klass)\
                .filter(alert_klass.trigger_id == trigger.id)\
                .filter(alert_klass.end_time.is_(None))\
                .count()

        return n_alerts
Пример #8
0
    def get_alerts(self, item, active=True, inactive=False):
        """Query Alerts."""
        alert_klass = ALERT_CLASS.get(item.itemtype.name)
        alerts = []
        triggers = self.get_triggers(item)

        for trigger in triggers:
            active_alert = self.db_session.query(alert_klass)\
                .filter(alert_klass.trigger_id == trigger.id)\
                .filter(alert_klass.end_time.is_(None))

            alerts.extend(active_alert)

        return alerts
Пример #9
0
    def get_host_severity(self, host):
        """Return highest severity of active triggers for this host."""
        float_trigger_klass = TRIGGER_CLASS.get('float')
        float_alert_klass = ALERT_CLASS.get('float')

        severity = self.db_session.query(TriggerSeverity)\
            .filter(TriggerSeverity.id.in_(
                self.db_session.query(float_trigger_klass.severity_id)\
                .filter(float_trigger_klass.item_id.in_(
                    self.db_session.query(Item.id)\
                    .filter(Item.host_id == host.id)
                ))\
                .filter(float_trigger_klass.id.in_(
                    self.db_session.query(float_alert_klass.trigger_id)\
                    .filter(float_alert_klass.end_time.is_(None))
                ))
            ))\
            .order_by(TriggerSeverity.level.desc())\
            .first()

        return severity
Пример #10
0
    def get_host_severity(self, host):
        """Return highest severity of active triggers for this host."""
        float_trigger_klass = TRIGGER_CLASS.get('float')
        float_alert_klass = ALERT_CLASS.get('float')

        severity = self.db_session.query(TriggerSeverity)\
            .filter(TriggerSeverity.id.in_(
                self.db_session.query(float_trigger_klass.severity_id)\
                .filter(float_trigger_klass.item_id.in_(
                    self.db_session.query(Item.id)\
                    .filter(Item.host_id == host.id)
                ))\
                .filter(float_trigger_klass.id.in_(
                    self.db_session.query(float_alert_klass.trigger_id)\
                    .filter(float_alert_klass.end_time.is_(None))
                ))
            ))\
            .order_by(TriggerSeverity.level.desc())\
            .first()

        return severity
Пример #11
0
    def get_host_severity(self, host):
        """Return highest severity of active triggers for this host.

        This should be optimized... running x queries for each individual
        host that needs it is very slow. - Want to use UNION, but
        I couldn't get it working with SQLAlchemy.
        """

        existing_query = None
        max_severity_level = -1
        max_severity = None

        for key in TRIGGER_CLASS:
            trigger_klass = TRIGGER_CLASS.get(key)
            alert_klass = ALERT_CLASS.get(key)

            severity = self.db_session.query(TriggerSeverity)\
                .filter(TriggerSeverity.id.in_(
                    self.db_session.query(trigger_klass.severity_id)\
                    .filter(trigger_klass.item_id.in_(
                        self.db_session.query(Item.id)
                        .filter(Item.host_id == host.id)
                    ))\
                    .filter(trigger_klass.id.in_(
                        self.db_session.query(alert_klass.trigger_id)
                        .filter(alert_klass.end_time.is_(None))
                    ))
                ))\
                .order_by(TriggerSeverity.level.desc())\
                .first()
            if severity is not None:
                if severity.level > max_severity_level:
                    max_severity_level = severity.level
                    max_severity = severity

        return max_severity