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.
@@ -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
+ kavach_logger
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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
+ )