Files
tesm/srv/poe_manager/generate_ips.py
T
alientimandClaude Sonnet 5 06db4c1382 Switche: optionaler SSH-Port statt fest 22
- Neue Spalte switches.ssh_port (nullable INTEGER), Migration für
  bestehende DBs in _ensure_schema(), Feld in create_db.py ergänzt.
- Formular (Anlegen/Bearbeiten): optionales SSH-Port-Feld, Validierung
  1-65535, leer -> NULL (= Standard 22 überall, SWITCH_DEFAULT_SSH_PORT).
  Switch-Liste zeigt den effektiven Port inkl. "(Standard)"-Hinweis.
- generate_ips.py liefert den effektiven Port (Fallback 22) als eigenes
  Pipe-Feld an poe.sh; poe.sh übernimmt es in disable_poe/enable_poe und
  reicht es als "ssh -p <port>" an die expect-Skripte durch (Default
  weiterhin 22 falls Parameter fehlt).
- Web-Terminal (Verbindungstest) sendet den im Formular eingetragenen
  Port statt hartkodiert 22.
- Live getestet: gültiger/leerer/ungültiger Port beim Anlegen, korrekte
  Weitergabe durch generate_ips.py inkl. Feldreihenfolge, die poe.sh
'read' erwartet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 19:56:23 +02:00

61 lines
1.8 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, switches.ssh_port,
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_ssh_port = switch["ssh_port"] or 22
switch_user = switch["username"]
switch_pass = decrypt_password(switch["password"])
else:
switch_ip = switch["ip"] if switch else ""
switch_ssh_port = (switch["ssh_port"] if switch else None) or 22
switch_user = ""
switch_pass = ""
port = dev["port"] or ""
print(
f"{dev['rpi_ip']}|"
f"{dev['name']}|"
f"{switch_ip}|"
f"{switch_ssh_port}|"
f"{dev['switch_hostname'] or 'kein Switch'}|"
f"{port}|"
f"{switch_user}|"
f"{switch_pass}|"
f"{dev['mac']}"
)
if __name__ == "__main__":
generate_ips_list()