Commit b1acd50e authored by Ad Schellevis's avatar Ad Schellevis

(ids) add logfile number selection to query script

parent f4253772
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------
query suricata alert log query suricata alert log
""" """
import os.path
import re import re
import sre_constants import sre_constants
import shlex import shlex
...@@ -37,12 +38,16 @@ import ujson ...@@ -37,12 +38,16 @@ import ujson
from lib.log import reverse_log_reader from lib.log import reverse_log_reader
from lib.params import updateParams from lib.params import updateParams
suricata_log = '/var/log/suricata/eve.json'
# handle parameters # handle parameters
parameters = {'limit':'0','offset':'0', 'filter':''} parameters = {'limit':'0','offset':'0', 'filter':'','fileid':''}
updateParams(parameters) updateParams(parameters)
# choose logfile by number
if parameters['fileid'].isdigit():
suricata_log = '/var/log/suricata/eve.json.%d'%int(parameters['fileid'])
else:
suricata_log = '/var/log/suricata/eve.json'
if parameters['limit'].isdigit(): if parameters['limit'].isdigit():
limit = int(parameters['limit']) limit = int(parameters['limit'])
else: else:
...@@ -78,42 +83,43 @@ else: ...@@ -78,42 +83,43 @@ else:
# query suricata eve log # query suricata eve log
result = {'filters':data_filters,'rows':[],'total_rows':0} result = {'filters':data_filters,'rows':[],'total_rows':0}
for line in reverse_log_reader(filename=suricata_log, start_pos=log_start_pos): if os.path.exists(suricata_log):
try: for line in reverse_log_reader(filename=suricata_log, start_pos=log_start_pos):
record = ujson.loads(line['line']) try:
except ValueError: record = ujson.loads(line['line'])
# can not handle line except ValueError:
record = {} # can not handle line
record = {}
# only process valid alert items
if 'alert' in record: # only process valid alert items
# add position in file if 'alert' in record:
record['filepos'] = line['pos'] # add position in file
# flatten structure record['filepos'] = line['pos']
record['alert_sid'] = record['alert']['signature_id'] # flatten structure
record['alert'] = record['alert']['signature'] record['alert_sid'] = record['alert']['signature_id']
record['alert'] = record['alert']['signature']
# use filters on data (using regular expressions)
do_output = True # use filters on data (using regular expressions)
for filterKeys in data_filters: do_output = True
filter_hit = False for filterKeys in data_filters:
for filterKey in filterKeys.split(','): filter_hit = False
if record.has_key(filterKey) and data_filters_comp[filterKeys].match(('%s'%record[filterKey]).lower()): for filterKey in filterKeys.split(','):
filter_hit = True if record.has_key(filterKey) and data_filters_comp[filterKeys].match(('%s'%record[filterKey]).lower()):
filter_hit = True
if not filter_hit:
do_output = False if not filter_hit:
if do_output: do_output = False
result['total_rows'] += 1 if do_output:
if (len(result['rows']) < limit or limit == 0) and result['total_rows'] >= offset: result['total_rows'] += 1
result['rows'].append(record) if (len(result['rows']) < limit or limit == 0) and result['total_rows'] >= offset:
elif result['total_rows'] > offset + limit: result['rows'].append(record)
# do not fetch data until end of file... elif result['total_rows'] > offset + limit:
break # do not fetch data until end of file...
break
# only try to fetch one line when filepos is given
if log_start_pos != None: # only try to fetch one line when filepos is given
break if log_start_pos != None:
break
# output results # output results
print(ujson.dumps(result)) print(ujson.dumps(result))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment