"""Effective Linux SSH admin credentials (DB overrides env).""" from __future__ import annotations from dataclasses import dataclass from sqlalchemy.orm import Session from app.config import get_settings from app.models.ui_settings import UI_SETTINGS_ROW_ID, UiSettings @dataclass(frozen=True) class LinuxAdminConfig: user: str password: str source: str # env | db @property def configured(self) -> bool: return bool(self.user.strip() and self.password.strip()) def _linux_admin_from_env() -> LinuxAdminConfig: settings = get_settings() return LinuxAdminConfig( user=settings.sac_linux_admin_user.strip(), password=settings.sac_linux_admin_password, source="env", ) def get_effective_linux_admin_config(db: Session | None = None) -> LinuxAdminConfig: if db is None: from app.database import SessionLocal session = SessionLocal() try: return get_effective_linux_admin_config(session) finally: session.close() row = db.get(UiSettings, UI_SETTINGS_ROW_ID) env_cfg = _linux_admin_from_env() if row is None: return env_cfg user = (row.linux_admin_user or "").strip() or env_cfg.user password = (row.linux_admin_password or "") or env_cfg.password has_db_values = bool((row.linux_admin_user or "").strip() or (row.linux_admin_password or "").strip()) return LinuxAdminConfig( user=user, password=password, source="db" if has_db_values else env_cfg.source, ) def upsert_linux_admin_settings( db: Session, *, user: str | None = None, password: str | None = None, ) -> LinuxAdminConfig: row = db.get(UiSettings, UI_SETTINGS_ROW_ID) env_cfg = _linux_admin_from_env() if row is None: row = UiSettings( id=UI_SETTINGS_ROW_ID, show_sidebar_system_stats=True, linux_admin_user=env_cfg.user or None, linux_admin_password=env_cfg.password or None, ) db.add(row) if user is not None and user.strip(): row.linux_admin_user = user.strip() if password is not None and password.strip(): row.linux_admin_password = password db.commit() db.refresh(row) return get_effective_linux_admin_config(db)