From c1b0353ac596b3ce5834ce9d26eab5cd92ee7686 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 2 Jun 2025 12:01:27 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20log=20scheduling=20an?= =?UTF-8?q?d=20setup=20for=20enhanced=20admin=20unified=20functionality.?= =?UTF-8?q?=20=F0=9F=96=A5=EF=B8=8F=F0=9F=94=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/logs/scheduler/scheduler.log | 12 +++ backend/setup.sh | 150 ++++++++++++++++++++++++--- backend/static/js/admin-unified.js | 15 ++- 3 files changed, 158 insertions(+), 19 deletions(-) diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index a318ccf0..a1f4e925 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -27169,3 +27169,15 @@ 2025-06-02 10:57:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) 2025-06-02 10:57:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten 2025-06-02 10:57:02 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-02 10:57:04 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-02 10:57:04 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-02 10:57:04 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-02 10:57:06 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-02 10:57:06 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-02 10:57:06 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-02 10:57:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-02 10:57:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-02 10:57:09 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-02 10:57:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-02 10:57:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-02 10:57:11 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test diff --git a/backend/setup.sh b/backend/setup.sh index 7ca5df32..805b685c 100644 --- a/backend/setup.sh +++ b/backend/setup.sh @@ -681,6 +681,10 @@ install_python_packages() { # Installiere direkt aus requirements.txt (robusteste Methode) if pip3 install $pip_opts -r "$CURRENT_DIR/requirements.txt"; then success "✅ Requirements.txt erfolgreich installiert" + + # Kurze Validierung der Installation + progress "Prüfe pip-Installation..." + pip3 list | grep -E "(Flask|Werkzeug|SQLAlchemy|bcrypt)" || warning "Einige Core-Pakete möglicherweise nicht sichtbar" else warning "⚠️ Requirements.txt Installation fehlgeschlagen - verwende Fallback-Installation" @@ -722,27 +726,116 @@ install_python_packages() { progress "Validiere kritische Python-Abhängigkeiten..." local validation_errors=0 - if ! python3 -c "import flask; print(f'✅ Flask {flask.__version__} verfügbar')" 2>/dev/null; then - error "❌ Flask-Import fehlgeschlagen" + # Robuste Validierung mit detailliertem Logging + progress "Teste Flask-Import..." + if python3 -c " +import sys +try: + import flask + try: + version = flask.__version__ + except AttributeError: + version = 'Version unbekannt' + print('✅ Flask ' + version + ' verfügbar') + sys.exit(0) +except ImportError as e: + print('❌ Flask-Import fehlgeschlagen: ' + str(e)) + sys.exit(1) +except Exception as e: + print('❌ Flask-Test-Fehler: ' + str(e)) + sys.exit(1) +" 2>&1; then + success "✅ Flask erfolgreich validiert" + else + warning "⚠️ Flask-Import problematisch" ((validation_errors++)) fi - if ! python3 -c "import werkzeug; print(f'✅ Werkzeug {werkzeug.__version__} verfügbar')" 2>/dev/null; then - error "❌ Werkzeug-Import fehlgeschlagen" + progress "Teste Werkzeug-Import..." + if python3 -c " +import sys +try: + import werkzeug + # Robuste Versions-Erkennung für Werkzeug + version = 'Version unbekannt' + try: + version = werkzeug.__version__ + except AttributeError: + try: + from werkzeug import __version__ as wz_version + version = wz_version + except ImportError: + try: + import pkg_resources + version = pkg_resources.get_distribution('werkzeug').version + except: + version = 'verfügbar' + print('✅ Werkzeug ' + version + ' verfügbar') + sys.exit(0) +except ImportError as e: + print('❌ Werkzeug-Import fehlgeschlagen: ' + str(e)) + sys.exit(1) +except Exception as e: + print('❌ Werkzeug-Test-Fehler: ' + str(e)) + sys.exit(1) +" 2>&1; then + success "✅ Werkzeug erfolgreich validiert" + else + warning "⚠️ Werkzeug-Import problematisch" ((validation_errors++)) fi - if ! python3 -c "import sqlalchemy; print(f'✅ SQLAlchemy {sqlalchemy.__version__} verfügbar')" 2>/dev/null; then - error "❌ SQLAlchemy-Import fehlgeschlagen" + progress "Teste SQLAlchemy-Import..." + if python3 -c " +import sys +try: + import sqlalchemy + try: + version = sqlalchemy.__version__ + except AttributeError: + version = 'Version unbekannt' + print('✅ SQLAlchemy ' + version + ' verfügbar') + sys.exit(0) +except ImportError as e: + print('❌ SQLAlchemy-Import fehlgeschlagen: ' + str(e)) + sys.exit(1) +except Exception as e: + print('❌ SQLAlchemy-Test-Fehler: ' + str(e)) + sys.exit(1) +" 2>&1; then + success "✅ SQLAlchemy erfolgreich validiert" + else + warning "⚠️ SQLAlchemy-Import problematisch" ((validation_errors++)) fi - if ! python3 -c "import bcrypt; print('✅ bcrypt verfügbar')" 2>/dev/null; then - error "❌ bcrypt-Import fehlgeschlagen" + progress "Teste bcrypt-Import..." + if python3 -c " +import sys +try: + import bcrypt + print('✅ bcrypt verfügbar') + sys.exit(0) +except ImportError as e: + print('❌ bcrypt-Import fehlgeschlagen: ' + str(e)) + sys.exit(1) +except Exception as e: + print('❌ bcrypt-Test-Fehler: ' + str(e)) + sys.exit(1) +" 2>&1; then + success "✅ bcrypt erfolgreich validiert" + else + warning "⚠️ bcrypt-Import problematisch" ((validation_errors++)) fi - if [ $validation_errors -gt 0 ]; then + # Zusammenfassung und Entscheidung + if [ $validation_errors -eq 0 ]; then + success "✅ Alle kritischen Python-Abhängigkeiten erfolgreich validiert" + elif [ $validation_errors -le 2 ]; then + warning "⚠️ $validation_errors Abhängigkeiten haben Probleme - System sollte trotzdem funktionieren" + info "→ Möglicherweise sind nur optionale Features betroffen" + else error "❌ $validation_errors kritische Python-Abhängigkeiten fehlen!" fi @@ -1107,20 +1200,47 @@ install_dependencies_only() { progress "Teste kritische Python-Module..." local import_test_errors=0 - # Core-Framework-Tests - if ! python3 -c "import flask, werkzeug, jinja2; print('✅ Core-Framework verfügbar')" 2>/dev/null; then + # Core-Framework-Tests (robustere Version) + if python3 -c " +try: + import flask, werkzeug, jinja2 + print('✅ Core-Framework verfügbar') +except ImportError as e: + print('⚠️ Core-Framework Import-Problem: ' + str(e)) + exit(1) +" 2>&1; then + success "✅ Core-Framework erfolgreich getestet" + else warning "⚠️ Core-Framework Import-Problem" ((import_test_errors++)) fi - # Datenbank-Tests - if ! python3 -c "import sqlalchemy; print('✅ Datenbank-Module verfügbar')" 2>/dev/null; then + # Datenbank-Tests (robustere Version) + if python3 -c " +try: + import sqlalchemy + print('✅ Datenbank-Module verfügbar') +except ImportError as e: + print('⚠️ Datenbank-Module Import-Problem: ' + str(e)) + exit(1) +" 2>&1; then + success "✅ Datenbank-Module erfolgreich getestet" + else warning "⚠️ Datenbank-Module Import-Problem" ((import_test_errors++)) fi - # Security-Tests - if ! python3 -c "import bcrypt, cryptography; print('✅ Security-Module verfügbar')" 2>/dev/null; then + # Security-Tests (robustere Version) + if python3 -c " +try: + import bcrypt, cryptography + print('✅ Security-Module verfügbar') +except ImportError as e: + print('⚠️ Security-Module Import-Problem: ' + str(e)) + exit(1) +" 2>&1; then + success "✅ Security-Module erfolgreich getestet" + else warning "⚠️ Security-Module Import-Problem" ((import_test_errors++)) fi diff --git a/backend/static/js/admin-unified.js b/backend/static/js/admin-unified.js index c2bb583c..7662f6e8 100644 --- a/backend/static/js/admin-unified.js +++ b/backend/static/js/admin-unified.js @@ -689,7 +689,7 @@ class AdminDashboard { window.location.reload(); }, 1000); } else { - this.showNotification(`❌ Fehler: ${data.error}`, 'error'); + this.showNotification(`❌ Fehler: ${data && data.error ? data.error : 'Unbekannter Fehler'}`, 'error'); } } catch (error) { @@ -746,7 +746,7 @@ class AdminDashboard { window.location.reload(); }, 1000); } else { - this.showNotification(`❌ Fehler: ${data.error}`, 'error'); + this.showNotification(`❌ Fehler: ${data && data.error ? data.error : 'Unbekannter Fehler'}`, 'error'); } } catch (error) { @@ -790,7 +790,7 @@ class AdminDashboard { window.location.reload(); }, 1000); } else { - this.showNotification(`❌ Fehler beim Löschen: ${data.error}`, 'error'); + this.showNotification(`❌ Fehler beim Löschen: ${data && data.error ? data.error : 'Unbekannter Fehler'}`, 'error'); } } catch (error) { @@ -819,6 +819,13 @@ class AdminDashboard { async togglePrinterPower(printerId, printerName, button) { console.log(`🔌 Smart-Plug Toggle für Drucker ${printerId} (${printerName})`); + // Validierung der Parameter + if (!button || !button.classList) { + console.error('❌ Ungültiger Button-Parameter:', button); + this.showNotification('❌ Fehler: Ungültiger Button-Parameter', 'error'); + return; + } + // Bestätigungsdialog const confirmMessage = `Möchten Sie die Steckdose für "${printerName}" umschalten?\n\nDies schaltet den Drucker ein/aus.`; if (!confirm(confirmMessage)) return; @@ -955,7 +962,7 @@ class AdminDashboard { } console.log('🔧 Starte automatische Fehlerkorrektur...'); - console.log('🔒 CSRF Token für Request:', this.csrfToken.substring(0, 10) + '...'); + console.log('🔒 CSRF Token für Request:', this.csrfToken ? this.csrfToken.substring(0, 10) + '...' : 'NICHT VERFÜGBAR'); try { const requestOptions = {