ObsiGate/backend/vault_settings.py

135 lines
4.2 KiB
Python

"""Vault-specific settings management.
Provides persistent storage for per-vault configuration like hidden files settings.
Settings are stored in /app/data/vault_settings.json
"""
import json
import logging
from pathlib import Path
from typing import Dict, Any, Optional
import threading
logger = logging.getLogger("obsigate.vault_settings")
_SETTINGS_PATH = Path("/app/data/vault_settings.json")
_settings_lock = threading.Lock()
# In-memory cache of vault settings
_vault_settings: Dict[str, Dict[str, Any]] = {}
def load_vault_settings() -> Dict[str, Dict[str, Any]]:
"""Load vault settings from disk.
Returns:
Dict mapping vault names to their settings.
"""
global _vault_settings
with _settings_lock:
if _SETTINGS_PATH.exists():
try:
content = _SETTINGS_PATH.read_text(encoding="utf-8")
_vault_settings = json.loads(content)
logger.info(f"Loaded settings for {len(_vault_settings)} vaults")
except Exception as e:
logger.warning(f"Failed to load vault settings: {e}")
_vault_settings = {}
else:
_vault_settings = {}
return dict(_vault_settings)
def save_vault_settings() -> None:
"""Persist vault settings to disk."""
with _settings_lock:
try:
logger.info(f"Attempting to save settings to {_SETTINGS_PATH}")
logger.info(f"Parent directory: {_SETTINGS_PATH.parent}")
logger.info(f"Parent exists: {_SETTINGS_PATH.parent.exists()}")
_SETTINGS_PATH.parent.mkdir(parents=True, exist_ok=True)
logger.info(f"Directory created/verified: {_SETTINGS_PATH.parent}")
content = json.dumps(_vault_settings, indent=2, ensure_ascii=False)
logger.info(f"JSON content prepared ({len(content)} bytes)")
_SETTINGS_PATH.write_text(content, encoding="utf-8")
logger.info(f"Successfully saved settings for {len(_vault_settings)} vaults to {_SETTINGS_PATH}")
except PermissionError as e:
logger.error(f"Permission denied writing to {_SETTINGS_PATH}: {e}")
logger.error(f"Check that user has write permissions to {_SETTINGS_PATH.parent}")
raise
except Exception as e:
logger.error(f"Failed to save vault settings to {_SETTINGS_PATH}: {e}")
logger.error(f"Error type: {type(e).__name__}")
import traceback
logger.error(f"Traceback: {traceback.format_exc()}")
raise
def get_vault_setting(vault_name: str) -> Optional[Dict[str, Any]]:
"""Get settings for a specific vault.
Args:
vault_name: Name of the vault.
Returns:
Dict with vault settings or None if not found.
"""
with _settings_lock:
return _vault_settings.get(vault_name)
def update_vault_setting(vault_name: str, settings: Dict[str, Any]) -> Dict[str, Any]:
"""Update settings for a specific vault.
Args:
vault_name: Name of the vault.
settings: Dict with settings to update (partial update supported).
Returns:
Updated settings dict for the vault.
"""
with _settings_lock:
if vault_name not in _vault_settings:
_vault_settings[vault_name] = {}
_vault_settings[vault_name].update(settings)
save_vault_settings()
return dict(_vault_settings[vault_name])
def delete_vault_setting(vault_name: str) -> bool:
"""Delete settings for a specific vault.
Args:
vault_name: Name of the vault.
Returns:
True if settings were deleted, False if vault not found.
"""
with _settings_lock:
if vault_name in _vault_settings:
del _vault_settings[vault_name]
save_vault_settings()
return True
return False
def get_all_vault_settings() -> Dict[str, Dict[str, Any]]:
"""Get all vault settings.
Returns:
Dict mapping vault names to their settings.
"""
with _settings_lock:
return dict(_vault_settings)
# Initialize settings on module load
load_vault_settings()