Files
tesm/srv/poe_manager/generate_ips.py
T
alientimandClaude Sonnet 5 fa6bb2935f Zugangsdaten-Entitaet, Gruppen-Tabelle mit Aufklappansicht, Vor-/Nachname, Dashboard-Sektionen
- Zugangsdaten (SSH-Logins) als eigenstaendige, wiederverwendbare Entitaet
  statt direkt am Switch; inline Neuanlage beim Switch-Erstellen moeglich;
  automatische Migration bestehender Switch-Logins
- Gruppen-Seite als Tabelle mit Aufklapp-Zeile fuer Rechte (Akkordeon),
  Admin als feste Systemzeile (Mitgliederverwaltung ueber is_admin),
  Standardgruppe 'Benutzer' mit allen Ansichtsrechten (devices.view,
  switches.view), automatische Zuordnung neuer/verwaister Benutzer
- Users-Seite: Icon-Buttons statt Text, Bearbeiten+Passwortaenderung in
  einem Modal zusammengefuehrt, Gruppe/Admin-Zuweisung ueber eigenen
  Zuweisen-Button (wie Switch-Zuordnung bei Devices), Vor-/Nachname
- Dashboard: einheitliche Kachelansicht mit/ohne Login, drei sortierte
  Abschnitte (Offline/Online/Deaktiviert), Kachel-Suchfilter, Bootstrap-
  artiges Grid (max. 6 Spalten), Aktivieren-Option im Popup fuer
  deaktivierte Geraete, Countdown serverseitig korrekt geseedet
- Sidebar dauerhaft einklappbar (Desktop, persistent via localStorage)
- Devices-Tabelle: Aktions-Buttons nebeneinander statt untereinander

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 13:30:47 +02:00

58 lines
1.6 KiB
Python

#!/usr/bin/env python3
"""
Gibt pipe-getrennt die Zugangsdaten aller aktiven Geräte + ihrer Switche aus.
Wird von poe.sh (Bash) konsumiert, um Erreichbarkeit zu prüfen und im
Fehlerfall den PoE-Port neu zu starten.
"""
import sqlite3
from app import decrypt_password, DB_PATH
def generate_ips_list():
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
switches = {
row["hostname"]: row
for row in conn.execute("""
SELECT switches.hostname, switches.ip,
credentials.username AS username, credentials.password AS password
FROM switches
LEFT JOIN credentials ON credentials.id = switches.credential_id
""")
}
devices = conn.execute("""
SELECT mac, rpi_ip, port, name, switch_hostname
FROM devices
WHERE is_active=1
""").fetchall()
conn.close()
for dev in devices:
switch = switches.get(dev["switch_hostname"])
if switch and switch["password"]:
switch_ip = switch["ip"]
switch_user = switch["username"]
switch_pass = decrypt_password(switch["password"])
else:
switch_ip = switch["ip"] if switch else ""
switch_user = ""
switch_pass = ""
port = dev["port"] or ""
print(
f"{dev['rpi_ip']}|"
f"{dev['name']}|"
f"{switch_ip}|"
f"{dev['switch_hostname'] or 'kein Switch'}|"
f"{port}|"
f"{switch_user}|"
f"{switch_pass}|"
f"{dev['mac']}"
)
if __name__ == "__main__":
generate_ips_list()