| import os |
| import sys |
| import importlib.util |
| import datetime |
| import logging |
| from logging.handlers import RotatingFileHandler |
|
|
| class PyFundamentsDebug: |
| """ |
| Debug-Klasse für PyFundaments. |
| Liest ENV-Variablen und konfiguriert Logging. |
| Gibt Startup-Infos aus, wenn PYFUNDAMENTS_DEBUG=true. |
| """ |
|
|
| def __init__(self): |
| |
| self.enabled = os.getenv("PYFUNDAMENTS_DEBUG", "false").lower() == "true" |
|
|
| |
| log_level_str = os.getenv("LOG_LEVEL", "INFO").upper() |
| self.log_level = getattr(logging, log_level_str, logging.INFO) |
|
|
| |
| self.log_to_tmp = os.getenv("LOG_TO_TMP", "false").lower() == "true" |
|
|
| |
| self.enable_public_logs = os.getenv("ENABLE_PUBLIC_LOGS", "true").lower() == "true" |
|
|
| |
| self.logger = logging.getLogger('pyfundaments_debug') |
| self._setup_logger() |
|
|
| def _setup_logger(self): |
| if not self.enable_public_logs: |
| |
| logging.basicConfig(level=logging.CRITICAL) |
| return |
|
|
| handlers = [] |
| if self.log_to_tmp: |
| log_file = '/tmp/pyfundaments_debug.log' |
| file_handler = RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=3) |
| handlers.append(file_handler) |
| handlers.append(logging.StreamHandler(sys.stdout)) |
|
|
| logging.basicConfig( |
| level=self.log_level, |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
| handlers=handlers |
| ) |
|
|
| def run(self): |
| if not self.enabled: |
| return |
|
|
| self.logger.info(f"==== PYFUNDAMENTS DEBUG STARTUP ({datetime.datetime.now()}) ====") |
| self.logger.info(f"Python version: {sys.version}") |
| self.logger.info(f"CWD: {os.getcwd()}") |
| self.logger.info(f"sys.path: {sys.path}") |
|
|
| fund_dir = "fundaments" |
| self.logger.info(f"fundaments exists: {os.path.isdir(fund_dir)}") |
|
|
| required_files = [ |
| "__init__.py", |
| "access_control.py", |
| "postgresql.py", |
| "config_handler.py", |
| "security.py", |
| "user_handler.py", |
| "encryption.py" |
| ] |
|
|
| for file in required_files: |
| path = os.path.join(fund_dir, file) |
| exists = os.path.isfile(path) |
| readable = os.access(path, os.R_OK) |
| self.logger.info(f"{file} exists: {exists} | readable: {readable}") |
|
|
| if os.path.isdir(fund_dir): |
| self.logger.info(f"Listing fundaments contents: {os.listdir(fund_dir)}") |
| else: |
| self.logger.warning("fundaments folder not found.") |
|
|
| spec = importlib.util.find_spec("fundaments") |
| self.logger.info(f"fundaments importable: {spec is not None}") |
|
|
| conflicts = [mod for mod in sys.modules if mod == "fundaments"] |
| self.logger.info(f"Name conflict in sys.modules: {conflicts}") |
|
|
| self.logger.info("==== PYFUNDAMENTS DEBUG END ====") |
|
|