Compare commits

..

12 Commits

Author SHA1 Message Date
609e116911 Merge pull request 'dev' (#4) from dev into main
Reviewed-on: #4
2025-10-12 17:45:58 +02:00
579f3f70b9 revert 9344690a31
revert srv/poe_manager/templates/devices.html aktualisiert
2025-10-12 17:42:58 +02:00
9344690a31 srv/poe_manager/templates/devices.html aktualisiert 2025-10-12 17:41:09 +02:00
1b74609d1b Merge pull request 'dev' (#3) from dev into main
Reviewed-on: #3
2025-10-12 17:38:39 +02:00
5b33e2d656 Merge pull request 'dev' (#2) from dev into main
Reviewed-on: #2
2025-10-12 17:19:37 +02:00
3b7acfbac1 revert a09454211b
revert srv/poe_manager/templates/index.html aktualisiert
2025-10-12 17:19:29 +02:00
a09454211b srv/poe_manager/templates/index.html aktualisiert 2025-10-12 17:00:15 +02:00
ba11861336 Merge pull request 'dev' (#1) from dev into main
Reviewed-on: #1
2025-10-12 13:44:14 +02:00
df000eace9 revert 74617a1e0f
revert srv/poe_manager/templates/switche.html aktualisiert
2025-10-07 18:19:42 +02:00
74617a1e0f srv/poe_manager/templates/switche.html aktualisiert 2025-10-07 18:17:58 +02:00
bc80b5fcf1 srv/poe_manager/create_db.py aktualisiert 2025-09-30 19:11:09 +02:00
0c82ce6100 srv/poe_manager/create_db.py aktualisiert 2025-09-30 19:10:13 +02:00
4 changed files with 41 additions and 83 deletions

View File

@@ -4,7 +4,6 @@ from flask_login import LoginManager, login_user, login_required, logout_user, U
from flask_bcrypt import Bcrypt
from cryptography.fernet import Fernet
from datetime import datetime
from collections import defaultdict
import sqlite3, glob, os, re
app = Flask(__name__)
@@ -119,13 +118,6 @@ def index():
c.execute("SELECT mac, name, is_active FROM devices ORDER BY name ASC")
devices = c.fetchall()
devices = sorted(devices, key=lambda d: d[1][0].upper())
grouped_devices = defaultdict(list)
for d in devices:
first_letter = d[1][:2].upper()
grouped_devices[first_letter].append(d)
# Intervall aus DB laden
c.execute("SELECT value FROM settings WHERE key='interval'")
row = c.fetchone()
@@ -159,7 +151,7 @@ def index():
else:
status_dict[dev[0]] = "unbekannt"
return render_template("index.html", grouped_devices=grouped_devices, devices=devices, status=status_dict, last_seen=last_seen_dict, interval=interval)
return render_template("index.html", devices=devices, status=status_dict, last_seen=last_seen_dict, interval=interval)
@app.route("/settings", methods=["GET", "POST"])
@login_required

View File

@@ -87,33 +87,25 @@ pre {
#log-container {
position: relative;
height: calc(100vh - 252px); /* Füllt die Seite minus Header */
padding: 1rem; /* optional, Abstand innen */
box-sizing: border-box; /* damit Padding nicht die Höhe sprengt */
display: flex;
flex-direction: column;
height: calc(100vh - 150px); /* Füllt die Seite minus Header */
}
#log-box {
flex: 1 1 auto; /* füllt den Container, berücksichtigt Header/Padding */
height: 97%;
overflow: auto;
white-space: pre-wrap;
font-family: monospace;
border: 1px solid #dee2e6;
border: 1px solid #dee2e6; /* Bootstrap-like border */
padding: 1rem;
background-color: #f8f9fa;
padding: 0.5rem;
}
#refresh-timer {
position: absolute;
bottom: 18px;
right: 30px;
bottom: 10px;
right: 10px;
font-size: 0.9em;
color: gray;
background-color: rgba(255,255,255,0.7); /* optional, besser lesbar */
padding: 2px 4px;
border-radius: 3px;
pointer-events: none; /* damit Scrollbar nicht blockiert wird */
}
/* Tabelle anpassen */

View File

@@ -7,11 +7,9 @@
Nächste Prüfung in -- Sekunden
</span>
</h2>
<div class="row g-3">
{% for letter, group in grouped_devices.items() %}
<div class="row g-3">
{% for d in group %}
<div class="col-6 col-md-4 col-lg-3 col-xl-2">
<div class="row row-cols-1 row-cols-md-6 g-3">
{% for d in devices %}
<div class="col">
<div class="card text-center p-2"
{% if last_seen.get(d[0]) %}
title="{{ last_seen[d[0]] }}"
@@ -36,8 +34,6 @@
</div>
{% endfor %}
</div>
{% endfor %}
</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const intervalMinutes = {{ interval | int }}; // aus DB

View File

@@ -87,26 +87,15 @@ EOF
echo "" > "$LOGFILE"
MAX_PARALLEL=10 # maximal gleichzeitig laufende Geräte
while true; do
echo "--------------------------------------------------------------------" >> "$LOGFILE"
python3 /srv/poe_manager/generate_ips.py | while IFS=: read -r rpi_ip dev_name switch_ip switch_hostname switch_port switch_user switch_pass; do
# Funktion für ein Gerät
check_device() {
local rpi_ip="$1"
local dev_name="$2"
local switch_ip="$3"
local switch_hostname="$4"
local switch_port="$5"
local switch_user="$6"
local switch_pass="$7"
if ping -c 4 -W 1 "$rpi_ip" &> /dev/null; then
if ping -c 1 -W 2 "$rpi_ip" &> /dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name ist erreichbar!" >> "$LOGFILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name ist nicht erreichbar!" >> "$LOGFILE"
# Nur PoE neu starten, wenn Port vorhanden ist
if [ -n "$switch_port" ] && [ "$switch_port" != "None" ]; then
disable_poe "$switch_ip" "$switch_port" "$switch_user" "$switch_pass"
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name PoE auf Port $switch_port am Switch $switch_hostname deaktiviert." >> "$LOGFILE"
@@ -115,17 +104,6 @@ while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name PoE auf Port $switch_port am Switch $switch_hostname aktiviert." >> "$LOGFILE"
fi
fi
}
# Job in Hintergrund starten
check_device "$rpi_ip" "$dev_name" "$switch_ip" "$switch_hostname" "$switch_port" "$switch_user" "$switch_pass" &
# Limit auf MAX_PARALLEL Jobs
while [ "$(jobs -rp | wc -l)" -ge "$MAX_PARALLEL" ]; do
sleep 0.2
done
done
wait # alle Hintergrundjobs beenden, bevor sleep
sleep "$SLEEP"
done