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
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