kavach-logger 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kavach_logger-0.1.0/PKG-INFO +15 -0
- kavach_logger-0.1.0/kavach_logger/__init__.py +6 -0
- kavach_logger-0.1.0/kavach_logger/base_logger.py +12 -0
- kavach_logger-0.1.0/kavach_logger/default_logger.py +66 -0
- kavach_logger-0.1.0/kavach_logger/logger_manager.py +51 -0
- kavach_logger-0.1.0/kavach_logger/setup.py +45 -0
- kavach_logger-0.1.0/kavach_logger.egg-info/PKG-INFO +15 -0
- kavach_logger-0.1.0/kavach_logger.egg-info/SOURCES.txt +10 -0
- kavach_logger-0.1.0/kavach_logger.egg-info/dependency_links.txt +1 -0
- kavach_logger-0.1.0/kavach_logger.egg-info/top_level.txt +1 -0
- kavach_logger-0.1.0/setup.cfg +4 -0
- kavach_logger-0.1.0/setup.py +13 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kavach-logger
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Centralized logging and masking for Kavach security suite
|
|
5
|
+
Home-page: https://github.com/shivamnamdeo0101/kavach-agent-ecosystem
|
|
6
|
+
Author: Shivam Namdeo
|
|
7
|
+
Author-email: shivamnamdeo0101@gmail.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Requires-Python: >=3.7
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: home-page
|
|
13
|
+
Dynamic: license
|
|
14
|
+
Dynamic: requires-python
|
|
15
|
+
Dynamic: summary
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from .base_logger import BaseLogger
|
|
2
|
+
from .default_logger import DefaultLogger, MaskedLogger
|
|
3
|
+
from .logger_manager import LoggerManager, get_logger, set_custom_logger, mask_sensitive_data
|
|
4
|
+
|
|
5
|
+
__version__ = "0.1.0"
|
|
6
|
+
__all__ = ["BaseLogger", "DefaultLogger", "MaskedLogger", "LoggerManager", "get_logger", "set_custom_logger", "mask_sensitive_data"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class BaseLogger:
|
|
2
|
+
def info(self, msg, **kwargs):
|
|
3
|
+
raise NotImplementedError
|
|
4
|
+
|
|
5
|
+
def error(self, msg, **kwargs):
|
|
6
|
+
raise NotImplementedError
|
|
7
|
+
|
|
8
|
+
def debug(self, msg, **kwargs):
|
|
9
|
+
raise NotImplementedError
|
|
10
|
+
|
|
11
|
+
def warning(self, msg, **kwargs):
|
|
12
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import re
|
|
3
|
+
from .base_logger import BaseLogger
|
|
4
|
+
|
|
5
|
+
class DefaultLogger(BaseLogger):
|
|
6
|
+
def __init__(self, name="kavach", level=logging.INFO):
|
|
7
|
+
self.logger = logging.getLogger(name)
|
|
8
|
+
self.logger.setLevel(level)
|
|
9
|
+
self.logger.propagate = False
|
|
10
|
+
|
|
11
|
+
if not self.logger.handlers:
|
|
12
|
+
handler = logging.StreamHandler()
|
|
13
|
+
formatter = logging.Formatter("[%(levelname)s] %(asctime)s | %(message)s", datefmt="%H:%M:%S")
|
|
14
|
+
handler.setFormatter(formatter)
|
|
15
|
+
self.logger.addHandler(handler)
|
|
16
|
+
|
|
17
|
+
def info(self, msg, **kwargs):
|
|
18
|
+
if kwargs:
|
|
19
|
+
msg = f"{msg} | {kwargs}"
|
|
20
|
+
self.logger.info(msg)
|
|
21
|
+
|
|
22
|
+
def error(self, msg, **kwargs):
|
|
23
|
+
if kwargs:
|
|
24
|
+
msg = f"{msg} | {kwargs}"
|
|
25
|
+
self.logger.error(msg)
|
|
26
|
+
|
|
27
|
+
def debug(self, msg, **kwargs):
|
|
28
|
+
if kwargs:
|
|
29
|
+
msg = f"{msg} | {kwargs}"
|
|
30
|
+
self.logger.debug(msg)
|
|
31
|
+
|
|
32
|
+
def warning(self, msg, **kwargs):
|
|
33
|
+
if kwargs:
|
|
34
|
+
msg = f"{msg} | {kwargs}"
|
|
35
|
+
self.logger.warning(msg)
|
|
36
|
+
|
|
37
|
+
class MaskedLogger(DefaultLogger):
|
|
38
|
+
def __init__(self, name="kavach", level=logging.INFO, enable_masking=True):
|
|
39
|
+
super().__init__(name, level)
|
|
40
|
+
self.enable_masking = enable_masking
|
|
41
|
+
|
|
42
|
+
def _mask_sensitive(self, text: str) -> str:
|
|
43
|
+
if not self.enable_masking or not isinstance(text, str):
|
|
44
|
+
return text
|
|
45
|
+
text = re.sub(r'(AKIA|sk-|api[_-]?key)[^\s]{10,}', r'\1***', text, flags=re.I)
|
|
46
|
+
text = re.sub(r'(bearer|token)[=:\s]+[^\s]{10,}', r'\1 ***', text, flags=re.I)
|
|
47
|
+
text = re.sub(r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b', '****-****-****-****', text)
|
|
48
|
+
text = re.sub(r'(password|passwd)[=:\s]+[^\s,}]+', r'\1=***', text, flags=re.I)
|
|
49
|
+
text = re.sub(r'(access_key|secret)[=:\s]+[^\s,}]+', r'\1=***', text, flags=re.I)
|
|
50
|
+
return text
|
|
51
|
+
|
|
52
|
+
def info(self, msg, **kwargs):
|
|
53
|
+
msg = self._mask_sensitive(str(msg))
|
|
54
|
+
super().info(msg, **kwargs)
|
|
55
|
+
|
|
56
|
+
def error(self, msg, **kwargs):
|
|
57
|
+
msg = self._mask_sensitive(str(msg))
|
|
58
|
+
super().error(msg, **kwargs)
|
|
59
|
+
|
|
60
|
+
def debug(self, msg, **kwargs):
|
|
61
|
+
msg = self._mask_sensitive(str(msg))
|
|
62
|
+
super().debug(msg, **kwargs)
|
|
63
|
+
|
|
64
|
+
def warning(self, msg, **kwargs):
|
|
65
|
+
msg = self._mask_sensitive(str(msg))
|
|
66
|
+
super().warning(msg, **kwargs)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from .base_logger import BaseLogger
|
|
2
|
+
from .default_logger import DefaultLogger, MaskedLogger
|
|
3
|
+
|
|
4
|
+
class LoggerManager:
|
|
5
|
+
_instance = None
|
|
6
|
+
_logger: BaseLogger = None
|
|
7
|
+
|
|
8
|
+
def __new__(cls):
|
|
9
|
+
if cls._instance is None:
|
|
10
|
+
cls._instance = super(LoggerManager, cls).__new__(cls)
|
|
11
|
+
return cls._instance
|
|
12
|
+
|
|
13
|
+
def set_logger(self, logger: BaseLogger):
|
|
14
|
+
self._logger = logger
|
|
15
|
+
|
|
16
|
+
def get_logger(self, masked: bool = True):
|
|
17
|
+
if self._logger is None:
|
|
18
|
+
self._logger = MaskedLogger() if masked else DefaultLogger()
|
|
19
|
+
return self._logger
|
|
20
|
+
|
|
21
|
+
_manager = LoggerManager()
|
|
22
|
+
|
|
23
|
+
def get_logger(name: str = "kavach", masked: bool = True) -> BaseLogger:
|
|
24
|
+
"""Get logger instance. Use masked=True for automatic sensitive data masking."""
|
|
25
|
+
logger = MaskedLogger(name) if masked else DefaultLogger(name)
|
|
26
|
+
return logger
|
|
27
|
+
|
|
28
|
+
def set_custom_logger(logger: BaseLogger):
|
|
29
|
+
"""Override default logger with custom implementation."""
|
|
30
|
+
_manager.set_logger(logger)
|
|
31
|
+
|
|
32
|
+
def mask_sensitive_data(text: str) -> str:
|
|
33
|
+
"""Utility to mask sensitive data."""
|
|
34
|
+
logger = MaskedLogger()
|
|
35
|
+
return logger._mask_sensitive(text)
|
|
36
|
+
|
|
37
|
+
def info(self, msg, **kwargs):
|
|
38
|
+
msg = self._mask_sensitive(str(msg))
|
|
39
|
+
super().info(msg, **kwargs)
|
|
40
|
+
|
|
41
|
+
def error(self, msg, **kwargs):
|
|
42
|
+
msg = self._mask_sensitive(str(msg))
|
|
43
|
+
super().error(msg, **kwargs)
|
|
44
|
+
|
|
45
|
+
def debug(self, msg, **kwargs):
|
|
46
|
+
msg = self._mask_sensitive(str(msg))
|
|
47
|
+
super().debug(msg, **kwargs)
|
|
48
|
+
|
|
49
|
+
def warning(self, msg, **kwargs):
|
|
50
|
+
msg = self._mask_sensitive(str(msg))
|
|
51
|
+
super().warning(msg, **kwargs)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
_logging_enabled = True
|
|
5
|
+
_masking_enabled = True
|
|
6
|
+
|
|
7
|
+
class LoggingFilter(logging.Filter):
|
|
8
|
+
def filter(self, record):
|
|
9
|
+
return _logging_enabled
|
|
10
|
+
|
|
11
|
+
def enable_logging(enabled: bool = True):
|
|
12
|
+
global _logging_enabled
|
|
13
|
+
_logging_enabled = enabled
|
|
14
|
+
|
|
15
|
+
def enable_masking(enabled: bool = True):
|
|
16
|
+
global _masking_enabled
|
|
17
|
+
_masking_enabled = enabled
|
|
18
|
+
|
|
19
|
+
def is_logging_enabled() -> bool:
|
|
20
|
+
return _logging_enabled
|
|
21
|
+
|
|
22
|
+
def is_masking_enabled() -> bool:
|
|
23
|
+
return _masking_enabled
|
|
24
|
+
|
|
25
|
+
def mask_sensitive_data(text: str) -> str:
|
|
26
|
+
if not _masking_enabled or not isinstance(text, str):
|
|
27
|
+
return text
|
|
28
|
+
text = re.sub(r'(AKIA|sk-|api[_-]?key)[^\s]{10,}', r'\1***', text, flags=re.I)
|
|
29
|
+
text = re.sub(r'(bearer|token)[=:\s]+[^\s]{10,}', r'\1 ***', text, flags=re.I)
|
|
30
|
+
text = re.sub(r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b', '****-****-****-****', text)
|
|
31
|
+
text = re.sub(r'(password|passwd)[=:\s]+[^\s,}]+', r'\1=***', text, flags=re.I)
|
|
32
|
+
text = re.sub(r'(access_key|secret)[=:\s]+[^\s,}]+', r'\1=***', text, flags=re.I)
|
|
33
|
+
return text
|
|
34
|
+
|
|
35
|
+
def get_logger(name: str = "kavach") -> logging.Logger:
|
|
36
|
+
logger = logging.getLogger(name)
|
|
37
|
+
if not logger.handlers:
|
|
38
|
+
logger.setLevel(logging.DEBUG)
|
|
39
|
+
logger.propagate = False
|
|
40
|
+
handler = logging.StreamHandler()
|
|
41
|
+
handler.addFilter(LoggingFilter())
|
|
42
|
+
formatter = logging.Formatter("[%(levelname)s] %(asctime)s | %(message)s", datefmt="%H:%M:%S")
|
|
43
|
+
handler.setFormatter(formatter)
|
|
44
|
+
logger.addHandler(handler)
|
|
45
|
+
return logger
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kavach-logger
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Centralized logging and masking for Kavach security suite
|
|
5
|
+
Home-page: https://github.com/shivamnamdeo0101/kavach-agent-ecosystem
|
|
6
|
+
Author: Shivam Namdeo
|
|
7
|
+
Author-email: shivamnamdeo0101@gmail.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Requires-Python: >=3.7
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: home-page
|
|
13
|
+
Dynamic: license
|
|
14
|
+
Dynamic: requires-python
|
|
15
|
+
Dynamic: summary
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
setup.py
|
|
2
|
+
kavach_logger/__init__.py
|
|
3
|
+
kavach_logger/base_logger.py
|
|
4
|
+
kavach_logger/default_logger.py
|
|
5
|
+
kavach_logger/logger_manager.py
|
|
6
|
+
kavach_logger/setup.py
|
|
7
|
+
kavach_logger.egg-info/PKG-INFO
|
|
8
|
+
kavach_logger.egg-info/SOURCES.txt
|
|
9
|
+
kavach_logger.egg-info/dependency_links.txt
|
|
10
|
+
kavach_logger.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
kavach_logger
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name="kavach-logger",
|
|
5
|
+
version="0.1.0",
|
|
6
|
+
description="Centralized logging and masking for Kavach security suite",
|
|
7
|
+
author="Shivam Namdeo",
|
|
8
|
+
author_email="shivamnamdeo0101@gmail.com",
|
|
9
|
+
url="https://github.com/shivamnamdeo0101/kavach-agent-ecosystem",
|
|
10
|
+
license="MIT",
|
|
11
|
+
packages=find_packages(),
|
|
12
|
+
python_requires=">=3.7",
|
|
13
|
+
)
|