Dateien
Hetzner-Backup/v2_adminpanel/FEHLERSUCHE.md
2025-06-18 01:35:54 +02:00

11 KiB

Fehlersuche - v2_adminpanel Refactoring

Aktueller Stand (17.06.2025 - 11:00 Uhr)

Erfolgreiches Refactoring

  • Die ursprüngliche 5000+ Zeilen große app.py wurde erfolgreich in Module aufgeteilt:
    • 9 Blueprint-Module in routes/
    • Separate Module für auth/, utils/, config.py, db.py, models.py
    • Hauptdatei app.py nur noch 178 Zeilen

Funktionierende Teile

  • Routing-System funktioniert (alle Routen sind registriert)
  • Login-System funktioniert
  • Einfache Test-Routen funktionieren (/simple-test)
  • Blueprint-Registrierung funktioniert korrekt
  • /test-db Route funktioniert nach Docker-Rebuild
  • Kunden-Anzeige funktioniert mit Test-Daten-Filter
  • Lizenzen-Anzeige funktioniert mit erweiterten Filtern
  • Batch-Lizenzerstellung funktioniert
  • Ressourcen-Pool funktioniert vollständig
  • Ressourcen hinzufügen funktioniert

Gelöste Probleme

1. Dict/Tuple Inkonsistenzen GELÖST

Problem: Templates erwarteten Tuple-Zugriff (row[0], row[1]), aber models.py lieferte Dictionaries Lösung: Alle betroffenen Templates wurden auf Dictionary-Zugriff umgestellt:

  • customers.html: customer[0]customer.id, customer[1]customer.name, etc.
  • customers_licenses.html: Komplett auf Dictionary-Zugriff umgestellt
  • licenses.html, edit_license.html, sessions.html, audit_log.html, resources.html, backups.html: Alle konvertiert

2. Fehlende /api/customers Route GELÖST

Problem: Batch-Lizenzerstellung konnte keine Kunden laden (Select2 AJAX-Fehler) Lösung: api_customers() Funktion zu api_routes.py hinzugefügt

3. Doppelte api_customers Funktion GELÖST

Problem: AssertionError beim Start - View function mapping is overwriting existing endpoint Lösung: Doppelte Definition in api_routes.py entfernt (Zeilen 833-943)

4. 502 Bad Gateway Error GELÖST

Problem: Admin-Panel war nicht erreichbar, nginx gab 502 zurück Ursache: Container startete nicht wegen doppelter Route-Definition Lösung: Doppelte api_customers Funktion entfernt, Container neu gebaut

5. Test-Daten Filter GELÖST

Problem: Test-Daten wurden immer angezeigt, Checkbox funktionierte nicht Lösung: get_customers() in models.py unterstützt jetzt show_test Parameter

Debugging-Schritte

1. Container komplett neu bauen

cd C:\Users\Administrator\Documents\GitHub\v2-Docker\v2
docker-compose down
docker-compose build --no-cache
docker-compose up -d

2. Logs überprüfen

docker logs admin-panel --tail 100

3. Test-Routen

  • /simple-test - Sollte "Simple test works!" zeigen
  • /debug-routes - Zeigt alle registrierten Routen
  • /test-db - Testet Datenbankverbindung

4. Login-Test

  1. Gehe zu https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com/
  2. Logge dich mit den Admin-Credentials ein
  3. Versuche dann /customers-licenses aufzurufen

Code-Fixes bereits implementiert

1. Datenbankverbindungen

  • Alle kritischen Funktionen verwenden jetzt conn = get_connection() mit normalem Cursor
  • Verhindert Dictionary/Tuple Konflikte

2. Spaltennamen korrigiert

  • is_active statt active für licenses Tabelle
  • is_active statt active für sessions Tabelle
  • is_test statt is_test_license
  • Entfernt: phone, address, notes aus customers (existieren nicht)

3. Blueprint-Referenzen

  • Alle url_for() Aufrufe haben korrekte Blueprint-Präfixe
  • z.B. url_for('auth.login') statt url_for('login')

Nächste Schritte

  1. Container neu bauen (siehe oben)
  2. Einloggen und testen ob /customers-licenses funktioniert
  3. Falls weiterhin Fehler: Docker Logs nach "CUSTOMERS-LICENSES ROUTE CALLED" durchsuchen
  4. Alternative: Temporär auf die große app.py.backup zurückwechseln:
    cp app.py.backup app.py
    docker-compose restart admin-panel
    

