318 Zeilen
14 KiB
Markdown
318 Zeilen
14 KiB
Markdown
# 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:45 Uhr)
|
|
|
|
#### Customers-Licenses Testdaten-Filter
|
|
- Problem: `/customers-licenses?show_test=false` zeigte trotzdem alle Kunden (auch Testdaten)
|
|
- Ursache: Die SQL-Query in `customers_licenses()` berücksichtigte den `show_test` Parameter nicht
|
|
- Lösung:
|
|
- `show_test` Parameter aus der URL auslesen
|
|
- WHERE-Klausel hinzugefügt: `WHERE (%s OR c.is_test = false)`
|
|
- `c.is_test` in SELECT und GROUP BY hinzugefügt
|
|
- `show_test` Parameter an Template weitergeben
|
|
- Standardverhalten: Nur Produktivdaten werden angezeigt (wenn show_test=false oder nicht gesetzt)
|
|
|
|
### Bereits gelöste Probleme (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
|
|
```bash
|
|
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
|
|
```bash
|
|
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:
|
|
```bash
|
|
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
|
|
|
|
### 5. **Navigation-Links** ✅ GELÖST
|
|
**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_query` → `search` korrigiert
|
|
4. Route-Namen korrigiert: `quarantine_resource` → `quarantine`, `release_resources` → `release`
|
|
5. Export-Route korrigiert: `resource_report` → `resources_report`
|
|
|
|
### 2. **URL-Generierungsfehler** ✅ GELÖST
|
|
**Problem**: Mehrere `url_for()` Aufrufe mit falschen Endpunkt-Namen
|
|
**Gelöste Fehler**:
|
|
- `api.generate_license_key` → `api.api_generate_key`
|
|
- `api.customers` → `api.api_customers`
|
|
- `export.customers` → `export.export_customers`
|
|
- `export.licenses` → `export.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')` |