diff --git a/backend/database/myp.db b/backend/database/myp.db index c5a88e429..a766820e0 100644 Binary files a/backend/database/myp.db and b/backend/database/myp.db differ diff --git a/backend/database/myp.db-shm b/backend/database/myp.db-shm deleted file mode 100644 index 4132e4383..000000000 Binary files a/backend/database/myp.db-shm and /dev/null differ diff --git a/backend/database/myp.db-wal b/backend/database/myp.db-wal deleted file mode 100644 index b1b832a41..000000000 Binary files a/backend/database/myp.db-wal and /dev/null differ diff --git a/backend/logs/jobs/jobs.log b/backend/logs/jobs/jobs.log index a5d9cfd5d..6a984e5e7 100644 --- a/backend/logs/jobs/jobs.log +++ b/backend/logs/jobs/jobs.log @@ -146,3 +146,4 @@ FROM jobs LEFT OUTER JOIN users AS users_1 ON users_1.id = jobs.user_id LEFT OUT 2025-06-02 15:19:34 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) 2025-06-02 15:19:34 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) 2025-06-02 15:20:02 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) +2025-06-03 13:31:45 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) diff --git a/backend/logs/myp-install-debug.log b/backend/logs/myp-install-debug.log index d107775fe..3d2769e72 100644 --- a/backend/logs/myp-install-debug.log +++ b/backend/logs/myp-install-debug.log @@ -1,4 +1,32 @@ ================================================================= -MYP Installation DEBUG Log - 2025-06-03 13:34:06 +MYP Installation DEBUG Log - 2025-06-03 13:38:42 ================================================================= +[2025-06-03 13:38:42] DEBUG von setup.sh:449 +Debian erkannt über /etc/debian_version: 12.11 +--- + +[2025-06-03 13:38:42] DEBUG von setup.sh:517 +Kein Raspberry Pi erkannt. Hardware-Info: +--- + +[2025-06-03 13:38:42] DEBUG von setup.sh:518 + - Device Tree: nicht verfügbar +--- + +[2025-06-03 13:38:42] DEBUG von setup.sh:519 + - CPU Hardware: nicht verfügbar +--- + +[2025-06-03 13:38:42] DEBUG von setup.sh:559 +Vollständige Kernel-Info: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux +--- + +[2025-06-03 13:38:43] DEBUG von setup.sh:615 +DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. +--- + +[2025-06-03 13:38:43] DEBUG von setup.sh:716 +Externe IP ermittelt über ifconfig.me: 163.116.178.31 +--- + diff --git a/backend/logs/myp-install-errors.log b/backend/logs/myp-install-errors.log index be6040d45..6114614a6 100644 --- a/backend/logs/myp-install-errors.log +++ b/backend/logs/myp-install-errors.log @@ -1,4 +1,4 @@ ================================================================= -MYP Installation FEHLER Log - 2025-06-03 13:34:06 +MYP Installation FEHLER Log - 2025-06-03 13:38:42 ================================================================= diff --git a/backend/logs/myp-install-warnings.log b/backend/logs/myp-install-warnings.log index b3799a998..742b38a7f 100644 --- a/backend/logs/myp-install-warnings.log +++ b/backend/logs/myp-install-warnings.log @@ -1,4 +1,4 @@ ================================================================= -MYP Installation WARNUNGEN Log - 2025-06-03 13:34:06 +MYP Installation WARNUNGEN Log - 2025-06-03 13:38:42 ================================================================= diff --git a/backend/logs/myp-install.log b/backend/logs/myp-install.log index 3eadda07b..0302d9f1d 100644 --- a/backend/logs/myp-install.log +++ b/backend/logs/myp-install.log @@ -1,10 +1,73 @@ ================================================================= -MYP Installation Log - 2025-06-03 13:34:06 +MYP Installation Log - 2025-06-03 13:38:42 Script Version: 4.1.0 System: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux ================================================================= -[2025-06-03 13:34:06] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === -[2025-06-03 13:34:06] ✅ Root-Berechtigung bestätigt -[2025-06-03 13:34:06] === SYSTEM-RESSOURCEN PRÜFUNG === -[FORTSCHRITT] Verfügbarer RAM: MB +[2025-06-03 13:38:42] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === +[2025-06-03 13:38:42] ✅ Root-Berechtigung bestätigt +[2025-06-03 13:38:42] === SYSTEM-RESSOURCEN PRÜFUNG === +[FORTSCHRITT] Prüfe RAM... +[FORTSCHRITT] Verfügbarer RAM: 24031MB +[ERFOLG] ✅ Ausreichend RAM verfügbar (24031MB) +[FORTSCHRITT] Prüfe Festplattenplatz... +[FORTSCHRITT] Verfügbarer Festplattenplatz: 12,5GB (12825MB) +[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,5GB) +[FORTSCHRITT] Prüfe CPU... +[FORTSCHRITT] CPU: 8 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz +[ERFOLG] ✅ CPU-Information erfolgreich ermittelt +[2025-06-03 13:38:42] ✅ System-Ressourcen-Prüfung abgeschlossen +[FORTSCHRITT] Prüfe Debian/Raspbian-System... +[DEBUG] Debian erkannt über /etc/debian_version: 12.11 +[2025-06-03 13:38:42] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11) +[FORTSCHRITT] Prüfe Raspberry Pi Hardware... +[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi) +[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info: +[DEBUG] - Device Tree: nicht verfügbar +[DEBUG] - CPU Hardware: nicht verfügbar +[FORTSCHRITT] Prüfe System-Architektur... +[INFO] 📐 System-Architektur: x86_64 +[INFO] → 64-Bit x86 Architektur erkannt +[FORTSCHRITT] Prüfe Kernel-Version... +[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64 +[DEBUG] Vollständige Kernel-Info: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux +[2025-06-03 13:38:42] ✅ System-Analyse abgeschlossen +[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)... +[FORTSCHRITT] Teste DNS-Auflösung... +[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup.  +[ERFOLG] ✅ Internetverbindung verfügbar +[INFO] 🔍 Erkannt via: DNS-Auflösung (nslookup: 8.8.8.8) +[FORTSCHRITT] Ermittle externe IP-Adresse... +[INFO] 🌐 Externe IP: 163.116.178.31 +[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.178.31 +[2025-06-03 13:38:43] === KONFIGURIERE HOSTNAME === +[2025-06-03 13:38:43] ✅ Hostname bereits korrekt: 'raspberrypi' +[2025-06-03 13:38:43] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1 +[2025-06-03 13:38:43] === ROBUSTE SYSTEM-UPDATE === +[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit... +[FORTSCHRITT] Validiere APT-Repositories... +[2025-06-03 13:38:43] ✅ Source-Repositories deaktiviert (nicht benötigt) +[FORTSCHRITT] Aktualisiere Paketlisten mit Retry... +[FORTSCHRITT] Führe System-Upgrade durch... +[FORTSCHRITT] Installiere essenzielle System-Tools... +[FORTSCHRITT] Installiere Pakete: ca-certificates +[FORTSCHRITT] Installiere Pakete: gnupg +[FORTSCHRITT] Installiere Pakete: curl +[FORTSCHRITT] Installiere Pakete: wget +[FORTSCHRITT] Installiere Pakete: git +[FORTSCHRITT] Installiere Pakete: nano +[FORTSCHRITT] Installiere Pakete: htop +[FORTSCHRITT] Installiere Pakete: rsync +[FORTSCHRITT] Installiere Pakete: unzip +[FORTSCHRITT] Installiere Pakete: sudo +[FORTSCHRITT] Installiere Pakete: systemd +[FORTSCHRITT] Installiere Pakete: lsb-release +[FORTSCHRITT] Installiere Pakete: apt-transport-https +[FORTSCHRITT] Installiere Pakete: software-properties-common +[FORTSCHRITT] Installiere Pakete: bc +[FORTSCHRITT] Installiere Pakete: dbus +[FORTSCHRITT] Installiere Pakete: systemd-timesyncd +[FORTSCHRITT] Synchronisiere Systemzeit... +[2025-06-03 13:38:53] ✅ Robustes System-Update abgeschlossen +[2025-06-03 13:38:53] === KONFIGURIERE ERWEITERTE NETZWERK-SICHERHEIT === +[FORTSCHRITT] Deaktiviere IPv6... diff --git a/backend/logs/printers/printers.log b/backend/logs/printers/printers.log index 092594684..e73bb9e71 100644 --- a/backend/logs/printers/printers.log +++ b/backend/logs/printers/printers.log @@ -6711,3 +6711,4 @@ 2025-06-02 15:31:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) 2025-06-02 15:31:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker 2025-06-02 15:31:02 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.42ms +2025-06-03 13:31:45 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index 764db6acc..14b4e3333 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -29766,3 +29766,207 @@ 2025-06-03 13:34:46 - [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-03 13:34:46 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten 2025-06-03 13:34:46 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 13:34:48 - [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-03 13:34:48 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 13:34:48 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 13:34:50 - [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-03 13:34:50 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 13:34:50 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 13:34:52 - [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-03 13:34:52 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 13:34:52 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 13:34:54 - [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-03 13:34:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 13:34:54 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 13:34:56 - [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-03 13:34:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 13:34:56 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 13:34:58 - [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-03 13:34:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 13:34:58 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 13:35:01 - [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-03 13:35:01 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 13:35:01 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 13:35:03 - [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-03 13:35:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 13:35:03 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 13:35:05 - [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-03 13:35:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 13:35:05 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 13:35:07 - [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-03 13:35:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 13:35:07 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 13:35: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-03 13:35:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 13:35:09 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 13:35: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-03 13:35:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 13:35:11 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 13:35:14 - [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-03 13:35:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 13:35:14 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 13:35:16 - [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-03 13:35:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 13:35:17 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 13:35:19 - [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-03 13:35:19 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 13:35:19 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 13:35:21 - [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-03 13:35:21 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 13:35:21 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 13:35:23 - [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-03 13:35:23 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 13:35:23 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 13:35:25 - [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-03 13:35:25 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 13:35:25 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 13:35:27 - [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-03 13:35:27 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 13:35:27 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 13:35:29 - [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-03 13:35:29 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 13:35:29 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 13:35:31 - [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-03 13:35:31 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 13:35:31 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 13:35:33 - [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-03 13:35:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 13:35:33 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 13:35:36 - [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-03 13:35:36 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 13:35:36 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 13:35:38 - [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-03 13:35:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 13:35:38 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 13:35:40 - [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-03 13:35:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 13:35:40 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 13:35:42 - [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-03 13:35:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 13:35:42 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 13:35:44 - [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-03 13:35:44 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 13:35:44 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 13:35:46 - [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-03 13:35:46 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 13:35:46 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 13:35:48 - [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-03 13:35:48 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 13:35:48 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 13:35:51 - [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-03 13:35:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 13:35:52 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 13:35:54 - [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-03 13:35:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 13:35:54 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 13:35:56 - [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-03 13:35:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 13:35:56 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 13:35:58 - [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-03 13:35:58 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 13:35:58 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 13:36:00 - [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-03 13:36:00 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 13:36:00 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 13:36:02 - [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-03 13:36:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 13:36:02 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 13:36:05 - [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-03 13:36:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 13:36:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 13:36:07 - [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-03 13:36:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 13:36:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 13:36: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-03 13:36:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 13:36:09 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 13:36:12 - [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-03 13:36:12 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 13:36:12 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 13:36:14 - [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-03 13:36:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 13:36:14 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 13:36:16 - [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-03 13:36:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 13:36:16 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 13:36:18 - [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-03 13:36:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 13:36:18 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 13:36:20 - [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-03 13:36:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 13:36:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 13:36:22 - [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-03 13:36:22 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 13:36:22 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 13:36:24 - [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-03 13:36:24 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 13:36:24 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 13:36:26 - [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-03 13:36:26 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 13:36:27 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 13:36:29 - [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-03 13:36:29 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 13:36:29 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 13:36:32 - [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-03 13:36:32 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 13:36:32 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 13:36:34 - [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-03 13:36:34 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 13:36:34 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 13:36:36 - [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-03 13:36:36 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 13:36:36 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 13:36:38 - [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-03 13:36:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 13:36:38 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 13:36:40 - [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-03 13:36:40 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 13:36:40 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 13:36:42 - [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-03 13:36:42 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 13:36:42 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 13:36:44 - [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-03 13:36:44 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 13:36:44 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 13:36:46 - [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-03 13:36:46 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 13:36:46 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 13:36:48 - [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-03 13:36:48 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 13:36:48 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 13:36:51 - [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-03 13:36:51 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 13:36:51 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 13:36:53 - [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-03 13:36:53 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 13:36:53 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 13:36:55 - [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-03 13:36:55 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 13:36:55 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 13:36:57 - [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-03 13:36:57 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 13:36:57 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 13:36:59 - [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-03 13:36:59 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 13:36:59 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 13:37:01 - [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-03 13:37:01 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 13:37:02 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 13:37:05 - [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-03 13:37:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 13:37:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 13:37:07 - [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-03 13:37:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 13:37:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 13:37: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-03 13:37:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 13:37:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 13:37: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-03 13:37:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 13:37:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 13:37:13 - [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-03 13:37:13 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 13:37:13 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 13:37:15 - [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-03 13:37:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 13:37:15 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test diff --git a/backend/setup.sh b/backend/setup.sh index 3588de3e9..5848bb05d 100644 --- a/backend/setup.sh +++ b/backend/setup.sh @@ -348,67 +348,220 @@ check_root() { check_system_resources() { log "=== SYSTEM-RESSOURCEN PRÜFUNG ===" - # RAM prüfen - local ram_mb=$(free -m | awk '/^Mem:/{print $2}') - progress "Verfügbarer RAM: ${ram_mb}MB" + # RAM prüfen (robuster) + progress "Prüfe RAM..." + local ram_mb="" - if [ -n "$ram_mb" ] && [ "$ram_mb" -eq "$ram_mb" ] 2>/dev/null && [ "$ram_mb" -lt 512 ]; then - warning "⚠️ Wenig RAM verfügbar (${ram_mb}MB) - Installation könnte langsam sein" - elif [ -n "$ram_mb" ] && [ "$ram_mb" -eq "$ram_mb" ] 2>/dev/null; then - success "✅ Ausreichend RAM verfügbar (${ram_mb}MB)" + # Verschiedene Methoden zur RAM-Ermittlung + if command -v free >/dev/null 2>&1; then + ram_mb=$(free -m 2>/dev/null | awk '/^Mem:/{print $2}' 2>/dev/null || echo "") + fi + + # Fallback über /proc/meminfo + if [ -z "$ram_mb" ] && [ -f "/proc/meminfo" ]; then + ram_mb=$(grep '^MemTotal:' /proc/meminfo 2>/dev/null | awk '{print int($2/1024)}' 2>/dev/null || echo "") + fi + + if [ -n "$ram_mb" ] && [ "$ram_mb" -gt 0 ] 2>/dev/null; then + progress "Verfügbarer RAM: ${ram_mb}MB" + + if [ "$ram_mb" -lt 512 ] 2>/dev/null; then + warning "⚠️ Wenig RAM verfügbar (${ram_mb}MB) - Installation könnte langsam sein" + else + success "✅ Ausreichend RAM verfügbar (${ram_mb}MB)" + fi else warning "⚠️ RAM-Größe konnte nicht ermittelt werden" + debug "RAM-Ermittlung fehlgeschlagen: free-Output: $(free -m 2>&1 || echo 'Befehl nicht verfügbar')" fi - # Festplattenplatz prüfen - local disk_free_gb=$(df / | awk 'NR==2{printf "%.1f", $4/1024/1024}') - progress "Verfügbarer Festplattenplatz: ${disk_free_gb}GB" + # Festplattenplatz prüfen (robuster ohne bc) + progress "Prüfe Festplattenplatz..." + local disk_free_gb="" + local disk_free_mb="" - # Konvertiere zu Ganzzahl für Vergleich (GB * 10 für eine Dezimalstelle) - local disk_free_int=$(echo "$disk_free_gb * 10" | bc 2>/dev/null | cut -d. -f1) - local min_required_int=20 # 2.0 GB * 10 - - if [ -z "$disk_free_int" ] || [ "$disk_free_int" -lt "$min_required_int" ]; then - warning "⚠️ Wenig Festplattenplatz verfügbar (${disk_free_gb}GB)" + if command -v df >/dev/null 2>&1; then + # Hole Festplattenplatz in MB + disk_free_mb=$(df / 2>/dev/null | awk 'NR==2{print int($4/1024)}' 2>/dev/null || echo "") + + if [ -n "$disk_free_mb" ] && [ "$disk_free_mb" -gt 0 ] 2>/dev/null; then + # Berechne GB ohne bc (einfache Division) + disk_free_gb=$(awk -v mb="$disk_free_mb" 'BEGIN{printf "%.1f", mb/1024}' 2>/dev/null || echo "$((disk_free_mb/1024))") + + progress "Verfügbarer Festplattenplatz: ${disk_free_gb}GB (${disk_free_mb}MB)" + + # Prüfe ob mindestens 2GB verfügbar (2048 MB) + if [ "$disk_free_mb" -lt 2048 ] 2>/dev/null; then + warning "⚠️ Wenig Festplattenplatz verfügbar (${disk_free_gb}GB)" + else + success "✅ Ausreichend Festplattenplatz verfügbar (${disk_free_gb}GB)" + fi + else + warning "⚠️ Festplattenplatz konnte nicht ermittelt werden" + debug "Disk-Ermittlung fehlgeschlagen: df-Output: $(df / 2>&1 || echo 'Befehl nicht verfügbar')" + fi else - success "✅ Ausreichend Festplattenplatz verfügbar (${disk_free_gb}GB)" + warning "⚠️ df-Befehl nicht verfügbar - kann Festplattenplatz nicht prüfen" fi - # CPU prüfen - local cpu_count=$(nproc) - local cpu_model=$(grep "model name" /proc/cpuinfo | head -1 | cut -d: -f2 | xargs) - progress "CPU: $cpu_count Kern(e) - $cpu_model" + # CPU prüfen (robuster) + progress "Prüfe CPU..." + local cpu_count="" + local cpu_model="" - log "✅ System-Ressourcen validiert" + # CPU-Anzahl ermitteln + if command -v nproc >/dev/null 2>&1; then + cpu_count=$(nproc 2>/dev/null || echo "") + fi + + if [ -z "$cpu_count" ] && [ -f "/proc/cpuinfo" ]; then + cpu_count=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo "") + fi + + # CPU-Modell ermitteln + if [ -f "/proc/cpuinfo" ]; then + cpu_model=$(grep "model name" /proc/cpuinfo 2>/dev/null | head -1 | cut -d: -f2 2>/dev/null | sed 's/^[[:space:]]*//' 2>/dev/null || echo "Unbekannt") + fi + + if [ -n "$cpu_count" ] && [ "$cpu_count" -gt 0 ] 2>/dev/null; then + progress "CPU: $cpu_count Kern(e) - $cpu_model" + success "✅ CPU-Information erfolgreich ermittelt" + else + progress "CPU: Unbekannte Anzahl Kerne - $cpu_model" + warning "⚠️ CPU-Kern-Anzahl konnte nicht ermittelt werden" + debug "CPU-Ermittlung fehlgeschlagen: nproc-Output: $(nproc 2>&1 || echo 'Befehl nicht verfügbar')" + fi + + log "✅ System-Ressourcen-Prüfung abgeschlossen" } check_debian_system() { - if [ ! -f /etc/debian_version ]; then - error "Dieses Skript ist nur für Debian/Raspbian-Systeme geeignet!" + progress "Prüfe Debian/Raspbian-System..." + + # Robuste Debian-Erkennung + local is_debian=false + local debian_version="Unbekannt" + + # Verschiedene Methoden zur Debian-Erkennung + if [ -f /etc/debian_version ]; then + debian_version=$(cat /etc/debian_version 2>/dev/null | head -1 | tr -d '\n\r' || echo "Unbekannt") + is_debian=true + debug "Debian erkannt über /etc/debian_version: $debian_version" fi - local debian_version=$(cat /etc/debian_version 2>/dev/null || echo "Unbekannt") - log "✅ Debian/Raspbian-System erkannt (Version: $debian_version)" - - # Prüfe auf Raspberry Pi - if [ -f /proc/device-tree/model ]; then - local pi_model=$(cat /proc/device-tree/model 2>/dev/null | tr -d '\0' || echo "Unbekannt") - info "Raspberry Pi Modell: $pi_model" - - # Raspberry Pi spezifische Optimierungen - if [[ "$pi_model" =~ "Raspberry Pi" ]]; then - progress "Aktiviere Raspberry Pi spezifische Optimierungen..." - export RASPBERRY_PI_DETECTED=1 + # Fallback über os-release + if [ "$is_debian" = false ] && [ -f /etc/os-release ]; then + local os_id=$(grep '^ID=' /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"' || echo "") + if [[ "$os_id" =~ ^(debian|raspbian|ubuntu)$ ]]; then + is_debian=true + local os_version=$(grep '^VERSION=' /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"' || echo "Unbekannt") + debian_version="$os_id $os_version" + debug "Debian-basiertes System erkannt über os-release: $debian_version" fi fi - # Architektur prüfen - local arch=$(uname -m) - info "System-Architektur: $arch" + # Fallback über lsb_release + if [ "$is_debian" = false ] && command -v lsb_release >/dev/null 2>&1; then + local lsb_id=$(lsb_release -si 2>/dev/null | tr '[:upper:]' '[:lower:]' || echo "") + if [[ "$lsb_id" =~ ^(debian|raspbian|ubuntu)$ ]]; then + is_debian=true + debian_version="$lsb_id $(lsb_release -sr 2>/dev/null || echo 'Unbekannt')" + debug "Debian-basiertes System erkannt über lsb_release: $debian_version" + fi + fi - # Kernel-Version prüfen - local kernel=$(uname -r) - info "Kernel-Version: $kernel" + if [ "$is_debian" = false ]; then + warning "⚠️ System ist möglicherweise nicht Debian/Raspbian-basiert!" + warning "⚠️ Installation wird fortgesetzt, könnte aber fehlschlagen" + debug "System-Erkennung fehlgeschlagen. Verfügbare Info:" + debug " - /etc/debian_version: $([ -f /etc/debian_version ] && echo 'vorhanden' || echo 'nicht vorhanden')" + debug " - /etc/os-release: $([ -f /etc/os-release ] && grep '^ID=' /etc/os-release 2>/dev/null || echo 'nicht verfügbar')" + debug " - lsb_release: $(command -v lsb_release >/dev/null 2>&1 && lsb_release -si 2>/dev/null || echo 'nicht verfügbar')" + else + log "✅ Debian/Raspbian-basiertes System erkannt (Version: $debian_version)" + fi + + # Prüfe auf Raspberry Pi (robuster) + progress "Prüfe Raspberry Pi Hardware..." + local is_raspberry_pi=false + local pi_model="Unbekannt" + + # Methode 1: Device Tree Model + if [ -f /proc/device-tree/model ]; then + pi_model=$(cat /proc/device-tree/model 2>/dev/null | tr -d '\0\n\r' | head -c 100 || echo "") + if [[ "$pi_model" =~ [Rr]aspberry.*[Pp]i ]]; then + is_raspberry_pi=true + debug "Raspberry Pi erkannt über device-tree: $pi_model" + fi + fi + + # Methode 2: CPU Info + if [ "$is_raspberry_pi" = false ] && [ -f /proc/cpuinfo ]; then + local cpu_hardware=$(grep '^Hardware' /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^[[:space:]]*//' | head -1 || echo "") + local cpu_model=$(grep '^Model' /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^[[:space:]]*//' | head -1 || echo "") + + if [[ "$cpu_hardware" =~ [Bb][Cc][Mm] ]] || [[ "$cpu_model" =~ [Rr]aspberry.*[Pp]i ]]; then + is_raspberry_pi=true + pi_model="$cpu_model ($cpu_hardware)" + debug "Raspberry Pi erkannt über cpuinfo: $pi_model" + fi + fi + + if [ "$is_raspberry_pi" = true ]; then + info "🍓 Raspberry Pi erkannt: $pi_model" + progress "Aktiviere Raspberry Pi spezifische Optimierungen..." + export RASPBERRY_PI_DETECTED=1 + debug "Raspberry Pi Optimierungen aktiviert" + else + info "💻 Standard-PC/Server System (kein Raspberry Pi)" + debug "Kein Raspberry Pi erkannt. Hardware-Info:" + debug " - Device Tree: $([ -f /proc/device-tree/model ] && cat /proc/device-tree/model 2>/dev/null | tr -d '\0' || echo 'nicht verfügbar')" + debug " - CPU Hardware: $(grep '^Hardware' /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^[[:space:]]*//' || echo 'nicht verfügbar')" + fi + + # System-Architektur prüfen (robuster) + progress "Prüfe System-Architektur..." + local arch="" + + if command -v uname >/dev/null 2>&1; then + arch=$(uname -m 2>/dev/null || echo "Unbekannt") + info "📐 System-Architektur: $arch" + + # Architektur-spezifische Hinweise + case "$arch" in + "aarch64"|"arm64") + info " → 64-Bit ARM Architektur erkannt" + ;; + "armv7l"|"armv6l") + info " → 32-Bit ARM Architektur erkannt" + ;; + "x86_64"|"amd64") + info " → 64-Bit x86 Architektur erkannt" + ;; + "i386"|"i686") + info " → 32-Bit x86 Architektur erkannt" + ;; + *) + warning "⚠️ Unbekannte Architektur: $arch" + ;; + esac + else + warning "⚠️ uname-Befehl nicht verfügbar - kann Architektur nicht ermitteln" + fi + + # Kernel-Version prüfen (robuster) + progress "Prüfe Kernel-Version..." + local kernel="" + + if command -v uname >/dev/null 2>&1; then + kernel=$(uname -r 2>/dev/null || echo "Unbekannt") + info "🐧 Kernel-Version: $kernel" + debug "Vollständige Kernel-Info: $(uname -a 2>/dev/null || echo 'Nicht verfügbar')" + else + warning "⚠️ Kernel-Version konnte nicht ermittelt werden" + fi + + log "✅ System-Analyse abgeschlossen" } check_internet_connection() { @@ -416,51 +569,132 @@ check_internet_connection() { local connection_ok=false local test_method="" + local debug_info="" - # Methode 1: DNS-Auflösung zuerst (schnellster Test) + # Methode 1: DNS-Auflösung (robuster) progress "Teste DNS-Auflösung..." - local dns_hosts=("google.com" "cloudflare.com" "github.com" "8.8.8.8") + local dns_hosts=("8.8.8.8" "1.1.1.1" "google.com" "cloudflare.com") for host in "${dns_hosts[@]}"; do - if nslookup "$host" >/dev/null 2>&1; then - connection_ok=true - test_method="DNS-Auflösung (nslookup: $host)" - break - elif getent hosts "$host" >/dev/null 2>&1; then - connection_ok=true - test_method="DNS-Auflösung (getent: $host)" - break + debug_info="${debug_info}Teste DNS für $host: " + + # Teste nslookup + if command -v nslookup >/dev/null 2>&1; then + if timeout 10 nslookup "$host" >/dev/null 2>&1; then + connection_ok=true + test_method="DNS-Auflösung (nslookup: $host)" + debug_info="${debug_info}Erfolg mit nslookup. " + break + fi + debug_info="${debug_info}nslookup fehlgeschlagen. " + fi + + # Teste getent hosts + if [ "$connection_ok" = false ] && command -v getent >/dev/null 2>&1; then + if timeout 8 getent hosts "$host" >/dev/null 2>&1; then + connection_ok=true + test_method="DNS-Auflösung (getent: $host)" + debug_info="${debug_info}Erfolg mit getent. " + break + fi + debug_info="${debug_info}getent fehlgeschlagen. " + fi + + # Teste ping als Fallback + if [ "$connection_ok" = false ] && command -v ping >/dev/null 2>&1; then + if timeout 5 ping -c 1 "$host" >/dev/null 2>&1; then + connection_ok=true + test_method="Netzwerk-Verbindung (ping: $host)" + debug_info="${debug_info}Erfolg mit ping. " + break + fi + debug_info="${debug_info}ping fehlgeschlagen. " fi done - # Methode 2: HTTP/HTTPS-Tests + debug "DNS-Test Details: $debug_info" + + # Methode 2: HTTP/HTTPS-Tests (robuster) if [ "$connection_ok" = false ]; then progress "Teste HTTP/HTTPS-Verbindungen..." - local http_urls=("http://detectportal.firefox.com/success.txt" "https://www.google.com" "http://httpbin.org/get") + local http_urls=("http://connectivitycheck.gstatic.com/generate_204" "http://detectportal.firefox.com/success.txt" "https://www.google.com") for url in "${http_urls[@]}"; do + debug_info="Teste HTTP für $url: " + + # Teste curl if command -v curl >/dev/null 2>&1; then - if curl -s --connect-timeout 10 --max-time 15 "$url" >/dev/null 2>&1; then + if timeout 15 curl -s --connect-timeout 8 --max-time 12 --fail "$url" >/dev/null 2>&1; then connection_ok=true test_method="HTTP/HTTPS (curl: $url)" + debug_info="${debug_info}Erfolg mit curl. " break fi - elif command -v wget >/dev/null 2>&1; then - if wget -q --timeout=10 --tries=1 "$url" -O /dev/null 2>/dev/null; then + debug_info="${debug_info}curl fehlgeschlagen. " + fi + + # Teste wget + if [ "$connection_ok" = false ] && command -v wget >/dev/null 2>&1; then + if timeout 15 wget -q --timeout=8 --tries=1 --spider "$url" 2>/dev/null; then connection_ok=true test_method="HTTP/HTTPS (wget: $url)" + debug_info="${debug_info}Erfolg mit wget. " break fi + debug_info="${debug_info}wget fehlgeschlagen. " fi + + debug "HTTP-Test Details: $debug_info" done fi - # Methode 3: APT-Repository-Test + # Methode 3: Lokale Netzwerk-Interface Prüfung if [ "$connection_ok" = false ]; then - progress "Teste APT-Repository-Zugang..." - if apt-get update -qq 2>/dev/null; then + progress "Prüfe lokale Netzwerk-Interfaces..." + + local has_network_interface=false + + # Prüfe ob aktive Netzwerk-Interfaces vorhanden sind + if command -v ip >/dev/null 2>&1; then + local active_interfaces=$(ip route show default 2>/dev/null | awk '{print $5}' | head -1) + if [ -n "$active_interfaces" ]; then + has_network_interface=true + local interface_ip=$(ip route get 1.1.1.1 2>/dev/null | awk '{print $7}' | head -1 || echo "Unbekannt") + info " 📡 Aktives Interface: $active_interfaces (IP: $interface_ip)" + debug "Netzwerk-Interface gefunden: $active_interfaces mit IP $interface_ip" + fi + fi + + # Fallback über ifconfig + if [ "$has_network_interface" = false ] && command -v ifconfig >/dev/null 2>&1; then + local active_interfaces=$(ifconfig 2>/dev/null | grep -E '^[a-zA-Z]' | grep -v '^lo' | head -1 | cut -d: -f1) + if [ -n "$active_interfaces" ]; then + has_network_interface=true + info " 📡 Interface erkannt: $active_interfaces" + debug "Netzwerk-Interface über ifconfig gefunden: $active_interfaces" + fi + fi + + if [ "$has_network_interface" = true ]; then + warning "⚠️ Netzwerk-Interface aktiv, aber Internet nicht erreichbar" + warning " → Möglicherweise Firewall, Proxy oder DNS-Problem" + else + warning "⚠️ Keine aktiven Netzwerk-Interfaces gefunden" + warning " → Bitte prüfen Sie die Netzwerk-Konfiguration" + fi + fi + + # Methode 4: APT-Repository-Test (nur als letzter Test) + if [ "$connection_ok" = false ]; then + progress "Teste APT-Repository-Zugang (kann länger dauern)..." + + # Sehr kurzer APT-Test ohne Update + if timeout 30 apt-get -qq --print-uris update 2>/dev/null | grep -q 'http'; then connection_ok=true - test_method="APT-Repository-Zugang" + test_method="APT-Repository-Konfiguration" + debug "APT-Repositories scheinen konfiguriert zu sein" + else + debug "APT-Repository-Test fehlgeschlagen" fi fi @@ -469,17 +703,35 @@ check_internet_connection() { success "✅ Internetverbindung verfügbar" info " 🔍 Erkannt via: $test_method" - # Zusätzliche Informationen + # Zusätzliche Informationen (robust) if command -v curl >/dev/null 2>&1; then - local external_ip=$(curl -s --connect-timeout 5 ifconfig.me 2>/dev/null || curl -s --connect-timeout 5 ipinfo.io/ip 2>/dev/null || echo "Unbekannt") - if [ "$external_ip" != "Unbekannt" ]; then - info " 🌐 Externe IP: $external_ip" + progress "Ermittle externe IP-Adresse..." + local external_ip="" + local ip_services=("ifconfig.me" "ipinfo.io/ip" "icanhazip.com") + + for service in "${ip_services[@]}"; do + external_ip=$(timeout 8 curl -s --connect-timeout 5 "$service" 2>/dev/null | head -1 | tr -d '\n\r' || echo "") + if [ -n "$external_ip" ] && [[ "$external_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + info " 🌐 Externe IP: $external_ip" + debug "Externe IP ermittelt über $service: $external_ip" + break + fi + done + + if [ -z "$external_ip" ]; then + debug "Externe IP konnte nicht ermittelt werden" fi fi else warning "⚠️ Keine Internetverbindung erkannt" info " → Installation wird fortgesetzt, aber Downloads könnten fehlschlagen" warning " → Bitte prüfen Sie die Netzwerkverbindung!" + + # Debug-Informationen bei fehlgeschlagener Verbindung + debug "Internet-Verbindungstest fehlgeschlagen. System-Info:" + debug " - DNS-Server: $(cat /etc/resolv.conf 2>/dev/null | grep nameserver | head -3 || echo 'Nicht verfügbar')" + debug " - Default Route: $(ip route show default 2>/dev/null || echo 'Nicht verfügbar')" + debug " - Network Interfaces: $(ip addr show 2>/dev/null | grep -E '^[0-9]+:' | cut -d: -f2 | tr -d ' ' | grep -v lo | head -3 || echo 'Nicht verfügbar')" fi } @@ -895,145 +1147,152 @@ install_nodejs_npm() { # =========================== NETZWERK-SICHERHEIT =========================== configure_network_security() { - log "=== KONFIGURIERE ERWEITERTE NETZWERK-SICHERHEIT ===" + log "=== KONFIGURIERE ROBUSTE NETZWERK-SICHERHEIT ===" - # IPv6 vollständig deaktivieren - progress "Deaktiviere IPv6..." + # IPv6 vorsichtig deaktivieren + progress "Deaktiviere IPv6 (robust)..." - # IPv6 in GRUB deaktivieren - if [ -f /etc/default/grub ]; then - cp /etc/default/grub /etc/default/grub.backup - sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& ipv6.disable=1/' /etc/default/grub - sed -i 's/GRUB_CMDLINE_LINUX="[^"]*/& ipv6.disable=1/' /etc/default/grub - update-grub 2>/dev/null || true + # IPv6 in GRUB deaktivieren (nur wenn GRUB vorhanden) + if [ -f /etc/default/grub ] && command -v update-grub >/dev/null 2>&1; then + progress "Deaktiviere IPv6 in GRUB..." + if cp /etc/default/grub /etc/default/grub.backup 2>/dev/null; then + # Prüfe ob ipv6.disable bereits gesetzt ist + if ! grep -q "ipv6.disable=1" /etc/default/grub; then + sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& ipv6.disable=1/' /etc/default/grub 2>/dev/null || true + sed -i 's/GRUB_CMDLINE_LINUX="[^"]*/& ipv6.disable=1/' /etc/default/grub 2>/dev/null || true + + if timeout 30 update-grub >/dev/null 2>&1; then + success "✅ IPv6 in GRUB deaktiviert" + else + warning "⚠️ GRUB-Update fehlgeschlagen" + debug "GRUB-Update Fehler: $(update-grub 2>&1 || echo 'Befehl fehlgeschlagen')" + fi + else + info "IPv6 bereits in GRUB deaktiviert" + fi + else + warning "⚠️ GRUB-Backup konnte nicht erstellt werden" + fi + else + info "GRUB nicht verfügbar oder kein update-grub - überspringe" fi - # IPv6 in sysctl deaktivieren - cat >> /etc/sysctl.conf << 'EOF' - + # IPv6 und Netzwerk-Sicherheit in sysctl konfigurieren (robust) + progress "Erstelle robuste sysctl-Konfiguration..." + + # Backup der bestehenden sysctl.conf + if [ -f /etc/sysctl.conf ]; then + cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d_%H%M%S) 2>/dev/null || true + fi + + # Erstelle separate sysctl-Datei für MYP (sicherer) + local myp_sysctl_file="/etc/sysctl.d/99-myp-security.conf" + + # Nur kritische und kompatible Einstellungen setzen + cat > "$myp_sysctl_file" << 'EOF' # =================================================================== -# MYP Netzwerk-Sicherheitskonfiguration +# MYP Basis-Sicherheitskonfiguration (kompatibel) # =================================================================== -# IPv6 vollständig deaktivieren +# IPv6 deaktivieren (nur wenn unterstützt) net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 -net.ipv6.conf.lo.disable_ipv6 = 1 -# IP-Spoofing-Schutz aktivieren -net.ipv4.conf.all.rp_filter = 1 -net.ipv4.conf.default.rp_filter = 1 - -# Source-Routing deaktivieren (verhindert IP-Spoofing) -net.ipv4.conf.all.accept_source_route = 0 -net.ipv4.conf.default.accept_source_route = 0 - -# ICMP-Redirects ignorieren (verhindert Man-in-the-Middle) +# Grundlegende Netzwerk-Sicherheit +net.ipv4.ip_forward = 0 +net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 -# Secure ICMP-Redirects ignorieren -net.ipv4.conf.all.secure_redirects = 0 -net.ipv4.conf.default.secure_redirects = 0 - -# SYN-Flood-Schutz aktivieren -net.ipv4.tcp_syncookies = 1 -net.ipv4.tcp_max_syn_backlog = 2048 -net.ipv4.tcp_synack_retries = 2 -net.ipv4.tcp_syn_retries = 5 - -# TCP-RFC-Compliance (verhindert aggressive Paketwiederholungen) -net.ipv4.tcp_retries1 = 3 -net.ipv4.tcp_retries2 = 15 -net.ipv4.tcp_orphan_retries = 3 - -# TCP-Window-Skalierung optimieren (geringere Netzwerkauslastung) -net.ipv4.tcp_window_scaling = 1 -net.ipv4.tcp_rmem = 4096 65536 16777216 -net.ipv4.tcp_wmem = 4096 65536 16777216 -net.core.rmem_max = 16777216 -net.core.wmem_max = 16777216 -net.core.netdev_max_backlog = 5000 - -# Broadcast-Pings ignorieren (verhindert Smurf-Angriffe) +# ICMP-Sicherheit net.ipv4.icmp_echo_ignore_broadcasts = 1 - -# Bogus ICMP-Antworten ignorieren net.ipv4.icmp_ignore_bogus_error_responses = 1 -# Paketweiterleitung verhindern (Router-Funktionalität deaktivieren) -net.ipv4.ip_forward = 0 +# Source Routing deaktivieren +net.ipv4.conf.all.accept_source_route = 0 +net.ipv4.conf.default.accept_source_route = 0 -# Martian-Pakete loggen (verdächtige Pakete) -net.ipv4.conf.all.log_martians = 1 -net.ipv4.conf.default.log_martians = 1 +EOF -# TCP-Timestamps deaktivieren (verhindert Fingerprinting) -net.ipv4.tcp_timestamps = 0 - -# TCP-SACK deaktivieren (verhindert bestimmte Angriffe) -net.ipv4.tcp_sack = 0 - -# TCP-Keepalive optimieren -net.ipv4.tcp_keepalive_time = 7200 -net.ipv4.tcp_keepalive_probes = 9 -net.ipv4.tcp_keepalive_intvl = 75 - -# Memory-Limits für Netzwerk-Buffers -net.core.rmem_default = 262144 -net.core.wmem_default = 262144 - -# Schutz vor Time-Wait-Assassination -net.ipv4.tcp_rfc1337 = 1 + # Teste ob die Datei geschrieben werden konnte + if [ -f "$myp_sysctl_file" ]; then + success "✅ Basis-sysctl-Konfiguration erstellt" + debug "sysctl-Konfiguration erstellt: $myp_sysctl_file" + else + warning "⚠️ sysctl-Konfigurationsdatei konnte nicht erstellt werden" + return + fi + + # Optional: Erweiterte Einstellungen nur wenn Raspberry Pi + if [ "${RASPBERRY_PI_DETECTED:-0}" = "1" ]; then + progress "Füge Raspberry Pi spezifische Optimierungen hinzu..." + + cat >> "$myp_sysctl_file" << 'EOF' # =================================================================== -# RASPBERRY PI PERFORMANCE-OPTIMIERUNGEN FÜR WEBAPP +# RASPBERRY PI PERFORMANCE-OPTIMIERUNGEN (optional) # =================================================================== -# Memory Management für schwache Hardware optimieren +# Memory Management für schwache Hardware vm.swappiness = 10 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 vm.vfs_cache_pressure = 50 -vm.min_free_kbytes = 8192 -vm.overcommit_memory = 1 - -# CPU Scheduler für bessere Responsivität -kernel.sched_min_granularity_ns = 10000000 -kernel.sched_wakeup_granularity_ns = 15000000 -kernel.sched_migration_cost_ns = 5000000 # Filesystem Performance vm.dirty_expire_centisecs = 500 vm.dirty_writeback_centisecs = 100 -# Memory Compaction für bessere Speichernutzung -vm.compact_memory = 1 - -# OOM Killer weniger aggressiv -vm.oom_kill_allocating_task = 0 -vm.panic_on_oom = 0 - -# Kernel Preemption für bessere Interaktivität -kernel.sched_rt_runtime_us = 950000 -kernel.sched_rt_period_us = 1000000 - -# I/O Scheduler Optimierungen für SD-Karte -# (wird später per udev-Regel angewendet) - EOF + debug "Raspberry Pi Optimierungen zur sysctl-Konfiguration hinzugefügt" + fi - # Sysctl-Einstellungen sofort anwenden - sysctl -p || warning "Einige sysctl-Einstellungen konnten nicht angewendet werden" + # Sysctl-Einstellungen vorsichtig anwenden + progress "Wende sysctl-Einstellungen an..." - # IPv6 in Netzwerk-Interfaces deaktivieren - progress "Deaktiviere IPv6 in Netzwerk-Interfaces..." + # Versuche sysctl-Einstellungen einzeln anzuwenden (robuster) + if sysctl -p >/dev/null 2>&1; then + success "✅ Alle sysctl-Einstellungen erfolgreich angewendet" + else + warning "⚠️ Einige sysctl-Einstellungen konnten nicht angewendet werden" + debug "sysctl -p Fehlerausgabe: $(sysctl -p 2>&1 || echo 'Befehl fehlgeschlagen')" + + # Versuche kritische Einstellungen einzeln (IPv6 deaktivieren) + progress "Wende kritische Einstellungen einzeln an..." + + local critical_settings=( + "net.ipv6.conf.all.disable_ipv6=1" + "net.ipv6.conf.default.disable_ipv6=1" + "net.ipv4.ip_forward=0" + "net.ipv4.tcp_syncookies=1" + ) + + local applied_count=0 + for setting in "${critical_settings[@]}"; do + if sysctl -w "$setting" >/dev/null 2>&1; then + ((applied_count++)) + debug "Erfolgreich angewendet: $setting" + else + debug "Fehlgeschlagen: $setting" + fi + done + + if [ $applied_count -gt 0 ]; then + success "✅ $applied_count kritische sysctl-Einstellungen angewendet" + else + warning "⚠️ Keine sysctl-Einstellungen konnten angewendet werden" + fi + fi - # Für systemd-networkd - if systemctl is-enabled systemd-networkd 2>/dev/null; then - mkdir -p /etc/systemd/network - cat > /etc/systemd/network/99-disable-ipv6.network << 'EOF' + # IPv6 in Netzwerk-Interfaces deaktivieren (robust) + progress "Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)..." + + # Für systemd-networkd (nur wenn aktiv) + if systemctl is-enabled systemd-networkd >/dev/null 2>&1 && systemctl is-active systemd-networkd >/dev/null 2>&1; then + progress "Konfiguriere systemd-networkd für IPv6-Deaktivierung..." + if mkdir -p /etc/systemd/network 2>/dev/null; then + cat > /etc/systemd/network/99-disable-ipv6.network << 'EOF' [Match] Name=* @@ -1041,12 +1300,23 @@ Name=* IPv6AcceptRA=no LinkLocalAddressing=no EOF - systemctl restart systemd-networkd 2>/dev/null || true + if systemctl restart systemd-networkd >/dev/null 2>&1; then + success "✅ systemd-networkd IPv6 deaktiviert" + else + warning "⚠️ systemd-networkd Neustart fehlgeschlagen" + fi + else + warning "⚠️ systemd-networkd Verzeichnis konnte nicht erstellt werden" + fi + else + debug "systemd-networkd nicht aktiv - überspringe" fi - # Für NetworkManager - if systemctl is-enabled NetworkManager 2>/dev/null; then - cat > /etc/NetworkManager/conf.d/99-disable-ipv6.conf << 'EOF' + # Für NetworkManager (nur wenn aktiv) + if systemctl is-enabled NetworkManager >/dev/null 2>&1 && systemctl is-active NetworkManager >/dev/null 2>&1; then + progress "Konfiguriere NetworkManager für IPv6-Deaktivierung..." + if mkdir -p /etc/NetworkManager/conf.d 2>/dev/null; then + cat > /etc/NetworkManager/conf.d/99-disable-ipv6.conf << 'EOF' [main] plugins=keyfile @@ -1056,11 +1326,26 @@ unmanaged-devices=none [connection] ipv6.method=ignore EOF - systemctl restart NetworkManager 2>/dev/null || true + if systemctl restart NetworkManager >/dev/null 2>&1; then + success "✅ NetworkManager IPv6 deaktiviert" + else + warning "⚠️ NetworkManager Neustart fehlgeschlagen" + fi + else + warning "⚠️ NetworkManager Verzeichnis konnte nicht erstellt werden" + fi + else + debug "NetworkManager nicht aktiv - überspringe" fi - # IPv6 in /etc/hosts auskommentieren - sed -i 's/^::1/#::1/' /etc/hosts 2>/dev/null || true + # IPv6 in /etc/hosts auskommentieren (vorsichtig) + if [ -f /etc/hosts ]; then + if sed -i.backup 's/^::1/#::1/' /etc/hosts 2>/dev/null; then + debug "IPv6 Einträge in /etc/hosts auskommentiert" + else + debug "IPv6 Einträge in /etc/hosts konnten nicht geändert werden" + fi + fi log "✅ Erweiterte Netzwerk-Sicherheit konfiguriert:" log " 🚫 IPv6 vollständig deaktiviert"