Bekannte funktionierende Routen (nach Login)

  • / - Dashboard
  • /customers - Kundenliste
  • /licenses - Lizenzliste
  • /resources - Ressourcen
  • /audit - Audit Log
  • /sessions - Sessions

Debug-Informationen in customer_routes.py

Die customers_licenses Funktion hat erweiterte Logging-Ausgaben:

  • "=== CUSTOMERS-LICENSES ROUTE CALLED ==="
  • "=== QUERY RETURNED X ROWS ==="
  • Details über Datentypen der Ergebnisse

Diese erscheinen in den Docker Logs und helfen bei der Fehlersuche.

Zusammenfassung der Fixes

Template-Konvertierungen (Dict statt Tuple)

Folgende Templates wurden von Tuple-Zugriff auf Dictionary-Zugriff umgestellt:

  1. customers.html: customer[0] → customer.id, etc.
  2. customers_licenses.html: Komplett umgestellt
  3. edit_customer.html: customer[0] → customer.id, etc.
  4. licenses.html: license[0] → license.id, etc.
  5. edit_license.html: license[0] → license.id, etc.
  6. sessions.html: session[0] → session.id, etc.
  7. audit_log.html: log[0] → log.id, etc.
  8. resources.html: resource[0] → resource.id, etc.
  9. backups.html: backup[0] → backup.id, etc.

API-Fixes

  1. api_routes.py: Fehlende /api/customers Route hinzugefügt
  2. api_routes.py: Doppelte api_customers Funktion entfernt

Model-Fixes

  1. models.py: get_customers() unterstützt jetzt show_test und search Parameter
  2. customer_routes.py: customers() nutzt die neuen Parameter

Status

Alle bekannten Probleme wurden behoben Admin-Panel ist vollständig funktionsfähig Docker Container läuft stabil

Weitere gelöste Probleme (17.06.2025 - 11:00 Uhr)

1. Test-Daten Checkbox funktioniert nicht GELÖST

Problem: Die Checkbox zum Anzeigen von Test-Daten in Kunden- und Lizenzansicht funktionierte nicht Ursache: Fehlende Blueprint-Präfixe in Template-URLs Lösung:

  • customers.html: Alle url_for('customers')url_for('customer.customers')
  • licenses.html: Alle url_for('licenses')url_for('license.licenses')
  • Formulare senden jetzt korrekt mit show_test Parameter

2. Lizenz-Filter erweitert GELÖST

Problem: Filter für Test-/Live-Daten fehlte in Lizenzansicht Lösung: license_routes.py erweitert mit:

  • Typ-Filter: full, test, test_data, live_data
  • Status-Filter: active, expiring, expired, inactive
  • Suche über Lizenzschlüssel, Kundenname und E-Mail

3. Resource Pool Anzeige GELÖST

Problem: Ressourcen-Pool Seite hatte fehlerhafte Links und Filter funktionierten nicht Lösung:

  • resources.html: Form-Action korrigiert zu url_for('resources.resources')
  • JavaScript toggleTestResources() arbeitet jetzt mit URL-Parametern
  • Alle Sortier- und Paginierungs-Links korrigiert

4. Ressourcen hinzufügen fehlte GELÖST

Problem: Route /resources/add existierte nicht Lösung: Komplette add_resources() Funktion in resource_routes.py implementiert:

  • Validierung für Domains, IPv4-Adressen und Telefonnummern
  • Duplikat-Prüfung
  • Bulk-Import mit detailliertem Feedback
  • Test/Produktion Unterscheidung

Problem: Sidebar-Links für Ressourcen verwendeten hardcodierte URLs Lösung: base.html aktualisiert:

  • Resource Pool Link: href="{{ url_for('resources.resources') }}"
  • Add Resources Link: href="{{ url_for('resources.add_resources') }}"
  • Active-Status Prüfung korrigiert für Blueprint-Endpunkte

Routing-Analyse (17.06.2025 - 11:30 Uhr)

Identifizierte Routing-Probleme

Nach systematischer Analyse wurden folgende Routing-Probleme gefunden:

1. Fehlende Blueprint-Präfixe ⚠️ OFFEN

