Skip to content

Commit c0678d3

Browse files
committed
Add binaries and optional GUI
Move source files to ./Source/ Add binaries for Windows and Linux Add an optional GUI for Windows
1 parent 8179466 commit c0678d3

22 files changed

+883
-26
lines changed

Linux/AuditLogCollector

11.4 MB
Binary file not shown.

Linux/AuditLogSubscriber

11.3 MB
Binary file not shown.
File renamed without changes.

AuditLogCollector.py Source/AuditLogCollector.py

+27-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Standard libs
2-
import collections
32
import os
3+
import sys
44
import json
55
import logging
66
import datetime
@@ -16,7 +16,7 @@
1616

1717
class AuditLogCollector(ApiConnection.ApiConnection):
1818

19-
def __init__(self, content_types, *args, resume=True, fallback_time=None,
19+
def __init__(self, *args, content_types=None, resume=True, fallback_time=None,
2020
file_output=False, output_path=None,
2121
graylog_output=False, graylog_address=None, graylog_port=None,
2222
azure_oms_output=False, azure_oms_workspace_id=None, azure_oms_shared_key=None,
@@ -41,38 +41,46 @@ def __init__(self, content_types, *args, resume=True, fallback_time=None,
4141
self.graylog_output = graylog_output
4242
self.azure_oms_output = azure_oms_output
4343
self.output_path = output_path
44-
self.content_types = content_types
44+
self.content_types = content_types or collections.deque()
4545
self._last_run_times = {}
46+
self.resume = resume
4647
if resume:
4748
self.get_last_run_times()
4849
self._fallback_time = fallback_time or datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=1)
4950
self._known_content = {}
50-
if self.azure_oms_output:
51-
self._azure_oms_interface = AzureOMSInterface.AzureOMSInterface(workspace_id=azure_oms_workspace_id,
52-
shared_key=azure_oms_shared_key)
53-
if self.graylog_output:
54-
self._graylog_interface = GraylogInterface.GraylogInterface(graylog_address=graylog_address,
55-
graylog_port=graylog_port)
51+
self._azure_oms_interface = AzureOMSInterface.AzureOMSInterface(workspace_id=azure_oms_workspace_id,
52+
shared_key=azure_oms_shared_key)
53+
self._graylog_interface = GraylogInterface.GraylogInterface(graylog_address=graylog_address,
54+
graylog_port=graylog_port)
5655
self.blobs_to_collect = collections.defaultdict(collections.deque)
5756
self.monitor_thread = threading.Thread()
5857
self.retrieve_available_content_threads = collections.deque()
5958
self.retrieve_content_threads = collections.deque()
59+
self.run_started = None
6060
self.logs_retrieved = 0
6161

6262
def run_once(self, start_time=None):
6363
"""
6464
Check available content and retrieve it, then exit.
6565
"""
66-
run_started = datetime.datetime.now()
66+
self._known_content.clear()
67+
self.logs_retrieved = 0
68+
self._graylog_interface.successfully_sent = 0
69+
self._graylog_interface.unsuccessfully_sent = 0
70+
self._azure_oms_interface.successfully_sent = 0
71+
self._azure_oms_interface.unsuccessfully_sent = 0
72+
self.run_started = datetime.datetime.now()
6773
self._clean_known_content()
74+
if self.resume:
75+
self.get_last_run_times()
6876
self.start_monitoring()
6977
self.get_all_available_content(start_time=start_time)
7078
self.monitor_thread.join()
71-
if self._last_run_times:
79+
if self.resume and self._last_run_times:
7280
with open('last_run_times', 'w') as ofile:
7381
json.dump(fp=ofile, obj=self._last_run_times)
7482
logging.info("Finished. Total logs retrieved: {}. Run time: {}.".format(
75-
self.logs_retrieved, datetime.datetime.now() - run_started))
83+
self.logs_retrieved, datetime.datetime.now() - self.run_started))
7684
if self.azure_oms_output:
7785
logging.info("Azure OMS output report: {} successfully sent, {} errors".format(
7886
self._azure_oms_interface.successfully_sent, self._azure_oms_interface.unsuccessfully_sent))
@@ -127,7 +135,7 @@ def get_all_available_content(self, start_time=None):
127135
"""
128136
for content_type in self.content_types.copy():
129137
if not start_time:
130-
if content_type in self._last_run_times.keys():
138+
if self.resume and content_type in self._last_run_times.keys():
131139
start_time = self._last_run_times[content_type]
132140
else:
133141
start_time = self._fallback_time
@@ -336,8 +344,12 @@ def known_content(self):
336344
elif argsdict['time_hours']:
337345
fallback_time = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=argsdict['time_hours'])
338346

339-
logging.basicConfig(filemode='w', filename=argsdict['log_path'],
340-
level=logging.INFO if not argsdict['debug_logging'] else logging.DEBUG)
347+
logger = logging.getLogger()
348+
fileHandler = logging.FileHandler(argsdict['log_path'], mode='w')
349+
streamHandler = logging.StreamHandler(sys.stdout)
350+
logger.addHandler(streamHandler)
351+
logger.addHandler(fileHandler)
352+
logger.setLevel(logging.INFO if not argsdict['debug_logging'] else logging.DEBUG)
341353
logging.log(level=logging.INFO, msg='Starting run @ {0}'.format(datetime.datetime.now()))
342354

343355
collector = AuditLogCollector(

AuditLogSubscriber.py Source/AuditLogSubscriber.py

+20-10
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,33 @@ def get_sub_status(self):
3131
status = self.make_api_request(url='subscriptions/list', append_url=True)
3232
return status.json()
3333

34-
def set_sub_status(self, ctype_stat):
34+
def set_sub_status(self, ctype_stat=None, content_type=None, action=None):
3535
"""
3636
Args:
3737
ctype_stat (tuple): content type, status (enabled | disabled)
38-
3938
Returns:
4039
dict
4140
"""
42-
if ctype_stat[1] == 'enabled':
43-
action = 'stop'
44-
elif ctype_stat[1] == 'disabled':
45-
action = 'start'
46-
else:
47-
return
48-
status = self.make_api_request(url='subscriptions/{0}?contentType={1}'.format(action, ctype_stat[0]),
41+
content_type = content_type or ctype_stat[0]
42+
if not action:
43+
if ctype_stat[1] == 'enabled':
44+
action = 'stop'
45+
elif ctype_stat[1] == 'disabled':
46+
action = 'start'
47+
else:
48+
return
49+
status = self.make_api_request(url='subscriptions/{0}?contentType={1}'.format(action, content_type),
4950
append_url=True, get=False)
50-
logging.info("Set sub status response: {}".format(status))
51+
logging.debug("Set sub status response: {}".format(status))
52+
try:
53+
logging.debug("Set sub status json: {}".format(status.json()))
54+
except Exception as e:
55+
pass
56+
if 200 <= status.status_code <= 299:
57+
logging.info('Successfully set sub status: {} > {}'.format(content_type, action))
58+
else:
59+
raise RuntimeError("Unable to set sub status: {} > {}".format(content_type, action))
60+
status.close()
5161

5262
def interactive(self):
5363

AzureOMSInterface.py Source/AzureOMSInterface.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ def post_data(self, body, log_type, time_generated):
129129
'time-generated-field': time_generated
130130
}
131131
response = self.session.post(uri, data=body, headers=headers)
132-
status_code, json_output = response.status_code, response.json
132+
status_code = response.status_code
133+
try:
134+
json_output = response.json()
135+
except:
136+
json_output = ''
137+
133138
response.close()
134139
if 200 <= status_code <= 299:
135140
logging.info('Accepted payload:' + body)

0 commit comments

Comments
 (0)