📚 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 - ❌ 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 - [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: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)
|
# Installiere direkt aus requirements.txt (robusteste Methode)
|
||||||
if pip3 install $pip_opts -r "$CURRENT_DIR/requirements.txt"; then
|
if pip3 install $pip_opts -r "$CURRENT_DIR/requirements.txt"; then
|
||||||
success "✅ Requirements.txt erfolgreich installiert"
|
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
|
else
|
||||||
warning "⚠️ Requirements.txt Installation fehlgeschlagen - verwende Fallback-Installation"
|
warning "⚠️ Requirements.txt Installation fehlgeschlagen - verwende Fallback-Installation"
|
||||||
|
|
||||||
@ -722,27 +726,116 @@ install_python_packages() {
|
|||||||
progress "Validiere kritische Python-Abhängigkeiten..."
|
progress "Validiere kritische Python-Abhängigkeiten..."
|
||||||
local validation_errors=0
|
local validation_errors=0
|
||||||
|
|
||||||
if ! python3 -c "import flask; print(f'✅ Flask {flask.__version__} verfügbar')" 2>/dev/null; then
|
# Robuste Validierung mit detailliertem Logging
|
||||||
error "❌ Flask-Import fehlgeschlagen"
|
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++))
|
((validation_errors++))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python3 -c "import werkzeug; print(f'✅ Werkzeug {werkzeug.__version__} verfügbar')" 2>/dev/null; then
|
progress "Teste Werkzeug-Import..."
|
||||||
error "❌ Werkzeug-Import fehlgeschlagen"
|
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++))
|
((validation_errors++))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python3 -c "import sqlalchemy; print(f'✅ SQLAlchemy {sqlalchemy.__version__} verfügbar')" 2>/dev/null; then
|
progress "Teste SQLAlchemy-Import..."
|
||||||
error "❌ SQLAlchemy-Import fehlgeschlagen"
|
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++))
|
((validation_errors++))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python3 -c "import bcrypt; print('✅ bcrypt verfügbar')" 2>/dev/null; then
|
progress "Teste bcrypt-Import..."
|
||||||
error "❌ bcrypt-Import fehlgeschlagen"
|
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++))
|
((validation_errors++))
|
||||||
fi
|
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!"
|
error "❌ $validation_errors kritische Python-Abhängigkeiten fehlen!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -1107,20 +1200,47 @@ install_dependencies_only() {
|
|||||||
progress "Teste kritische Python-Module..."
|
progress "Teste kritische Python-Module..."
|
||||||
local import_test_errors=0
|
local import_test_errors=0
|
||||||
|
|
||||||
# Core-Framework-Tests
|
# Core-Framework-Tests (robustere Version)
|
||||||
if ! python3 -c "import flask, werkzeug, jinja2; print('✅ Core-Framework verfügbar')" 2>/dev/null; then
|
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"
|
warning "⚠️ Core-Framework Import-Problem"
|
||||||
((import_test_errors++))
|
((import_test_errors++))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Datenbank-Tests
|
# Datenbank-Tests (robustere Version)
|
||||||
if ! python3 -c "import sqlalchemy; print('✅ Datenbank-Module verfügbar')" 2>/dev/null; then
|
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"
|
warning "⚠️ Datenbank-Module Import-Problem"
|
||||||
((import_test_errors++))
|
((import_test_errors++))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Security-Tests
|
# Security-Tests (robustere Version)
|
||||||
if ! python3 -c "import bcrypt, cryptography; print('✅ Security-Module verfügbar')" 2>/dev/null; then
|
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"
|
warning "⚠️ Security-Module Import-Problem"
|
||||||
((import_test_errors++))
|
((import_test_errors++))
|
||||||
fi
|
fi
|
||||||
|
@ -689,7 +689,7 @@ class AdminDashboard {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
} else {
|
} else {
|
||||||
this.showNotification(`❌ Fehler: ${data.error}`, 'error');
|
this.showNotification(`❌ Fehler: ${data && data.error ? data.error : 'Unbekannter Fehler'}`, 'error');
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -746,7 +746,7 @@ class AdminDashboard {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
} else {
|
} else {
|
||||||
this.showNotification(`❌ Fehler: ${data.error}`, 'error');
|
this.showNotification(`❌ Fehler: ${data && data.error ? data.error : 'Unbekannter Fehler'}`, 'error');
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -790,7 +790,7 @@ class AdminDashboard {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
} else {
|
} 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) {
|
} catch (error) {
|
||||||
@ -819,6 +819,13 @@ class AdminDashboard {
|
|||||||
async togglePrinterPower(printerId, printerName, button) {
|
async togglePrinterPower(printerId, printerName, button) {
|
||||||
console.log(`🔌 Smart-Plug Toggle für Drucker ${printerId} (${printerName})`);
|
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
|
// Bestätigungsdialog
|
||||||
const confirmMessage = `Möchten Sie die Steckdose für "${printerName}" umschalten?\n\nDies schaltet den Drucker ein/aus.`;
|
const confirmMessage = `Möchten Sie die Steckdose für "${printerName}" umschalten?\n\nDies schaltet den Drucker ein/aus.`;
|
||||||
if (!confirm(confirmMessage)) return;
|
if (!confirm(confirmMessage)) return;
|
||||||
@ -955,7 +962,7 @@ class AdminDashboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log('🔧 Starte automatische Fehlerkorrektur...');
|
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 {
|
try {
|
||||||
const requestOptions = {
|
const requestOptions = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user