📚 Improved log scheduling and setup for enhanced admin unified functionality. 🖥️🔍

This commit is contained in:
Till Tomczak 2025-06-02 12:01:27 +02:00
parent 74367497af
commit c1b0353ac5
3 changed files with 158 additions and 19 deletions

View File

@ -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(<urllib3.connection.HTTPConnection object at 0x000001826C79EBE0>, '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(<urllib3.connection.HTTPConnection object at 0x000001826C79DAE0>, '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(<urllib3.connection.HTTPConnection object at 0x000001826C79F240>, '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(<urllib3.connection.HTTPConnection object at 0x000001826C79EAD0>, '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(<urllib3.connection.HTTPConnection object at 0x000001826C79D260>, '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

View File

@ -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

View File

@ -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 = {