- Dashboard zeigt jetzt in beiden Zustaenden (mit/ohne Login) Kacheln statt Tabelle; ohne Login nur aktive Geraete + Online/Offline/Gesamt, eingeloggt alle Geraete + zusaetzliche Deaktiviert-Kachel - Sortierung ueberall: erst alle Nicht-Online-Geraete, dann Online, jeweils alphabetisch - Neue Rechte devices.view / switches.view; Standardgruppe 'Benutzer' wird automatisch angelegt (alle Ansichtsrechte) und jedem neuen Benutzer zugeordnet; bestehende Benutzer ohne Gruppe werden migriert - Gruppen-Seite zeigt zusaetzlich virtuelle 'Admin'-Karte (informativ) und markiert die Standardgruppe (nicht loeschbar) - 'Naechste Pruefung'-Countdown wird serverseitig aus dem tatsaechlichen letzten Log-Eintrag geseedet statt bei jedem Reload neu zu starten - Deployment-Doku korrigiert: Checkout getrennt von /srv/poe_manager, damit kein verschachteltes srv/poe_manager/srv/poe_manager entsteht Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""Initialisiert die SQLite-Datenbank für den PoE Manager."""
|
|
import os
|
|
import sqlite3
|
|
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
DB_PATH = os.environ.get("POE_DB_PATH", os.path.join(BASE_DIR, "sqlite.db"))
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
c = conn.cursor()
|
|
|
|
# Switches (Aruba-Switche mit SSH-Zugangsdaten; Passwort wird verschlüsselt gespeichert)
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS switches (
|
|
hostname TEXT PRIMARY KEY,
|
|
ip TEXT NOT NULL,
|
|
username TEXT NOT NULL,
|
|
password TEXT NOT NULL
|
|
);
|
|
""")
|
|
|
|
# Devices
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS devices (
|
|
mac TEXT PRIMARY KEY,
|
|
rpi_ip TEXT NOT NULL,
|
|
switch_hostname TEXT,
|
|
port TEXT,
|
|
name TEXT NOT NULL,
|
|
is_active INTEGER DEFAULT 1,
|
|
FOREIGN KEY (switch_hostname) REFERENCES switches(hostname)
|
|
);
|
|
""")
|
|
|
|
# Benutzer
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password TEXT NOT NULL,
|
|
is_admin INTEGER DEFAULT 0
|
|
);
|
|
""")
|
|
|
|
# Gruppen (Rechtesystem) — Admins besitzen ohnehin alle Rechte; Gruppen
|
|
# dienen dazu, normalen Benutzern gezielt einzelne Verwaltungsrechte für
|
|
# Devices/Switches zu geben, ohne sie zu Admins zu machen.
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS groups (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT UNIQUE NOT NULL,
|
|
is_default INTEGER DEFAULT 0
|
|
);
|
|
""")
|
|
|
|
# Welche Berechtigungen eine Gruppe gewährt (siehe app.py: PERMISSIONS)
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS group_permissions (
|
|
group_id INTEGER NOT NULL,
|
|
permission TEXT NOT NULL,
|
|
PRIMARY KEY (group_id, permission),
|
|
FOREIGN KEY (group_id) REFERENCES groups(id)
|
|
);
|
|
""")
|
|
|
|
# Gruppenmitgliedschaft (ein Benutzer kann in mehreren Gruppen sein;
|
|
# effektive Rechte = Vereinigung aller Gruppen)
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS user_groups (
|
|
user_id INTEGER NOT NULL,
|
|
group_id INTEGER NOT NULL,
|
|
PRIMARY KEY (user_id, group_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id),
|
|
FOREIGN KEY (group_id) REFERENCES groups(id)
|
|
);
|
|
""")
|
|
|
|
# Settings (z.B. Prüfintervall)
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL
|
|
);
|
|
""")
|
|
|
|
# Standard-Setting: Prüfintervall 5 Minuten (interval = Minuten, check_interval = Sekunden)
|
|
c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)", ("interval", "5"))
|
|
c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)", ("check_interval", "300"))
|
|
|
|
# Standardgruppe 'Benutzer' mit allen Ansichtsrechten — jeder neu angelegte
|
|
# (nicht-admin) Benutzer landet automatisch darin (siehe app.py: users()).
|
|
cur = c.execute("INSERT OR IGNORE INTO groups (name, is_default) VALUES (?, 1)", ("Benutzer",))
|
|
if cur.rowcount > 0:
|
|
default_group_id = cur.lastrowid
|
|
c.executemany(
|
|
"INSERT OR IGNORE INTO group_permissions (group_id, permission) VALUES (?, ?)",
|
|
[(default_group_id, "devices.view"), (default_group_id, "switches.view")],
|
|
)
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
print(f"Datenbank '{DB_PATH}' wurde initialisiert inklusive Settings.")
|