From 690aa8835ee7841f02bbb4c75db2140ec8421082 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Tue, 3 Jun 2025 21:27:04 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20IHK=20Projektdokument?= =?UTF-8?q?ation=20and=20logs=20for=20better=20clarity=20&=20error=20handl?= =?UTF-8?q?ing=20in=20backend=20installation=20process.=20=F0=9F=96=A5?= =?UTF-8?q?=EF=B8=8F=F0=9F=94=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dokumentation.md | 292 ++++++++++-------- backend/logs/myp-install-debug.log | 58 +--- backend/logs/myp-install-errors.log | 2 +- backend/logs/myp-install-warnings.log | 2 +- backend/logs/myp-install.log | 179 +---------- backend/setup.sh | 117 ++++++- 6 files changed, 291 insertions(+), 359 deletions(-) diff --git a/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md index 227dd1b9..05596920 100644 --- a/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md +++ b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md @@ -131,65 +131,65 @@ Gesamtinfrastruktur [4.4 Abnahme [15](#abnahme)](#abnahme) -[Anlagen [15](#anlagen)](#anlagen) +# Anlagen -[Netzwerkdiagramme und Systemarchitektur -[15](#netzwerkdiagramme-und-systemarchitektur)](#netzwerkdiagramme-und-systemarchitektur) +## Netzwerkdiagramme und Systemarchitektur -[API-Dokumentation [15](#api-dokumentation)](#api-dokumentation) +(Inklusive Zenmap-Visualisierung der DNS-Problematik) -[Benutzerhandbuch [16](#benutzerhandbuch)](#benutzerhandbuch) +## API-Dokumentation -[Testprotokolle [16](#testprotokolle)](#testprotokolle) +## Benutzerhandbuch -[Screenshots der Benutzeroberfläche -[16](#screenshots-der-benutzeroberfläche)](#screenshots-der-benutzeroberfläche) +## Testprotokolle -[Konfigurationsdateien und Deployment-Skripte -[16](#konfigurationsdateien-und-deployment-skripte)](#konfigurationsdateien-und-deployment-skripte) +## Screenshots der Benutzeroberfläche + +## Konfigurationsdateien und Deployment-Skripte # 1. Einleitung ## 1.1 Analyse des Projektauftrages Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am -Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller -(Prusa, Anycubic; B-Ware im Vergleich zu 3D-Druckern von Kostenstellen -höherer Prioriät sozusagen). Diese Geräte stellen eine wichtige -Ressource für die praktische Ausbildung dar, weisen jedoch erhebliche -technische Limitierungen auf; beispielsweise verfügen die Drucker weder -über Funk- noch Netzwerkschnittstellen oder andere gesamteinheitliche -Steuerungsmöglichkeiten. Diese technischen Einschränkungen verhinderten -bislang eine koordinierte digitale Verwaltung und eine damit -einhergehende Übersicht von Reservierungen und Nutzungsplänen der -Azubis. +Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller – +Prusa, Anycubic. B-Ware im Vergleich zu 3D-Druckern von Kostenstellen +höherer Priorität, aber für unsere Zwecke vollkommen ausreichend. Diese +Geräte stellen eine wichtige Ressource für die praktische Ausbildung dar, +weisen jedoch erhebliche technische Limitierungen auf: Die Drucker +verfügen weder über Funk- noch Netzwerkschnittstellen, geschweige denn +über andere gesamteinheitliche Steuerungsmöglichkeiten. Diese technischen +Einschränkungen verhinderten bislang eine koordinierte digitale +Verwaltung und damit auch jegliche Übersicht von Reservierungen und +Nutzungsplänen. -Das bestehende 'Reservierungssystem' - wenn man es nun so nennen kann - -basierte auf einem analogen Whiteboard, welches neben den Druckern -positioniert war. Dies führte zu systematischen Problemen: -Doppelbuchungen traten regelmäßig auf, wenn mehrere Nutzer zeitgleich -Reservierungen vornahmen, die manuelle Aktivierung und Deaktivierung der -Geräte wurde häufig versäumt - was zu unnötigem Energieverbrauch und -erhöhtem Verschleiß führte - und eine verlässliche Dokumentation der -tatsächlichen Nutzungszeiten existierte nicht, wodurch weder -aussagekräftige Betätigungs- und Verantwortungszuordnung (bspw. für -Aufräumarbeiten), noch eine verursachungsgerechte Kostenzuordnung -möglich waren. +Das bestehende 'Reservierungssystem' – wenn man ein analoges Whiteboard +neben den Druckern überhaupt so nennen möchte – führte zu systematischen +Problemen. Doppelbuchungen waren an der Tagesordnung, die manuelle +Aktivierung und Deaktivierung der Geräte wurde regelmäßig vergessen (was +zu unnötigem Energieverbrauch und erhöhtem Verschleiß führte), und eine +verlässliche Dokumentation der tatsächlichen Nutzungszeiten? +Fehlanzeige. Weder Verantwortungszuordnung für Aufräumarbeiten noch +verursachungsgerechte Kostenzuordnung waren möglich. Ein erstmaliger Lösungsansatz durch den ehemaligen Auszubildenden Torben -Haack hatte einen vielversprechenden Frontend-Prototyp auf Basis von -Next.js hervorgebracht. Der Prototyp verfügte über eine moderne -Benutzeroberfläche und gute Analysefunktionen, allerdings jedoch fehlte -ganz fundamental die essentielle Backend-Funktionalität; ohne dies blieb -die auf Prototypen-basierende Projektarbeit des Torben Haacks in der -praktischen Anwendung ohne jegliche Funktion. Ich sah für mich also die -Chance, die Idee hinter dem Prototypen aufzugreifen und mich ihrer im -Rahmen meiner hier dargelegten Projektarbeit anzunehmen, da ich sofort -mehrere Möglichkeiten zur Einbringung meiner Fachrichtung identifizieren -konnte und ich keine notwendige Obligation - wie bei anderen -Projektmöglichkeiten die sich mir boten - verspürte, sondern einen -Anflug von Ideen, Tatendrang und intrinsischer Motivation; sprich: es -kitzelte meine Leidenschaft. +Haack – Fachrichtung Daten- und Prozessanalyse – hatte einen +vielversprechenden Frontend-Prototyp auf Basis von Next.js +hervorgebracht. Der Prototyp verfügte über eine moderne +Benutzeroberfläche mit umfangreichen Analysefunktionen. Nur fehlte +dummerweise die komplette Backend-Funktionalität. Ohne Backend blieb +die Projektarbeit des Herrn Haack in der praktischen Anwendung +funktionslos. Ursprünglich war angedacht, API-Endpunkte zu +implementieren, welche die Daten- und Prozessanalyse seines Frontends +ermöglicht hätten – eine Aufgabe, die naturgemäß außerhalb meines +Fachgebiets der digitalen Vernetzung lag. + +Ich sah die Chance, die Idee aufzugreifen und im Rahmen meiner +Projektarbeit weiterzuentwickeln. Die Schnittstelle der Vernetzung zum +cyber-physischen System lag im Backend – genau mein Ding. Mehrere +Möglichkeiten zur Einbringung meiner Fachrichtung sprangen mir direkt +ins Auge. Keine lästige Pflichtaufgabe wie bei anderen Projektoptionen, +sondern echtes Interesse. Es kitzelte meine Leidenschaft. ## 1.2 Ableitung der Projektziele @@ -238,13 +238,24 @@ erfordert, die weder zeitlich noch wirtschaftlich vertretbar gewesen wären – ganz zu schweigen von den Garantieverlusten, die solche Eingriffe unweigerlich nach sich gezogen hätten. -Ebenfalls nicht Teil des Projekts war die Integration in übergeordnete -ERP-Systeme oder das unternehmensweite Intranet. Diese Anbindungen -hätten zusätzliche Genehmigungsprozesse und Sicherheitsprüfungen -erfordert, die den Projektrahmen bei weitem überschritten hätten. +Die Integration in das unternehmensweite Intranet war ursprünglich fest +eingeplant – ein Vorhaben, das sich als verhängnisvoller Trugschluss +erweisen sollte. Zur Projektmitte hatte ich die bereits genehmigten +SSL-Zertifikate des Haack'schen Prototyps durch einen unglücklichen +Neuinstallationsprozess unwiederbringlich gelöscht; ein Moment des +Schreckens, der die gesamte Projektplanung ins Wanken brachte. Immerhin +war ich so weit gekommen, dass ich vom Frontend aus den GitHub +OAuth-Zertifizierungsmechanismus ansteuern konnte – doch eine uns im +E-Mail-Verkehr zuvor mitgeteilte IP-Adresse war aus irgendeinem Grund im +DNS nicht mehr richtig zugeordnet, wie ich mit Zenmap herausfand. Die +Intranetanbindung blieb somit ausstehend; zum Zeitpunkt der Abgabe war +sie aufgrund der Konzerngröße und der damit einhergehenden, +entschleunigenden Formalitäten und Genehmigungsprozesse unvollkommen. +Diese Anbindung hätte zusätzliche Sicherheitsprüfungen erfordert, die +den bereits strapazierten Projektrahmen endgültig gesprengt hätten. Stattdessen wurde eine autarke Lösung entwickelt, die alle -erforderlichen Funktionen lokal bereitstellt – ein Ansatz, der sich im -Nachhinein als goldrichtig erweisen sollte. +erforderlichen Funktionen lokal bereitstellt – ein Ansatz, der sich +trotz der Rückschläge als gangbar erwies. ## 1.4 Projektumfeld @@ -289,9 +300,8 @@ Funktionsumfang und Benutzerfreundlichkeit. Besonders herausfordernd gestaltete sich die Schnittstelle zu den Smart-Plugs. Die ursprüngliche Annahme, dass sich die TAPO P110-Steckdosen von TP-Link problemlos integrieren lassen würden, erwies sich als -naiv. Die proprietäre API der Geräte war nicht nur -undokumentiert, sondern verschleiert – ein Umstand, der -erheblichen Reverse-Engineering-Aufwand erforderte. +naiv. Die Geräte boten keine dokumentierte API – nur die proprietäre +TAPO-App ermöglichte die Steuerung. Das war ein Problem. ## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen @@ -306,25 +316,30 @@ Lösungsansätzen zwang. Die Authentifizierung und Autorisierung musste robust implementiert werden, ohne die Benutzerfreundlichkeit zu beeinträchtigen – ein klassisches Dilemma der IT-Sicherheit. Die Entscheidung für -bcrypt-basiertes Password-Hashing mit einem Cost-Faktor von 12 stellte -einen vernünftigen Kompromiss zwischen Sicherheit und Performance auf -dem ressourcenbeschränkten Raspberry Pi dar. +bcrypt-basiertes Password-Hashing stellte einen vernünftigen Kompromiss +zwischen Sicherheit und Performance auf dem ressourcenbeschränkten +Raspberry Pi dar; die Details der Implementierung überließ ich – +naturgemäß außerhalb meiner Kernkompetenz der digitalen Vernetzung +liegend – der bewährten Flask-Login-Bibliothek. Besondere Aufmerksamkeit erforderte die Absicherung der API-Endpunkte. Jeder Endpunkt musste gegen gängige Angriffsvektoren wie SQL-Injection, Cross-Site-Scripting und CSRF-Attacken geschützt werden. Die -Implementierung eines Rate-Limiting-Mechanismus verhindert zudem +Implementierung eines Rate-Limiting-Mechanismus erschwert Brute-Force-Angriffe auf die Authentifizierungsschnittstelle – eine -Maßnahme, die sich später als weitsichtig erweisen sollte. +Maßnahme, die zwar keinen absoluten Schutz bietet, aber die Hürde für +Angreifer signifikant erhöht. ## 1.7 Darstellung der vorhandenen Systemarchitektur -Die vorgefundene Systemarchitektur – wenn man sie denn überhaupt so -nennen möchte – bestand aus isolierten Komponenten ohne jegliche -Integration. Die 3D-Drucker operierten als Insellösungen, verbunden -lediglich durch ihre physische Nähe und das gemeinsame Whiteboard. Der -Frontend-Prototyp von Torben Haack existierte als Docker-Container auf -einem Entwicklungsserver, ohne Anbindung an reale Daten oder Funktionen. +Die vorgefundene Systemarchitektur – möchte man sie überhaupt so nennen – +bestand aus diffusen Komponenten ohne jegliche Integration. Die +3D-Drucker operierten als Insellösungen, verbunden lediglich durch ihre +physische Nähe und das gemeinsame Whiteboard. Der Frontend-Prototyp von +Torben Haack existierte als Docker-Container auf einem +Entwicklungsserver, operativ maximal auf ein Testnetzwerk begrenzt ohne +jegliche praktische Integration – ohne Anbindung an reale Daten oder +Funktionen. Die Netzwerkinfrastruktur der TBA basierte auf einem segmentierten Ansatz mit verschiedenen VLANs für unterschiedliche Geräteklassen. Die @@ -338,7 +353,15 @@ erforderlich war. Die Lösung musste die isolierten Komponenten zu einem kohärenten System verbinden, ohne dabei die bestehenden Sicherheitsrichtlinien zu verletzen. Der gewählte Ansatz – die Steuerung über Smart-Plugs – stellte einen eleganten Kompromiss zwischen -technischer Machbarkeit und praktischem Nutzen dar. +technischer Machbarkeit und praktischem Nutzen dar; eine Entscheidung, +die nicht zuletzt auf meiner privaten Erfahrung mit TAPO-Geräten +basierte. In meiner privat geführten Infrastruktur hatte ich bereits +TAPO-Geräte aller Art integriert – stets ging dies recht schnell und +einfach vonstatten. Privat nutzte ich ebenfalls Air-Gapped-Networks +hierfür, jedoch mit dem entscheidenden Unterschied, nicht mit der +eigenständigen programmatischen Integration eben jener Geräte als +Hauptkomponente beauftragt zu sein; ein Unterschied, der sich als +gravierend herausstellen sollte. # 2. Projektplanung @@ -437,6 +460,13 @@ nicht nur Unabhängigkeit von proprietären Lösungen, sondern erfüllte auch die strikte Offline-Anforderung des Projekts – ein Umstand, der sich als Segen erwies. +Als Betriebssystem stand zunächst eine Entscheidung zwischen OpenSUSE +und NixOS im Raum – wir hatten uns bereits gedanklich auf NixOS +festgelegt, da es durch seine deklarative Konfiguration für diesen +Einsatzzweck prädestiniert schien. Letztendlich entschied ich mich doch +für Raspbian, um nicht unnötig zu experimentieren und die knapp bemessene +Zeit effizient zu nutzen; Pragmatismus über technische Eleganz. + ## 2.3 Planung der Qualitätssicherung Das Qualitätssicherungskonzept orientierte sich am V-Modell. Für jede @@ -499,25 +529,23 @@ kategorisch aus, was die Optionen erheblich einschränkte. Die Entscheidung für lokale HTTP/HTTPS-Kommunikation mit selbstsignierten Zertifikaten war pragmatisch, aber effektiv. -Die Kommunikation mit den Smart-Plugs erfolgte über das proprietäre -TP-Link-Protokoll, das auf HTTP basiert. Die anfänglichen Versuche, die -offizielle Cloud-API zu nutzen, scheiterten an den -Sicherheitsrichtlinien. Die Entdeckung, dass die Geräte auch eine lokale -API anboten, war ein Durchbruch – allerdings einer, der erheblichen -Reverse-Engineering-Aufwand erforderte. +Die Kommunikation mit den Smart-Plugs stellte die größte Herausforderung +dar. Die TAPO-Geräte boten keine dokumentierte Schnittstelle – nur die +proprietäre App konnte sie steuern. Also griff ich zu Wireshark und +analysierte den Netzwerkverkehr zwischen App und Steckdosen. Was ich +fand, war ernüchternd: verschlüsselte Kommunikation mit sich ständig +ändernden Session-Keys. -Hier kam Wireshark ins Spiel. Zusammen mit der TAPO-App analysierte ich -den Netzwerkverkehr, um das Kommunikationsprotokoll zu entschlüsseln. -Die Erkenntnis, dass ein Session-Key erforderlich war, der sich bei -jeder Anmeldung änderte, verkomplizierte die Integration erheblich. -Zunächst versuchte ich, diesen Key manuell abzufangen und in meine -Anwendung zu integrieren – ein Ansatz, der funktionierte, aber -offensichtlich nicht praxistauglich war. +Mein erster Versuch mit einem vielversprechenden Python-Modul schlug +fehl – es funktionierte einfach nicht mit meinen Geräten. Der +Wireshark-Mitschnitt offenbarte immer dieselben verschlüsselten +Responses. Ohne Erfolg beim Simulieren einzelner Anfragen dämmerte +es mir: Die Anfragensequenz musste stimmen! Die Verbindung nutzte +temporäre Cookies und proprietäre Verschlüsselung. -Nach tagelangen Experimenten und zahllosen Fehlversuchen stieß ich auf -ein alternatives Python-Modul, das die lokale Kommunikation mit den -TAPO-Geräten ermöglichte. Dieses Modul – versteckt in den Tiefen von -GitHub – löste die Session-Key-Problematik elegant und ermöglichte eine +Nach tagelangen Experimenten stieß ich auf PyP100 – ein alternatives +Python-Modul, versteckt in den Tiefen von GitHub. Dieses Modul löste +die Session-Key-Problematik elegant und ermöglichte endlich eine stabile Integration. ## 2.6 Planung der Prozess-/ und Systemschnittstellen @@ -582,24 +610,24 @@ iterativen, problemgetriebenen Herangehensweise. Die "Sensoren" in diesem Kontext waren die Smart-Plugs – eine euphemistische Bezeichnung für Geräte, die sich als erstaunlich -widerspenstig erwiesen. Die initiale Annahme, dass die PyP100-Bibliothek -out-of-the-box funktionieren würde, zerschlug sich an der Realität der -proprietären TP-Link-Implementation. +widerspenstig erwiesen. Meine erste Hoffnung, ein bestehendes +Python-Modul zur Steuerung zu finden, zerschlug sich schnell. +Das gefundene Modul funktionierte schlicht nicht. -Der erste Ansatz – die Nutzung der dokumentierten Cloud-API – scheiterte -an den Sicherheitsrichtlinien. Der zweite Ansatz – die direkte lokale -Kommunikation – scheiterte an der fehlenden Dokumentation. Erst der -dritte Ansatz – Reverse Engineering mittels Wireshark – führte zum -Durchbruch. +Also Plan B: Wireshark. Ich schnitt den Netzwerkverkehr zwischen +TAPO-App und Smart-Plugs mit. Die Analyse offenbarte das komplexe +Authentifizierungsprotokoll der TAPO-Geräte – verschlüsselte +Kommunikation mit Session-Tokens, die sich bei jeder Anmeldung +änderten. Die Verschlüsselung basierte auf einer Kombination aus +RSA und AES. Respektabel für Consumer-Hardware, aber auch verdammt +nervig für meine Zwecke. -Die Wireshark-Analyse offenbarte das komplexe -Authentifizierungsprotokoll der TAPO-Geräte. Jede Kommunikation -erforderte einen verschlüsselten Handshake, gefolgt von einem -Session-Token, der für alle weiteren Operationen benötigt wurde. Die -Verschlüsselung basierte auf einer Kombination aus RSA und AES – -durchaus respektabel für Consumer-Hardware. +Nach tagelangen Experimenten stieß ich endlich auf PyP100 – ein +Python-Modul, das die lokale Kommunikation mit den TAPO-Geräten +tatsächlich beherrschte. Versteckt in den Tiefen von GitHub, löste +es die Session-Key-Problematik elegant. Endlich. -Die Implementierung der Datenabfrage erfolgte schließlich über eine +Die Implementierung der Datenabfrage erfolgte über eine selbstentwickelte Wrapper-Klasse, die die Komplexität der Kommunikation kapselte. Retry-Mechanismen mit exponentieller Backoff-Strategie sorgten für Robustheit bei Netzwerkproblemen. Die Abfrage umfasste nicht nur den @@ -645,16 +673,19 @@ konsolidieren, vereinfachte nicht nur die Architektur, sondern reduzierte auch Kosten und Stromverbrauch. Der versehentliche Verlust der SSL-Zertifikate während einer -Neuinstallation führte zur Implementierung -eines robusten Backup-Systems. Kritische Konfigurationsdateien werden nun dreifach -gesichert. +Neuinstallation führte zur Implementierung eines robusten Backup-Systems. +Kritische Konfigurationsdateien werden nun dreifach gesichert – eine +Lektion, die schmerzhaft gelernt wurde. Der Verlust der bereits +genehmigten Zertifikate des Haack'schen Prototyps zur Projektmitte war +ein Moment des Schreckens; die mühsam erkämpften Genehmigungen, die +etablierten Vertrauensstellungen – alles dahin durch einen unbedachten +Moment während der Systemkonfiguration. -Die Entscheidung, von der komplexen PyP100-Integration zu einem -alternativen Modul zu wechseln, fiel nach tagelangen frustrierenden -Debugging-Sessions. Der Stolz, es "richtig" machen zu wollen, wich dem -Pragmatismus, eine funktionierende Lösung zu liefern. Das gefundene -Alternative Modul – ironischerweise simpler und stabiler – rettete das -Projekt. +Die Entscheidung, von meinem ersten Python-Modul-Versuch zu PyP100 zu +wechseln, fiel nach tagelangen frustrierenden Debugging-Sessions. Der +Stolz, es mit dem ersten Modul schaffen zu wollen, wich dem Pragmatismus, +eine funktionierende Lösung zu liefern. PyP100 – ironischerweise simpler +und stabiler – rettete das Projekt. ## 3.3 Maßnahmen zur Qualitätskontrolle @@ -704,7 +735,7 @@ für die Offline-Anforderung. Der Scheduler wurde als eigenständiger Thread implementiert, der beim Anwendungsstart initialisiert wurde. Die Kommunikation mit dem Hauptthread erfolgte über thread-sichere Queues. Diese Architektur -ermöglichte asynchrone Hardware-Operationen ohne Blockierung der +ermöglicht asynchrone Hardware-Operationen ohne Blockierung der Web-Requests. ## 3.5 Konfiguration von Übertragungssystemen und Integration in die Gesamtinfrastruktur @@ -721,10 +752,11 @@ erheblich, aber notwendig für die Compliance. Die SSL-Konfiguration mit selbstsignierten Zertifikaten war ein notwendiges Übel. Ohne Internet-Zugang war Let's Encrypt keine Option. -Die Zertifikate wurden mit allen relevanten SANs (Subject Alternative -Names) generiert, um Kompatibilitätsprobleme zu vermeiden. Die -Browser-Warnungen wurden durch eine dokumentierte Prozedur zur -Zertifikats-Installation umgangen – nicht elegant, aber funktional. +Die Zertifikate wurden mit OpenSSL generiert und mit allen relevanten +SANs (Subject Alternative Names) versehen, um Kompatibilitätsprobleme zu +vermeiden. Die Browser-Warnungen wurden durch eine dokumentierte +Prozedur zur Zertifikats-Installation umgangen – nicht elegant, aber +funktional. Die Integration der Smart-Plugs erforderte statische IP-Adressen – DHCP-Reservierungen waren in der Netzwerk-Policy nicht vorgesehen. Die @@ -744,11 +776,11 @@ API-Endpunkte wurden systematisch gegen die OWASP Top 10 abgesichert. Input-Validation erfolgte auf mehreren Ebenen – Client-seitig für UX, Server-seitig für Sicherheit; Vertrauen ist gut, Kontrolle ist besser. -Die Implementierung eines Rate-Limiters verhinderte +Die Implementierung eines Rate-Limiters erschwerte Brute-Force-Angriffe. Nach fünf fehlgeschlagenen Login-Versuchen wurde die IP-Adresse für 30 Minuten gesperrt – lang genug, um Angriffe -unwirtschaftlich zu machen, kurz genug, um legitime Nutzer nicht -übermäßig zu frustrieren; ein Balanceakt zwischen Sicherheit und +unattraktiv zu machen, kurz genug, um legitime Nutzer nicht übermäßig zu +frustrieren; ein Balanceakt zwischen Sicherheit und Benutzerfreundlichkeit. DSGVO-Compliance wurde durch Privacy-by-Design erreicht. @@ -789,6 +821,24 @@ Energiemonitorings. Diese ursprünglich nicht geplante Funktion ermöglicht detaillierte Einblicke in Nutzungsmuster und Energieverbrauch – wertvolle Daten für die Optimierung des Druckerbetriebs. +Für die programmatische Umsetzung des Frontends nahm ich gänzlich +Unterstützung künstlicher Intelligenz zu Hilfe – mehr als absolut +notwendig, um das Zeitlimit nicht um Längen zu überschreiten und die +Profession meiner Fachrichtung einzuhalten. Die Frontend-Entwicklung lag +außerhalb meines Kernkompetenzbereichs der digitalen Vernetzung; die +KI-Assistenz ermöglichte es mir, mich auf die Backend-Integration und +Hardware-Anbindung zu konzentrieren – meine eigentlichen Stärken. + +Die Implementierung eines Kiosk-Modus für die Werkstatt-Terminals +erforderte zusätzliche Systemkonfiguration: Openbox als minimalistisches +Desktop-Environment, Chromium im Kiosk-Modus mit automatischem Start +dreier Instanzen – eine auf Port 443, eine auf Port 80 als Fallback für +die API, sowie eine lokale Instanz auf Port 5000 für den Kiosk-Modus. +Die Mercedes Root-CA-Zertifikate mussten manuell installiert werden; ein +Shell-Skript automatisierte diesen Prozess, eine systemd-Service-Datei +gewährleistete den Autostart. FirewallD diente als Firewall-Service – +eine weitere Ebene der Absicherung. + Die technischen Herausforderungen – insbesondere die Smart-Plug-Integration – erforderten mehr Zeit als geplant. Die investierte Mühe zahlte sich jedoch aus: Die finale Lösung ist robuster @@ -889,17 +939,3 @@ chaotisch zu strukturiert, von manuell zu automatisiert ist vollbracht. Was als technische Herausforderung begann, endete als Erfolgsgeschichte – ein Beweis dafür, dass mit Kreativität, Durchhaltevermögen und einer Prise technischer Finesse auch scheinbar unlösbare Probleme gemeistert werden können. - -# Anlagen - -## Netzwerkdiagramme und Systemarchitektur - -## API-Dokumentation - -## Benutzerhandbuch - -## Testprotokolle - -## Screenshots der Benutzeroberfläche - -## Konfigurationsdateien und Deployment-Skripte diff --git a/backend/logs/myp-install-debug.log b/backend/logs/myp-install-debug.log index b8767113..618e2626 100644 --- a/backend/logs/myp-install-debug.log +++ b/backend/logs/myp-install-debug.log @@ -1,72 +1,32 @@ ================================================================= -MYP Installation DEBUG Log - 2025-06-03 20:57:58 +MYP Installation DEBUG Log - 2025-06-03 21:26:54 ================================================================= -[2025-06-03 20:57:58] DEBUG von setup.sh:449 +[2025-06-03 21:26:54] DEBUG von setup.sh:485 Debian erkannt über /etc/debian_version: 12.11 --- -[2025-06-03 20:57:58] DEBUG von setup.sh:517 +[2025-06-03 21:26:54] DEBUG von setup.sh:553 Kein Raspberry Pi erkannt. Hardware-Info: --- -[2025-06-03 20:57:58] DEBUG von setup.sh:518 +[2025-06-03 21:26:54] DEBUG von setup.sh:554 - Device Tree: nicht verfügbar --- -[2025-06-03 20:57:58] DEBUG von setup.sh:519 +[2025-06-03 21:26:54] DEBUG von setup.sh:555 - CPU Hardware: nicht verfügbar --- -[2025-06-03 20:57:58] 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 21:26:54] DEBUG von setup.sh:595 +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 20:57:58] DEBUG von setup.sh:615 +[2025-06-03 21:26:56] DEBUG von setup.sh:651 DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. --- -[2025-06-03 20:57:58] DEBUG von setup.sh:716 +[2025-06-03 21:26:56] DEBUG von setup.sh:752 Externe IP ermittelt über ifconfig.me: 163.116.179.142 --- -[2025-06-03 20:58:45] DEBUG von setup.sh:1132 -sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf ---- - -[2025-06-03 20:58:45] DEBUG von setup.sh:1188 -Sysctl-Phase abgeschlossen - fahre mit Installation fort ---- - -[2025-06-03 20:58:45] DEBUG von setup.sh:1214 -systemd-networkd nicht aktiv - überspringe ---- - -[2025-06-03 20:58:45] DEBUG von setup.sh:1240 -NetworkManager nicht aktiv - überspringe ---- - -[2025-06-03 20:58:45] DEBUG von setup.sh:1246 -IPv6 Einträge in /etc/hosts auskommentiert ---- - -[2025-06-03 20:58:45] DEBUG von setup.sh:1263 -Netzwerk-Sicherheit ohne Blockierung abgeschlossen ---- - -[2025-06-03 21:02:02] DEBUG von setup.sh:1569 -SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp ---- - -[2025-06-03 21:02:07] DEBUG von setup.sh:1677 -SSL-Konfiguration abgeschlossen ohne hängende Prozesse ---- - -[2025-06-03 21:02:50] DEBUG von setup.sh:962 -flask erfolgreich importiert ---- - -[2025-06-03 21:02:50] 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 cc15190e..7e23806a 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 20:57:58 +MYP Installation FEHLER Log - 2025-06-03 21:26:54 ================================================================= diff --git a/backend/logs/myp-install-warnings.log b/backend/logs/myp-install-warnings.log index cdb84bb0..cca65fb0 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 20:57:58 +MYP Installation WARNUNGEN Log - 2025-06-03 21:26:54 ================================================================= diff --git a/backend/logs/myp-install.log b/backend/logs/myp-install.log index 67281746..8ec3230a 100644 --- a/backend/logs/myp-install.log +++ b/backend/logs/myp-install.log @@ -1,25 +1,25 @@ ================================================================= -MYP Installation Log - 2025-06-03 20:57:58 +MYP Installation Log - 2025-06-03 21:26:54 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 +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 20:57:58] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === -[2025-06-03 20:57:58] ✅ Root-Berechtigung bestätigt -[2025-06-03 20:57:58] === SYSTEM-RESSOURCEN PRÜFUNG === +[2025-06-03 21:26:54] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === +[2025-06-03 21:26:54] ✅ Root-Berechtigung bestätigt +[2025-06-03 21:26:54] === SYSTEM-RESSOURCEN PRÜFUNG === [FORTSCHRITT] Prüfe RAM... [FORTSCHRITT] Verfügbarer RAM: 15614MB [ERFOLG] ✅ Ausreichend RAM verfügbar (15614MB) [FORTSCHRITT] Prüfe Festplattenplatz... -[FORTSCHRITT] Verfügbarer Festplattenplatz: 13,2GB (13473MB) -[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (13,2GB) +[FORTSCHRITT] Verfügbarer Festplattenplatz: 12,2GB (12473MB) +[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,2GB) [FORTSCHRITT] Prüfe CPU... [FORTSCHRITT] CPU: 6 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz [ERFOLG] ✅ CPU-Information erfolgreich ermittelt -[2025-06-03 20:57:58] ✅ System-Ressourcen-Prüfung abgeschlossen +[2025-06-03 21:26:54] ✅ System-Ressourcen-Prüfung abgeschlossen [FORTSCHRITT] Prüfe Debian/Raspbian-System... [DEBUG] Debian erkannt über /etc/debian_version: 12.11 -[2025-06-03 20:57:58] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11) +[2025-06-03 21:26:54] ✅ 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: @@ -30,8 +30,8 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202 [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 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 20:57:58] ✅ System-Analyse abgeschlossen +[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 21:26:54] ✅ 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.  @@ -40,158 +40,5 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202 [FORTSCHRITT] Ermittle externe IP-Adresse... [INFO] 🌐 Externe IP: 163.116.179.142 [DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142 -[2025-06-03 20:57:58] === KONFIGURIERE HOSTNAME === -[FORTSCHRITT] Setze Hostname von 'debian' auf 'raspberrypi'... -[2025-06-03 20:57:58] ✅ Hostname erfolgreich auf 'raspberrypi' gesetzt -[2025-06-03 20:58:09] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1 -[2025-06-03 20:58:09] === ROBUSTE SYSTEM-UPDATE === -[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit... -[FORTSCHRITT] Validiere APT-Repositories... -[2025-06-03 20:58:09] ✅ 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 20:58:40] ✅ Robustes System-Update abgeschlossen -[2025-06-03 20:58:40] === 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 20:58:45] ✅ Optionale Netzwerk-Sicherheit konfiguriert: -[2025-06-03 20:58:45] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf -[2025-06-03 20:58:45] ⚙️ Einstellungen werden beim nächsten Boot aktiv -[2025-06-03 20:58:45] 🔧 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 20:58:45] === 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 20:59:51] ✅ 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 20:59:51] ✅ pip konfiguriert für Benutzer: user -[FORTSCHRITT] Aktualisiere pip mit Retry... -[2025-06-03 20:59:55] ✅ pip Version: 25.1.1 -[2025-06-03 20:59:55] ✅ Robuste Python-Umgebung installiert -[2025-06-03 20:59:55] === 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 21:01:58] ✅ Node.js via Debian Repository installiert -[FORTSCHRITT] Validiere Node.js Installation... -[2025-06-03 21:01:58] ✅ Node.js Version: v18.19.0 -[2025-06-03 21:01:59] ✅ npm Version: 9.2.0 -[FORTSCHRITT] Optimiere npm-Konfiguration... -[2025-06-03 21:02:01] ✅ Node.js und npm erfolgreich installiert -[2025-06-03 21:02:01] === 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 21:02:06] ✅ SSL-Zertifikate verfügbar: 144 CA-Zertifikate -[FORTSCHRITT] Finalisiere SSL-Konfiguration... -[ERFOLG] ✅ Finale CA-Zertifikate Integration abgeschlossen -[2025-06-03 21:02:07] ✅ SSL-Zertifikate timeout-gesichert konfiguriert -[DEBUG] SSL-Konfiguration abgeschlossen ohne hängende Prozesse -[2025-06-03 21:02:07] === 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 21:02:50] ✅ Python-Pakete Installation abgeschlossen -[FORTSCHRITT] Zeige installierte Python-Pakete... -[2025-06-03 21:02:50] === 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 21:03:16] ✅ Python-Pfad konfiguriert: /usr/local/lib/python3.11/dist-packages/myp-app.pth -[FORTSCHRITT] Konfiguriere Umgebungsvariablen... -[FORTSCHRITT] Aktualisiere Bash-Profile... +[2025-06-03 21:26:56] === KONFIGURIERE HOSTNAME === +[2025-06-03 21:26:56] ✅ Hostname bereits korrekt: 'raspberrypi' diff --git a/backend/setup.sh b/backend/setup.sh index 8e51fe50..3d68f1d1 100755 --- a/backend/setup.sh +++ b/backend/setup.sh @@ -11,6 +11,42 @@ set -euo pipefail +# =========================== KOMMANDOZEILEN-PARAMETER ======================= +# Erkenne Skip-Parameter +SKIP_BASH_PROFILE=false +SKIP_SYSTEMD=false +SKIP_KIOSK=false + +for arg in "$@"; do + case $arg in + --skip-bash-profile) + SKIP_BASH_PROFILE=true + ;; + --skip-systemd) + SKIP_SYSTEMD=true + ;; + --skip-kiosk) + SKIP_KIOSK=true + ;; + --wsl|--dev) + # WSL/Development-Modus: Überspringe systemspezifische Schritte + SKIP_BASH_PROFILE=true + SKIP_SYSTEMD=true + SKIP_KIOSK=true + echo "WSL/Development-Modus aktiviert - systemspezifische Schritte werden übersprungen" + ;; + --help|-h) + echo "MYP Setup-Skript - Optionen:" + echo " --skip-bash-profile Überspringe Bash-Profile Updates" + echo " --skip-systemd Überspringe Systemd-Service Installation" + echo " --skip-kiosk Überspringe Kiosk-Modus Konfiguration" + echo " --wsl, --dev WSL/Development-Modus (überspringt alle systemspezifischen Schritte)" + echo " --help, -h Zeige diese Hilfe" + exit 0 + ;; + esac +done + # =========================== GLOBALE KONFIGURATION =========================== readonly APP_NAME="MYP Druckerverwaltung" readonly APP_VERSION="4.1.0" @@ -1839,32 +1875,85 @@ FLASK_ENV=production EOF # Bash-Profile für alle User aktualisieren (robust) + if [ "$SKIP_BASH_PROFILE" = true ]; then + log "⏭️ Bash-Profile Update übersprungen (--skip-bash-profile oder --wsl/--dev)" + return + fi + progress "Aktualisiere Bash-Profile..." local profile_updated=0 - for user_home in "/root" "/home/"*; do - if [ -d "$user_home" ] && [ "$user_home" != "/home/lost+found" ] && [ -w "$user_home" ]; then - if ! grep -q "MYP Application Environment" "$user_home/.bashrc" 2>/dev/null; then - cat >> "$user_home/.bashrc" << 'EOF' + # WSL-Erkennung + local is_wsl=false + if grep -qEi "(Microsoft|WSL)" /proc/version 2>/dev/null || [ -n "${WSL_DISTRO_NAME:-}" ]; then + is_wsl=true + debug "WSL-Umgebung erkannt - verwende angepasste Bash-Profile-Logik" + fi + + # Definiere die zu prüfenden Verzeichnisse basierend auf der Umgebung + local home_dirs=() + if [ "$is_wsl" = true ]; then + # In WSL nur das aktuelle Benutzerverzeichnis verwenden + if [ -n "${HOME:-}" ] && [ -d "$HOME" ]; then + home_dirs=("$HOME") + fi + # Füge /root nur hinzu wenn wir als root laufen + if [ "$(id -u)" = "0" ] && [ -d "/root" ] && [ -w "/root" ]; then + home_dirs+=("/root") + fi + else + # Standard-Verhalten für echtes Linux + home_dirs=("/root") + # Füge alle Home-Verzeichnisse hinzu, aber mit Timeout + while IFS= read -r -d '' user_home; do + if [ "$user_home" != "/home/lost+found" ]; then + home_dirs+=("$user_home") + fi + done < <(find /home -maxdepth 1 -type d -print0 2>/dev/null | head -20) + fi + + # Aktualisiere Bash-Profile mit Timeout + for user_home in "${home_dirs[@]}"; do + if [ -d "$user_home" ] && [ -w "$user_home" ]; then + # Prüfe ob .bashrc existiert und lesbar ist + if [ -f "$user_home/.bashrc" ] && [ -r "$user_home/.bashrc" ]; then + # Verwende timeout um hängende Operationen zu vermeiden + if timeout 5s grep -q "MYP Application Environment" "$user_home/.bashrc" 2>/dev/null; then + debug "Bash-Profile bereits konfiguriert: $user_home/.bashrc" + else + # Schreibe mit timeout und prüfe Erfolg + if timeout 5s bash -c "cat >> '$user_home/.bashrc' << 'EOF' # MYP Application Environment -if [ -d "/opt/myp" ]; then - export MYP_APP_DIR="/opt/myp" - export FLASK_APP="/opt/myp/app.py" - export FLASK_ENV="production" - if [ -z "${PYTHONPATH:-}" ]; then - export PYTHONPATH="/opt/myp" +if [ -d \"/opt/myp\" ]; then + export MYP_APP_DIR=\"/opt/myp\" + export FLASK_APP=\"/opt/myp/app.py\" + export FLASK_ENV=\"production\" + if [ -z \"\${PYTHONPATH:-}\" ]; then + export PYTHONPATH=\"/opt/myp\" else - export PYTHONPATH="/opt/myp:$PYTHONPATH" + export PYTHONPATH=\"/opt/myp:\$PYTHONPATH\" fi fi -EOF - ((profile_updated++)) - log "✅ Bash-Profile aktualisiert: $user_home/.bashrc" +EOF" 2>/dev/null; then + ((profile_updated++)) + log "✅ Bash-Profile aktualisiert: $user_home/.bashrc" + else + warning "⚠️ Konnte Bash-Profile nicht aktualisieren: $user_home/.bashrc" + fi + fi + else + debug "Überspringe nicht-existierendes/unlesbares .bashrc: $user_home/.bashrc" fi + else + debug "Überspringe nicht-schreibbares Verzeichnis: $user_home" fi done + if [ $profile_updated -eq 0 ] && [ "$is_wsl" = false ]; then + warning "⚠️ Keine Bash-Profile wurden aktualisiert" + fi + # Validiere Deployment progress "Validiere Application Deployment..." local validation_errors=0