Compare commits
49 Commits
3b7acfbac1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cfbec22590 | |||
| 3eb78b46a7 | |||
| 609e116911 | |||
| 681888a36a | |||
| e8df4f937b | |||
| 29823bb4ef | |||
| a2920a98bd | |||
| 579f3f70b9 | |||
| 9344690a31 | |||
| 1b74609d1b | |||
| 7f0871fa64 | |||
| 5ae38a9e20 | |||
| de23b132ed | |||
| 746972e321 | |||
| dfba8789a7 | |||
| 194e3cfbf9 | |||
| 5b33e2d656 | |||
| 4e10fe8ac0 | |||
| 7ae131b5f4 | |||
| 09ee8c245e | |||
| bb07a598d7 | |||
| 4ef10fc39d | |||
| d73fda1935 | |||
| ad9dfcee7a | |||
| 4ae255b67f | |||
| aa2895ccf5 | |||
| 7c81f3a299 | |||
| cef96cd7cd | |||
| b4cc41c272 | |||
| 0d784a0530 | |||
| 34ef2c4e2a | |||
| a26a91ec5a | |||
| ef548b9532 | |||
| 466f3615ed | |||
| 3dc554e165 | |||
| 78ed058d69 | |||
| d3f209941b | |||
| 9f98d240ca | |||
| d88135fc12 | |||
| 34eae3ca9d | |||
| f05936226d | |||
| d6c15d3d49 | |||
| 7a1e9d88e5 | |||
| 2f1c7b5653 | |||
| d1e43a1220 | |||
| fe921254c8 | |||
| f27e73ae72 | |||
| 63b8e33434 | |||
| ad09b4f6a2 |
@@ -3,8 +3,8 @@ from flask import Flask, render_template, request, redirect, url_for, flash
|
|||||||
from flask_login import LoginManager, login_user, login_required, logout_user, UserMixin, current_user
|
from flask_login import LoginManager, login_user, login_required, logout_user, UserMixin, current_user
|
||||||
from flask_bcrypt import Bcrypt
|
from flask_bcrypt import Bcrypt
|
||||||
from cryptography.fernet import Fernet
|
from cryptography.fernet import Fernet
|
||||||
import sqlite3
|
from datetime import datetime
|
||||||
import glob, os, re
|
import sqlite3, glob, os, re
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.secret_key = "309cc4d5ce1fe7486ae25cbd232bbdfe6a72539c03f0127d372186dbdc0fc928"
|
app.secret_key = "309cc4d5ce1fe7486ae25cbd232bbdfe6a72539c03f0127d372186dbdc0fc928"
|
||||||
@@ -81,6 +81,34 @@ def logout():
|
|||||||
logout_user()
|
logout_user()
|
||||||
return redirect(url_for('login'))
|
return redirect(url_for('login'))
|
||||||
|
|
||||||
|
def get_last_seen(dev_name: str):
|
||||||
|
"""Letztes Mal, dass ein Gerät erreichbar war."""
|
||||||
|
log_files = glob.glob("/var/log/rpi-*.log")
|
||||||
|
if not log_files:
|
||||||
|
return None
|
||||||
|
|
||||||
|
latest_time = None
|
||||||
|
|
||||||
|
# alle Logs durchgehen
|
||||||
|
for logfile in sorted(log_files):
|
||||||
|
with open(logfile, "r") as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if f"{dev_name} ist erreichbar!" in line:
|
||||||
|
try:
|
||||||
|
ts_str = line.split(" ")[0] + " " + line.split(" ")[1] # "YYYY-MM-DD HH:MM:SS"
|
||||||
|
ts = datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S")
|
||||||
|
if latest_time is None or ts > latest_time:
|
||||||
|
latest_time = ts
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if latest_time:
|
||||||
|
datetime_str = latest_time.strftime("Zuletzt Online am %d.%m.%Y um %H:%M Uhr")
|
||||||
|
return f"{datetime_str}"
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
@login_required
|
@login_required
|
||||||
def index():
|
def index():
|
||||||
@@ -90,26 +118,40 @@ def index():
|
|||||||
c.execute("SELECT mac, name, is_active FROM devices ORDER BY name ASC")
|
c.execute("SELECT mac, name, is_active FROM devices ORDER BY name ASC")
|
||||||
devices = c.fetchall()
|
devices = c.fetchall()
|
||||||
|
|
||||||
# Intervall aus DB (Minuten) laden
|
# Intervall aus DB laden
|
||||||
c.execute("SELECT value FROM settings WHERE key='interval'")
|
c.execute("SELECT value FROM settings WHERE key='interval'")
|
||||||
row = c.fetchone()
|
row = c.fetchone()
|
||||||
interval = int(row[0]) if row else 5 # Default 5 Minuten
|
interval = int(row[0]) if row else 5
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
# Status aus letztem Log ermitteln
|
# Status aus Logdateien ermitteln
|
||||||
import glob, os
|
|
||||||
log_files = glob.glob("/var/log/rpi-*.log")
|
log_files = glob.glob("/var/log/rpi-*.log")
|
||||||
status_dict = {}
|
status_dict = {}
|
||||||
|
last_seen_dict = {}
|
||||||
|
|
||||||
if log_files:
|
if log_files:
|
||||||
latest_log = max(log_files, key=os.path.getctime)
|
latest_log = max(log_files, key=os.path.getctime)
|
||||||
with open(latest_log, "r") as f:
|
with open(latest_log, "r") as f:
|
||||||
for line in f:
|
lines = f.readlines()
|
||||||
for dev in devices:
|
|
||||||
if dev[1] in line:
|
|
||||||
status_dict[dev[0]] = "online" if "erreichbar" in line else "offline"
|
|
||||||
|
|
||||||
# Template rendern mit Devices, Status und Intervall
|
for dev in devices:
|
||||||
return render_template("index.html", devices=devices, status=status_dict, interval=interval)
|
last_status = None
|
||||||
|
for line in reversed(lines):
|
||||||
|
if f"{dev[1]} ist erreichbar!" in line:
|
||||||
|
last_status = "online"
|
||||||
|
break
|
||||||
|
elif f"{dev[1]} ist nicht erreichbar!" in line:
|
||||||
|
last_status = "offline"
|
||||||
|
break
|
||||||
|
|
||||||
|
if last_status:
|
||||||
|
status_dict[dev[0]] = last_status
|
||||||
|
if last_status == "offline":
|
||||||
|
last_seen_dict[dev[0]] = get_last_seen(dev[1])
|
||||||
|
else:
|
||||||
|
status_dict[dev[0]] = "unbekannt"
|
||||||
|
|
||||||
|
return render_template("index.html", devices=devices, status=status_dict, last_seen=last_seen_dict, interval=interval)
|
||||||
|
|
||||||
@app.route("/settings", methods=["GET", "POST"])
|
@app.route("/settings", methods=["GET", "POST"])
|
||||||
@login_required
|
@login_required
|
||||||
@@ -179,7 +221,7 @@ def devices():
|
|||||||
switch_hostname = request.form.get('switch_hostname')
|
switch_hostname = request.form.get('switch_hostname')
|
||||||
is_active = 1 if 'is_active' in request.form else 0
|
is_active = 1 if 'is_active' in request.form else 0
|
||||||
|
|
||||||
if not all([mac, rpi_ip, port, name, switch_hostname]):
|
if not all([mac, rpi_ip, name]):
|
||||||
flash("Alle Felder müssen ausgefüllt sein!")
|
flash("Alle Felder müssen ausgefüllt sein!")
|
||||||
return redirect(url_for('devices'))
|
return redirect(url_for('devices'))
|
||||||
|
|
||||||
@@ -216,22 +258,22 @@ def devices():
|
|||||||
old_mac = request.form.get('old_mac')
|
old_mac = request.form.get('old_mac')
|
||||||
mac = request.form.get('mac')
|
mac = request.form.get('mac')
|
||||||
rpi_ip = request.form.get('rpi_ip')
|
rpi_ip = request.form.get('rpi_ip')
|
||||||
port = request.form.get('port')
|
port = request.form.get('port') or None
|
||||||
name = request.form.get('name')
|
name = request.form.get('name')
|
||||||
switch_hostname = request.form.get('switch_hostname') or None
|
switch_hostname = request.form.get('switch_hostname') or None
|
||||||
is_active = 1 if 'is_active' in request.form else 0
|
is_active = 1 if 'is_active' in request.form else 0
|
||||||
|
|
||||||
# --- Prüfen, ob es sich um eine Switch-Änderung handelt ---
|
# --- Nur Switch ändern ---
|
||||||
if mac is None and rpi_ip is None and port is None and name is None and switch_hostname:
|
# Prüfen, ob nur das Switch-Feld gesendet wurde und die anderen Felder leer sind
|
||||||
# Nur den Switch ändern
|
if 'switch_hostname' in request.form and all(not f for f in [mac, rpi_ip, name]):
|
||||||
device = conn.execute("SELECT name, switch_hostname FROM devices WHERE mac=?", (old_mac,)).fetchone()
|
device = conn.execute("SELECT name, switch_hostname FROM devices WHERE mac=?", (old_mac,)).fetchone()
|
||||||
|
|
||||||
if not device:
|
if not device:
|
||||||
flash("Gerät nicht gefunden!")
|
flash("Gerät nicht gefunden!")
|
||||||
return redirect(url_for('devices'))
|
return redirect(url_for('devices'))
|
||||||
|
|
||||||
old_switch = device['switch_hostname'] or "unbekannt"
|
old_switch = device['switch_hostname'] or "unbekannt"
|
||||||
device_name = device['name']
|
device_name = device['name']
|
||||||
|
switch_hostname = request.form.get('switch_hostname') or ""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
conn.execute("""
|
conn.execute("""
|
||||||
@@ -240,27 +282,36 @@ def devices():
|
|||||||
WHERE mac=?
|
WHERE mac=?
|
||||||
""", (switch_hostname, old_mac))
|
""", (switch_hostname, old_mac))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
flash(f"Switch von {device_name} geändert: {old_switch} → {switch_hostname}")
|
flash(f"Switch von {device_name} geändert: {old_switch} → {switch_hostname or 'Kein Switch'}")
|
||||||
except sqlite3.IntegrityError:
|
except sqlite3.IntegrityError:
|
||||||
flash("Fehler beim Ändern des Switch!")
|
flash("Fehler beim Ändern des Switch!")
|
||||||
return redirect(url_for('devices'))
|
return redirect(url_for('devices'))
|
||||||
|
|
||||||
if not all([old_mac, mac, rpi_ip, port, name]):
|
# --- Normales Gerät bearbeiten ---
|
||||||
flash("Alle Felder müssen ausgefüllt sein!")
|
# Pflichtfelder prüfen
|
||||||
|
if not all([old_mac, mac, rpi_ip, name]):
|
||||||
|
flash("Felder 'MAC', 'IP' und 'Name' müssen ausgefüllt sein!")
|
||||||
return redirect(url_for('devices'))
|
return redirect(url_for('devices'))
|
||||||
|
|
||||||
# Prüfen auf doppelte IP außer das aktuelle Gerät
|
# Prüfen auf doppelte IP außer das aktuelle Gerät
|
||||||
ip_device = conn.execute("SELECT name FROM devices WHERE rpi_ip=? AND mac<>?", (rpi_ip, old_mac)).fetchone()
|
ip_device = conn.execute(
|
||||||
|
"SELECT name FROM devices WHERE rpi_ip=? AND mac<>?",
|
||||||
|
(rpi_ip, old_mac)
|
||||||
|
).fetchone()
|
||||||
if ip_device:
|
if ip_device:
|
||||||
flash(f"IP-Adresse existiert bereits für Gerät '{ip_device['name']}'!")
|
flash(f"IP-Adresse existiert bereits für Gerät '{ip_device['name']}'!")
|
||||||
return redirect(url_for('devices'))
|
return redirect(url_for('devices'))
|
||||||
|
|
||||||
# Prüfen auf doppelte MAC außer das aktuelle Gerät
|
# Prüfen auf doppelte MAC außer das aktuelle Gerät
|
||||||
mac_device = conn.execute("SELECT name FROM devices WHERE mac=? AND mac<>?", (mac, old_mac)).fetchone()
|
mac_device = conn.execute(
|
||||||
|
"SELECT name FROM devices WHERE mac=? AND mac<>?",
|
||||||
|
(mac, old_mac)
|
||||||
|
).fetchone()
|
||||||
if mac_device:
|
if mac_device:
|
||||||
flash(f"MAC-Adresse existiert bereits für Gerät '{mac_device['name']}'!")
|
flash(f"MAC-Adresse existiert bereits für Gerät '{mac_device['name']}'!")
|
||||||
return redirect(url_for('devices'))
|
return redirect(url_for('devices'))
|
||||||
|
|
||||||
|
# Update durchführen
|
||||||
try:
|
try:
|
||||||
conn.execute("""
|
conn.execute("""
|
||||||
UPDATE devices
|
UPDATE devices
|
||||||
@@ -272,6 +323,7 @@ def devices():
|
|||||||
except sqlite3.IntegrityError:
|
except sqlite3.IntegrityError:
|
||||||
flash("Fehler beim Aktualisieren des Geräts!")
|
flash("Fehler beim Aktualisieren des Geräts!")
|
||||||
|
|
||||||
|
|
||||||
# -----------------------
|
# -----------------------
|
||||||
# Gerät löschen
|
# Gerät löschen
|
||||||
# -----------------------
|
# -----------------------
|
||||||
@@ -300,7 +352,7 @@ def devices():
|
|||||||
switches.hostname AS switch_hostname
|
switches.hostname AS switch_hostname
|
||||||
FROM devices
|
FROM devices
|
||||||
LEFT JOIN switches ON devices.switch_hostname = switches.hostname
|
LEFT JOIN switches ON devices.switch_hostname = switches.hostname
|
||||||
ORDER BY switches.hostname ASC
|
ORDER BY switches.hostname ASC, devices.name ASC
|
||||||
""").fetchall()
|
""").fetchall()
|
||||||
|
|
||||||
conn.close()
|
conn.close()
|
||||||
@@ -434,36 +486,43 @@ def logs():
|
|||||||
return render_template('logs.html', log_content=log_content, log_name=os.path.basename(latest_log), interval=interval)
|
return render_template('logs.html', log_content=log_content, log_name=os.path.basename(latest_log), interval=interval)
|
||||||
|
|
||||||
def load_device_status():
|
def load_device_status():
|
||||||
"""
|
|
||||||
Liest das aktuellste rpi-Logfile und extrahiert den letzten Status jedes Devices.
|
|
||||||
Gibt ein Dictionary zurück: {Device-Name: 'online'/'offline'}
|
|
||||||
"""
|
|
||||||
status = {}
|
status = {}
|
||||||
|
|
||||||
|
# Devices aus DB laden (Name → MAC)
|
||||||
|
conn = sqlite3.connect("sqlite.db")
|
||||||
|
conn.row_factory = sqlite3.Row
|
||||||
|
devices = conn.execute("SELECT mac, name FROM devices").fetchall()
|
||||||
|
name_to_mac = {d['name']: d['mac'] for d in devices}
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
# Logfile
|
||||||
log_files = glob.glob("/var/log/rpi-*.log")
|
log_files = glob.glob("/var/log/rpi-*.log")
|
||||||
if not log_files:
|
if not log_files:
|
||||||
return status
|
return status
|
||||||
|
|
||||||
latest_log = max(log_files, key=os.path.getctime)
|
latest_log = max(log_files, key=os.path.getctime)
|
||||||
|
|
||||||
# Jede Zeile des Logs lesen
|
|
||||||
with open(latest_log, "r") as f:
|
|
||||||
lines = f.readlines()
|
|
||||||
|
|
||||||
# Regex für Ping-Ergebnisse
|
|
||||||
online_re = re.compile(r"(\S+) ist erreichbar!")
|
online_re = re.compile(r"(\S+) ist erreichbar!")
|
||||||
offline_re = re.compile(r"(\S+) ist nicht erreichbar!")
|
offline_re = re.compile(r"(\S+) ist nicht erreichbar!")
|
||||||
|
|
||||||
for line in lines:
|
with open(latest_log, "r") as f:
|
||||||
|
for line in f:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
m_online = online_re.search(line)
|
m_online = online_re.search(line)
|
||||||
m_offline = offline_re.search(line)
|
m_offline = offline_re.search(line)
|
||||||
if m_online:
|
if m_online:
|
||||||
status[m_online.group(1)] = 'online'
|
name = m_online.group(1)
|
||||||
|
mac = name_to_mac.get(name)
|
||||||
|
if mac:
|
||||||
|
status[mac] = 'online'
|
||||||
elif m_offline:
|
elif m_offline:
|
||||||
status[m_offline.group(1)] = 'offline'
|
name = m_offline.group(1)
|
||||||
|
mac = name_to_mac.get(name)
|
||||||
|
if mac:
|
||||||
|
status[mac] = 'offline'
|
||||||
|
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
|
||||||
@app.route("/users", methods=["GET", "POST"])
|
@app.route("/users", methods=["GET", "POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def users():
|
def users():
|
||||||
|
|||||||
@@ -6,7 +6,10 @@ def generate_ips_list():
|
|||||||
conn = sqlite3.connect(DB_PATH)
|
conn = sqlite3.connect(DB_PATH)
|
||||||
conn.row_factory = sqlite3.Row
|
conn.row_factory = sqlite3.Row
|
||||||
|
|
||||||
switches = {row['hostname']: row for row in conn.execute("SELECT hostname, ip, username, password FROM switches")}
|
switches = {row['hostname']: row for row in conn.execute(
|
||||||
|
"SELECT hostname, ip, username, password FROM switches"
|
||||||
|
)}
|
||||||
|
|
||||||
devices = conn.execute("""
|
devices = conn.execute("""
|
||||||
SELECT mac, rpi_ip, port, name, switch_hostname
|
SELECT mac, rpi_ip, port, name, switch_hostname
|
||||||
FROM devices
|
FROM devices
|
||||||
@@ -16,11 +19,17 @@ def generate_ips_list():
|
|||||||
|
|
||||||
for dev in devices:
|
for dev in devices:
|
||||||
switch = switches.get(dev['switch_hostname'])
|
switch = switches.get(dev['switch_hostname'])
|
||||||
if not switch:
|
if switch:
|
||||||
continue
|
switch_ip = switch['ip']
|
||||||
password = decrypt_password(switch['password'])
|
switch_user = switch['username']
|
||||||
|
switch_pass = decrypt_password(switch['password'])
|
||||||
|
else:
|
||||||
|
switch_ip = ""
|
||||||
|
switch_user = ""
|
||||||
|
switch_pass = ""
|
||||||
|
|
||||||
port = dev['port'] or ""
|
port = dev['port'] or ""
|
||||||
print(f"{dev['rpi_ip']}:{dev['name']}:{switch['ip']}:{switch['hostname']}:{port}:{switch['username']}:{password}")
|
print(f"{dev['rpi_ip']}:{dev['name']}:{switch_ip}:{dev['switch_hostname'] or 'kein Switch'}:{port}:{switch_user}:{switch_pass}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
generate_ips_list()
|
generate_ips_list()
|
||||||
|
|||||||
Binary file not shown.
@@ -8,7 +8,7 @@
|
|||||||
<button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#deviceModal" onclick="openDeviceModal()">Neues Gerät hinzufügen</button>
|
<button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#deviceModal" onclick="openDeviceModal()">Neues Gerät hinzufügen</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<table class="table table-bordered">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Hostname</th>
|
<th>Hostname</th>
|
||||||
@@ -89,11 +89,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>Port</label>
|
<label>Port</label>
|
||||||
<input type="text" name="port" class="form-control" required placeholder="z.B. 3">
|
<input type="text" name="port" class="form-control" placeholder="z.B. 3">
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>Switch</label>
|
<label>Switch (optional)</label>
|
||||||
<select name="switch_hostname" class="form-select" required>
|
<select name="switch_hostname" class="form-select">
|
||||||
|
<option value="">Kein Switch</option>
|
||||||
{% for sw in switches %}
|
{% for sw in switches %}
|
||||||
<option value="{{ sw['hostname'] }}">{{ sw['hostname'] }}</option>
|
<option value="{{ sw['hostname'] }}">{{ sw['hostname'] }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -137,7 +138,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>Port</label>
|
<label>Port</label>
|
||||||
<input type="text" name="port" id="edit_port" class="form-control" required placeholder="z.B. 3">
|
<input type="text" name="port" id="edit_port" class="form-control" placeholder="z.B. 3">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
@@ -161,7 +162,8 @@
|
|||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<select name="switch_hostname" id="switch_select" class="form-select" required>
|
<select name="switch_hostname" id="switch_select" class="form-select">
|
||||||
|
<option value="">Kein Switch</option>
|
||||||
{% for sw in switches %}
|
{% for sw in switches %}
|
||||||
<option value="{{ sw['hostname'] }}">{{ sw['hostname'] }}</option>
|
<option value="{{ sw['hostname'] }}">{{ sw['hostname'] }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -7,15 +7,20 @@
|
|||||||
Nächste Prüfung in -- Sekunden
|
Nächste Prüfung in -- Sekunden
|
||||||
</span>
|
</span>
|
||||||
</h2>
|
</h2>
|
||||||
<div class="row row-cols-1 row-cols-md-6 g-3">
|
<div class="row g-3">
|
||||||
{% for d in devices %}
|
{% for d in devices %}
|
||||||
<div class="col">
|
<div class="col-6 col-md-4 col-lg-3 col-xl-2">
|
||||||
<div class="card text-center p-2">
|
<div class="card text-center p-2"
|
||||||
|
{% if last_seen.get(d[0]) %}
|
||||||
|
title="{{ last_seen[d[0]] }}"
|
||||||
|
{% elif status[d[0]] == 'offline' %}
|
||||||
|
title="Noch nie online"
|
||||||
|
{% endif %}>
|
||||||
<div class="card-header">{{ d[1] }}</div>
|
<div class="card-header">{{ d[1] }}</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<span class="fw-bold" style="color:
|
<span class="fw-bold" style="color:
|
||||||
{% if d[2] == 0 %}gray
|
{% if d[2] == 0 %}gray
|
||||||
{% elif status[d[0]]=='online' %}green
|
{% elif status[d[0]] == 'online' %}green
|
||||||
{% else %}red
|
{% else %}red
|
||||||
{% endif %};">
|
{% endif %};">
|
||||||
{% if d[2] == 0 %}
|
{% if d[2] == 0 %}
|
||||||
@@ -29,7 +34,6 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
const intervalMinutes = {{ interval | int }}; // aus DB
|
const intervalMinutes = {{ interval | int }}; // aus DB
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<!-- Button zum Hinzufügen -->
|
<!-- Button zum Hinzufügen -->
|
||||||
<button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#addSwitchModal">Neuen Switch hinzufügen</button>
|
<button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#addSwitchModal">Neuen Switch hinzufügen</button>
|
||||||
|
|
||||||
<table class="table table-bordered">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Hostname</th>
|
<th>Hostname</th>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#userModal" onclick="openUserModal()">Neuen Benutzer</button>
|
<button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#userModal" onclick="openUserModal()">Neuen Benutzer</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<table class="table table-bordered">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="col-ip">Username</th>
|
<th class="col-ip">Username</th>
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ while true; do
|
|||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name ist nicht erreichbar!" >> "$LOGFILE"
|
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name ist nicht erreichbar!" >> "$LOGFILE"
|
||||||
|
|
||||||
# Nur PoE neu starten, wenn Port vorhanden ist
|
# Nur PoE neu starten, wenn Port vorhanden ist
|
||||||
if [ -n "$switch_port" ]; then
|
if [ -n "$switch_port" ] && [ "$switch_port" != "None" ]; then
|
||||||
disable_poe "$switch_ip" "$switch_port" "$switch_user" "$switch_pass"
|
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"
|
echo "$(date '+%Y-%m-%d %H:%M:%S') $dev_name PoE auf Port $switch_port am Switch $switch_hostname deaktiviert." >> "$LOGFILE"
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|||||||
Reference in New Issue
Block a user