From 1b56982e2234b6bb44fb78808879989310eeb0b8 Mon Sep 17 00:00:00 2001 From: wh1te909 Date: Sun, 1 Mar 2020 11:46:30 +0000 Subject: [PATCH] compress eventlogs to significantly reduce size of data sent back to the rmm, which was causing salt to use insane amounts of memory --- _modules/get_eventlog.py | 26 ++++++++++++++++---------- api/tacticalrmm/agents/views.py | 12 ++++++++++-- web/src/components/EventLog.vue | 3 ++- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/_modules/get_eventlog.py b/_modules/get_eventlog.py index d5d7d97a..0be4af29 100644 --- a/_modules/get_eventlog.py +++ b/_modules/get_eventlog.py @@ -4,8 +4,17 @@ import win32con import win32evtlogutil import winerror import datetime -import random -import string +import zlib +import json +import base64 + + +def _compress_json(j): + return { + "wineventlog": base64.b64encode( + zlib.compress(json.dumps(j).encode("utf-8", errors="ignore")) + ).decode("ascii", errors="ignore") + } def get_eventlog(logtype, last_n_days): @@ -28,6 +37,7 @@ def get_eventlog(logtype, last_n_days): try: events = 1 + uid = 0 while events: events = win32evtlog.ReadEventLog(hand, flags, 0) for ev_obj in events: @@ -43,6 +53,7 @@ def get_eventlog(logtype, last_n_days): evt_category = str(ev_obj.EventCategory) record = str(ev_obj.RecordNumber) msg = str(win32evtlogutil.SafeFormatMessage(ev_obj, logtype)) + uid += 1 event_dict = { "computer": computer, @@ -53,12 +64,7 @@ def get_eventlog(logtype, last_n_days): "message": msg, "time": the_time, "record": record, - "uid": "".join( - [ - random.choice(string.ascii_letters + string.digits) - for n in range(60) - ] - ), + "uid": uid, } log.append(event_dict) @@ -66,8 +72,8 @@ def get_eventlog(logtype, last_n_days): if time_obj < start_time: break - except Exception as e: + except Exception: pass win32evtlog.CloseEventLog(hand) - return log + return _compress_json(log) diff --git a/api/tacticalrmm/agents/views.py b/api/tacticalrmm/agents/views.py index 01706a24..181121a0 100644 --- a/api/tacticalrmm/agents/views.py +++ b/api/tacticalrmm/agents/views.py @@ -1,6 +1,9 @@ from loguru import logger import subprocess from packaging import version as pyver +import zlib +import json +import base64 from django.conf import settings from django.shortcuts import get_object_or_404 @@ -236,13 +239,18 @@ def get_event_log(request, pk, logtype, days): func="get_eventlog.get_eventlog", arg=[logtype, int(days)], ) - data = resp.json() except Exception: return Response( {"error": "unable to contact the agent"}, status=status.HTTP_400_BAD_REQUEST ) - return Response(data["return"][0][agent.salt_id]) + return Response( + json.loads( + zlib.decompress( + base64.b64decode(resp.json()["return"][0][agent.salt_id]["wineventlog"]) + ) + ) + ) @api_view(["POST"]) diff --git a/web/src/components/EventLog.vue b/web/src/components/EventLog.vue index 1a0a6a49..160690e6 100644 --- a/web/src/components/EventLog.vue +++ b/web/src/components/EventLog.vue @@ -19,6 +19,7 @@ row-key="uid" binary-state-sort hide-bottom + virtual-scroll >