📚 Improved log scheduling and setup for enhanced admin unified functionality. 🖥️🔍
This commit is contained in:
parent
74367497af
commit
c1b0353ac5
@ -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
|
||||
|
150
backend/setup.sh
150
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
|
||||
|
@ -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 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user