From 0c4ee776486b129965216ddf6f9208c8ca751940 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Tue, 3 Jun 2025 20:45:45 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20documentation=20and?= =?UTF-8?q?=20log=20management=20in=20backend=20=F0=9F=96=A5=EF=B8=8F?= =?UTF-8?q?=F0=9F=94=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.claude/settings.local.json | 8 + backend/__pycache__/models.cpython-311.pyc | Bin 81702 -> 97525 bytes .../__pycache__/calendar.cpython-311.pyc | Bin 45380 -> 68967 bytes .../__pycache__/jobs.cpython-311.pyc | Bin 28132 -> 34271 bytes backend/database/myp.db | Bin 135168 -> 135168 bytes backend/database/myp.db-shm | Bin 0 -> 32768 bytes backend/database/myp.db-wal | Bin 0 -> 32992 bytes backend/logs/analytics/analytics.log | 2 + backend/logs/app/app.log | 59 ++++++ backend/logs/auth/auth.log | 3 + backend/logs/backup/backup.log | 3 + backend/logs/dashboard/dashboard.log | 8 + backend/logs/database/database.log | 3 + .../database_cleanup/database_cleanup.log | 6 + .../email_notification/email_notification.log | 2 + .../logs/error_recovery/error_recovery.log | 8 + backend/logs/jobs/jobs.log | 1 + backend/logs/maintenance/maintenance.log | 4 + .../logs/multi_location/multi_location.log | 4 + backend/logs/myp-install-debug.log | 60 +++++-- backend/logs/myp-install-errors.log | 2 +- backend/logs/myp-install-warnings.log | 2 +- backend/logs/myp-install.log | 170 ++++++++++++++++-- backend/logs/permissions/permissions.log | 2 + .../logs/printer_monitor/printer_monitor.log | 34 ++++ backend/logs/printers/printers.log | 48 +++++ backend/logs/queue_manager/queue_manager.log | 15 ++ backend/logs/scheduler/scheduler.log | 77 ++++++++ backend/logs/security/security.log | 2 + .../shutdown_manager/shutdown_manager.log | 2 + backend/logs/startup/startup.log | 16 ++ .../logs/system_control/system_control.log | 2 + backend/logs/windows_fixes/windows_fixes.log | 4 + backend/requirements.txt | 146 +++++++-------- backend/setup.sh | 163 +++++++++-------- .../conflict_manager.cpython-311.pyc | Bin 0 -> 28965 bytes .../error_recovery.cpython-311.pyc | Bin 0 -> 32151 bytes .../printer_monitor.cpython-311.pyc | Bin 34174 -> 38416 bytes .../system_control.cpython-311.pyc | Bin 0 -> 34170 bytes 39 files changed, 679 insertions(+), 177 deletions(-) create mode 100644 backend/.claude/settings.local.json create mode 100644 backend/database/myp.db-shm create mode 100644 backend/database/myp.db-wal create mode 100644 backend/utils/__pycache__/conflict_manager.cpython-311.pyc create mode 100644 backend/utils/__pycache__/error_recovery.cpython-311.pyc create mode 100644 backend/utils/__pycache__/system_control.cpython-311.pyc diff --git a/backend/.claude/settings.local.json b/backend/.claude/settings.local.json new file mode 100644 index 000000000..dd8ca7aa8 --- /dev/null +++ b/backend/.claude/settings.local.json @@ -0,0 +1,8 @@ +{ + "permissions": { + "allow": [ + "Bash(grep:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/backend/__pycache__/models.cpython-311.pyc b/backend/__pycache__/models.cpython-311.pyc index a3ebff154e2371d11ad3933d5df232d144e4f3fc..ed7985b5b51b041ac083e33280d3dd2d90fe9940 100644 GIT binary patch delta 23493 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 delta 12019 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 delta 3932 zcmai13v5%@8TPefCx$rWO%js$#!0{q0rH^Xx$qi~wk!n#D&-aI+?(X)<@ET5(5NgK zw53~MZ8(7pNZWN4tr%6?;kA^i?X(GLXzxmUUTG6*=_V#kYd2}q*oyXl{|z>Sq_vXI z=ltjU&*Oicbi;}xH8hJ!wTdTK?-(Ql1r6gc;}MuX3;b~^MFElr>EveV(X zK>zk|ga~fV2^8yK8_B6a4=9MRSxmw*h1BBEg%j6->!1WM1VRyrL<2bC@?b z!7H9--4f=_OYlmkIftKksz+0r9icKgmhx%*vU|SMT}f8<#c!nkD%}&LrU=O&R;dM6S-iU)?~GL9ZHYZjB0kxhlXOOsiHmN5dL* z@0aKE8qp^| z^v2!(r@gC#o!|XFi5&6G>pt>Pgw$+Zllff`F90}JM&#GFR;+)6`c3xw z?7d-(bMU;1)=>b5(d%g8ujq$867^$v8|n`{?&*iQ1KgWiQK>1N&;J7UrY3u&00;I+~?7h4QX zyay$=GTSz3{tdFWIX9Qh>?ICWO8Y}e`AD&@Vv{kygiIMaWr35gES9*mQ^C%S9?E z9D!{3adf9B8@5NLEfIU6#;3_fYa8HU07n~#YqD7E-Gh;R1eUAE=(S7Be#kUH7!U!l zS2=Ro3+&n)J2Zzep7cX9J_E9;v)FzjJSzJ-w-@~y%ntzlfEa+oA%`xTd|WpF>I}I5 zNaA0_OS;O{yyRSb0^YYFcZ{r@`81JkaE?AHCr13r+w$F!x=d6KF#EUX#B!1-hA6)9E(E1SYAi;U3SgpkI6~ZDk z6ITVjr+UIhw|xmjXvlK+M5)SIsU6{1*ffP5Y@Cn4+ROnyxsIlWQols`RP?oVDM6BzRG6nNnA`_3(WXQImQ%(ile6;E;YD!E z0N=sbj4Xb2+Q#6Q!b`I8>~QThFzP5+EKjuG?4zo?7?HCQ5|@Y$SU!7?rmnS6mwtr& z{p=o!-pv!`$|l)2QKSsWk%<-l3M`U?D`avLx33V7zKb}~al}_1#ByS3ZgnRsY zs&Zlctu&=H!Zzd^4+Yh73)+d!KQ6>MY!5G6@jl=R;3@zGil@Hw9Za&DX)DRU{oQ(_ kFlk}>bHr+0 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 aoMu-qXq3!|hPcM~Yu_95sWfXq%Krnat4E~( delta 6918 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 Y2MI@bdihGZsMZu=?)sGuL5uqRA0hk|ssI20 diff --git a/backend/database/myp.db b/backend/database/myp.db index fb8c0f46360af004294e97bfdb87d495bfe531d9..243867b46251c4aab4091e235d7f97691998d211 100644 GIT binary patch delta 233 zcmZozz|pXPV}dl}^NBLftj`(rk{LIquV-Mw z`3C#D2V@om2YDog6bGbcRAw3)`}!DqWm)K_PF|oN!eeS~Wn`ddW@2V$Y_`eZrmi4R zz{FV3!qn8*+{DFJH%8P&E6aWcJQ0{~s!M(qFq delta 164 zcmZozz|pXPV}dl}VwMFvNOXM`H(_>_bvPF|oN!eeA)Won{lXl`z7X1vMZrmmoo zAxOZ)#KhRZ#Mr3OfO+!8Xw_!^xb6ILj9(Y>v2wg*;G4>;#l4>^gyZGrg#y<(n42=B Qr#F6QRNF4Z$@Gp50BjXCG5`Po diff --git a/backend/database/myp.db-shm b/backend/database/myp.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..b839bf9517efd069f52f9a67a4d14a15e2a05157 GIT binary patch literal 32768 zcmeI*Jq`gu6ae61{j5%+Q7F)fI0Me&3@ULL2XF|DgD5njmnfK#jcB&eNNm2Byv$^F zGV|u!ex`q#g%qurwGg^_Y)3JN^ZROh?i}{{WU#wj$D8$Xy6D}G{V(UorCyQNeSAbQ z9O^|U?w$63XBPXZj?|{w1OWmB2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+KotdQ@&1V{G^%(sXCgp= z0D%&LW@wjuF-(8}0RjXF5U83!x{FZ|AV7cs0RjXF5FkK+009C7{zJga5dZO?R7rpU h0RjXF5FkK+009C72oNAZfB*pk1PBlyK!Ct61fEuEB>DgV literal 0 HcmV?d00001 diff --git a/backend/database/myp.db-wal b/backend/database/myp.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..4ef4d7988f746de817ac31a21c1ab72b65876dfa GIT binary patch literal 32992 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 literal 0 HcmV?d00001 diff --git a/backend/logs/analytics/analytics.log b/backend/logs/analytics/analytics.log index e622bb8e9..54cc7627a 100644 --- a/backend/logs/analytics/analytics.log +++ b/backend/logs/analytics/analytics.log @@ -123,3 +123,5 @@ 2025-06-03 15:19:24 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-03 15:21:43 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-03 15:22:52 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 15:57:19 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-03 20:42:02 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log index 82fe68863..75b0df5ba 100644 --- a/backend/logs/app/app.log +++ b/backend/logs/app/app.log @@ -3203,3 +3203,62 @@ WHERE jobs.status = ?) AS anon_1] 2025-06-03 15:23:16 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_plug_schedules_statistics: User authenticated: True, User ID: 1, Is Admin: True 2025-06-03 15:23:16 - [app] app - [ERROR] ERROR - Datenbank-Transaktion fehlgeschlagen: name 'func' is not defined 2025-06-03 15:23:16 - [app] app - [ERROR] ERROR - Fehler beim Erstellen der Steckdosen-Statistiken: name 'func' is not defined +2025-06-03 15:56:54 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: /mnt/database/myp.db +2025-06-03 15:57:19 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: /mnt/database/myp.db +2025-06-03 15:57:20 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 15:57:20 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 15:57:20 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration verwendet +2025-06-03 15:57:20 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-03 15:57:20 - [app] app - [INFO] INFO - ✅ Error-Recovery-Monitoring gestartet +2025-06-03 15:57:20 - [app] app - [INFO] INFO - ✅ System-Control-Manager initialisiert +2025-06-03 15:57:20 - [app] app - [WARNING] WARNING - ⚠️ Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt +2025-06-03 15:57:20 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-03 15:57:20 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-03 15:57:20 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-03 15:57:20 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-03 15:57:20 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-03 15:57:20 - [app] app - [INFO] INFO - 📋 Standard-Konfiguration aktiv (keine Optimierungen) +2025-06-03 15:57:20 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-03 15:57:22 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-03 15:57:22 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 0/1 Drucker erfolgreich +2025-06-03 15:57:22 - [app] app - [WARNING] WARNING - ⚠️ 1 Drucker konnten nicht initialisiert werden +2025-06-03 15:57:22 - [app] app - [INFO] INFO - ✅ Printer Queue Manager erfolgreich gestartet +2025-06-03 15:57:23 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-03 15:57:25 - [app] app - [INFO] INFO - Starte HTTPS-Server auf 0.0.0.0:443 +2025-06-03 15:57:56 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 15:58:12 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 15:58:12 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 15:58:15 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 20:42:01 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-03 20:42:04 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O) +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🚀 Aktiviere optimierte Konfiguration für schwache Hardware/Raspberry Pi +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ Optimierte Konfiguration aktiviert +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ Error-Recovery-Monitoring gestartet +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ System-Control-Manager initialisiert +2025-06-03 20:42:04 - [app] app - [WARNING] WARNING - ⚠️ Kiosk-Service nicht gefunden - Kiosk-Funktionen eventuell eingeschränkt +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-03 20:42:04 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-03 20:42:04 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🚀 === OPTIMIERTE KONFIGURATION AKTIV === +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 📊 Hardware erkannt: Raspberry Pi=False +2025-06-03 20:42:04 - [app] app - [INFO] INFO - ⚙️ Erzwungen: False +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🔧 CLI-Parameter: True +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🔧 Aktive Optimierungen: +2025-06-03 20:42:04 - [app] app - [INFO] INFO - - Minifizierte Assets: True +2025-06-03 20:42:04 - [app] app - [INFO] INFO - - Animationen deaktiviert: True +2025-06-03 20:42:04 - [app] app - [INFO] INFO - - Glassmorphism begrenzt: True +2025-06-03 20:42:04 - [app] app - [INFO] INFO - - Template-Caching: True +2025-06-03 20:42:04 - [app] app - [INFO] INFO - - Static Cache: 8760.0h +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🚀 ======================================== +2025-06-03 20:42:04 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-03 20:42:06 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system +2025-06-03 20:42:06 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 0/1 Drucker erfolgreich +2025-06-03 20:42:06 - [app] app - [WARNING] WARNING - ⚠️ 1 Drucker konnten nicht initialisiert werden +2025-06-03 20:42:06 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-03 20:42:06 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-03 20:42:06 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-03 20:42:06 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert diff --git a/backend/logs/auth/auth.log b/backend/logs/auth/auth.log index 96dd94b80..711428282 100644 --- a/backend/logs/auth/auth.log +++ b/backend/logs/auth/auth.log @@ -932,3 +932,6 @@ 2025-06-03 15:19:46 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0) 2025-06-03 15:19:46 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet 2025-06-03 15:19:48 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1 +2025-06-03 20:42:21 - [auth] auth - [WARNING] WARNING - JSON-Parsing fehlgeschlagen: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 1 (char 0) +2025-06-03 20:42:21 - [auth] auth - [INFO] INFO - Benutzer admin@mercedes-benz.com hat sich erfolgreich angemeldet +2025-06-03 20:42:22 - [auth] auth - [INFO] INFO - 🔐 Neue Session erstellt für Benutzer admin@mercedes-benz.com von IP 127.0.0.1 diff --git a/backend/logs/backup/backup.log b/backend/logs/backup/backup.log index a2e61c078..c921b8e25 100644 --- a/backend/logs/backup/backup.log +++ b/backend/logs/backup/backup.log @@ -127,3 +127,6 @@ 2025-06-03 15:19:24 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-03 15:21:43 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-03 15:22:52 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 15:56:54 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 15:57:19 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-03 20:42:02 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) diff --git a/backend/logs/dashboard/dashboard.log b/backend/logs/dashboard/dashboard.log index 7fafae51d..cad506db1 100644 --- a/backend/logs/dashboard/dashboard.log +++ b/backend/logs/dashboard/dashboard.log @@ -494,3 +494,11 @@ 2025-06-03 15:22:53 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet 2025-06-03 15:22:53 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) 2025-06-03 15:22:53 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-03 15:57:19 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 15:57:20 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 15:57:20 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit eventlet initialisiert +2025-06-03 15:57:20 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: eventlet) +2025-06-03 20:42:04 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 20:42:04 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-03 20:42:04 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-03 20:42:04 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) diff --git a/backend/logs/database/database.log b/backend/logs/database/database.log index 3433fbe71..e4ccefc89 100644 --- a/backend/logs/database/database.log +++ b/backend/logs/database/database.log @@ -123,3 +123,6 @@ 2025-06-03 15:19:24 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-03 15:21:43 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-03 15:22:52 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 15:56:54 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 15:57:19 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-03 20:42:02 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet diff --git a/backend/logs/database_cleanup/database_cleanup.log b/backend/logs/database_cleanup/database_cleanup.log index 7e0a49f79..f341388d3 100644 --- a/backend/logs/database_cleanup/database_cleanup.log +++ b/backend/logs/database_cleanup/database_cleanup.log @@ -34,3 +34,9 @@ 2025-06-03 15:22:53 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... 2025-06-03 15:22:53 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... 2025-06-03 15:22:53 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-03 15:57:20 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-03 15:57:20 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-03 15:57:20 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-03 20:42:04 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-03 20:42:04 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-03 20:42:04 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... diff --git a/backend/logs/email_notification/email_notification.log b/backend/logs/email_notification/email_notification.log index 4116987a9..44ff92736 100644 --- a/backend/logs/email_notification/email_notification.log +++ b/backend/logs/email_notification/email_notification.log @@ -120,3 +120,5 @@ 2025-06-03 15:19:26 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-03 15:21:44 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-03 15:22:53 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 15:57:20 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-03 20:42:04 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) diff --git a/backend/logs/error_recovery/error_recovery.log b/backend/logs/error_recovery/error_recovery.log index 3a7707089..73e389b7d 100644 --- a/backend/logs/error_recovery/error_recovery.log +++ b/backend/logs/error_recovery/error_recovery.log @@ -26,3 +26,11 @@ 2025-06-03 15:22:53 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet 2025-06-03 15:22:53 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked 2025-06-03 15:22:53 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database +2025-06-03 15:57:20 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert +2025-06-03 15:57:20 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet +2025-06-03 15:57:20 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked +2025-06-03 15:57:20 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database +2025-06-03 20:42:04 - [error_recovery] error_recovery - [INFO] INFO - 🛡️ Error-Recovery-Manager initialisiert +2025-06-03 20:42:04 - [error_recovery] error_recovery - [INFO] INFO - 🔍 Error-Monitoring gestartet +2025-06-03 20:42:04 - [error_recovery] error_recovery - [WARNING] WARNING - 🚨 Fehler erkannt: database_lock - 2025-06-01 00:29:13 - myp.app - ERROR - ❌ Fehler beim Datenbank-Cleanup: (sqlite3.OperationalError) database is locked +2025-06-03 20:42:04 - [error_recovery] error_recovery - [INFO] INFO - 🔧 Führe Recovery-Aktion aus: reset_database diff --git a/backend/logs/jobs/jobs.log b/backend/logs/jobs/jobs.log index 6a984e5e7..426ed91d4 100644 --- a/backend/logs/jobs/jobs.log +++ b/backend/logs/jobs/jobs.log @@ -147,3 +147,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: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) +2025-06-03 20:43:48 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1) diff --git a/backend/logs/maintenance/maintenance.log b/backend/logs/maintenance/maintenance.log index 7f6a19a04..8eedadf00 100644 --- a/backend/logs/maintenance/maintenance.log +++ b/backend/logs/maintenance/maintenance.log @@ -246,3 +246,7 @@ 2025-06-03 15:21:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-03 15:22:53 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-03 15:22:53 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 15:57:20 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 15:57:20 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 20:42:04 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-03 20:42:04 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet diff --git a/backend/logs/multi_location/multi_location.log b/backend/logs/multi_location/multi_location.log index d9e6915ca..c95620e4d 100644 --- a/backend/logs/multi_location/multi_location.log +++ b/backend/logs/multi_location/multi_location.log @@ -244,3 +244,7 @@ 2025-06-03 15:21:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-03 15:22:53 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-03 15:22:53 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 15:57:20 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 15:57:20 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 20:42:04 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-03 20:42:04 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt diff --git a/backend/logs/myp-install-debug.log b/backend/logs/myp-install-debug.log index 1f8d3cf7f..45d22bc4e 100644 --- a/backend/logs/myp-install-debug.log +++ b/backend/logs/myp-install-debug.log @@ -1,32 +1,72 @@ ================================================================= -MYP Installation DEBUG Log - 2025-06-03 15:45:48 +MYP Installation DEBUG Log - 2025-06-03 19:21:32 ================================================================= -[2025-06-03 15:45:49] DEBUG von setup.sh:449 +[2025-06-03 19:21:33] DEBUG von setup.sh:449 Debian erkannt über /etc/debian_version: 12.11 --- -[2025-06-03 15:45:49] DEBUG von setup.sh:517 +[2025-06-03 19:21:33] DEBUG von setup.sh:517 Kein Raspberry Pi erkannt. Hardware-Info: --- -[2025-06-03 15:45:49] DEBUG von setup.sh:518 +[2025-06-03 19:21:33] DEBUG von setup.sh:518 - Device Tree: nicht verfügbar --- -[2025-06-03 15:45:49] DEBUG von setup.sh:519 +[2025-06-03 19:21:33] DEBUG von setup.sh:519 - CPU Hardware: nicht verfügbar --- -[2025-06-03 15:45:49] DEBUG von setup.sh:559 +[2025-06-03 19:21:33] DEBUG von setup.sh:559 Vollständige Kernel-Info: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux --- -[2025-06-03 15:45:49] DEBUG von setup.sh:615 -DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. +[2025-06-03 19:21:52] DEBUG von setup.sh:615 +DNS-Test Details: Teste DNS für 8.8.8.8: nslookup fehlgeschlagen. getent fehlgeschlagen. Erfolg mit ping. --- -[2025-06-03 15:45:50] DEBUG von setup.sh:716 -Externe IP ermittelt über ifconfig.me: 163.116.178.31 +[2025-06-03 19:22:08] DEBUG von setup.sh:722 +Externe IP konnte nicht ermittelt werden +--- + +[2025-06-03 19:25:10] DEBUG von setup.sh:1132 +sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +--- + +[2025-06-03 19:25:10] DEBUG von setup.sh:1188 +Sysctl-Phase abgeschlossen - fahre mit Installation fort +--- + +[2025-06-03 19:25:10] DEBUG von setup.sh:1214 +systemd-networkd nicht aktiv - überspringe +--- + +[2025-06-03 19:25:10] DEBUG von setup.sh:1240 +NetworkManager nicht aktiv - überspringe +--- + +[2025-06-03 19:25:10] DEBUG von setup.sh:1246 +IPv6 Einträge in /etc/hosts auskommentiert +--- + +[2025-06-03 19:25:10] DEBUG von setup.sh:1263 +Netzwerk-Sicherheit ohne Blockierung abgeschlossen +--- + +[2025-06-03 19:28:20] DEBUG von setup.sh:1569 +SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp +--- + +[2025-06-03 19:28:25] DEBUG von setup.sh:1677 +SSL-Konfiguration abgeschlossen ohne hängende Prozesse +--- + +[2025-06-03 19:29:06] DEBUG von setup.sh:962 +flask erfolgreich importiert +--- + +[2025-06-03 19:29:06] DEBUG von setup.sh:962 +requests erfolgreich importiert --- diff --git a/backend/logs/myp-install-errors.log b/backend/logs/myp-install-errors.log index 3c44b950e..a3b77ad84 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 15:45:48 +MYP Installation FEHLER Log - 2025-06-03 19:21:32 ================================================================= diff --git a/backend/logs/myp-install-warnings.log b/backend/logs/myp-install-warnings.log index 3d83789db..97d7a2842 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 15:45:48 +MYP Installation WARNUNGEN Log - 2025-06-03 19:21:32 ================================================================= diff --git a/backend/logs/myp-install.log b/backend/logs/myp-install.log index 535dc9a83..a736738c7 100644 --- a/backend/logs/myp-install.log +++ b/backend/logs/myp-install.log @@ -1,12 +1,12 @@ ================================================================= -MYP Installation Log - 2025-06-03 15:45:48 +MYP Installation Log - 2025-06-03 19:21:32 Script Version: 4.1.0 System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux ================================================================= -[2025-06-03 15:45:48] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === -[2025-06-03 15:45:49] ✅ Root-Berechtigung bestätigt -[2025-06-03 15:45:49] === SYSTEM-RESSOURCEN PRÜFUNG === +[2025-06-03 19:21:32] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === +[2025-06-03 19:21:32] ✅ Root-Berechtigung bestätigt +[2025-06-03 19:21:32] === SYSTEM-RESSOURCEN PRÜFUNG === [FORTSCHRITT] Prüfe RAM... [FORTSCHRITT] Verfügbarer RAM: 24031MB [ERFOLG] ✅ Ausreichend RAM verfügbar (24031MB) @@ -16,10 +16,10 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202 [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 15:45:49] ✅ System-Ressourcen-Prüfung abgeschlossen +[2025-06-03 19:21:32] ✅ System-Ressourcen-Prüfung abgeschlossen [FORTSCHRITT] Prüfe Debian/Raspbian-System... [DEBUG] Debian erkannt über /etc/debian_version: 12.11 -[2025-06-03 15:45:49] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11) +[2025-06-03 19:21:33] ✅ 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: @@ -31,23 +31,22 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202 [FORTSCHRITT] Prüfe Kernel-Version... [INFO] 🐧 Kernel-Version: 6.1.0-37-amd64 [DEBUG] Vollständige Kernel-Info: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux -[2025-06-03 15:45:49] ✅ System-Analyse abgeschlossen +[2025-06-03 19:21:33] ✅ 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.  +[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: nslookup fehlgeschlagen. getent fehlgeschlagen. Erfolg mit ping.  [ERFOLG] ✅ Internetverbindung verfügbar -[INFO] 🔍 Erkannt via: DNS-Auflösung (nslookup: 8.8.8.8) +[INFO] 🔍 Erkannt via: Netzwerk-Verbindung (ping: 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 15:45:50] === KONFIGURIERE HOSTNAME === +[DEBUG] Externe IP konnte nicht ermittelt werden +[2025-06-03 19:22:08] === KONFIGURIERE HOSTNAME === [FORTSCHRITT] Setze Hostname von 'debian' auf 'raspberrypi'... -[2025-06-03 15:45:50] ✅ Hostname erfolgreich auf 'raspberrypi' gesetzt -[2025-06-03 15:45:50] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1 -[2025-06-03 15:45:50] === ROBUSTE SYSTEM-UPDATE === +[2025-06-03 19:22:08] ✅ Hostname erfolgreich auf 'raspberrypi' gesetzt +[2025-06-03 19:23:44] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1 +[2025-06-03 19:23:44] === ROBUSTE SYSTEM-UPDATE === [FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit... [FORTSCHRITT] Validiere APT-Repositories... -[2025-06-03 15:45:50] ✅ Source-Repositories deaktiviert (nicht benötigt) +[2025-06-03 19:23:44] ✅ Source-Repositories deaktiviert (nicht benötigt) [FORTSCHRITT] Aktualisiere Paketlisten mit Retry... [FORTSCHRITT] Führe System-Upgrade durch... [FORTSCHRITT] Installiere essenzielle System-Tools... @@ -56,3 +55,142 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202 [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 19:24:37] ✅ Robustes System-Update abgeschlossen +[2025-06-03 19:24:37] === KONFIGURIERE OPTIONALE NETZWERK-SICHERHEIT === +[FORTSCHRITT] Deaktiviere IPv6 (robust)... +[FORTSCHRITT] Deaktiviere IPv6 in GRUB... +[ERFOLG] ✅ IPv6 in GRUB deaktiviert +[FORTSCHRITT] Erstelle robuste sysctl-Konfiguration... +[ERFOLG] ✅ Basis-sysctl-Konfiguration erstellt +[DEBUG] sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +[FORTSCHRITT] OPTIONAL: Versuche sysctl-Einstellungen anzuwenden... +[ERFOLG] ✅ MYP sysctl-Einstellungen angewendet +[DEBUG] Sysctl-Phase abgeschlossen - fahre mit Installation fort +[FORTSCHRITT] Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)... +[DEBUG] systemd-networkd nicht aktiv - überspringe +[DEBUG] NetworkManager nicht aktiv - überspringe +[DEBUG] IPv6 Einträge in /etc/hosts auskommentiert +[2025-06-03 19:25:10] ✅ Optionale Netzwerk-Sicherheit konfiguriert: +[2025-06-03 19:25:10] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +[2025-06-03 19:25:10] ⚙️ Einstellungen werden beim nächsten Boot aktiv +[2025-06-03 19:25:10] 🔧 Netzwerk-Konfiguration vorbereitet +[INFO] 💡 Tipp: Netzwerk-Sicherheit kann manuell aktiviert werden: +[INFO] → sudo sysctl -p /etc/sysctl.d/99-myp-security.conf +[INFO] → Oder automatisch beim nächsten Neustart +[DEBUG] Netzwerk-Sicherheit ohne Blockierung abgeschlossen +[2025-06-03 19:25:10] === ROBUSTE PYTHON-INSTALLATION === +[FORTSCHRITT] Installiere Python 3 und Build-Abhängigkeiten... +[FORTSCHRITT] Installiere Pakete: python3 +[FORTSCHRITT] Installiere Pakete: python3-pip +[FORTSCHRITT] Installiere Pakete: python3-dev +[FORTSCHRITT] Installiere Pakete: python3-setuptools +[FORTSCHRITT] Installiere Pakete: python3-venv +[FORTSCHRITT] Installiere Pakete: python3-wheel +[FORTSCHRITT] Installiere Pakete: build-essential +[FORTSCHRITT] Installiere Pakete: libssl-dev +[FORTSCHRITT] Installiere Pakete: libffi-dev +[FORTSCHRITT] Installiere Pakete: libbz2-dev +[FORTSCHRITT] Installiere Pakete: libreadline-dev +[FORTSCHRITT] Installiere Pakete: libsqlite3-dev +[FORTSCHRITT] Installiere Pakete: libncurses5-dev +[FORTSCHRITT] Installiere Pakete: libncursesw5-dev +[FORTSCHRITT] Installiere Pakete: zlib1g-dev +[FORTSCHRITT] Installiere Pakete: sqlite3 +[FORTSCHRITT] Validiere Python-Installation... +[2025-06-03 19:26:13] ✅ Python Version: 3.11.2 +[FORTSCHRITT] Konfiguriere pip für bessere Zuverlässigkeit... +[FORTSCHRITT] Erstelle systemweite pip-Konfiguration... +[FORTSCHRITT] Konfiguriere pip für alle Benutzer... +[2025-06-03 19:26:13] ✅ pip konfiguriert für Benutzer: user +[FORTSCHRITT] Aktualisiere pip mit Retry... +[2025-06-03 19:26:17] ✅ pip Version: 25.1.1 +[2025-06-03 19:26:17] ✅ Robuste Python-Umgebung installiert +[2025-06-03 19:26:17] === ROBUSTE NODE.JS UND NPM INSTALLATION === +[FORTSCHRITT] Bereinige alte Node.js-Installationen... +[FORTSCHRITT] Installiere Node.js mit Fallback-Strategie... +[FORTSCHRITT] Verwende Debian Repository als Fallback... +[FORTSCHRITT] Installiere Pakete: nodejs npm +[2025-06-03 19:28:16] ✅ Node.js via Debian Repository installiert +[FORTSCHRITT] Validiere Node.js Installation... +[2025-06-03 19:28:17] ✅ Node.js Version: v18.19.0 +[2025-06-03 19:28:17] ✅ npm Version: 9.2.0 +[FORTSCHRITT] Optimiere npm-Konfiguration... +[2025-06-03 19:28:19] ✅ Node.js und npm erfolgreich installiert +[2025-06-03 19:28:19] === TIMEOUT-GESICHERTE SSL-ZERTIFIKATE KONFIGURATION === +[FORTSCHRITT] Installiere SSL-Grundkomponenten... +[FORTSCHRITT] Installiere Pakete: ca-certificates openssl +[FORTSCHRITT] Aktualisiere CA-Zertifikate (timeout-gesichert)... +[ERFOLG] ✅ CA-Zertifikate erfolgreich aktualisiert +[DEBUG] SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp +[FORTSCHRITT] Installiere Mercedes Corporate Zertifikate (timeout-gesichert)... +[FORTSCHRITT] Lade CA-Zertifikate nach Mercedes-Import neu (timeout-gesichert)... +[ERFOLG] ✅ Mercedes-Zertifikate erfolgreich in CA-Store integriert +[FORTSCHRITT] Konfiguriere SSL-Umgebungsvariablen... +[FORTSCHRITT] Validiere SSL-Konfiguration... +[2025-06-03 19:28:24] ✅ SSL-Zertifikate verfügbar: 144 CA-Zertifikate +[FORTSCHRITT] Finalisiere SSL-Konfiguration... +[ERFOLG] ✅ Finale CA-Zertifikate Integration abgeschlossen +[2025-06-03 19:28:25] ✅ SSL-Zertifikate timeout-gesichert konfiguriert +[DEBUG] SSL-Konfiguration abgeschlossen ohne hängende Prozesse +[2025-06-03 19:28:25] === PYTHON-PAKETE INSTALLATION === +[FORTSCHRITT] Installiere Python-Pakete... +[FORTSCHRITT] Installiere requirements.txt... +[ERFOLG] ✅ requirements.txt erfolgreich installiert +[FORTSCHRITT] Validiere essenzielle Python-Module... +[DEBUG] flask erfolgreich importiert +[DEBUG] requests erfolgreich importiert +[ERFOLG] ✅ Essenzielle Python-Module verfügbar +[2025-06-03 19:29:06] ✅ Python-Pakete Installation abgeschlossen +[FORTSCHRITT] Zeige installierte Python-Pakete... +[2025-06-03 19:29:06] === ROBUSTES ANWENDUNGS-DEPLOYMENT === +[FORTSCHRITT] Erstelle sicheres Zielverzeichnis: /opt/myp +[FORTSCHRITT] Validiere Source-Dateien... +[FORTSCHRITT] Kopiere Anwendungsdateien (robust)... +[FORTSCHRITT] Kopiere kritische Datei: app.py +[ERFOLG] ✅ app.py erfolgreich kopiert +[FORTSCHRITT] Kopiere kritische Datei: models.py +[ERFOLG] ✅ models.py erfolgreich kopiert +[FORTSCHRITT] Kopiere kritische Datei: requirements.txt +[ERFOLG] ✅ requirements.txt erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: blueprints +[ERFOLG] ✅ blueprints erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: config +[ERFOLG] ✅ config erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: database +[ERFOLG] ✅ database erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: static +[ERFOLG] ✅ static erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: templates +[ERFOLG] ✅ templates erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: uploads +[ERFOLG] ✅ uploads erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: utils +[ERFOLG] ✅ utils erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: logs +[ERFOLG] ✅ logs erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: certs +[ERFOLG] ✅ certs erfolgreich kopiert +[FORTSCHRITT] Kopiere optionale Datei: package.json +[FORTSCHRITT] Kopiere optionale Datei: package-lock.json +[FORTSCHRITT] Kopiere optionale Datei: tailwind.config.js +[FORTSCHRITT] Kopiere optionale Datei: postcss.config.js +[FORTSCHRITT] Kopiere optionale Datei: README.md +[FORTSCHRITT] Erstelle Verzeichnisstruktur... +[FORTSCHRITT] Setze sichere Berechtigungen... +[FORTSCHRITT] Konfiguriere robuste Python-Umgebung... +[2025-06-03 19:29:40] ✅ Python-Pfad konfiguriert: /usr/local/lib/python3.11/dist-packages/myp-app.pth +[FORTSCHRITT] Konfiguriere Umgebungsvariablen... +[FORTSCHRITT] Aktualisiere Bash-Profile... diff --git a/backend/logs/permissions/permissions.log b/backend/logs/permissions/permissions.log index eb807be9c..5b4043655 100644 --- a/backend/logs/permissions/permissions.log +++ b/backend/logs/permissions/permissions.log @@ -122,3 +122,5 @@ 2025-06-03 15:19:26 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-03 15:21:44 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-03 15:22:53 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 15:57:20 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-03 20:42:04 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert diff --git a/backend/logs/printer_monitor/printer_monitor.log b/backend/logs/printer_monitor/printer_monitor.log index 855460b0f..ace1f5b24 100644 --- a/backend/logs/printer_monitor/printer_monitor.log +++ b/backend/logs/printer_monitor/printer_monitor.log @@ -3372,3 +3372,37 @@ 2025-06-03 15:23:25 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.103): UNREACHABLE (Ping fehlgeschlagen) 2025-06-03 15:23:25 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 1 Drucker 2025-06-03 15:23:30 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s +2025-06-03 15:56:54 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 15:56:54 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 15:57:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 15:57:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 15:57:20 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-03 15:57:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 15:57:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 15:57:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 15:57:22 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.103): Steckdose konnte nicht ausgeschaltet werden +2025-06-03 15:57:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 0/1 erfolgreich +2025-06-03 15:57:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 15:57:35 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-03 15:57:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 15:57:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-03 15:57:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-03 15:58:05 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 44.3s +2025-06-03 20:42:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-03 20:42:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-03 20:42:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-03 20:42:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-03 20:42:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-03 20:42:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-03 20:42:06 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.103): Steckdose konnte nicht ausgeschaltet werden +2025-06-03 20:42:06 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 0/1 erfolgreich +2025-06-03 20:42:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-03 20:42:16 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-03 20:42:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-03 20:42:25 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-03 20:42:25 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Prüfe Status von 1 aktiven Druckern... +2025-06-03 20:42:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-03 20:42:34 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.103): UNREACHABLE (Ping fehlgeschlagen) +2025-06-03 20:42:34 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 1 Drucker +2025-06-03 20:42:34 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-03 20:42:40 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s diff --git a/backend/logs/printers/printers.log b/backend/logs/printers/printers.log index 5d4918b84..3b0f4279b 100644 --- a/backend/logs/printers/printers.log +++ b/backend/logs/printers/printers.log @@ -6724,3 +6724,51 @@ 2025-06-03 15:23:56 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) 2025-06-03 15:23:56 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker 2025-06-03 15:23:56 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.31ms +2025-06-03 20:42:25 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 20:42:25 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:42:34 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:42:34 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 9011.72ms +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.64ms +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.54ms +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:42:55 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.58ms +2025-06-03 20:43:19 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:43:19 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:43:19 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.41ms +2025-06-03 20:43:31 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 20:43:57 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-03 20:44:01 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:44:01 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:44:01 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.31ms +2025-06-03 20:44:28 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:44:28 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:44:28 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.38ms +2025-06-03 20:44:33 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:44:33 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:44:33 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.28ms +2025-06-03 20:44:33 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:44:33 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:44:33 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.33ms +2025-06-03 20:44:57 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:44:57 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:44:57 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.63ms +2025-06-03 20:45:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:45:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:45:02 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.35ms +2025-06-03 20:45:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:45:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:45:02 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.32ms +2025-06-03 20:45:27 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:45:27 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:45:27 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.47ms +2025-06-03 20:45:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:45:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:45:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.36ms +2025-06-03 20:45:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-03 20:45:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 1 Drucker +2025-06-03 20:45:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.26ms diff --git a/backend/logs/queue_manager/queue_manager.log b/backend/logs/queue_manager/queue_manager.log index b032655b3..8d9f224ab 100644 --- a/backend/logs/queue_manager/queue_manager.log +++ b/backend/logs/queue_manager/queue_manager.log @@ -89,3 +89,18 @@ 2025-06-03 15:21:54 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop 2025-06-03 15:21:54 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet 2025-06-03 15:21:54 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestoppt +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Initialisiere neuen Queue-Manager... +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Zentrale Shutdown-Verwaltung erkannt - deaktiviere lokale Signal-Handler +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Starte Printer Queue Manager... +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden) +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet +2025-06-03 15:57:22 - [queue_manager] queue_manager - [INFO] INFO - 🔍 Überprüfe 8 wartende Jobs... +2025-06-03 15:57:55 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Stoppe Queue-Manager... +2025-06-03 15:57:55 - [queue_manager] queue_manager - [INFO] INFO - ⏳ Warte auf Monitor-Thread... +2025-06-03 15:57:56 - [queue_manager] queue_manager - [ERROR] ERROR - ❌ Fehler beim Überprüfen wartender Jobs: (sqlite3.ProgrammingError) Cannot operate on a closed database. +[SQL: UPDATE printers SET status=?, active=?, last_checked=? WHERE printers.id = ?] +[parameters: [{'last_checked': datetime.datetime(2025, 6, 3, 15, 57, 56, 75275), 'active': False, 'status': 'offline', 'printers_id': 4}]] +(Background on this error at: https://sqlalche.me/e/20/f405) +2025-06-03 15:57:56 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop +2025-06-03 15:57:56 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index 75b9c9378..c97bccb18 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -30221,3 +30221,80 @@ 2025-06-03 15:24: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 15:24:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten 2025-06-03 15:24:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 15:56:54 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 15:57:19 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 15:57:23 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-03 15:57:23 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-03 15:57:23 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 15:57: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 15:57:25 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 15:57:25 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 15:57: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 15:57:27 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 15:57:27 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 15:57: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 15:57:31 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 15:57:31 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 15:57: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 15:57:33 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 15:57:33 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 15:57:35 - [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 15:57:35 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 15:57:35 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 15:57: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 15:57:38 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 15:57:38 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 15:57:41 - [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 15:57:41 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 15:57:41 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 15:57:43 - [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 15:57:43 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 15:57:43 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 15:57:45 - [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 15:57:45 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 15:57:45 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi +2025-06-03 15:57:49 - [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 15:57:49 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 10 nicht einschalten +2025-06-03 15:57:49 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 11: fee +2025-06-03 15:57:52 - [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 15:57:52 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 11 nicht einschalten +2025-06-03 15:57:52 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 12: fee +2025-06-03 15:57:54 - [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 15:57:54 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 12 nicht einschalten +2025-06-03 15:57:54 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 13: e2 +2025-06-03 15:57: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 15:57:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Steckdose für Drucker 4: (sqlite3.ProgrammingError) Cannot operate on a closed database. +(Background on this error at: https://sqlalche.me/e/20/f405) +2025-06-03 15:57:56 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten +2025-06-03 15:57:56 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 15:57: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 15:57:59 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 14 nicht einschalten +2025-06-03 15:57:59 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 15: test +2025-06-03 15:58: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 15:58:02 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 15 nicht einschalten +2025-06-03 15:58:02 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 16: test +2025-06-03 15:58: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 15:58:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 16 nicht einschalten +2025-06-03 15:58:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 15:58:10 - [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 15:58:10 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 15:58:10 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 15:58:12 - [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 15:58:12 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Steckdose für Drucker 4: (sqlite3.ProgrammingError) Cannot operate on a closed database. +(Background on this error at: https://sqlalche.me/e/20/f405) +2025-06-03 15:58:12 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 15:58:12 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 15:58: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 15:58:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Steckdose für Drucker 4: (sqlite3.ProgrammingError) Cannot operate on a closed database. +(Background on this error at: https://sqlalche.me/e/20/f405) +2025-06-03 15:58:15 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 15:58:15 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 15:58:18 - [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 15:58:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 15:58:18 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 15:58: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 15:58:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 15:58:20 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 15:58: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 15:58:22 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 15:58:22 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test diff --git a/backend/logs/security/security.log b/backend/logs/security/security.log index 06111dea1..d23b4c721 100644 --- a/backend/logs/security/security.log +++ b/backend/logs/security/security.log @@ -122,3 +122,5 @@ 2025-06-03 15:19:26 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-03 15:21:44 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-03 15:22:53 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 15:57:20 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 20:42:04 - [security] security - [INFO] INFO - 🔒 Security System initialisiert diff --git a/backend/logs/shutdown_manager/shutdown_manager.log b/backend/logs/shutdown_manager/shutdown_manager.log index 1449ff354..6ff46c5f1 100644 --- a/backend/logs/shutdown_manager/shutdown_manager.log +++ b/backend/logs/shutdown_manager/shutdown_manager.log @@ -216,3 +216,5 @@ 2025-06-03 15:21:54 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Beende Scheduler mit stop()... 2025-06-03 15:21:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Scheduler erfolgreich gestoppt 2025-06-03 15:22:53 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 15:57:20 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 20:42:04 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log index 68635864e..499870f18 100644 --- a/backend/logs/startup/startup.log +++ b/backend/logs/startup/startup.log @@ -1106,3 +1106,19 @@ 2025-06-03 15:22:53 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert 2025-06-03 15:22:53 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert 2025-06-03 15:22:53 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.11.2 (main, Apr 28 2025, 14:11:48) [GCC 12.2.0] +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: posix (linux) +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: /mnt +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T15:57:20.116232 +2025-06-03 15:57:20 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T20:42:04.235089 +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 20:42:04 - [startup] startup - [INFO] INFO - ================================================== diff --git a/backend/logs/system_control/system_control.log b/backend/logs/system_control/system_control.log index 950f5c0fc..ccfac2c72 100644 --- a/backend/logs/system_control/system_control.log +++ b/backend/logs/system_control/system_control.log @@ -5,3 +5,5 @@ 2025-06-03 15:19:26 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert 2025-06-03 15:21:44 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert 2025-06-03 15:22:53 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 15:57:20 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 20:42:04 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log index 4434f77d7..a47ae927c 100644 --- a/backend/logs/windows_fixes/windows_fixes.log +++ b/backend/logs/windows_fixes/windows_fixes.log @@ -523,3 +523,7 @@ 2025-06-03 15:22:51 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) 2025-06-03 15:22:51 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet 2025-06-03 15:22:51 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet diff --git a/backend/requirements.txt b/backend/requirements.txt index 28906aab3..6e9cc98f3 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -4,131 +4,131 @@ # Produktions-optimierte Versionen mit Kompatibilitätsgarantie # ===== CORE FRAMEWORK ===== -Flask==3.1.1 -Werkzeug==3.1.3 -Jinja2==3.1.4 +Flask +Werkzeug +Jinja2 # ===== FLASK EXTENSIONS ===== -Flask-Login==0.6.3 -Flask-WTF==1.2.1 -Flask-SocketIO==5.4.1 -WTForms==3.1.2 -Flask-CORS==5.0.0 -Flask-Compress==1.15 +Flask-Login +Flask-WTF +Flask-SocketIO +WTForms +Flask-CORS +Flask-Compress # ===== DATABASE ===== -SQLAlchemy==2.0.36 +SQLAlchemy # ===== SECURITY ===== -cryptography==44.0.0 -bcrypt==4.2.1 -PyJWT==2.10.1 -itsdangerous==2.2.0 +cryptography +bcrypt +PyJWT +itsdangerous # ===== HTTP REQUESTS ===== -requests==2.32.3 -urllib3==2.2.3 +requests +urllib3 # ===== HARDWARE INTEGRATION ===== -PyP100==0.0.8 -pyserial==3.5 -pyusb==1.2.1 +PyP100 +pyserial +pyusb # ===== REAL-TIME FEATURES ===== -eventlet==0.37.0 -python-socketio==5.13.2 +eventlet +python-socketio # ===== SCHEDULING ===== -schedule==1.2.2 -APScheduler==3.10.4 +schedule +APScheduler # ===== GIS & LOCATION ===== -geocoder==1.38.1 +geocoder # ===== DATA PROCESSING & EXPORT ===== -openpyxl==3.1.5 -xlsxwriter==3.2.0 -pandas==2.2.3 -chardet==5.2.0 -python-magic==0.4.27 -python-magic-bin==0.4.14; sys_platform == "win32" +openpyxl +xlsxwriter +pandas +chardet +python-magic +python-magic-bin; sys_platform == "win32" # ===== EMAIL & VALIDATION ===== -email-validator==2.2.0 +email-validator # ===== IMAGE PROCESSING ===== -Pillow==11.0.0 -qrcode[pil]==8.0 +Pillow +qrcode[pil] # ===== PDF & REPORT GENERATION ===== -reportlab==4.2.5 -weasyprint==63.1 +reportlab +weasyprint # ===== DATE/TIME HANDLING ===== -python-dateutil==2.9.0 -pytz==2024.2 +python-dateutil +pytz # ===== LOGGING & MONITORING ===== -colorlog==6.9.0 -psutil==6.1.1 +colorlog +psutil # ===== FILE SYSTEM OPERATIONS ===== -watchdog==6.0.0 -Send2Trash==1.8.3 +watchdog +Send2Trash # ===== DATA VALIDATION ===== -cerberus==1.3.5 -marshmallow==3.23.2 -validators==0.34.0 +cerberus +marshmallow +validators # ===== UTILITIES ===== -python-slugify==8.0.4 -click==8.1.7 -humanize==4.11.0 -python-dotenv==1.0.1 +python-slugify +click +humanize +python-dotenv # ===== NETWORK & API ===== -ping3==4.0.8 -netifaces==0.11.0 +ping3 +netifaces # ===== CACHING ===== -cachelib==0.13.0 +cachelib # ===== COMPRESSION ===== -py7zr==0.22.0 +py7zr # ===== WINDOWS COMPATIBILITY ===== -pywin32==308; sys_platform == "win32" -wmi==1.5.1; sys_platform == "win32" -colorama==0.4.6; sys_platform == "win32" +pywin32; sys_platform == "win32" +wmi; sys_platform == "win32" +colorama; sys_platform == "win32" # ===== LINUX COMPATIBILITY ===== -RPi.GPIO==0.7.1; sys_platform == "linux" +RPi.GPIO; sys_platform == "linux" # ===== PRODUCTION DEPLOYMENT ===== -gunicorn==23.0.0; sys_platform != "win32" -waitress==3.0.2 +gunicorn; sys_platform != "win32" +waitress # ===== TESTING & DEVELOPMENT ===== -pytest==8.3.4 -pytest-flask==1.3.0 -pytest-cov==6.0.0 -coverage==7.6.9 +pytest +pytest-flask +pytest-cov +coverage # ===== CODE QUALITY ===== -flake8==7.1.1 -black==24.10.0 -isort==5.13.2 +flake8 +black +isort # ===== DEPENDENCY COMPATIBILITY ===== -MarkupSafe==3.0.2 -setuptools==75.6.0 -wheel==0.45.1 -pip==24.3.1 +MarkupSafe +setuptools +wheel +pip # ===== OPTIONAL PERFORMANCE ENHANCEMENTS ===== # Auskommentiert für Stabilität - bei Bedarf aktivieren: -# uwsgi==2.0.26; sys_platform != "win32" -# gevent==24.11.1 -# redis==5.2.1 -# celery==5.4.0 +# uwsgi; sys_platform != "win32" +gevent +redis +celery diff --git a/backend/setup.sh b/backend/setup.sh index ec0f673b4..8e51fe50f 100755 --- a/backend/setup.sh +++ b/backend/setup.sh @@ -930,9 +930,9 @@ EOF } install_python_packages() { - log "=== TIMEOUT-GESICHERTE PYTHON-PAKETE INSTALLATION ===" + log "=== PYTHON-PAKETE INSTALLATION ===" - progress "Installiere Python-Pakete mit Timeout-Sicherung..." + progress "Installiere Python-Pakete..." if [ ! -f "$CURRENT_DIR/requirements.txt" ]; then error "requirements.txt nicht gefunden: $CURRENT_DIR/requirements.txt" @@ -941,81 +941,24 @@ install_python_packages() { # Kopiere requirements.txt cp "$CURRENT_DIR/requirements.txt" "$APP_DIR/" 2>/dev/null || true - # Timeout-gesicherte pip-Optionen - local pip_opts="--break-system-packages --timeout 60 --retries 2 --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --no-cache-dir" + # Installiere alle Pakete aus requirements.txt + progress "Installiere requirements.txt..." - # Strategie 1: Direkte Installation mit Timeout - progress "Versuche direkte requirements.txt Installation (max 10 Minuten)..." - - if timeout 600 python3 -m pip install $pip_opts -r "$CURRENT_DIR/requirements.txt" >/dev/null 2>&1; then + if python3 -m pip install -r "$CURRENT_DIR/requirements.txt" --break-system-packages; then success "✅ requirements.txt erfolgreich installiert" - return 0 else - warning "⚠️ Direkte Installation fehlgeschlagen oder Timeout - verwende minimale Installation" - debug "requirements.txt Installation nach 600s abgebrochen" - - # Strategie 2: Nur essenzielle Pakete (timeout-gesichert) - progress "Installiere nur essenzielle Flask-Komponenten..." - - # Minimale Flask-Installation für Funktionalität - local essential_deps=( - "Flask" - "Werkzeug" - "Jinja2" - "requests" - ) - - local installed_count=0 - for dep in "${essential_deps[@]}"; do - progress "Installiere essenzielle Abhängigkeit: $dep" - if timeout 120 python3 -m pip install $pip_opts "$dep" >/dev/null 2>&1; then - success "✅ $dep erfolgreich installiert" - ((installed_count++)) - else - warning "⚠️ $dep Installation fehlgeschlagen oder Timeout" - debug "$dep Timeout oder Fehler bei Installation" - fi - done - - if [ $installed_count -eq 0 ]; then - warning "⚠️ Keine Python-Pakete konnten installiert werden" - warning "⚠️ Überspringe Python-Pakete Installation - verwende System-Pakete" - - # Strategie 3: Fallback auf System-Pakete (APT) - progress "Versuche System-Python-Pakete als Fallback..." - local system_packages=("python3-flask" "python3-requests") - local system_installed=0 - - for pkg in "${system_packages[@]}"; do - if timeout 60 apt-get install -y "$pkg" >/dev/null 2>&1; then - success "✅ System-Paket installiert: $pkg" - ((system_installed++)) - else - debug "System-Paket fehlgeschlagen: $pkg" - fi - done - - if [ $system_installed -gt 0 ]; then - success "✅ Fallback auf System-Pakete erfolgreich ($system_installed installiert)" - else - warning "⚠️ Auch System-Pakete Installation fehlgeschlagen" - info " → System läuft mit vorhandenen Python-Paketen" - info " → Manuell: pip3 install --break-system-packages Flask requests" - info " → Oder: apt install python3-flask python3-requests" - fi - else - success "✅ $installed_count von ${#essential_deps[@]} essenziellen Paketen installiert" - fi + error "❌ requirements.txt Installation fehlgeschlagen" + return 1 fi - # Schnelle Validierung nur der essenziellen Pakete (timeout-gesichert) + # Validiere essenzielle Module progress "Validiere essenzielle Python-Module..." local essential_modules=("flask" "requests") local validation_success=true for module in "${essential_modules[@]}"; do - if timeout 10 python3 -c "import $module; print(f'✅ $module verfügbar')" 2>/dev/null; then + if python3 -c "import $module; print(f'✅ $module verfügbar')" 2>/dev/null; then debug "$module erfolgreich importiert" else warning "⚠️ $module nicht verfügbar" @@ -1027,12 +970,16 @@ install_python_packages() { success "✅ Essenzielle Python-Module verfügbar" else warning "⚠️ Einige essenzielle Module fehlen" - info " → System funktioniert möglicherweise trotzdem" - info " → Fehlende Pakete: pip3 install --break-system-packages Flask requests" fi - log "✅ Timeout-gesicherte Python-Pakete Installation abgeschlossen" - debug "Python-Installation ohne hängende Prozesse beendet" + log "✅ Python-Pakete Installation abgeschlossen" + + # Zeige installierte Pakete + progress "Zeige installierte Python-Pakete..." + echo "" + echo "📦 Installierte Python-Pakete:" + python3 -m pip list 2>/dev/null | grep -E "(Flask|requests|Werkzeug|Jinja2)" | head -10 || echo " Keine relevanten Pakete gefunden" + echo "" } # =========================== ROBUSTE NODE.JS INSTALLATION =========================== @@ -2203,6 +2150,10 @@ enable_and_start_services() { test_application() { log "=== UMFASSENDE SYSTEM-TESTS ===" + echo "" + echo -e "${BLUE}🔍 Führe System-Tests durch...${NC}" + echo "" + local test_errors=0 local test_warnings=0 @@ -2396,18 +2347,30 @@ except Exception as e: fi # Zusammenfassung der Tests - log "📊 System-Test Zusammenfassung:" - log " ❌ Fehler: $test_errors" - log " ⚠️ Warnungen: $test_warnings" + echo "" + echo -e "${CYAN}=================================================================${NC}" + echo -e "${CYAN} SYSTEM-TEST ERGEBNISSE${NC}" + echo -e "${CYAN}=================================================================${NC}" + echo "" + echo -e "${BLUE}📊 Test-Zusammenfassung:${NC}" + echo -e " ❌ Fehler: $test_errors" + echo -e " ⚠️ Warnungen: $test_warnings" + echo "" if [ $test_errors -eq 0 ] && [ $test_warnings -eq 0 ]; then - success "✅ Alle System-Tests erfolgreich - System vollständig funktionsfähig" + echo -e "${GREEN}✅ Alle System-Tests erfolgreich!${NC}" + echo -e "${GREEN} → System vollständig funktionsfähig${NC}" + echo "" return 0 elif [ $test_errors -eq 0 ]; then - warning "⚠️ System-Tests mit $test_warnings Warnungen abgeschlossen - System grundsätzlich funktionsfähig" + echo -e "${YELLOW}⚠️ System-Tests mit $test_warnings Warnungen abgeschlossen${NC}" + echo -e "${YELLOW} → System grundsätzlich funktionsfähig${NC}" + echo "" return 0 else - error "❌ System-Tests mit $test_errors Fehlern fehlgeschlagen - System möglicherweise nicht funktionsfähig" + echo -e "${RED}❌ System-Tests mit $test_errors Fehlern fehlgeschlagen${NC}" + echo -e "${RED} → System möglicherweise nicht funktionsfähig${NC}" + echo "" return 1 fi } @@ -2519,6 +2482,31 @@ install_dependencies_only() { # Fehler-Zusammenfassung anzeigen show_error_summary + + # Finale Status-Anzeige + echo "" + echo -e "${GREEN}=================================================================${NC}" + echo -e "${GREEN} INSTALLATION ERFOLGREICH ABGESCHLOSSEN!${NC}" + echo -e "${GREEN}=================================================================${NC}" + echo "" + echo -e "${BLUE}📋 Was wurde installiert:${NC}" + echo -e " ✅ System-Updates und Tools" + echo -e " ✅ Python 3 und pip" + echo -e " ✅ Node.js und npm" + echo -e " ✅ SSL-Zertifikate" + echo -e " ✅ Anwendung deployed nach: $APP_DIR" + echo -e " ✅ Systemd-Services installiert" + echo "" + echo -e "${YELLOW}🚀 Nächste Schritte:${NC}" + echo -e " 1. Testen Sie die Anwendung:" + echo -e " ${CYAN}cd $APP_DIR && python3 app.py${NC}" + echo -e " 2. Oder prüfen Sie den Service:" + echo -e " ${CYAN}sudo systemctl status $HTTPS_SERVICE_NAME${NC}" + echo -e " 3. Zugriff über Browser:" + echo -e " ${CYAN}$HTTPS_URL${NC}" + echo "" + echo -e "${GREEN}✅ System bereit für manuelle Tests!${NC}" + echo -e "${GREEN}=================================================================${NC}" } install_full_production_system() { @@ -2621,6 +2609,29 @@ install_full_production_system() { # Fehler-Zusammenfassung anzeigen show_error_summary + + # Finale Status-Anzeige für Vollinstallation + echo "" + echo -e "${GREEN}=================================================================${NC}" + echo -e "${GREEN} VOLLSTÄNDIGE INSTALLATION ERFOLGREICH ABGESCHLOSSEN!${NC}" + echo -e "${GREEN}=================================================================${NC}" + echo "" + echo -e "${BLUE}📋 Was wurde installiert:${NC}" + echo -e " ✅ Komplettes Produktionssystem" + echo -e " ✅ Kiosk-Modus konfiguriert" + echo -e " ✅ Remote-Zugang (SSH & RDP)" + echo -e " ✅ Firewall konfiguriert" + echo -e " ✅ Automatischer Start beim Boot" + echo "" + echo -e "${YELLOW}🔐 Zugangsdaten:${NC}" + echo -e " SSH: user:raspberry (Port 22)" + echo -e " RDP: root:744563017196A (Port 3389)" + echo "" + echo -e "${RED}⚠️ WICHTIG: Neustart erforderlich!${NC}" + echo -e " ${CYAN}sudo reboot${NC}" + echo "" + echo -e "${GREEN}✅ Produktionssystem vollständig installiert!${NC}" + echo -e "${GREEN}=================================================================${NC}" } # =========================== RDP & SSH ZUGANG =========================== diff --git a/backend/utils/__pycache__/conflict_manager.cpython-311.pyc b/backend/utils/__pycache__/conflict_manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f43a9822b0e55d1a0fe6d92f421f0c9a63af067 GIT binary patch literal 28965 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 literal 0 HcmV?d00001 diff --git a/backend/utils/__pycache__/error_recovery.cpython-311.pyc b/backend/utils/__pycache__/error_recovery.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17a4fe1271115a00654048e273e187aceff9de28 GIT binary patch literal 32151 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 AaR2}S literal 0 HcmV?d00001 diff --git a/backend/utils/__pycache__/printer_monitor.cpython-311.pyc b/backend/utils/__pycache__/printer_monitor.cpython-311.pyc index bac81604bd2df858aa680a6bf9925a16b763176e..530db39f3c2aa4d6b26ea6dc1c05b39b2bcb4f44 100644 GIT binary patch delta 9287 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 delta 5752 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 diff --git a/backend/utils/__pycache__/system_control.cpython-311.pyc b/backend/utils/__pycache__/system_control.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..948a5bee7657849461f4f3f6c6c489393c32ce07 GIT binary patch literal 34170 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 literal 0 HcmV?d00001