45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
"""First-run seeding. Creates the default ``admin`` / ``admin`` account when
|
|
``radadmin_admins`` is empty, forcing a password change on first login.
|
|
Idempotent: once any admin exists this does nothing.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from sqlalchemy import func, select
|
|
|
|
from . import auth
|
|
from .database import SessionLocal
|
|
from .models import Admin
|
|
|
|
log = logging.getLogger("uvicorn.error")
|
|
|
|
DEFAULT_USERNAME = "admin"
|
|
DEFAULT_PASSWORD = "admin"
|
|
|
|
|
|
def seed_default_admin() -> None:
|
|
db = SessionLocal()
|
|
try:
|
|
count = db.execute(select(func.count()).select_from(Admin)).scalar_one()
|
|
if count:
|
|
return
|
|
db.add(
|
|
Admin(
|
|
username=DEFAULT_USERNAME,
|
|
password_hash=auth.hash_password(DEFAULT_PASSWORD),
|
|
is_admin=True,
|
|
must_change_password=True,
|
|
)
|
|
)
|
|
db.commit()
|
|
log.warning(
|
|
"Seeded default admin account '%s' / '%s' — change this password on first login.",
|
|
DEFAULT_USERNAME,
|
|
DEFAULT_PASSWORD,
|
|
)
|
|
except Exception as exc: # never block startup on a seeding hiccup
|
|
db.rollback()
|
|
log.error("Could not seed default admin: %s", exc)
|
|
finally:
|
|
db.close()
|