Проблема с разбором журналов Snort с использованием модуля pyparsing.Синхронизация журналов Snort с PyParsing
Проблема состоит в том, чтобы отделить журнал Snort (который содержит многострочные записи, разделенные пустой строкой) и получать пираринг для синтаксического анализа каждой записи как целого фрагмента, а не читать строки за строкой и ожидать, что грамматика будет работать с в каждой строке (очевидно, это не так).
Я попытался преобразовать каждый фрагмент в временную строку, удалив строки новой строки внутри каждого фрагмента, но он отказывается обрабатывать правильно. Возможно, я полностью ошибаюсь, но я так не думаю (аналогичная форма отлично работает для журналов типа syslog, но это однострочные записи и поэтому поддаются основному файловому итератору/обработке строк)
Вот пример лога и код, который я до сих пор:
[**] [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 [**]
и обновленный код:
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
Любая помощь, указатели, RTFMs, вы делаете это бесправие, и т.д. ., сильно оценен.
Ты бог. Это решение выходит за рамки моего опыта, но скоро будет реализовано, как только я заставлю себя понять все рабочие части. Спасибо! –
+1 - Хороший ответ ~ unutbu, избили меня до удара! (Ваш код группы выглядит довольно сумасшедшим, мне придется разобраться в нем, когда я получу несколько минут.) – PaulMcG
+ много просто для прекрасного и элегантного использования 'groupby'. – katrielalex