📚 Improved IHK Projektdokumentation and logs for better clarity & error handling in backend installation process. 🖥️🔍

This commit is contained in:
Till Tomczak 2025-06-03 21:27:04 +02:00
parent d861cf3312
commit 690aa8835e
6 changed files with 291 additions and 359 deletions

View File

@ -131,65 +131,65 @@ Gesamtinfrastruktur
[4.4 Abnahme [15](#abnahme)](#abnahme) [4.4 Abnahme [15](#abnahme)](#abnahme)
[Anlagen [15](#anlagen)](#anlagen) # Anlagen
[Netzwerkdiagramme und Systemarchitektur ## Netzwerkdiagramme und Systemarchitektur
[15](#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 ## Testprotokolle
[16](#screenshots-der-benutzeroberfläche)](#screenshots-der-benutzeroberfläche)
[Konfigurationsdateien und Deployment-Skripte ## Screenshots der Benutzeroberfläche
[16](#konfigurationsdateien-und-deployment-skripte)](#konfigurationsdateien-und-deployment-skripte)
## Konfigurationsdateien und Deployment-Skripte
# 1. Einleitung # 1. Einleitung
## 1.1 Analyse des Projektauftrages ## 1.1 Analyse des Projektauftrages
Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am
Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller
(Prusa, Anycubic; B-Ware im Vergleich zu 3D-Druckern von Kostenstellen Prusa, Anycubic. B-Ware im Vergleich zu 3D-Druckern von Kostenstellen
höherer Prioriät sozusagen). Diese Geräte stellen eine wichtige höherer Priorität, aber für unsere Zwecke vollkommen ausreichend. Diese
Ressource für die praktische Ausbildung dar, weisen jedoch erhebliche Geräte stellen eine wichtige Ressource für die praktische Ausbildung dar,
technische Limitierungen auf; beispielsweise verfügen die Drucker weder weisen jedoch erhebliche technische Limitierungen auf: Die Drucker
über Funk- noch Netzwerkschnittstellen oder andere gesamteinheitliche verfügen weder über Funk- noch Netzwerkschnittstellen, geschweige denn
Steuerungsmöglichkeiten. Diese technischen Einschränkungen verhinderten über andere gesamteinheitliche Steuerungsmöglichkeiten. Diese technischen
bislang eine koordinierte digitale Verwaltung und eine damit Einschränkungen verhinderten bislang eine koordinierte digitale
einhergehende Übersicht von Reservierungen und Nutzungsplänen der Verwaltung und damit auch jegliche Übersicht von Reservierungen und
Azubis. Nutzungsplänen.
Das bestehende 'Reservierungssystem' - wenn man es nun so nennen kann - Das bestehende 'Reservierungssystem' wenn man ein analoges Whiteboard
basierte auf einem analogen Whiteboard, welches neben den Druckern neben den Druckern überhaupt so nennen möchte führte zu systematischen
positioniert war. Dies führte zu systematischen Problemen: Problemen. Doppelbuchungen waren an der Tagesordnung, die manuelle
Doppelbuchungen traten regelmäßig auf, wenn mehrere Nutzer zeitgleich Aktivierung und Deaktivierung der Geräte wurde regelmäßig vergessen (was
Reservierungen vornahmen, die manuelle Aktivierung und Deaktivierung der zu unnötigem Energieverbrauch und erhöhtem Verschleiß führte), und eine
Geräte wurde häufig versäumt - was zu unnötigem Energieverbrauch und verlässliche Dokumentation der tatsächlichen Nutzungszeiten?
erhöhtem Verschleiß führte - und eine verlässliche Dokumentation der Fehlanzeige. Weder Verantwortungszuordnung für Aufräumarbeiten noch
tatsächlichen Nutzungszeiten existierte nicht, wodurch weder verursachungsgerechte Kostenzuordnung waren möglich.
aussagekräftige Betätigungs- und Verantwortungszuordnung (bspw. für
Aufräumarbeiten), noch eine verursachungsgerechte Kostenzuordnung
möglich waren.
Ein erstmaliger Lösungsansatz durch den ehemaligen Auszubildenden Torben Ein erstmaliger Lösungsansatz durch den ehemaligen Auszubildenden Torben
Haack hatte einen vielversprechenden Frontend-Prototyp auf Basis von Haack Fachrichtung Daten- und Prozessanalyse hatte einen
Next.js hervorgebracht. Der Prototyp verfügte über eine moderne vielversprechenden Frontend-Prototyp auf Basis von Next.js
Benutzeroberfläche und gute Analysefunktionen, allerdings jedoch fehlte hervorgebracht. Der Prototyp verfügte über eine moderne
ganz fundamental die essentielle Backend-Funktionalität; ohne dies blieb Benutzeroberfläche mit umfangreichen Analysefunktionen. Nur fehlte
die auf Prototypen-basierende Projektarbeit des Torben Haacks in der dummerweise die komplette Backend-Funktionalität. Ohne Backend blieb
praktischen Anwendung ohne jegliche Funktion. Ich sah für mich also die die Projektarbeit des Herrn Haack in der praktischen Anwendung
Chance, die Idee hinter dem Prototypen aufzugreifen und mich ihrer im funktionslos. Ursprünglich war angedacht, API-Endpunkte zu
Rahmen meiner hier dargelegten Projektarbeit anzunehmen, da ich sofort implementieren, welche die Daten- und Prozessanalyse seines Frontends
mehrere Möglichkeiten zur Einbringung meiner Fachrichtung identifizieren ermöglicht hätten eine Aufgabe, die naturgemäß außerhalb meines
konnte und ich keine notwendige Obligation - wie bei anderen Fachgebiets der digitalen Vernetzung lag.
Projektmöglichkeiten die sich mir boten - verspürte, sondern einen
Anflug von Ideen, Tatendrang und intrinsischer Motivation; sprich: es Ich sah die Chance, die Idee aufzugreifen und im Rahmen meiner
kitzelte meine Leidenschaft. 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 ## 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 wären ganz zu schweigen von den Garantieverlusten, die solche
Eingriffe unweigerlich nach sich gezogen hätten. Eingriffe unweigerlich nach sich gezogen hätten.
Ebenfalls nicht Teil des Projekts war die Integration in übergeordnete Die Integration in das unternehmensweite Intranet war ursprünglich fest
ERP-Systeme oder das unternehmensweite Intranet. Diese Anbindungen eingeplant ein Vorhaben, das sich als verhängnisvoller Trugschluss
hätten zusätzliche Genehmigungsprozesse und Sicherheitsprüfungen erweisen sollte. Zur Projektmitte hatte ich die bereits genehmigten
erfordert, die den Projektrahmen bei weitem überschritten hätten. 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 Stattdessen wurde eine autarke Lösung entwickelt, die alle
erforderlichen Funktionen lokal bereitstellt ein Ansatz, der sich im erforderlichen Funktionen lokal bereitstellt ein Ansatz, der sich
Nachhinein als goldrichtig erweisen sollte. trotz der Rückschläge als gangbar erwies.
## 1.4 Projektumfeld ## 1.4 Projektumfeld
@ -289,9 +300,8 @@ Funktionsumfang und Benutzerfreundlichkeit.
Besonders herausfordernd gestaltete sich die Schnittstelle zu den Besonders herausfordernd gestaltete sich die Schnittstelle zu den
Smart-Plugs. Die ursprüngliche Annahme, dass sich die TAPO P110-Steckdosen Smart-Plugs. Die ursprüngliche Annahme, dass sich die TAPO P110-Steckdosen
von TP-Link problemlos integrieren lassen würden, erwies sich als von TP-Link problemlos integrieren lassen würden, erwies sich als
naiv. Die proprietäre API der Geräte war nicht nur naiv. Die Geräte boten keine dokumentierte API nur die proprietäre
undokumentiert, sondern verschleiert ein Umstand, der TAPO-App ermöglichte die Steuerung. Das war ein Problem.
erheblichen Reverse-Engineering-Aufwand erforderte.
## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen ## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen
@ -306,25 +316,30 @@ Lösungsansätzen zwang.
Die Authentifizierung und Autorisierung musste robust implementiert Die Authentifizierung und Autorisierung musste robust implementiert
werden, ohne die Benutzerfreundlichkeit zu beeinträchtigen ein werden, ohne die Benutzerfreundlichkeit zu beeinträchtigen ein
klassisches Dilemma der IT-Sicherheit. Die Entscheidung für klassisches Dilemma der IT-Sicherheit. Die Entscheidung für
bcrypt-basiertes Password-Hashing mit einem Cost-Faktor von 12 stellte bcrypt-basiertes Password-Hashing stellte einen vernünftigen Kompromiss
einen vernünftigen Kompromiss zwischen Sicherheit und Performance auf zwischen Sicherheit und Performance auf dem ressourcenbeschränkten
dem ressourcenbeschränkten Raspberry Pi dar. 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. Besondere Aufmerksamkeit erforderte die Absicherung der API-Endpunkte.
Jeder Endpunkt musste gegen gängige Angriffsvektoren wie SQL-Injection, Jeder Endpunkt musste gegen gängige Angriffsvektoren wie SQL-Injection,
Cross-Site-Scripting und CSRF-Attacken geschützt werden. Die 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 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 ## 1.7 Darstellung der vorhandenen Systemarchitektur
Die vorgefundene Systemarchitektur wenn man sie denn überhaupt so Die vorgefundene Systemarchitektur möchte man sie überhaupt so nennen
nennen möchte bestand aus isolierten Komponenten ohne jegliche bestand aus diffusen Komponenten ohne jegliche Integration. Die
Integration. Die 3D-Drucker operierten als Insellösungen, verbunden 3D-Drucker operierten als Insellösungen, verbunden lediglich durch ihre
lediglich durch ihre physische Nähe und das gemeinsame Whiteboard. Der physische Nähe und das gemeinsame Whiteboard. Der Frontend-Prototyp von
Frontend-Prototyp von Torben Haack existierte als Docker-Container auf Torben Haack existierte als Docker-Container auf einem
einem Entwicklungsserver, ohne Anbindung an reale Daten oder Funktionen. 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 Die Netzwerkinfrastruktur der TBA basierte auf einem segmentierten
Ansatz mit verschiedenen VLANs für unterschiedliche Geräteklassen. Die 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 kohärenten System verbinden, ohne dabei die bestehenden
Sicherheitsrichtlinien zu verletzen. Der gewählte Ansatz die Steuerung Sicherheitsrichtlinien zu verletzen. Der gewählte Ansatz die Steuerung
über Smart-Plugs stellte einen eleganten Kompromiss zwischen ü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 # 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 auch die strikte Offline-Anforderung des Projekts ein Umstand, der
sich als Segen erwies. 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 ## 2.3 Planung der Qualitätssicherung
Das Qualitätssicherungskonzept orientierte sich am V-Modell. Für jede 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 Entscheidung für lokale HTTP/HTTPS-Kommunikation mit selbstsignierten
Zertifikaten war pragmatisch, aber effektiv. Zertifikaten war pragmatisch, aber effektiv.
Die Kommunikation mit den Smart-Plugs erfolgte über das proprietäre Die Kommunikation mit den Smart-Plugs stellte die größte Herausforderung
TP-Link-Protokoll, das auf HTTP basiert. Die anfänglichen Versuche, die dar. Die TAPO-Geräte boten keine dokumentierte Schnittstelle nur die
offizielle Cloud-API zu nutzen, scheiterten an den proprietäre App konnte sie steuern. Also griff ich zu Wireshark und
Sicherheitsrichtlinien. Die Entdeckung, dass die Geräte auch eine lokale analysierte den Netzwerkverkehr zwischen App und Steckdosen. Was ich
API anboten, war ein Durchbruch allerdings einer, der erheblichen fand, war ernüchternd: verschlüsselte Kommunikation mit sich ständig
Reverse-Engineering-Aufwand erforderte. ändernden Session-Keys.
Hier kam Wireshark ins Spiel. Zusammen mit der TAPO-App analysierte ich Mein erster Versuch mit einem vielversprechenden Python-Modul schlug
den Netzwerkverkehr, um das Kommunikationsprotokoll zu entschlüsseln. fehl es funktionierte einfach nicht mit meinen Geräten. Der
Die Erkenntnis, dass ein Session-Key erforderlich war, der sich bei Wireshark-Mitschnitt offenbarte immer dieselben verschlüsselten
jeder Anmeldung änderte, verkomplizierte die Integration erheblich. Responses. Ohne Erfolg beim Simulieren einzelner Anfragen dämmerte
Zunächst versuchte ich, diesen Key manuell abzufangen und in meine es mir: Die Anfragensequenz musste stimmen! Die Verbindung nutzte
Anwendung zu integrieren ein Ansatz, der funktionierte, aber temporäre Cookies und proprietäre Verschlüsselung.
offensichtlich nicht praxistauglich war.
Nach tagelangen Experimenten und zahllosen Fehlversuchen stieß ich auf Nach tagelangen Experimenten stieß ich auf PyP100 ein alternatives
ein alternatives Python-Modul, das die lokale Kommunikation mit den Python-Modul, versteckt in den Tiefen von GitHub. Dieses Modul löste
TAPO-Geräten ermöglichte. Dieses Modul versteckt in den Tiefen von die Session-Key-Problematik elegant und ermöglichte endlich eine
GitHub löste die Session-Key-Problematik elegant und ermöglichte eine
stabile Integration. stabile Integration.
## 2.6 Planung der Prozess-/ und Systemschnittstellen ## 2.6 Planung der Prozess-/ und Systemschnittstellen
@ -582,24 +610,24 @@ iterativen, problemgetriebenen Herangehensweise.
Die "Sensoren" in diesem Kontext waren die Smart-Plugs eine Die "Sensoren" in diesem Kontext waren die Smart-Plugs eine
euphemistische Bezeichnung für Geräte, die sich als erstaunlich euphemistische Bezeichnung für Geräte, die sich als erstaunlich
widerspenstig erwiesen. Die initiale Annahme, dass die PyP100-Bibliothek widerspenstig erwiesen. Meine erste Hoffnung, ein bestehendes
out-of-the-box funktionieren würde, zerschlug sich an der Realität der Python-Modul zur Steuerung zu finden, zerschlug sich schnell.
proprietären TP-Link-Implementation. Das gefundene Modul funktionierte schlicht nicht.
Der erste Ansatz die Nutzung der dokumentierten Cloud-API scheiterte Also Plan B: Wireshark. Ich schnitt den Netzwerkverkehr zwischen
an den Sicherheitsrichtlinien. Der zweite Ansatz die direkte lokale TAPO-App und Smart-Plugs mit. Die Analyse offenbarte das komplexe
Kommunikation scheiterte an der fehlenden Dokumentation. Erst der Authentifizierungsprotokoll der TAPO-Geräte verschlüsselte
dritte Ansatz Reverse Engineering mittels Wireshark führte zum Kommunikation mit Session-Tokens, die sich bei jeder Anmeldung
Durchbruch. ä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 Nach tagelangen Experimenten stieß ich endlich auf PyP100 ein
Authentifizierungsprotokoll der TAPO-Geräte. Jede Kommunikation Python-Modul, das die lokale Kommunikation mit den TAPO-Geräten
erforderte einen verschlüsselten Handshake, gefolgt von einem tatsächlich beherrschte. Versteckt in den Tiefen von GitHub, löste
Session-Token, der für alle weiteren Operationen benötigt wurde. Die es die Session-Key-Problematik elegant. Endlich.
Verschlüsselung basierte auf einer Kombination aus RSA und AES
durchaus respektabel für Consumer-Hardware.
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 selbstentwickelte Wrapper-Klasse, die die Komplexität der Kommunikation
kapselte. Retry-Mechanismen mit exponentieller Backoff-Strategie sorgten kapselte. Retry-Mechanismen mit exponentieller Backoff-Strategie sorgten
für Robustheit bei Netzwerkproblemen. Die Abfrage umfasste nicht nur den 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. reduzierte auch Kosten und Stromverbrauch.
Der versehentliche Verlust der SSL-Zertifikate während einer Der versehentliche Verlust der SSL-Zertifikate während einer
Neuinstallation führte zur Implementierung Neuinstallation führte zur Implementierung eines robusten Backup-Systems.
eines robusten Backup-Systems. Kritische Konfigurationsdateien werden nun dreifach Kritische Konfigurationsdateien werden nun dreifach gesichert eine
gesichert. 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 Die Entscheidung, von meinem ersten Python-Modul-Versuch zu PyP100 zu
alternativen Modul zu wechseln, fiel nach tagelangen frustrierenden wechseln, fiel nach tagelangen frustrierenden Debugging-Sessions. Der
Debugging-Sessions. Der Stolz, es "richtig" machen zu wollen, wich dem Stolz, es mit dem ersten Modul schaffen zu wollen, wich dem Pragmatismus,
Pragmatismus, eine funktionierende Lösung zu liefern. Das gefundene eine funktionierende Lösung zu liefern. PyP100 ironischerweise simpler
Alternative Modul ironischerweise simpler und stabiler rettete das und stabiler rettete das Projekt.
Projekt.
## 3.3 Maßnahmen zur Qualitätskontrolle ## 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 Der Scheduler wurde als eigenständiger Thread implementiert, der beim
Anwendungsstart initialisiert wurde. Die Kommunikation mit dem Anwendungsstart initialisiert wurde. Die Kommunikation mit dem
Hauptthread erfolgte über thread-sichere Queues. Diese Architektur 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. Web-Requests.
## 3.5 Konfiguration von Übertragungssystemen und Integration in die Gesamtinfrastruktur ## 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 Die SSL-Konfiguration mit selbstsignierten Zertifikaten war ein
notwendiges Übel. Ohne Internet-Zugang war Let's Encrypt keine Option. notwendiges Übel. Ohne Internet-Zugang war Let's Encrypt keine Option.
Die Zertifikate wurden mit allen relevanten SANs (Subject Alternative Die Zertifikate wurden mit OpenSSL generiert und mit allen relevanten
Names) generiert, um Kompatibilitätsprobleme zu vermeiden. Die SANs (Subject Alternative Names) versehen, um Kompatibilitätsprobleme zu
Browser-Warnungen wurden durch eine dokumentierte Prozedur zur vermeiden. Die Browser-Warnungen wurden durch eine dokumentierte
Zertifikats-Installation umgangen nicht elegant, aber funktional. Prozedur zur Zertifikats-Installation umgangen nicht elegant, aber
funktional.
Die Integration der Smart-Plugs erforderte statische IP-Adressen Die Integration der Smart-Plugs erforderte statische IP-Adressen
DHCP-Reservierungen waren in der Netzwerk-Policy nicht vorgesehen. Die 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, Input-Validation erfolgte auf mehreren Ebenen Client-seitig für UX,
Server-seitig für Sicherheit; Vertrauen ist gut, Kontrolle ist besser. 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 Brute-Force-Angriffe. Nach fünf fehlgeschlagenen Login-Versuchen wurde
die IP-Adresse für 30 Minuten gesperrt lang genug, um Angriffe die IP-Adresse für 30 Minuten gesperrt lang genug, um Angriffe
unwirtschaftlich zu machen, kurz genug, um legitime Nutzer nicht unattraktiv zu machen, kurz genug, um legitime Nutzer nicht übermäßig zu
übermäßig zu frustrieren; ein Balanceakt zwischen Sicherheit und frustrieren; ein Balanceakt zwischen Sicherheit und
Benutzerfreundlichkeit. Benutzerfreundlichkeit.
DSGVO-Compliance wurde durch Privacy-by-Design erreicht. 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 ermöglicht detaillierte Einblicke in Nutzungsmuster und Energieverbrauch
wertvolle Daten für die Optimierung des Druckerbetriebs. 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 Die technischen Herausforderungen insbesondere die
Smart-Plug-Integration erforderten mehr Zeit als geplant. Die Smart-Plug-Integration erforderten mehr Zeit als geplant. Die
investierte Mühe zahlte sich jedoch aus: Die finale Lösung ist robuster 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 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 Prise technischer Finesse auch scheinbar unlösbare Probleme gemeistert
werden können. werden können.
# Anlagen
## Netzwerkdiagramme und Systemarchitektur
## API-Dokumentation
## Benutzerhandbuch
## Testprotokolle
## Screenshots der Benutzeroberfläche
## Konfigurationsdateien und Deployment-Skripte

View File

@ -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 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: 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 - 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 - CPU Hardware: nicht verfügbar
--- ---
[2025-06-03 20:57:58] DEBUG von setup.sh:559 [2025-06-03 21:26:54] DEBUG von setup.sh:595
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 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. 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 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
---

View File

@ -1,4 +1,4 @@
================================================================= =================================================================
MYP Installation FEHLER Log - 2025-06-03 20:57:58 MYP Installation FEHLER Log - 2025-06-03 21:26:54
================================================================= =================================================================

View File

@ -1,4 +1,4 @@
================================================================= =================================================================
MYP Installation WARNUNGEN Log - 2025-06-03 20:57:58 MYP Installation WARNUNGEN Log - 2025-06-03 21:26:54
================================================================= =================================================================

View File

@ -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 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 21:26:54] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN ===
[2025-06-03 20:57:58] ✅ Root-Berechtigung bestätigt [2025-06-03 21:26:54] ✅ Root-Berechtigung bestätigt
[2025-06-03 20:57:58] === SYSTEM-RESSOURCEN PRÜFUNG === [2025-06-03 21:26:54] === SYSTEM-RESSOURCEN PRÜFUNG ===
[FORTSCHRITT] Prüfe RAM... [FORTSCHRITT] Prüfe RAM...
[FORTSCHRITT] Verfügbarer RAM: 15614MB [FORTSCHRITT] Verfügbarer RAM: 15614MB
[ERFOLG] ✅ Ausreichend RAM verfügbar (15614MB) [ERFOLG] ✅ Ausreichend RAM verfügbar (15614MB)
[FORTSCHRITT] Prüfe Festplattenplatz... [FORTSCHRITT] Prüfe Festplattenplatz...
[FORTSCHRITT] Verfügbarer Festplattenplatz: 13,2GB (13473MB) [FORTSCHRITT] Verfügbarer Festplattenplatz: 12,2GB (12473MB)
[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (13,2GB) [ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,2GB)
[FORTSCHRITT] Prüfe CPU... [FORTSCHRITT] Prüfe CPU...
[FORTSCHRITT] CPU: 6 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz [FORTSCHRITT] CPU: 6 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz
[ERFOLG] ✅ CPU-Information erfolgreich ermittelt [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... [FORTSCHRITT] Prüfe Debian/Raspbian-System...
[DEBUG] Debian erkannt über /etc/debian_version: 12.11 [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... [FORTSCHRITT] Prüfe Raspberry Pi Hardware...
[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi) [INFO] 💻 Standard-PC/Server System (kein Raspberry Pi)
[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info: [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 [INFO] → 64-Bit x86 Architektur erkannt
[FORTSCHRITT] Prüfe Kernel-Version... [FORTSCHRITT] Prüfe Kernel-Version...
[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64 [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 [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 20:57:58] ✅ System-Analyse abgeschlossen [2025-06-03 21:26:54] ✅ System-Analyse abgeschlossen
[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)... [FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)...
[FORTSCHRITT] Teste DNS-Auflösung... [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: 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... [FORTSCHRITT] Ermittle externe IP-Adresse...
[INFO] 🌐 Externe IP: 163.116.179.142 [INFO] 🌐 Externe IP: 163.116.179.142
[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142 [DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142
[2025-06-03 20:57:58] === KONFIGURIERE HOSTNAME === [2025-06-03 21:26:56] === KONFIGURIERE HOSTNAME ===
[FORTSCHRITT] Setze Hostname von 'debian' auf 'raspberrypi'... [2025-06-03 21:26:56] ✅ Hostname bereits korrekt: '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...

View File

@ -11,6 +11,42 @@
set -euo pipefail 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 =========================== # =========================== GLOBALE KONFIGURATION ===========================
readonly APP_NAME="MYP Druckerverwaltung" readonly APP_NAME="MYP Druckerverwaltung"
readonly APP_VERSION="4.1.0" readonly APP_VERSION="4.1.0"
@ -1839,32 +1875,85 @@ FLASK_ENV=production
EOF EOF
# Bash-Profile für alle User aktualisieren (robust) # 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..." progress "Aktualisiere Bash-Profile..."
local profile_updated=0 local profile_updated=0
for user_home in "/root" "/home/"*; do # WSL-Erkennung
if [ -d "$user_home" ] && [ "$user_home" != "/home/lost+found" ] && [ -w "$user_home" ]; then local is_wsl=false
if ! grep -q "MYP Application Environment" "$user_home/.bashrc" 2>/dev/null; then if grep -qEi "(Microsoft|WSL)" /proc/version 2>/dev/null || [ -n "${WSL_DISTRO_NAME:-}" ]; then
cat >> "$user_home/.bashrc" << 'EOF' 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 # MYP Application Environment
if [ -d "/opt/myp" ]; then if [ -d \"/opt/myp\" ]; then
export MYP_APP_DIR="/opt/myp" export MYP_APP_DIR=\"/opt/myp\"
export FLASK_APP="/opt/myp/app.py" export FLASK_APP=\"/opt/myp/app.py\"
export FLASK_ENV="production" export FLASK_ENV=\"production\"
if [ -z "${PYTHONPATH:-}" ]; then if [ -z \"\${PYTHONPATH:-}\" ]; then
export PYTHONPATH="/opt/myp" export PYTHONPATH=\"/opt/myp\"
else else
export PYTHONPATH="/opt/myp:$PYTHONPATH" export PYTHONPATH=\"/opt/myp:\$PYTHONPATH\"
fi fi
fi fi
EOF EOF" 2>/dev/null; then
((profile_updated++)) ((profile_updated++))
log "✅ Bash-Profile aktualisiert: $user_home/.bashrc" log "✅ Bash-Profile aktualisiert: $user_home/.bashrc"
else
warning "⚠️ Konnte Bash-Profile nicht aktualisieren: $user_home/.bashrc"
fi fi
fi fi
else
debug "Überspringe nicht-existierendes/unlesbares .bashrc: $user_home/.bashrc"
fi
else
debug "Überspringe nicht-schreibbares Verzeichnis: $user_home"
fi
done done
if [ $profile_updated -eq 0 ] && [ "$is_wsl" = false ]; then
warning "⚠️ Keine Bash-Profile wurden aktualisiert"
fi
# Validiere Deployment # Validiere Deployment
progress "Validiere Application Deployment..." progress "Validiere Application Deployment..."
local validation_errors=0 local validation_errors=0