mirror of
https://github.com/mvt-project/mvt.git
synced 2026-08-24 20:03:00 +02:00
update alerts.py
This commit is contained in:
+44
-20
@@ -4,6 +4,7 @@
|
|||||||
# https://license.mvt.re/1.1/
|
# https://license.mvt.re/1.1/
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
from dataclasses import asdict, dataclass
|
from dataclasses import asdict, dataclass
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
@@ -35,6 +36,39 @@ class AlertStore:
|
|||||||
self.__alerts: List[Alert] = []
|
self.__alerts: List[Alert] = []
|
||||||
self.__log = log
|
self.__log = log
|
||||||
|
|
||||||
|
def _get_calling_module(self) -> str:
|
||||||
|
"""
|
||||||
|
Automatically detect the calling MVT module and return its slug.
|
||||||
|
|
||||||
|
Walks up the call stack to find the first frame that belongs to an MVT module
|
||||||
|
(artifact or extraction module) and extracts its slug.
|
||||||
|
|
||||||
|
:return: Module slug string
|
||||||
|
"""
|
||||||
|
frame = inspect.currentframe()
|
||||||
|
try:
|
||||||
|
# Walk up the call stack
|
||||||
|
while frame is not None:
|
||||||
|
frame = frame.f_back
|
||||||
|
if frame is None:
|
||||||
|
break
|
||||||
|
|
||||||
|
# Get the 'self' object from the frame's local variables
|
||||||
|
frame_locals = frame.f_locals
|
||||||
|
if "self" in frame_locals:
|
||||||
|
obj = frame_locals["self"]
|
||||||
|
# Check if it has a get_slug method (MVT modules have this)
|
||||||
|
if hasattr(obj, "get_slug") and callable(obj.get_slug):
|
||||||
|
try:
|
||||||
|
return obj.get_slug()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Fallback: return "unknown" if we can't find the module
|
||||||
|
return "unknown"
|
||||||
|
finally:
|
||||||
|
del frame
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def alerts(self) -> List[Alert]:
|
def alerts(self) -> List[Alert]:
|
||||||
return self.__alerts
|
return self.__alerts
|
||||||
@@ -47,65 +81,55 @@ class AlertStore:
|
|||||||
for alert in alerts:
|
for alert in alerts:
|
||||||
self.add(alert)
|
self.add(alert)
|
||||||
|
|
||||||
def info(
|
def info(self, message: str, event_time: str, event: ModuleAtomicResult):
|
||||||
self, module: str, message: str, event_time: str, event: ModuleAtomicResult
|
|
||||||
):
|
|
||||||
self.add(
|
self.add(
|
||||||
Alert(
|
Alert(
|
||||||
level=AlertLevel.INFORMATIONAL,
|
level=AlertLevel.INFORMATIONAL,
|
||||||
module=module,
|
module=self._get_calling_module(),
|
||||||
message=message,
|
message=message,
|
||||||
event_time=event_time,
|
event_time=event_time,
|
||||||
event=event,
|
event=event,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def low(
|
def low(self, message: str, event_time: str, event: ModuleAtomicResult):
|
||||||
self, module: str, message: str, event_time: str, event: ModuleAtomicResult
|
|
||||||
):
|
|
||||||
self.add(
|
self.add(
|
||||||
Alert(
|
Alert(
|
||||||
level=AlertLevel.LOW,
|
level=AlertLevel.LOW,
|
||||||
module=module,
|
module=self._get_calling_module(),
|
||||||
message=message,
|
message=message,
|
||||||
event_time=event_time,
|
event_time=event_time,
|
||||||
event=event,
|
event=event,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def medium(
|
def medium(self, message: str, event_time: str, event: ModuleAtomicResult):
|
||||||
self, module: str, message: str, event_time: str, event: ModuleAtomicResult
|
|
||||||
):
|
|
||||||
self.add(
|
self.add(
|
||||||
Alert(
|
Alert(
|
||||||
level=AlertLevel.MEDIUM,
|
level=AlertLevel.MEDIUM,
|
||||||
module=module,
|
module=self._get_calling_module(),
|
||||||
message=message,
|
message=message,
|
||||||
event_time=event_time,
|
event_time=event_time,
|
||||||
event=event,
|
event=event,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def high(
|
def high(self, message: str, event_time: str, event: ModuleAtomicResult):
|
||||||
self, module: str, message: str, event_time: str, event: ModuleAtomicResult
|
|
||||||
):
|
|
||||||
self.add(
|
self.add(
|
||||||
Alert(
|
Alert(
|
||||||
level=AlertLevel.HIGH,
|
level=AlertLevel.HIGH,
|
||||||
module=module,
|
module=self._get_calling_module(),
|
||||||
message=message,
|
message=message,
|
||||||
event_time=event_time,
|
event_time=event_time,
|
||||||
event=event,
|
event=event,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def critical(
|
def critical(self, message: str, event_time: str, event: ModuleAtomicResult):
|
||||||
self, module: str, message: str, event_time: str, event: ModuleAtomicResult
|
|
||||||
):
|
|
||||||
self.add(
|
self.add(
|
||||||
Alert(
|
Alert(
|
||||||
level=AlertLevel.CRITICAL,
|
level=AlertLevel.CRITICAL,
|
||||||
module=module,
|
module=self._get_calling_module(),
|
||||||
message=message,
|
message=message,
|
||||||
event_time=event_time,
|
event_time=event_time,
|
||||||
event=event,
|
event=event,
|
||||||
|
|||||||
Reference in New Issue
Block a user