Ein wirklich frisches Setup (create_db.py auf einer neuen Installation) erzeugte bislang nur den ALLERERSTEN Schema-Stand aus der Projektgeschichte -- alle seither per _ensure_schema()-Migration nachgerüsteten Spalten und Tabellen fehlten komplett, bis diese Migration beim ersten App-Start erfolgreich durchläuft. Live auf einem frisch installierten Produktivsystem ist genau das nicht passiert: "sqlite3.OperationalError: no such column: deleted_at" beim Dashboard-Aufruf, weil devices/switches/credentials/ users/groups ohne die Papierkorb-Spalte angelegt wurden. Fehlten außerdem komplett: dhcp_subnets, dhcp_manual_reservations, service_accounts, ldap_group_mappings (LDAP/DHCP-Funktionen wären auf einer solchen frischen Installation gar nicht nutzbar gewesen) sowie dhcp_option_defs.is_standard. - create_db.py jetzt deckungsgleich mit dem tatsächlichen, vollständig migrierten Schema (per .schema-Dump von einer produktiv laufenden Instanz verifiziert) -- category/deleted_at auf credentials, deleted_at auf switches, credential_id/ssh_port/deleted_at auf devices, deleted_at auf users/groups, is_standard auf dhcp_option_defs, plus die vier fehlenden Tabellen. - POE_DB_PATH → TESM_DB_PATH in create_db.py UND create_admin.py (weiteres übersehenes Namensrelikt aus der TESM-Umbenennung), Docstring von create_admin.py aktualisiert. - Live verifiziert: komplett frische DB erzeugt, App auf separatem Testport dagegen gestartet, alle wesentlichen Routen (Dashboard, Geräte, Switche, Zugangsdaten, Wartung, Papierkorb, Benutzer, Gruppen, alle Einstellungsseiten, Logs, Konto) liefern 200 ohne einen einzigen Fehler im App-Log -- eine frische Installation hängt jetzt an keiner Stelle mehr von der Laufzeit-Migration ab, um überhaupt benutzbar zu sein.
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Legt einen Admin-Benutzer in TESM an."""
|
|
import os
|
|
import sqlite3
|
|
from getpass import getpass
|
|
from flask_bcrypt import Bcrypt
|
|
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
DB_PATH = os.environ.get("TESM_DB_PATH", os.path.join(BASE_DIR, "sqlite.db"))
|
|
bcrypt = Bcrypt()
|
|
|
|
|
|
def main():
|
|
username = input("Admin-Benutzername: ").strip()
|
|
password = getpass("Passwort: ")
|
|
password_confirm = getpass("Passwort bestätigen: ")
|
|
|
|
if password != password_confirm:
|
|
print("Passwörter stimmen nicht überein!")
|
|
return
|
|
|
|
pw_hash = bcrypt.generate_password_hash(password).decode("utf-8")
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cur = conn.cursor()
|
|
try:
|
|
cur.execute(
|
|
"INSERT INTO users (username, password, is_admin) VALUES (?, ?, ?)",
|
|
(username, pw_hash, 1),
|
|
)
|
|
conn.commit()
|
|
print(f"Admin-Benutzer '{username}' erfolgreich angelegt.")
|
|
except sqlite3.IntegrityError:
|
|
print("Benutzername existiert bereits!")
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|