Files
profilarr/backend/app/init.py

203 lines
7.1 KiB
Python

from datetime import timedelta
import os
import subprocess
import logging
import logging.config
from .config import config
from .db import get_secret_key, update_pat_status
def setup_logging():
log_config = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'detailed': {
'format':
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'detailed',
'stream': 'ext://sys.stdout'
},
# general_file handler
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'INFO',
'formatter': 'detailed',
'filename': config.GENERAL_LOG_FILE,
'maxBytes': 1048576, # 1MB
'backupCount': 20
},
# importarr_file handler
'importarr_file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'DEBUG',
'formatter': 'detailed',
'filename': config.IMPORTARR_LOG_FILE,
'maxBytes': 1048576,
'backupCount': 20
},
# hash_file handler
'hash_file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'INFO',
'formatter': 'detailed',
'filename': config.HASH_LOG_FILE,
'maxBytes': 1048576, # 1MB
'backupCount': 20
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console', 'file']
},
'loggers': {
# The 'importarr' logger uses all three handlers
'importarr': {
'level': 'DEBUG',
'handlers': ['console', 'file', 'importarr_file'],
'propagate': False
},
# The 'importer' logger (new import module) - reduce verbosity
'importer': {
'level': 'WARNING',
'handlers': ['file'],
'propagate': False
},
# The 'hash' logger uses all three handlers
'hash': {
'level': 'INFO',
'handlers': ['console', 'file', 'hash_file'],
'propagate': False
},
# Example: Keep these if you want separate loggers
'werkzeug': {
'level': 'INFO',
'handlers': ['console', 'file'],
'propagate': False
},
'flask': {
'level': 'INFO',
'handlers': ['console', 'file'],
'propagate': False
},
'git': {
'level': 'ERROR',
'handlers': ['console', 'file'],
'propagate': False
},
'urllib3': {
'level': 'WARNING',
'handlers': ['console', 'file'],
'propagate': False
},
'urllib3.connectionpool': {
'level': 'WARNING',
'handlers': ['console', 'file'],
'propagate': False
}
}
}
# Make sure the log directory exists
os.makedirs(os.path.dirname(config.GENERAL_LOG_FILE), exist_ok=True)
# Apply the configuration
logging.config.dictConfig(log_config)
# Create a logger for this module
logger = logging.getLogger(__name__)
logger.info("Logging system initialized")
return logger
def init_git_user():
"""Initialize Git user configuration for the repository and update PAT status."""
logger = logging.getLogger(__name__)
logger.info("Starting Git user configuration")
try:
from .config import config
repo_path = config.DB_DIR
git_name = os.environ.get('GIT_USER_NAME', 'Profilarr')
git_email = os.environ.get('GIT_USER_EMAIL',
'profilarr@dictionarry.com')
logger.debug(
f"Retrieved Git config - Name: {git_name}, Email: {git_email}")
if git_name == 'Profilarr' or git_email == 'profilarr@dictionarry.com':
logger.info("Using default Git user configuration")
# Set repository-level Git configuration if repo exists
if os.path.exists(os.path.join(repo_path, '.git')):
logger.info(f"Setting git config for repository at {repo_path}")
subprocess.run(['git', '-C', repo_path, 'config', '--local', 'user.name', git_name],
check=True)
subprocess.run(['git', '-C', repo_path, 'config', '--local', 'user.email', git_email],
check=True)
# Add safe.directory to prevent ownership issues
subprocess.run(['git', '-C', repo_path, 'config', '--local', '--add', 'safe.directory', repo_path],
check=True)
else:
logger.warning(f"No git repository found at {repo_path}, skipping git config")
# Update PAT status in database
update_pat_status()
# Verify configuration if repository exists
if os.path.exists(os.path.join(repo_path, '.git')):
configured_name = subprocess.run(
['git', '-C', repo_path, 'config', '--local', 'user.name'],
capture_output=True,
text=True,
check=True).stdout.strip()
configured_email = subprocess.run(
['git', '-C', repo_path, 'config', '--local', 'user.email'],
capture_output=True,
text=True,
check=True).stdout.strip()
if configured_name != git_name or configured_email != git_email:
logger.error("Git configuration verification failed")
return False, "Git configuration verification failed"
logger.info("Git user configuration completed successfully")
return True, "Git configuration successful"
except subprocess.CalledProcessError as e:
logger.error(f"Error configuring git: {str(e)}", exc_info=True)
return False, f"Failed to configure git: {str(e)}"
except Exception as e:
logger.error(f"Unexpected error configuring git: {str(e)}",
exc_info=True)
return False, f"Unexpected error configuring git: {str(e)}"
def init_app_config(app):
"""Initialize Flask app configuration."""
logger = logging.getLogger(__name__)
logger.info("Initializing app configuration")
app.config['SECRET_KEY'] = get_secret_key()
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(
days=config.SESSION_LIFETIME_DAYS)
app.config['SESSION_COOKIE_SECURE'] = config.SESSION_COOKIE_SECURE
app.config['SESSION_COOKIE_HTTPONLY'] = config.SESSION_COOKIE_HTTPONLY
app.config['SESSION_COOKIE_SAMESITE'] = config.SESSION_COOKIE_SAMESITE
logger.info("App configuration initialized")