Analisando Snort Logs com PyParsing

Problema ao analisar os logs do Snort usando o módulo pyparsing.

O problema é separar o log do Snort (que possui entradas de várias linhas, separadas por uma linha em branco) e obter pyparsing para analisar cada entrada como um pedaço inteiro, em vez de ler linha por linha e esperar que a gramática funcione com cada linha (obviamente , isso não.)

Tentei converter cada pedaço em uma sequência temporária, removendo as novas linhas dentro de cada pedaço, mas ele se recusa a processar corretamente. Posso estar totalmente no caminho errado, mas acho que não (um formulário semelhante funciona perfeitamente para logs do tipo syslog, mas essas são entradas de uma linha e, portanto, se prestam ao iterador de arquivo / processamento de linha básico)

Aqui está uma amostra do log e do código que tenho até agora:

[**] [1:486:4] ICMP Destination Unreachable Communication with Destination Host is Administratively Prohibited [**]
[Classification: Misc activity] [Priority: 3] 
08/03-07:30:02.233350 172.143.241.86 -> 63.44.2.33
ICMP TTL:61 TOS:0xC0 ID:49461 IpLen:20 DgmLen:88
Type:3  Code:10  DESTINATION UNREACHABLE: ADMINISTRATIVELY PROHIBITED HOST FILTERED
** ORIGINAL DATAGRAM DUMP:
63.44.2.33:41235 -> 172.143.241.86:4949
TCP TTL:61 TOS:0x0 ID:36212 IpLen:20 DgmLen:60 DF
Seq: 0xF74E606
(32 more bytes of original packet)
** END OF DUMP

[**] ...more like this [**]

E o código atualizado:

def snort_parse(logfile):
    header = Suppress("[**] [") + Combine(integer + ":" + integer + ":" + integer) + Suppress("]") + Regex(".*") + Suppress("[**]")
    cls = Optional(Suppress("[Classification:") + Regex(".*") + Suppress("]"))
    pri = Suppress("[Priority:") + integer + Suppress("]")
    date = integer + "/" + integer + "-" + integer + ":" + integer + "." + Suppress(integer)
    src_ip = ip_addr + Suppress("->")
    dest_ip = ip_addr
    extra = Regex(".*")

    bnf = header + cls + pri + date + src_ip + dest_ip + extra

    def logreader(logfile):
        chunk = []
        with open(logfile) as snort_logfile:
            for line in snort_logfile:
                if line !='\n':
                    line = line[:-1]
                    chunk.append(line)
                    continue
                else:
                    print chunk
                    yield " ".join(chunk)
                    chunk = []

    string_to_parse = "".join(logreader(logfile).next())
    fields = bnf.parseString(string_to_parse)
    print fields

Qualquer ajuda, ponteiros, RTFMs, você está fazendo errado, etc., é muito apreciada.

questionAnswers(3)

yourAnswerToTheQuestion