#!/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() # Zugangsdaten (wiederverwendbare SSH-Logins, mehrere Switche können sich # dieselben teilen; Passwort wird verschlüsselt gespeichert) c.execute(""" CREATE TABLE IF NOT EXISTS credentials ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL ); """) # Switches (Aruba-Switche) — referenzieren ihre Zugangsdaten statt sie # direkt zu speichern c.execute(""" CREATE TABLE IF NOT EXISTS switches ( hostname TEXT PRIMARY KEY, ip TEXT NOT NULL, credential_id INTEGER, FOREIGN KEY (credential_id) REFERENCES credentials(id) ); """) # 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, first_name TEXT, last_name TEXT ); """) # 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.")