📚 Improved IHK Projektdokumentation and logs for better clarity & error handling in backend installation process. 🖥️🔍
This commit is contained in:
parent
d861cf3312
commit
690aa8835e
@ -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
|
|
||||||
|
@ -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
|
|
||||||
---
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
=================================================================
|
=================================================================
|
||||||
MYP Installation FEHLER Log - 2025-06-03 20:57:58
|
MYP Installation FEHLER Log - 2025-06-03 21:26:54
|
||||||
=================================================================
|
=================================================================
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
=================================================================
|
=================================================================
|
||||||
MYP Installation WARNUNGEN Log - 2025-06-03 20:57:58
|
MYP Installation WARNUNGEN Log - 2025-06-03 21:26:54
|
||||||
=================================================================
|
=================================================================
|
||||||
|
|
||||||
|
@ -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
|
||||||
=================================================================
|
=================================================================
|
||||||
|
|
||||||
[0;32m[2025-06-03 20:57:58] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN ===[0m
|
[0;32m[2025-06-03 21:26:54] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN ===[0m
|
||||||
[0;32m[2025-06-03 20:57:58] ✅ Root-Berechtigung bestätigt[0m
|
[0;32m[2025-06-03 21:26:54] ✅ Root-Berechtigung bestätigt[0m
|
||||||
[0;32m[2025-06-03 20:57:58] === SYSTEM-RESSOURCEN PRÜFUNG ===[0m
|
[0;32m[2025-06-03 21:26:54] === SYSTEM-RESSOURCEN PRÜFUNG ===[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe RAM...[0m
|
[0;35m[FORTSCHRITT] Prüfe RAM...[0m
|
||||||
[0;35m[FORTSCHRITT] Verfügbarer RAM: 15614MB[0m
|
[0;35m[FORTSCHRITT] Verfügbarer RAM: 15614MB[0m
|
||||||
[0;36m[ERFOLG] ✅ Ausreichend RAM verfügbar (15614MB)[0m
|
[0;36m[ERFOLG] ✅ Ausreichend RAM verfügbar (15614MB)[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe Festplattenplatz...[0m
|
[0;35m[FORTSCHRITT] Prüfe Festplattenplatz...[0m
|
||||||
[0;35m[FORTSCHRITT] Verfügbarer Festplattenplatz: 13,2GB (13473MB)[0m
|
[0;35m[FORTSCHRITT] Verfügbarer Festplattenplatz: 12,2GB (12473MB)[0m
|
||||||
[0;36m[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (13,2GB)[0m
|
[0;36m[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,2GB)[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe CPU...[0m
|
[0;35m[FORTSCHRITT] Prüfe CPU...[0m
|
||||||
[0;35m[FORTSCHRITT] CPU: 6 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz[0m
|
[0;35m[FORTSCHRITT] CPU: 6 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz[0m
|
||||||
[0;36m[ERFOLG] ✅ CPU-Information erfolgreich ermittelt[0m
|
[0;36m[ERFOLG] ✅ CPU-Information erfolgreich ermittelt[0m
|
||||||
[0;32m[2025-06-03 20:57:58] ✅ System-Ressourcen-Prüfung abgeschlossen[0m
|
[0;32m[2025-06-03 21:26:54] ✅ System-Ressourcen-Prüfung abgeschlossen[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe Debian/Raspbian-System...[0m
|
[0;35m[FORTSCHRITT] Prüfe Debian/Raspbian-System...[0m
|
||||||
[0;34m[DEBUG] Debian erkannt über /etc/debian_version: 12.11[0m
|
[0;34m[DEBUG] Debian erkannt über /etc/debian_version: 12.11[0m
|
||||||
[0;32m[2025-06-03 20:57:58] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11)[0m
|
[0;32m[2025-06-03 21:26:54] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11)[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe Raspberry Pi Hardware...[0m
|
[0;35m[FORTSCHRITT] Prüfe Raspberry Pi Hardware...[0m
|
||||||
[0;34m[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi)[0m
|
[0;34m[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi)[0m
|
||||||
[0;34m[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info:[0m
|
[0;34m[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info:[0m
|
||||||
@ -30,8 +30,8 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202
|
|||||||
[0;34m[INFO] → 64-Bit x86 Architektur erkannt[0m
|
[0;34m[INFO] → 64-Bit x86 Architektur erkannt[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe Kernel-Version...[0m
|
[0;35m[FORTSCHRITT] Prüfe Kernel-Version...[0m
|
||||||
[0;34m[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64[0m
|
[0;34m[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64[0m
|
||||||
[0;34m[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[0m
|
[0;34m[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[0m
|
||||||
[0;32m[2025-06-03 20:57:58] ✅ System-Analyse abgeschlossen[0m
|
[0;32m[2025-06-03 21:26:54] ✅ System-Analyse abgeschlossen[0m
|
||||||
[0;35m[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)...[0m
|
[0;35m[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)...[0m
|
||||||
[0;35m[FORTSCHRITT] Teste DNS-Auflösung...[0m
|
[0;35m[FORTSCHRITT] Teste DNS-Auflösung...[0m
|
||||||
[0;34m[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. [0m
|
[0;34m[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. [0m
|
||||||
@ -40,158 +40,5 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202
|
|||||||
[0;35m[FORTSCHRITT] Ermittle externe IP-Adresse...[0m
|
[0;35m[FORTSCHRITT] Ermittle externe IP-Adresse...[0m
|
||||||
[0;34m[INFO] 🌐 Externe IP: 163.116.179.142[0m
|
[0;34m[INFO] 🌐 Externe IP: 163.116.179.142[0m
|
||||||
[0;34m[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142[0m
|
[0;34m[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142[0m
|
||||||
[0;32m[2025-06-03 20:57:58] === KONFIGURIERE HOSTNAME ===[0m
|
[0;32m[2025-06-03 21:26:56] === KONFIGURIERE HOSTNAME ===[0m
|
||||||
[0;35m[FORTSCHRITT] Setze Hostname von 'debian' auf 'raspberrypi'...[0m
|
[0;32m[2025-06-03 21:26:56] ✅ Hostname bereits korrekt: 'raspberrypi'[0m
|
||||||
[0;32m[2025-06-03 20:57:58] ✅ Hostname erfolgreich auf 'raspberrypi' gesetzt[0m
|
|
||||||
[0;32m[2025-06-03 20:58:09] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1[0m
|
|
||||||
[0;32m[2025-06-03 20:58:09] === ROBUSTE SYSTEM-UPDATE ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Validiere APT-Repositories...[0m
|
|
||||||
[0;32m[2025-06-03 20:58:09] ✅ Source-Repositories deaktiviert (nicht benötigt)[0m
|
|
||||||
[0;35m[FORTSCHRITT] Aktualisiere Paketlisten mit Retry...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Führe System-Upgrade durch...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere essenzielle System-Tools...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: ca-certificates[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: gnupg[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: curl[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: wget[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: git[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: nano[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: htop[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: rsync[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: unzip[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: sudo[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: systemd[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: lsb-release[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: apt-transport-https[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: software-properties-common[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: bc[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: dbus[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: systemd-timesyncd[0m
|
|
||||||
[0;35m[FORTSCHRITT] Synchronisiere Systemzeit...[0m
|
|
||||||
[0;32m[2025-06-03 20:58:40] ✅ Robustes System-Update abgeschlossen[0m
|
|
||||||
[0;32m[2025-06-03 20:58:40] === KONFIGURIERE OPTIONALE NETZWERK-SICHERHEIT ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 (robust)...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 in GRUB...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ IPv6 in GRUB deaktiviert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Erstelle robuste sysctl-Konfiguration...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ Basis-sysctl-Konfiguration erstellt[0m
|
|
||||||
[0;34m[DEBUG] sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf[0m
|
|
||||||
[0;35m[FORTSCHRITT] OPTIONAL: Versuche sysctl-Einstellungen anzuwenden...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ MYP sysctl-Einstellungen angewendet[0m
|
|
||||||
[0;34m[DEBUG] Sysctl-Phase abgeschlossen - fahre mit Installation fort[0m
|
|
||||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)...[0m
|
|
||||||
[0;34m[DEBUG] systemd-networkd nicht aktiv - überspringe[0m
|
|
||||||
[0;34m[DEBUG] NetworkManager nicht aktiv - überspringe[0m
|
|
||||||
[0;34m[DEBUG] IPv6 Einträge in /etc/hosts auskommentiert[0m
|
|
||||||
[0;32m[2025-06-03 20:58:45] ✅ Optionale Netzwerk-Sicherheit konfiguriert:[0m
|
|
||||||
[0;32m[2025-06-03 20:58:45] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf[0m
|
|
||||||
[0;32m[2025-06-03 20:58:45] ⚙️ Einstellungen werden beim nächsten Boot aktiv[0m
|
|
||||||
[0;32m[2025-06-03 20:58:45] 🔧 Netzwerk-Konfiguration vorbereitet[0m
|
|
||||||
[0;34m[INFO] 💡 Tipp: Netzwerk-Sicherheit kann manuell aktiviert werden:[0m
|
|
||||||
[0;34m[INFO] → sudo sysctl -p /etc/sysctl.d/99-myp-security.conf[0m
|
|
||||||
[0;34m[INFO] → Oder automatisch beim nächsten Neustart[0m
|
|
||||||
[0;34m[DEBUG] Netzwerk-Sicherheit ohne Blockierung abgeschlossen[0m
|
|
||||||
[0;32m[2025-06-03 20:58:45] === ROBUSTE PYTHON-INSTALLATION ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Python 3 und Build-Abhängigkeiten...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-pip[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-setuptools[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-venv[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-wheel[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: build-essential[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libssl-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libffi-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libbz2-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libreadline-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libsqlite3-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libncurses5-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: libncursesw5-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: zlib1g-dev[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: sqlite3[0m
|
|
||||||
[0;35m[FORTSCHRITT] Validiere Python-Installation...[0m
|
|
||||||
[0;32m[2025-06-03 20:59:51] ✅ Python Version: 3.11.2[0m
|
|
||||||
[0;35m[FORTSCHRITT] Konfiguriere pip für bessere Zuverlässigkeit...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Erstelle systemweite pip-Konfiguration...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Konfiguriere pip für alle Benutzer...[0m
|
|
||||||
[0;32m[2025-06-03 20:59:51] ✅ pip konfiguriert für Benutzer: user[0m
|
|
||||||
[0;35m[FORTSCHRITT] Aktualisiere pip mit Retry...[0m
|
|
||||||
[0;32m[2025-06-03 20:59:55] ✅ pip Version: 25.1.1[0m
|
|
||||||
[0;32m[2025-06-03 20:59:55] ✅ Robuste Python-Umgebung installiert[0m
|
|
||||||
[0;32m[2025-06-03 20:59:55] === ROBUSTE NODE.JS UND NPM INSTALLATION ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Bereinige alte Node.js-Installationen...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Node.js mit Fallback-Strategie...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Verwende Debian Repository als Fallback...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: nodejs npm[0m
|
|
||||||
[0;32m[2025-06-03 21:01:58] ✅ Node.js via Debian Repository installiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Validiere Node.js Installation...[0m
|
|
||||||
[0;32m[2025-06-03 21:01:58] ✅ Node.js Version: v18.19.0[0m
|
|
||||||
[0;32m[2025-06-03 21:01:59] ✅ npm Version: 9.2.0[0m
|
|
||||||
[0;35m[FORTSCHRITT] Optimiere npm-Konfiguration...[0m
|
|
||||||
[0;32m[2025-06-03 21:02:01] ✅ Node.js und npm erfolgreich installiert[0m
|
|
||||||
[0;32m[2025-06-03 21:02:01] === TIMEOUT-GESICHERTE SSL-ZERTIFIKATE KONFIGURATION ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere SSL-Grundkomponenten...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Pakete: ca-certificates openssl[0m
|
|
||||||
[0;35m[FORTSCHRITT] Aktualisiere CA-Zertifikate (timeout-gesichert)...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ CA-Zertifikate erfolgreich aktualisiert[0m
|
|
||||||
[0;34m[DEBUG] SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Mercedes Corporate Zertifikate (timeout-gesichert)...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Lade CA-Zertifikate nach Mercedes-Import neu (timeout-gesichert)...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ Mercedes-Zertifikate erfolgreich in CA-Store integriert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Konfiguriere SSL-Umgebungsvariablen...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Validiere SSL-Konfiguration...[0m
|
|
||||||
[0;32m[2025-06-03 21:02:06] ✅ SSL-Zertifikate verfügbar: 144 CA-Zertifikate[0m
|
|
||||||
[0;35m[FORTSCHRITT] Finalisiere SSL-Konfiguration...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ Finale CA-Zertifikate Integration abgeschlossen[0m
|
|
||||||
[0;32m[2025-06-03 21:02:07] ✅ SSL-Zertifikate timeout-gesichert konfiguriert[0m
|
|
||||||
[0;34m[DEBUG] SSL-Konfiguration abgeschlossen ohne hängende Prozesse[0m
|
|
||||||
[0;32m[2025-06-03 21:02:07] === PYTHON-PAKETE INSTALLATION ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere Python-Pakete...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Installiere requirements.txt...[0m
|
|
||||||
[0;36m[ERFOLG] ✅ requirements.txt erfolgreich installiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Validiere essenzielle Python-Module...[0m
|
|
||||||
[0;34m[DEBUG] flask erfolgreich importiert[0m
|
|
||||||
[0;34m[DEBUG] requests erfolgreich importiert[0m
|
|
||||||
[0;36m[ERFOLG] ✅ Essenzielle Python-Module verfügbar[0m
|
|
||||||
[0;32m[2025-06-03 21:02:50] ✅ Python-Pakete Installation abgeschlossen[0m
|
|
||||||
[0;35m[FORTSCHRITT] Zeige installierte Python-Pakete...[0m
|
|
||||||
[0;32m[2025-06-03 21:02:50] === ROBUSTES ANWENDUNGS-DEPLOYMENT ===[0m
|
|
||||||
[0;35m[FORTSCHRITT] Erstelle sicheres Zielverzeichnis: /opt/myp[0m
|
|
||||||
[0;35m[FORTSCHRITT] Validiere Source-Dateien...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Anwendungsdateien (robust)...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere kritische Datei: app.py[0m
|
|
||||||
[0;36m[ERFOLG] ✅ app.py erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere kritische Datei: models.py[0m
|
|
||||||
[0;36m[ERFOLG] ✅ models.py erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere kritische Datei: requirements.txt[0m
|
|
||||||
[0;36m[ERFOLG] ✅ requirements.txt erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: blueprints[0m
|
|
||||||
[0;36m[ERFOLG] ✅ blueprints erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: config[0m
|
|
||||||
[0;36m[ERFOLG] ✅ config erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: database[0m
|
|
||||||
[0;36m[ERFOLG] ✅ database erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: static[0m
|
|
||||||
[0;36m[ERFOLG] ✅ static erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: templates[0m
|
|
||||||
[0;36m[ERFOLG] ✅ templates erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: uploads[0m
|
|
||||||
[0;36m[ERFOLG] ✅ uploads erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: utils[0m
|
|
||||||
[0;36m[ERFOLG] ✅ utils erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: logs[0m
|
|
||||||
[0;36m[ERFOLG] ✅ logs erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: certs[0m
|
|
||||||
[0;36m[ERFOLG] ✅ certs erfolgreich kopiert[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: package.json[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: package-lock.json[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: tailwind.config.js[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: postcss.config.js[0m
|
|
||||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: README.md[0m
|
|
||||||
[0;35m[FORTSCHRITT] Erstelle Verzeichnisstruktur...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Setze sichere Berechtigungen...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Konfiguriere robuste Python-Umgebung...[0m
|
|
||||||
[0;32m[2025-06-03 21:03:16] ✅ Python-Pfad konfiguriert: /usr/local/lib/python3.11/dist-packages/myp-app.pth[0m
|
|
||||||
[0;35m[FORTSCHRITT] Konfiguriere Umgebungsvariablen...[0m
|
|
||||||
[0;35m[FORTSCHRITT] Aktualisiere Bash-Profile...[0m
|
|
||||||
|
117
backend/setup.sh
117
backend/setup.sh
@ -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
|
||||||
|
else
|
||||||
|
debug "Überspringe nicht-existierendes/unlesbares .bashrc: $user_home/.bashrc"
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
debug "Überspringe nicht-schreibbares Verzeichnis: $user_home"
|
||||||
fi
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user