Erklärende Kommentare aus dem Code entfernt, in KNOWLEDGE_BASE.md überführt

Betrifft app.py, create_db.py, poe.sh sowie alle HTML-Templates mit
Kommentaren (Jinja {# #}, HTML <!-- -->, eingebettetes JavaScript //).
Docstrings bleiben unangetastet -- nur reine Kommentarzeilen/-fragmente
wurden entfernt, damit der Code selbst schlank bleibt, ohne die
dahinterliegende Begründung zu verlieren.

Umsetzung:
- app.py/create_db.py: per Pythons eigenem tokenize-Modul entfernt (sicher
  gegen '#' innerhalb von String-Literalen, Shebang-Zeile ausgenommen).
- poe.sh: manuell, da einzelne expect-Prompt-Strings ('expect "#"')
  ein literales '#' als Teil des Strings enthalten, kein Kommentar.
- Templates: {# #}/<!-- --> per Regex (eindeutige Delimiter, anschließend
  mit Jinja2s eigenem Parser validiert), echte // -JS-Kommentare manuell
  identifiziert (zwei Fundstellen mit '//' waren tatsächlich Code --
   als Protocol-relative-URL-Template-
  String -- und wurden bewusst nicht angefasst).

Verifiziert: alle Python-/Bash-/Jinja-Dateien syntaktisch weiterhin
gültig, live auf der Testbox deployt und alle 14 Kernrouten mit 200
bestätigt, keine Fehler im App-Log.
This commit is contained in:
2026-08-14 12:05:39 +02:00
parent bc360a0b7f
commit 33753e4f41
16 changed files with 551 additions and 1191 deletions
-50
View File
@@ -1,23 +1,9 @@
#!/bin/bash
# ============================================================================
# PoE Device Check Script
# - prüft Erreichbarkeit von Geräten
# - startet PoE-Port bei Ausfall neu
# - loggt Ereignisse
# ============================================================================
# Eine einzige, durchgehend fortgeschriebene Datei statt vorher bei jedem
# (auch täglich per tesm-check-restart.timer automatisch ausgelösten)
# Dienst-Neustart ein neues rpi-<timestamp>.log -- Rotation/Aufbewahrung
# übernimmt jetzt zentral logrotate (siehe app.py: _write_logrotate_config,
# einstellbar unter Systemeinstellungen → Logs), nicht mehr dieses Skript
# selbst. Pfad muss mit TESM_LOG_DIR/live.log in app.py übereinstimmen.
LOG_DIR="/var/log/tesm"
LOGFILE="$LOG_DIR/live.log"
mkdir -p "$LOG_DIR"
touch "$LOGFILE"
# Intervall aus DB abrufen
SLEEP=$(python3 - <<'END'
import sqlite3
conn = sqlite3.connect("/srv/tesm/sqlite.db")
@@ -29,21 +15,6 @@ END
SLEEP=${SLEEP:-300}
# disable_poe()/enable_poe(): bewusst OHNE expliziten "timeout { exit 1 }"/
# "eof { exit 1 }"-Abbruch in den einzelnen expect-Schritten -- ein nicht
# matchender Schritt laesst expect nach Ablauf von "set timeout 5" einfach
# zur naechsten Zeile weiterlaufen, statt abzubrechen. Das ist absichtlich
# so belassen: ein Versuch, hier "echte" Fehlererkennung nachzuruesten
# (Exit-Code 0 nur bei bestaetigtem Erfolg je Schritt), hat sich live als
# Regression herausgestellt. Grund: das Login-Prompt-Pattern
# "-re ".*> $"" unten matcht nur ein Operator-Prompt ("switchname>"). Auf
# ArubaOS-Switches, bei denen der SSH-Account (z.B. "admin") mit
# Manager-Rechten direkt im privilegierten Modus landet ("switchname#"
# statt "switchname>", bestaetigt an einem 2930M/"ST-2000-Sued"), matcht
# das Pattern nie -- mit einem harten Timeout-Abbruch waere das faelschlich
# als Fehlschlag gewertet worden, obwohl Passwort und Verbindung in
# Ordnung waren. Diese Funktionen hier sind daher wieder exakt auf den
# Stand der urspruenglichen, in Produktion bewaehrten Fassung zurueckgesetzt.
function disable_poe() {
local switch_ip=$1
local switch_port=$2
@@ -106,9 +77,6 @@ expect eof
EOF
}
# Ein Geräte-Check (Ping + ggf. PoE-Neustart) als eigene Funktion, damit sie
# sowohl vom manuellen Neustart (einzeln, synchron) als auch von der
# Hauptschleife (parallel im Hintergrund, siehe unten) verwendet werden kann.
function check_device() {
local rpi_ip=$1 dev_name=$2 switch_ip=$3 switch_ssh_port=$4
local switch_hostname=$5 switch_port=$6 switch_user=$7 switch_pass=$8
@@ -120,10 +88,6 @@ function check_device() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name ist nicht erreichbar!" >> "$LOGFILE"
# Nur PoE neu starten, wenn dem Gerät auch tatsächlich ein Switch
# zugeordnet ist (switch_ip) — ein reiner Port-Wert ohne Switch
# (switch_ip leer) darf keinen SSH-Versuch mit leeren
# Zugangsdaten auslösen.
if [ -z "$switch_ip" ] || [ -z "$switch_port" ] || [ "$switch_port" == "None" ]; then
return
fi
@@ -182,24 +146,10 @@ fi
while true; do
echo "--------------------------------------------------------------------" >> "$LOGFILE"
# Jedes Gerät wird als eigener Hintergrund-Job geprüft, statt strikt
# nacheinander in einer einzigen Schleife -- bei einer größeren
# Geräteliste (z.B. nach einem Import) hätte ein einzelnes bereits
# ausgefallenes Gerät mit langsamem/nicht erreichbarem Switch (jeder
# expect-Versuch bis zu ~5s Timeout je Verbindungsschritt) sonst die
# Prüfung ALLER nachfolgenden Geräte verzögert. "< <(...)" (Process
# Substitution) statt einer Pipe, damit die Hintergrund-Jobs Kinder
# dieser Shell bleiben und "wait" sie unten tatsächlich erfassen kann
# (bei "cmd | while ...; done" liefe die Schleife in einer eigenen
# Subshell, deren Hintergrund-Jobs von außen nicht mehr sichtbar wären).
while IFS='|' read -r rpi_ip dev_name switch_ip switch_ssh_port switch_hostname switch_port switch_user switch_pass mac; do
check_device "$rpi_ip" "$dev_name" "$switch_ip" "$switch_ssh_port" "$switch_hostname" "$switch_port" "$switch_user" "$switch_pass" &
done < <(python3 /srv/tesm/generate_ips.py)
# Auf alle in diesem Durchlauf gestarteten Geräte-Checks warten, bevor
# das Intervall abgewartet wird -- sonst könnten sich Durchläufe
# überlappen (z.B. mehrere parallele expect-Sitzungen zum selben
# Switch aus zwei verschiedenen, noch laufenden Zyklen gleichzeitig).
wait
sleep "$SLEEP"
done