Пример #1
0
    def __init__(self, when, message, tags=None, id=None):
        """
        Конструктор.

        @param when: дата/время записи в логе, UTC
        @type when: C{int}
        @param message: само сообщение
        @type message: L{IMessage} или L{ITaggedMessage} или L{TransitMessage}
        @param tags: тэги, привзяанные к сообщению
        @type tags: C{list(str)}
        """
        if when is None:
            when = time()
        self.when = when
        if tags is None:
            tags = []
        self.tags = tags
        if IMessage.providedBy(message):
            if ITaggedMessage.providedBy(message):
                self.tags.extend(message.getTags())
            message = TransitMessage(message=message)
        self.message = message
        self.id = id
Пример #2
0
    def analyze(self, message, domain, debug=False, logCallback=None):
        """
        Анализировать входящие сообщение и вернуть результат анализа.

        @param message: анализируемое сообщение
        @type message: L{IMessage}
        @param domain: текущий домен
        @type domain: L{IDomain}
        @return: результат анализа
        @rtype: C{twisted.internet.defer.Deferred}
        @param debug: включить отладочный режим?
        @type debug: C{bool}
        @param logCallback: функция, которая получит лог прохождения сообщения
                            через firewall в отладочном режиме, прототип функции:
                            С{logCallback(log)}
        """
        if not ITaggedMessage.providedBy(message):
            message = TaggedMessage(message=message)
        pack = FirewallMessagePack(message, domain)
        d = defer.succeed(pack)
        for statement in self.compiled:
            statement.compile(d, debug)
        d.addCallback(lambda _: 'UNKNOWN') # если ни одно правило не завершилось stop as, считаем результат неизвестным
        
        def processStop(failure):
            """
            Обрабатываем обычный случай завершения обработки через stop as..
            """         
            failure.trap(FirewallResult)
            return failure.value.result
        d.addErrback(processStop)

        def processSkipThrough(failure):
            """
            Обрабатываем ситуацию, когда для skip to.. не нашлось метки.
            """
            failure.trap(SkipToProcess)
            raise errors.SkipToFallthroughError(failure.value.label)
        d.addErrback(processSkipThrough)

        def handleDomainKeyError(failure):
            """
            Обрабатываем отсутствующий ключ в домене, на который "напоролось" правило.
            """
            failure.trap(DomainKeyError)
            raise errors.AttributeKeyException, failure.value.args[0]
        d.addErrback(handleDomainKeyError)


        def handleAttributeKeyError(failure):
            """
            Обрабатываем исключение об отсутствии атрибута у сообщения.
            """
            failure.trap(AttributeNotFoundError)
            raise errors.MessageAttributeKeyException, failure.value.args[0]
        d.addErrback(handleAttributeKeyError)
        
        if debug:
            def returnLog(res):
                logCallback(pack.getLog())
                return res

            d.addBoth(returnLog)

        return d