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 e52fe28..37542c6 100644 Binary files a/srv/poe_manager/sqlite.db and b/srv/poe_manager/sqlite.db differ diff --git a/srv/poe_manager/static/images/logo.png b/srv/poe_manager/static/images/logo.png new file mode 100644 index 0000000..fed2463 Binary files /dev/null and b/srv/poe_manager/static/images/logo.png differ diff --git a/srv/poe_manager/templates/devices.html b/srv/poe_manager/templates/devices.html index f5d8d7d..0ae9e49 100644 --- a/srv/poe_manager/templates/devices.html +++ b/srv/poe_manager/templates/devices.html @@ -20,7 +20,7 @@
| Username | -Rolle | +Username | +Rolle | {% if current_user.is_admin %}Aktionen | {% endif %}
|---|