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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user