From 28a436df162c8572273052159182a28e047af4f7 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Tue, 30 Sep 2025 15:14:26 +0000 Subject: [PATCH] images --- .gitignore | 3 +- srv/poe_manager/app.py | 137 +++++++++++++++---------- srv/poe_manager/sqlite.db | Bin 40960 -> 40960 bytes srv/poe_manager/static/images/logo.png | Bin 0 -> 2623 bytes srv/poe_manager/templates/devices.html | 71 +++++++------ srv/poe_manager/templates/users.html | 4 +- 6 files changed, 121 insertions(+), 94 deletions(-) create mode 100644 srv/poe_manager/static/images/logo.png diff --git a/.gitignore b/.gitignore index c520d23..cb3a40e 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,8 @@ __pycache__/ !/srv/poe_manager/static/css/* !/srv/poe_manager/static/js/ !/srv/poe_manager/static/js/* - +!/srv/poe_manager/static/images/ +!/srv/poe_manager/static/images/* # Optional: SQLite DB ignorieren (falls du nicht willst, dass Passwörter im Repo landen) # /srv/poe_manager/sqlite.db diff --git a/srv/poe_manager/app.py b/srv/poe_manager/app.py index 689a13d..8b4b179 100644 --- a/srv/poe_manager/app.py +++ b/srv/poe_manager/app.py @@ -47,7 +47,7 @@ def get_devices(): Liefert eine Liste aller Devices aus der Datenbank als Dictionaries. """ conn = get_db_connection() - devices = conn.execute("SELECT mac, rpi_ip, port, name, switch_hostname, is_active FROM devices").fetchall() + devices = conn.execute("SELECT mac, rpi_ip, port, name, switch_hostname, is_active FROM devices ORDER BY name ASC").fetchall() conn.close() return devices @@ -87,7 +87,7 @@ def index(): conn = sqlite3.connect("sqlite.db") c = conn.cursor() # is_active mit abfragen - c.execute("SELECT mac, name, is_active FROM devices") + c.execute("SELECT mac, name, is_active FROM devices ORDER BY name ASC") devices = c.fetchall() conn.close() @@ -146,73 +146,99 @@ def devices(): conn = get_db_connection() switches = conn.execute("SELECT hostname FROM switches").fetchall() - # Inline-Add - if request.method == 'POST' and 'add_device' in request.form: - if not current_user.is_admin: - flash("Zugriff verweigert!") - return redirect(url_for('devices')) + if request.method == 'POST': + # ----------------------- + # Inline-Add + # ----------------------- + if 'add_device' in request.form: + if not current_user.is_admin: + flash("Zugriff verweigert!") + return redirect(url_for('devices')) - mac = request.form['mac'] - rpi_ip = request.form['rpi_ip'] - port = request.form['port'] - name = request.form['name'] - switch_hostname = request.form['switch_hostname'] - is_active = 1 if 'is_active' in request.form else 0 + mac = request.form.get('mac') + rpi_ip = request.form.get('rpi_ip') + port = request.form.get('port') + name = request.form.get('name') + switch_hostname = request.form.get('switch_hostname') + is_active = 1 if 'is_active' in request.form else 0 - try: - conn.execute(""" - INSERT INTO devices (mac, rpi_ip, port, name, switch_hostname, is_active) - VALUES (?, ?, ?, ?, ?, ?) - """, (mac, rpi_ip, port, name, switch_hostname, is_active)) - conn.commit() - flash(f"Gerät {name} hinzugefügt.") - except sqlite3.IntegrityError: - flash("MAC existiert bereits oder Eingabefehler!") + if not all([mac, rpi_ip, port, name, switch_hostname]): + flash("Alle Felder müssen ausgefüllt sein!") + return redirect(url_for('devices')) - # Inline-Edit - if request.method == 'POST' and 'edit_device' in request.form: - if not current_user.is_admin: - flash("Zugriff verweigert!") - return redirect(url_for('devices')) + try: + conn.execute(""" + INSERT INTO devices (mac, rpi_ip, port, name, switch_hostname, is_active) + VALUES (?, ?, ?, ?, ?, ?) + """, (mac, rpi_ip, port, name, switch_hostname, is_active)) + conn.commit() + flash(f"Gerät {name} hinzugefügt.") + except sqlite3.IntegrityError: + flash("MAC existiert bereits oder Eingabefehler!") - old_mac = request.form['old_mac'] - mac = request.form['mac'] - rpi_ip = request.form['rpi_ip'] - port = request.form['port'] - name = request.form['name'] - switch_hostname = request.form['switch_hostname'] - is_active = 1 if 'is_active' in request.form else 0 + # ----------------------- + # Inline-Edit + # ----------------------- + elif 'edit_device' in request.form: + if not current_user.is_admin: + flash("Zugriff verweigert!") + return redirect(url_for('devices')) - try: - conn.execute(""" - UPDATE devices - SET mac=?, rpi_ip=?, port=?, name=?, switch_hostname=?, is_active=? - WHERE mac=? - """, (mac, rpi_ip, port, name, switch_hostname, is_active, old_mac)) - conn.commit() - flash(f"Gerät {name} aktualisiert.") - except sqlite3.IntegrityError: - flash("MAC existiert bereits oder Eingabefehler!") + old_mac = request.form.get('old_mac') + mac = request.form.get('mac') + rpi_ip = request.form.get('rpi_ip') + port = request.form.get('port') + name = request.form.get('name') + switch_hostname = request.form.get('switch_hostname') + is_active = 1 if 'is_active' in request.form else 0 - # Inline-Delete - if request.method == 'POST' and 'delete_device' in request.form: - if not current_user.is_admin: - flash("Zugriff verweigert!") - return redirect(url_for('devices')) - del_mac = request.form['delete_device'] - conn.execute("DELETE FROM devices WHERE mac=?", (del_mac,)) - conn.commit() - flash(f"Gerät {del_mac} gelöscht.") + if not all([old_mac, mac, rpi_ip, port, name, switch_hostname]): + flash("Alle Felder müssen ausgefüllt sein!") + return redirect(url_for('devices')) + try: + conn.execute(""" + UPDATE devices + SET mac=?, rpi_ip=?, port=?, name=?, switch_hostname=?, is_active=? + WHERE mac=? + """, (mac, rpi_ip, port, name, switch_hostname, is_active, old_mac)) + conn.commit() + flash(f"Gerät {name} aktualisiert.") + except sqlite3.IntegrityError: + flash("MAC existiert bereits oder Eingabefehler!") + + # ----------------------- + # Inline-Delete + # ----------------------- + elif 'delete_device' in request.form: + if not current_user.is_admin: + flash("Zugriff verweigert!") + return redirect(url_for('devices')) + + del_mac = request.form.get('delete_device') + if del_mac: + device = conn.execute("SELECT name FROM devices WHERE mac=?", (del_mac,)).fetchone() + hostname = device['name'] if device else del_mac + conn.execute("DELETE FROM devices WHERE mac=?", (del_mac,)) + conn.commit() + flash(f"Gerät {hostname} gelöscht.") + else: + flash("Keine MAC-Adresse übermittelt!") + + return redirect(url_for('devices')) + + # ----------------------- + # Devices für Anzeige + # ----------------------- devices = conn.execute(""" SELECT devices.mac, devices.rpi_ip, devices.port, devices.name, devices.is_active, switches.hostname AS switch_hostname FROM devices - JOIN switches ON devices.switch_hostname = switches.hostname + LEFT JOIN switches ON devices.switch_hostname = switches.hostname + ORDER BY switches.hostname ASC """).fetchall() conn.close() - interval_min = get_interval_seconds() // 60 return render_template('devices.html', devices=devices, switches=switches) @app.route('/switches', methods=['GET', 'POST']) @@ -264,6 +290,7 @@ def switches(): flash("Zugriff verweigert!") return redirect(url_for('switches')) del_hostname = request.form['delete_switch'] + conn.execute("UPDATE devices SET switch_hostname=NULL WHERE switch_hostname=?", (del_hostname,)) conn.execute("DELETE FROM switches WHERE hostname=?", (del_hostname,)) conn.commit() flash(f"Switch {del_hostname} gelöscht.") diff --git a/srv/poe_manager/sqlite.db b/srv/poe_manager/sqlite.db index e52fe2841b153a39d7eb7385837d6b321d5b5613..37542c6ae7d1b8428fbf1890ecb60c5a4eaaf1e6 100644 GIT binary patch delta 302 zcmZoTz|?SnX@WGP%|sbzMw^WZOZa(Mcpo$H7xO*ii{^d2Sy13IZ+#gHo2aO0V`xcg zaS05kJA!~yzEO##X<9{TxtnK+u5P(&W|*6!PmW`xqi$wcil0wFc1lrRX_%X{xp%Uo zX}CqcuVhN=YPrn XnEx*Sb^dceBep@T;n;lLUo!vzG81HB delta 127 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
- +
@@ -42,43 +42,42 @@ {% for d in devices %} -
- - + + + + + + + + + + + {% if current_user.is_admin %} + + + - - - - - - - - - - - - - - - - - - - {% if current_user.is_admin %} - - - - +
+ + +
+ + - - {% endif %} -
+ + + {% endif %} {% endfor %} diff --git a/srv/poe_manager/templates/users.html b/srv/poe_manager/templates/users.html index 12188cf..a5f66eb 100644 --- a/srv/poe_manager/templates/users.html +++ b/srv/poe_manager/templates/users.html @@ -11,8 +11,8 @@ - - + + {% if current_user.is_admin %}{% endif %}
UsernameRolleUsernameRolleAktionen