9883e6aab3
Allow host-level login/password for home/workgroup PCs while keeping global domain admins in Settings.
97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
"""Effective Linux SSH admin credentials (host → DB → env)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.config import get_settings
|
|
from app.models.host import Host
|
|
from app.models.ui_settings import UI_SETTINGS_ROW_ID, UiSettings
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class LinuxAdminConfig:
|
|
user: str
|
|
password: str
|
|
source: str # host | 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)
|
|
|
|
|
|
def get_effective_linux_admin_for_host(db: Session, host: Host) -> LinuxAdminConfig:
|
|
"""Prefer per-host mgmt_* when both user and password are set; else global Settings/env."""
|
|
host_user = (host.mgmt_user or "").strip()
|
|
host_password = (host.mgmt_password or "").strip()
|
|
if host_user and host_password:
|
|
return LinuxAdminConfig(user=host_user, password=host_password, source="host")
|
|
|
|
global_cfg = get_effective_linux_admin_config(db)
|
|
if host_user and global_cfg.password.strip():
|
|
return LinuxAdminConfig(user=host_user, password=global_cfg.password, source="host")
|
|
return global_cfg
|