Dateien
Hetzner-Backup/v2_adminpanel/FEHLERSUCHE.md

13 KiB

Fehlersuche - v2_adminpanel Refactoring

Aktueller Stand (18.06.2025 - 02:30 Uhr)

ALLE KRITISCHEN PROBLEME GELÖST

  • Resources Route funktioniert jetzt korrekt
  • Customers-Licenses Route funktioniert jetzt korrekt
  • Container startet ohne Fehler

Finale Fixes (18.06.2025 - 02:35 Uhr)

Backups Route Fix

  • Problem 1: 500 Error bei /backups - url_for('admin.create_backup') existiert nicht

  • Lösung 1:

    • url_for('admin.create_backup')url_for('admin.create_backup_route')
    • url_for('admin.restore_backup', backup_id='')/backup/restore/${backupId}
    • url_for('admin.delete_backup', backup_id='')/backup/delete/${backupId}
  • Problem 2: "SyntaxError: Unexpected token '<'" beim Backup erstellen

  • Ursache: Routes gaben HTML (redirect) statt JSON zurück

  • Lösung 2:

    • create_backup_route() und restore_backup_route() geben jetzt JSON zurück
    • Entfernt: return redirect(url_for('admin.backups'))
    • Hinzugefügt: return jsonify({'success': True/False, 'message': '...'})

Bereits gelöste Probleme (18.06.2025 - 02:30 Uhr)

  1. Customers-Licenses Template Fix:

    • Problem: url_for('api.toggle_license', license_id='') mit leerem String
    • Lösung: Hardcodierte URL verwendet: /api/license/${licenseId}/toggle
  2. Resources Route Fix:

    • Problem 1: invalid literal for int() with base 10: '' bei page Parameter
    • Lösung 1: Try-except Block für sichere Konvertierung des page Parameters
    • Problem 2: url_for('resources.quarantine', resource_id='') mit leerem String im Template
    • Lösung 2: Hardcodierte URL verwendet: /resources/quarantine/${resourceId}
    • Zusätzlich: Debug-Logging hinzugefügt für bessere Fehlerdiagnose

Wichtige Erkenntnisse:

  • Flask's url_for() kann nicht mit leeren Parametern für Integer-Routen umgehen
  • Bei JavaScript-generierten URLs ist es oft besser, hardcodierte URLs zu verwenden
  • Container muss nach Template-Änderungen neu gestartet werden

Stand vom 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 GELÖST (18.06.2025 - 02:00 Uhr)

Problem: /resources Route leitete 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'

Gelöst durch:

  1. Stats Dictionary korrekt initialisiert mit allen erforderlichen Feldern inkl. available_percent
  2. Fehlende Template-Variablen hinzugefügt: total, page, total_pages, sort_by, sort_order, recent_activities, datetime
  3. Template-Variable search_querysearch korrigiert
  4. Route-Namen korrigiert: quarantine_resourcequarantine, release_resourcesrelease
  5. Export-Route korrigiert: resource_reportresources_report

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 GELÖST (18.06.2025 - 02:00 Uhr)

Problem: /customers-licenses Route leitete auf Dashboard um Fehlermeldung im Log: ValueError: invalid literal for int() with base 10: '' Ursache: Template versuchte Server-seitiges Rendering von Daten, die per AJAX geladen werden sollten

Gelöst durch:

  1. Entfernt: Server-seitiges Rendering von selected_customer und licenses im Template
  2. Template zeigt jetzt nur "Wählen Sie einen Kunden aus" bis AJAX-Daten geladen sind
  3. Korrigiert: selected_customer_id Variable entfernt
  4. Export-Links funktionieren jetzt ohne customer_id Parameter
  5. API-Endpunkt korrekt referenziert mit url_for('customers.api_customer_licenses')