Dateien
Hetzner-Backup/v2_adminpanel/FEHLERSUCHE.md

306 Zeilen
13 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: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')`