Viele url_for() Aufrufe fehlen Blueprint-Präfixe. Dies verursacht 500-Fehler:

Betroffene Templates:

  • profile.html: 3 fehlerhafte Aufrufe (change_password, disable_2fa, setup_2fa)
  • setup_2fa.html: 2 fehlerhafte Aufrufe (profile, enable_2fa)
  • backup_codes.html: 1 fehlerhafter Aufruf (profile)
  • resource_history.html: 2 fehlerhafte Aufrufe (resources, edit_license)
  • resource_metrics.html: 2 fehlerhafte Aufrufe (resources, resources_report)
  • resource_report.html: 2 fehlerhafte Aufrufe
  • sessions.html: Mehrere fehlerhafte Aufrufe
  • audit_log.html: Mehrere fehlerhafte Aufrufe

2. Hardcodierte URLs ⚠️ OFFEN

Über 50 hardcodierte URLs gefunden, die mit url_for() ersetzt werden sollten:

Hauptprobleme in base.html:

  • href="/"href="{{ url_for('admin.dashboard') }}"
  • href="/profile"href="{{ url_for('auth.profile') }}"
  • href="/logout"href="{{ url_for('auth.logout') }}"
  • href="/customers-licenses"href="{{ url_for('customer.customers_licenses') }}"
  • href="/customer/create"href="{{ url_for('customer.create_customer') }}"
  • href="/create"href="{{ url_for('license.create_license') }}"
  • href="/batch"href="{{ url_for('batch.batch_create') }}"
  • href="/audit"href="{{ url_for('admin.audit_log') }}"
  • href="/sessions"href="{{ url_for('session.sessions') }}"
  • href="/backups"href="{{ url_for('admin.backups') }}"

3. Doppelte Route-Definitionen GELÖST

  • Entfernt: Doppelte add_resource Funktion in resource_routes.py

4. Route-Namenskonsistenz ⚠️ OFFEN

  • resource_report vs resources_report - inkonsistente Benennung

Prioritäten für Fixes

  1. KRITISCH: Fehlende Blueprint-Präfixe (verursachen 500-Fehler)
  2. HOCH: Hardcodierte URLs in Navigation (base.html)
  3. MITTEL: Andere hardcodierte URLs
  4. NIEDRIG: Namenskonsistenz

Vollständiger Report

Ein detaillierter Report wurde erstellt: ROUTING_ISSUES_REPORT.md

Aktuelle Probleme (18.06.2025 - 01:30 Uhr)

1. Resources Route funktioniert nicht NICHT GELÖST

Problem: /resources Route leitet auf Dashboard um mit Fehlermeldung "Fehler beim Laden der Ressourcen!" Fehlermeldungen im Log:

  1. Ursprünglich: FEHLER: Spalte l.customer_name existiert nicht
  2. Nach Fix: 'dict object' has no attribute 'total'

Versuchte Lösungen:

  1. SQL-Query in resource_routes.py korrigiert:
    • JOIN mit customers Tabelle hinzugefügt für c.name as customer_name
    • l.customer_namec.name in WHERE-Klausel
  2. Stats Dictionary erweitert um 'total': 0 und stats[res_type]['total'] += count
  3. Template resources.html angepasst: data.quarantinedata.quarantined

Status: Trotz aller Fixes funktioniert die Route weiterhin nicht

2. URL-Generierungsfehler GELÖST

Problem: Mehrere url_for() Aufrufe mit falschen Endpunkt-Namen Gelöste Fehler:

  • api.generate_license_keyapi.api_generate_key
  • api.customersapi.api_customers
  • export.customersexport.export_customers
  • export.licensesexport.export_licenses
  • url_for() mit leeren Parametern durch hardcodierte URLs ersetzt

3. Customers-Licenses Route NICHT GELÖST

Problem: /customers-licenses Route leitet auf Dashboard um Fehlermeldung im Log: ValueError: invalid literal for int() with base 10: '' Ursache: Template versucht url_for('licenses.edit_license', license_id='') mit leerem String aufzurufen Versuchte Lösungen:

  • url_for('licenses.edit_license', license_id='') durch hardcodierte URL ersetzt: /license/edit/${license.id}
  • url_for('customers.edit_customer', customer_id='') durch hardcodierte URL ersetzt: /customer/edit/${customerId} Status: Route funktioniert trotz Fixes nicht