📝 "Update IHK project documentation with Gitmoji emojis in setup.sh" 🌟
This commit is contained in:
parent
f1094bb125
commit
6a858b0dd3
@ -279,22 +279,19 @@ mit der bestehenden Netzwerkinfrastruktur der TBA harmonieren, ohne
|
|||||||
dabei Sicherheitsrichtlinien zu verletzen. Die Schnittstelle zur
|
dabei Sicherheitsrichtlinien zu verletzen. Die Schnittstelle zur
|
||||||
IT-Abteilung erwies sich als besonders kritisch, da jede
|
IT-Abteilung erwies sich als besonders kritisch, da jede
|
||||||
Netzwerkkonfiguration und jede Port-Freischaltung einer expliziten
|
Netzwerkkonfiguration und jede Port-Freischaltung einer expliziten
|
||||||
Genehmigung bedurfte – ein bürokratischer Tanz, der Fingerspitzengefühl
|
Genehmigung bedurfte.
|
||||||
erforderte.
|
|
||||||
|
|
||||||
Die Benutzerschnittstelle musste so gestaltet werden, dass sowohl
|
Die Benutzerschnittstelle musste so gestaltet werden, dass sowohl
|
||||||
technisch versierte Auszubildende als auch weniger IT-affine Nutzer das
|
technisch versierte Auszubildende als auch weniger IT-affine Nutzer das
|
||||||
System intuitiv bedienen können. Dies erforderte eine Balance zwischen
|
System intuitiv bedienen können. Dies erforderte eine Balance zwischen
|
||||||
Funktionsumfang und Benutzerfreundlichkeit – eine Balance, die nicht
|
Funktionsumfang und Benutzerfreundlichkeit.
|
||||||
immer leicht zu finden war, aber letztendlich gelang.
|
|
||||||
|
|
||||||
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
|
||||||
erstaunlich naiv. Die proprietäre API der Geräte war nicht nur
|
naiv. Die proprietäre API der Geräte war nicht nur
|
||||||
undokumentiert, sondern geradezu verschleiert – ein Umstand, der
|
undokumentiert, sondern verschleiert – ein Umstand, der
|
||||||
erheblichen Reverse-Engineering-Aufwand erforderte und mich in die
|
erheblichen Reverse-Engineering-Aufwand erforderte.
|
||||||
Tiefen der Netzwerkanalyse führte.
|
|
||||||
|
|
||||||
## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen
|
## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen
|
||||||
|
|
||||||
@ -327,8 +324,7 @@ nennen möchte – bestand aus isolierten Komponenten ohne jegliche
|
|||||||
Integration. Die 3D-Drucker operierten als Insellösungen, verbunden
|
Integration. Die 3D-Drucker operierten als Insellösungen, verbunden
|
||||||
lediglich durch ihre physische Nähe und das gemeinsame Whiteboard. Der
|
lediglich durch ihre physische Nähe und das gemeinsame Whiteboard. Der
|
||||||
Frontend-Prototyp von Torben Haack existierte als Docker-Container auf
|
Frontend-Prototyp von Torben Haack existierte als Docker-Container auf
|
||||||
einem Entwicklungsserver, ohne Anbindung an reale Daten oder Funktionen
|
einem Entwicklungsserver, ohne Anbindung an reale Daten oder Funktionen.
|
||||||
– ein digitales Potemkinsches Dorf, wenn man so will.
|
|
||||||
|
|
||||||
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
|
||||||
@ -342,8 +338,7 @@ 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; eine Lösung, die in
|
technischer Machbarkeit und praktischem Nutzen dar.
|
||||||
ihrer Simplizität genial war.
|
|
||||||
|
|
||||||
# 2. Projektplanung
|
# 2. Projektplanung
|
||||||
|
|
||||||
@ -351,7 +346,7 @@ ihrer Simplizität genial war.
|
|||||||
|
|
||||||
Die Projektplanung folgte einem agilen Ansatz nach Scrum-Prinzipien –
|
Die Projektplanung folgte einem agilen Ansatz nach Scrum-Prinzipien –
|
||||||
eine Entscheidung, die sich angesichts der zahlreichen Unwägbarkeiten
|
eine Entscheidung, die sich angesichts der zahlreichen Unwägbarkeiten
|
||||||
als goldrichtig erweisen sollte. Die Gesamtprojektdauer von fünf Wochen
|
als richtig erweisen sollte. Die Gesamtprojektdauer von fünf Wochen
|
||||||
(15. April bis 20. Mai 2025) wurde in fünf einwöchige Sprints
|
(15. April bis 20. Mai 2025) wurde in fünf einwöchige Sprints
|
||||||
unterteilt, wobei jeder Sprint seine eigenen Herausforderungen und
|
unterteilt, wobei jeder Sprint seine eigenen Herausforderungen und
|
||||||
– ja – auch Überraschungen bereithielt.
|
– ja – auch Überraschungen bereithielt.
|
||||||
@ -372,12 +367,11 @@ Vorhaben, das zunächst kläglich scheiterte.
|
|||||||
|
|
||||||
Im zweiten Sprint lag der Fokus auf dem Aufbau der
|
Im zweiten Sprint lag der Fokus auf dem Aufbau der
|
||||||
Backend-Infrastruktur. Die Beantragung der erforderlichen
|
Backend-Infrastruktur. Die Beantragung der erforderlichen
|
||||||
Administratorrechte erwies sich als bürokratischer Marathon durch die
|
Administratorrechte erwies sich als zeitaufwändiger als erwartet.
|
||||||
Instanzen der Mercedes-Benz AG. Parallel dazu begannen die ersten
|
Parallel dazu begannen die ersten Experimente mit Wireshark, um das
|
||||||
Experimente mit Wireshark, um das Kommunikationsprotokoll der
|
Kommunikationsprotokoll der Smart-Plugs zu entschlüsseln – eine
|
||||||
Smart-Plugs zu entschlüsseln – eine Notwendigkeit, die sich aus der
|
Notwendigkeit, die sich aus der mangelhaften Dokumentation der
|
||||||
mangelhaften Dokumentation der PyP100-Bibliothek ergab und mich in die
|
PyP100-Bibliothek ergab.
|
||||||
Rolle eines digitalen Detektivs drängte.
|
|
||||||
|
|
||||||
### Sprint 3 (29. April - 3. Mai 2025)
|
### Sprint 3 (29. April - 3. Mai 2025)
|
||||||
|
|
||||||
@ -385,8 +379,7 @@ Der dritte Sprint sollte die Integration von Frontend und Backend
|
|||||||
realisieren. Stattdessen mutierte er zu einer Woche der technischen
|
realisieren. Stattdessen mutierte er zu einer Woche der technischen
|
||||||
Herausforderungen: Die Verbindung zwischen den Komponenten scheiterte
|
Herausforderungen: Die Verbindung zwischen den Komponenten scheiterte
|
||||||
wiederholt, die genehmigten SSL-Zertifikate gingen durch einen
|
wiederholt, die genehmigten SSL-Zertifikate gingen durch einen
|
||||||
unglücklichen Neuinstallationsprozess verloren (ein Moment, der mich
|
unglücklichen Neuinstallationsprozess verloren, und die Einarbeitung in die
|
||||||
die Wichtigkeit von Backups lehrte), und die Einarbeitung in die
|
|
||||||
unternehmensspezifischen Implementierungen von GitHub OAuth und npm
|
unternehmensspezifischen Implementierungen von GitHub OAuth und npm
|
||||||
verschlang wertvolle Zeit.
|
verschlang wertvolle Zeit.
|
||||||
|
|
||||||
@ -394,18 +387,16 @@ verschlang wertvolle Zeit.
|
|||||||
|
|
||||||
Ursprünglich für Optimierungen vorgesehen, wandelte sich dieser Sprint
|
Ursprünglich für Optimierungen vorgesehen, wandelte sich dieser Sprint
|
||||||
zur Rettungsmission. Der Zeitdruck erzwang pragmatische Entscheidungen
|
zur Rettungsmission. Der Zeitdruck erzwang pragmatische Entscheidungen
|
||||||
und die Konzentration auf essenzielle Funktionen. In marathonartigen
|
und die Konzentration auf essenzielle Funktionen. In intensiven
|
||||||
Coding-Sessions wurde die Grundfunktionalität implementiert – nicht
|
Coding-Sessions wurde die Grundfunktionalität implementiert – nicht
|
||||||
unbedingt elegant, aber funktional; ein klassischer Fall von "done is
|
unbedingt elegant, aber funktional.
|
||||||
better than perfect".
|
|
||||||
|
|
||||||
### Sprint 5 (13.-17. Mai 2025)
|
### Sprint 5 (13.-17. Mai 2025)
|
||||||
|
|
||||||
Der finale Sprint diente der Fehlerbehebung und Systemstabilisierung.
|
Der finale Sprint diente der Fehlerbehebung und Systemstabilisierung.
|
||||||
Die ursprünglich geplanten Schulungen fielen dem Zeitdruck zum Opfer.
|
Die ursprünglich geplanten Schulungen fielen dem Zeitdruck zum Opfer.
|
||||||
Stattdessen wurde fieberhaft an kritischen Bugfixes gearbeitet und die
|
Stattdessen wurde an kritischen Bugfixes gearbeitet und die
|
||||||
Projektdokumentation erstellt – letztere teilweise in nächtlichen
|
Projektdokumentation erstellt.
|
||||||
Sessions, begleitet von übermäßigem Koffeinkonsum.
|
|
||||||
|
|
||||||
## 2.2 Ressourcenplanung
|
## 2.2 Ressourcenplanung
|
||||||
|
|
||||||
@ -417,8 +408,7 @@ ausgewählt.
|
|||||||
Als zentrale Serverplattform diente zunächst ein Raspberry Pi 4 mit 4 GB
|
Als zentrale Serverplattform diente zunächst ein Raspberry Pi 4 mit 4 GB
|
||||||
RAM – eine Entscheidung, die sich schnell als Fehlkalkulation
|
RAM – eine Entscheidung, die sich schnell als Fehlkalkulation
|
||||||
herausstellte. Performance-Tests zeigten, dass das ressourcenhungrige
|
herausstellte. Performance-Tests zeigten, dass das ressourcenhungrige
|
||||||
Next.js-Frontend die kleine Platine an ihre Grenzen brachte; ein
|
Next.js-Frontend die kleine Platine an ihre Grenzen brachte. Der
|
||||||
digitaler David gegen Goliath, nur dass David diesmal unterlag. Der
|
|
||||||
kurzfristige Wechsel auf einen Raspberry Pi 5 mit 8 GB RAM und 128 GB
|
kurzfristige Wechsel auf einen Raspberry Pi 5 mit 8 GB RAM und 128 GB
|
||||||
Speicher löste die Performance-Probleme, verursachte aber zusätzliche
|
Speicher löste die Performance-Probleme, verursachte aber zusätzliche
|
||||||
Kosten und – was schwerer wog – Zeitverzug.
|
Kosten und – was schwerer wog – Zeitverzug.
|
||||||
@ -449,26 +439,22 @@ sich als Segen erwies.
|
|||||||
|
|
||||||
## 2.3 Planung der Qualitätssicherung
|
## 2.3 Planung der Qualitätssicherung
|
||||||
|
|
||||||
Das Qualitätssicherungskonzept orientierte sich am V-Modell – eine
|
Das Qualitätssicherungskonzept orientierte sich am V-Modell. Für jede
|
||||||
klassische, aber bewährte Herangehensweise. Für jede Entwicklungsphase
|
Entwicklungsphase wurden korrespondierende Testaktivitäten definiert.
|
||||||
wurden korrespondierende Testaktivitäten definiert, wobei die Realität
|
|
||||||
diese saubere Trennung oft genug konterkarierte.
|
|
||||||
|
|
||||||
Auf Unit-Test-Ebene wurden alle kritischen Komponenten isoliert
|
Auf Unit-Test-Ebene wurden alle kritischen Komponenten isoliert
|
||||||
getestet. Die Datenbankoperationen, API-Eingabevalidierung und
|
getestet. Die Datenbankoperationen, API-Eingabevalidierung und
|
||||||
Kernfunktionen der Reservierungsverwaltung durchliefen umfangreiche
|
Kernfunktionen der Reservierungsverwaltung durchliefen umfangreiche
|
||||||
Testszenarien. Besondere Aufmerksamkeit galt der
|
Testszenarien. Besondere Aufmerksamkeit galt der
|
||||||
Smart-Plug-Kommunikation, für die spezielle Testfälle entwickelt wurden
|
Smart-Plug-Kommunikation, für die spezielle Testfälle entwickelt wurden
|
||||||
– einschließlich simulierter Netzwerkausfälle und Timeout-Situationen;
|
– einschließlich simulierter Netzwerkausfälle und Timeout-Situationen.
|
||||||
Szenarien, die sich später als prophetisch erweisen sollten.
|
|
||||||
|
|
||||||
Die Integrationstests gestalteten sich komplexer als erwartet. Das
|
Die Integrationstests gestalteten sich komplexer als erwartet. Das
|
||||||
Zusammenspiel zwischen Backend und Smart-Plugs erwies sich als
|
Zusammenspiel zwischen Backend und Smart-Plugs erwies sich als
|
||||||
fehleranfällig, insbesondere bei gleichzeitigen Zugriffen. Die
|
fehleranfällig, insbesondere bei gleichzeitigen Zugriffen. Die
|
||||||
systematischen Tests mit verschiedenen Eingabedaten – einschließlich
|
systematischen Tests mit verschiedenen Eingabedaten – einschließlich
|
||||||
bewusst invalider und potenziell schädlicher Inputs – deckten mehrere
|
bewusst invalider und potenziell schädlicher Inputs – deckten mehrere
|
||||||
Sicherheitslücken auf, die nachträglich geschlossen werden mussten; ein
|
Sicherheitslücken auf, die nachträglich geschlossen werden mussten.
|
||||||
demütigender, aber lehrreicher Prozess.
|
|
||||||
|
|
||||||
Systemtests bildeten komplette Anwendungsszenarien ab. Ein typischer
|
Systemtests bildeten komplette Anwendungsszenarien ab. Ein typischer
|
||||||
Testfall umfasste die Benutzeranmeldung, Reservierungserstellung,
|
Testfall umfasste die Benutzeranmeldung, Reservierungserstellung,
|
||||||
@ -489,16 +475,14 @@ Die IT-Landschaft der TBA präsentierte sich als bunter Flickenteppich
|
|||||||
verschiedenster Technologien und Standards. Die 3D-Drucker stammten von
|
verschiedenster Technologien und Standards. Die 3D-Drucker stammten von
|
||||||
unterschiedlichen Herstellern mit inkompatiblen Steuerungssystemen. Das
|
unterschiedlichen Herstellern mit inkompatiblen Steuerungssystemen. Das
|
||||||
Netzwerk war in multiple VLANs segmentiert, wobei die Dokumentation
|
Netzwerk war in multiple VLANs segmentiert, wobei die Dokumentation
|
||||||
dieser Struktur bestenfalls als lückenhaft bezeichnet werden konnte –
|
dieser Struktur bestenfalls als lückenhaft bezeichnet werden konnte.
|
||||||
ein digitales Labyrinth ohne Ariadnefaden.
|
|
||||||
|
|
||||||
Die Herausforderung bestand darin, eine einheitliche Lösung für diese
|
Die Herausforderung bestand darin, eine einheitliche Lösung für diese
|
||||||
heterogene Umgebung zu entwickeln. Der Ansatz über Smart-Plugs erwies
|
heterogene Umgebung zu entwickeln. Der Ansatz über Smart-Plugs erwies
|
||||||
sich hier als Glücksgriff – er abstrahierte die Unterschiede zwischen
|
sich hier als Glücksgriff – er abstrahierte die Unterschiede zwischen
|
||||||
den Druckern auf die simpelste mögliche Ebene: Strom an oder aus. Diese
|
den Druckern auf die simpelste mögliche Ebene: Strom an oder aus. Diese
|
||||||
radikale Vereinfachung ermöglichte eine universelle Lösung, die
|
radikale Vereinfachung ermöglichte eine universelle Lösung, die
|
||||||
unabhängig vom Druckermodell funktionierte; ein Paradebeispiel für das
|
unabhängig vom Druckermodell funktionierte.
|
||||||
KISS-Prinzip in Aktion.
|
|
||||||
|
|
||||||
Die Integration in die bestehende Netzwerkinfrastruktur erforderte
|
Die Integration in die bestehende Netzwerkinfrastruktur erforderte
|
||||||
diplomatisches Geschick. Die IT-Abteilung bestand auf strikter
|
diplomatisches Geschick. Die IT-Abteilung bestand auf strikter
|
||||||
@ -513,8 +497,7 @@ Die Auswahl der Übertragungssysteme wurde maßgeblich durch die
|
|||||||
Sicherheitsanforderungen bestimmt. Cloud-basierte Lösungen schieden
|
Sicherheitsanforderungen bestimmt. Cloud-basierte Lösungen schieden
|
||||||
kategorisch aus, was die Optionen erheblich einschränkte. Die
|
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 – eine Notlösung, die zur
|
Zertifikaten war pragmatisch, aber effektiv.
|
||||||
Dauerlösung wurde.
|
|
||||||
|
|
||||||
Die Kommunikation mit den Smart-Plugs erfolgte über das proprietäre
|
Die Kommunikation mit den Smart-Plugs erfolgte über das proprietäre
|
||||||
TP-Link-Protokoll, das auf HTTP basiert. Die anfänglichen Versuche, die
|
TP-Link-Protokoll, das auf HTTP basiert. Die anfänglichen Versuche, die
|
||||||
@ -523,21 +506,19 @@ Sicherheitsrichtlinien. Die Entdeckung, dass die Geräte auch eine lokale
|
|||||||
API anboten, war ein Durchbruch – allerdings einer, der erheblichen
|
API anboten, war ein Durchbruch – allerdings einer, der erheblichen
|
||||||
Reverse-Engineering-Aufwand erforderte.
|
Reverse-Engineering-Aufwand erforderte.
|
||||||
|
|
||||||
Hier kam Wireshark ins Spiel; mein digitales Stethoskop, wenn man so
|
Hier kam Wireshark ins Spiel. Zusammen mit der TAPO-App analysierte ich
|
||||||
will. Zusammen mit der TAPO-App analysierte ich den Netzwerkverkehr, um
|
den Netzwerkverkehr, um das Kommunikationsprotokoll zu entschlüsseln.
|
||||||
das Kommunikationsprotokoll zu entschlüsseln. Die Erkenntnis, dass ein
|
Die Erkenntnis, dass ein Session-Key erforderlich war, der sich bei
|
||||||
Session-Key erforderlich war, der sich bei jeder Anmeldung änderte,
|
jeder Anmeldung änderte, verkomplizierte die Integration erheblich.
|
||||||
verkomplizierte die Integration erheblich. Zunächst versuchte ich,
|
Zunächst versuchte ich, diesen Key manuell abzufangen und in meine
|
||||||
diesen Key manuell abzufangen und in meine Anwendung zu integrieren –
|
Anwendung zu integrieren – ein Ansatz, der funktionierte, aber
|
||||||
ein Ansatz, der funktionierte, aber offensichtlich nicht praxistauglich
|
offensichtlich nicht praxistauglich war.
|
||||||
war.
|
|
||||||
|
|
||||||
Nach tagelangen Experimenten und zahllosen Fehlversuchen stieß ich auf
|
Nach tagelangen Experimenten und zahllosen Fehlversuchen stieß ich auf
|
||||||
ein alternatives Python-Modul, das die lokale Kommunikation mit den
|
ein alternatives Python-Modul, das die lokale Kommunikation mit den
|
||||||
TAPO-Geräten ermöglichte. Dieses Modul – versteckt in den Tiefen von
|
TAPO-Geräten ermöglichte. Dieses Modul – versteckt in den Tiefen von
|
||||||
GitHub – löste die Session-Key-Problematik elegant und ermöglichte eine
|
GitHub – löste die Session-Key-Problematik elegant und ermöglichte eine
|
||||||
stabile Integration; ein Fund, der mich vor Freude fast hätte tanzen
|
stabile Integration.
|
||||||
lassen.
|
|
||||||
|
|
||||||
## 2.6 Planung der Prozess-/ und Systemschnittstellen
|
## 2.6 Planung der Prozess-/ und Systemschnittstellen
|
||||||
|
|
||||||
@ -568,37 +549,34 @@ Eleganz bestach.
|
|||||||
Die Sicherheitsplanung folgte dem Prinzip "Security by Design" – ein
|
Die Sicherheitsplanung folgte dem Prinzip "Security by Design" – ein
|
||||||
Ansatz, der sich angesichts der sensiblen Umgebung als unerlässlich
|
Ansatz, der sich angesichts der sensiblen Umgebung als unerlässlich
|
||||||
erwies. Jede Komponente wurde von Anfang an mit Sicherheit im Hinterkopf
|
erwies. Jede Komponente wurde von Anfang an mit Sicherheit im Hinterkopf
|
||||||
entwickelt; Paranoia als Tugend, wenn man so will.
|
entwickelt.
|
||||||
|
|
||||||
Die Authentifizierung basierte auf bcrypt mit einem Cost-Faktor von 12 –
|
Die Authentifizierung basierte auf bcrypt mit einem Cost-Faktor von 12 –
|
||||||
ein Kompromiss zwischen Sicherheit und Performance auf dem Raspberry Pi.
|
ein Kompromiss zwischen Sicherheit und Performance auf dem Raspberry Pi.
|
||||||
Session-Management wurde über Flask-Login realisiert, mit
|
Session-Management wurde über Flask-Login realisiert, mit
|
||||||
konfigurierbaren Timeout-Werten und sicheren Session-Cookies. Die
|
konfigurierbaren Timeout-Werten und sicheren Session-Cookies. Die
|
||||||
Implementierung einer Brute-Force-Protection mit exponentieller
|
Implementierung einer Brute-Force-Protection mit exponentieller
|
||||||
Backoff-Strategie verhinderte automatisierte Angriffe; ein digitaler
|
Backoff-Strategie verhinderte automatisierte Angriffe.
|
||||||
Türsteher, der keine Kompromisse kannte.
|
|
||||||
|
|
||||||
Auf Netzwerkebene wurden restriktive Firewall-Regeln implementiert. Nur
|
Auf Netzwerkebene wurden restriktive Firewall-Regeln implementiert. Nur
|
||||||
essenzielle Ports wurden geöffnet, ausgehende Verbindungen auf die
|
essenzielle Ports wurden geöffnet, ausgehende Verbindungen auf die
|
||||||
IP-Adressen der Smart-Plugs beschränkt. Die Verwendung von iptables
|
IP-Adressen der Smart-Plugs beschränkt. Die Verwendung von iptables
|
||||||
ermöglichte granulare Kontrolle über den Netzwerkverkehr – eine
|
ermöglichte granulare Kontrolle über den Netzwerkverkehr.
|
||||||
Festung aus Bits und Bytes.
|
|
||||||
|
|
||||||
Die API-Sicherheit umfasste Input-Validation, Output-Encoding und
|
Die API-Sicherheit umfasste Input-Validation, Output-Encoding und
|
||||||
CSRF-Protection. Jeder Endpunkt wurde gegen die OWASP Top 10
|
CSRF-Protection. Jeder Endpunkt wurde gegen die OWASP Top 10
|
||||||
abgesichert. Ein selbstentwickeltes Intrusion Detection System
|
abgesichert. Ein selbstentwickeltes Intrusion Detection System
|
||||||
überwachte verdächtige Aktivitäten und sperrte bei Bedarf IP-Adressen
|
überwachte verdächtige Aktivitäten und sperrte bei Bedarf IP-Adressen
|
||||||
temporär – Big Brother im Dienste der Sicherheit.
|
temporär.
|
||||||
|
|
||||||
# 3. Durchführung und Auftragsbearbeitung
|
# 3. Durchführung und Auftragsbearbeitung
|
||||||
|
|
||||||
## 3.1 Prozess-Schritte und Vorgehensweise
|
## 3.1 Prozess-Schritte und Vorgehensweise
|
||||||
|
|
||||||
Die Durchführung des Projekts glich einer technischen Odyssee, gespickt
|
Die Durchführung des Projekts glich einer technischen Expedition mit
|
||||||
mit unerwarteten Wendungen und kreativen Lösungsansätzen. Die
|
unerwarteten Wendungen und kreativen Lösungsansätzen. Die
|
||||||
ursprünglich geplante lineare Vorgehensweise wich schnell einer
|
ursprünglich geplante lineare Vorgehensweise wich schnell einer
|
||||||
iterativen, problemgetriebenen Herangehensweise – Agilität nicht als
|
iterativen, problemgetriebenen Herangehensweise.
|
||||||
Methode, sondern als Überlebensstrategie.
|
|
||||||
|
|
||||||
### 3.1.1 Datenabfrage der Sensoren
|
### 3.1.1 Datenabfrage der Sensoren
|
||||||
|
|
||||||
@ -612,7 +590,7 @@ Der erste Ansatz – die Nutzung der dokumentierten Cloud-API – scheiterte
|
|||||||
an den Sicherheitsrichtlinien. Der zweite Ansatz – die direkte lokale
|
an den Sicherheitsrichtlinien. Der zweite Ansatz – die direkte lokale
|
||||||
Kommunikation – scheiterte an der fehlenden Dokumentation. Erst der
|
Kommunikation – scheiterte an der fehlenden Dokumentation. Erst der
|
||||||
dritte Ansatz – Reverse Engineering mittels Wireshark – führte zum
|
dritte Ansatz – Reverse Engineering mittels Wireshark – führte zum
|
||||||
Durchbruch; ein Prozess, der mich die Kunst der Paketanalyse lehrte.
|
Durchbruch.
|
||||||
|
|
||||||
Die Wireshark-Analyse offenbarte das komplexe
|
Die Wireshark-Analyse offenbarte das komplexe
|
||||||
Authentifizierungsprotokoll der TAPO-Geräte. Jede Kommunikation
|
Authentifizierungsprotokoll der TAPO-Geräte. Jede Kommunikation
|
||||||
@ -636,13 +614,13 @@ Scheduler-Thread prüfte im Minutentakt die Datenbank auf anstehende
|
|||||||
Aktionen und triggerte entsprechende Smart-Plug-Operationen. Die
|
Aktionen und triggerte entsprechende Smart-Plug-Operationen. Die
|
||||||
Herausforderung bestand darin, die Asynchronität der
|
Herausforderung bestand darin, die Asynchronität der
|
||||||
Hardware-Operationen mit der Synchronität der Datenbankzugriffe zu
|
Hardware-Operationen mit der Synchronität der Datenbankzugriffe zu
|
||||||
vereinen – ein Tanz zwischen zwei Welten.
|
vereinen.
|
||||||
|
|
||||||
Die Lösung war ein Queue-basiertes System, das Kommandos pufferte und
|
Die Lösung war ein Queue-basiertes System, das Kommandos pufferte und
|
||||||
sequenziell abarbeitete. Dies verhinderte Race Conditions bei simultanen
|
sequenziell abarbeitete. Dies verhinderte Race Conditions bei simultanen
|
||||||
Zugriffen und gewährleistete die Konsistenz der Systemzustände. Jede
|
Zugriffen und gewährleistete die Konsistenz der Systemzustände. Jede
|
||||||
Operation wurde in einer Transaktion gekapselt, mit Rollback-Mechanismen
|
Operation wurde in einer Transaktion gekapselt, mit Rollback-Mechanismen
|
||||||
bei Fehlern – Atomarität als oberstes Gebot.
|
bei Fehlern.
|
||||||
|
|
||||||
Die Verarbeitung der Energiedaten ermöglichte interessante Einblicke in
|
Die Verarbeitung der Energiedaten ermöglichte interessante Einblicke in
|
||||||
die Nutzungsmuster. Anomalien – wie ungewöhnlich hoher Stromverbrauch –
|
die Nutzungsmuster. Anomalien – wie ungewöhnlich hoher Stromverbrauch –
|
||||||
@ -655,44 +633,40 @@ ein glücklicher Zufall, der zur Kernfunktionalität wurde.
|
|||||||
Die Projektdurchführung war geprägt von kontinuierlichen Anpassungen an
|
Die Projektdurchführung war geprägt von kontinuierlichen Anpassungen an
|
||||||
die Realität. Die größte Abweichung vom ursprünglichen Plan war der
|
die Realität. Die größte Abweichung vom ursprünglichen Plan war der
|
||||||
Wechsel der Systemarchitektur von einer verteilten zu einer
|
Wechsel der Systemarchitektur von einer verteilten zu einer
|
||||||
konsolidierten Lösung – eine Entscheidung, die aus der Not geboren
|
konsolidierten Lösung.
|
||||||
wurde.
|
|
||||||
|
|
||||||
Ursprünglich war geplant, dass ich nur die API entwickle und diese mit
|
Ursprünglich war geplant, dass ich nur die API entwickle und diese mit
|
||||||
Torbens Frontend auf einem separaten Raspberry Pi verknüpfe. Diese
|
Torbens Frontend auf einem separaten Raspberry Pi verknüpfe. Diese
|
||||||
Architektur erwies sich als zu komplex – die unterschiedlichen
|
Architektur erwies sich als zu komplex – die unterschiedlichen
|
||||||
Technologie-Stacks (Next.js vs. Python/Flask) und die
|
Technologie-Stacks (Next.js vs. Python/Flask) und die
|
||||||
Netzwerksegmentierung machten die Integration zum Albtraum. Die
|
Netzwerksegmentierung machten die Integration schwierig. Die
|
||||||
Entscheidung, beide Komponenten auf einem einzigen Raspberry Pi zu
|
Entscheidung, beide Komponenten auf einem einzigen Raspberry Pi zu
|
||||||
konsolidieren, vereinfachte nicht nur die Architektur, sondern
|
konsolidieren, vereinfachte nicht nur die Architektur, sondern
|
||||||
reduzierte auch Kosten und Stromverbrauch; manchmal ist weniger
|
reduzierte auch Kosten und Stromverbrauch.
|
||||||
tatsächlich mehr.
|
|
||||||
|
|
||||||
Der versehentliche Verlust der SSL-Zertifikate während einer
|
Der versehentliche Verlust der SSL-Zertifikate während einer
|
||||||
Neuinstallation – ein Moment des Schreckens – führte zur Implementierung
|
Neuinstallation führte zur Implementierung
|
||||||
eines robusten Backup-Systems. Die Lektion war schmerzhaft, aber
|
eines robusten Backup-Systems. Kritische Konfigurationsdateien werden nun dreifach
|
||||||
lehrreich: Kritische Konfigurationsdateien werden nun dreifach
|
gesichert.
|
||||||
gesichert; Paranoia als Versicherung.
|
|
||||||
|
|
||||||
Die Entscheidung, von der komplexen PyP100-Integration zu einem
|
Die Entscheidung, von der komplexen PyP100-Integration zu einem
|
||||||
alternativen Modul zu wechseln, fiel nach tagelangen frustrierenden
|
alternativen Modul zu wechseln, fiel nach tagelangen frustrierenden
|
||||||
Debugging-Sessions. Der Stolz, es "richtig" machen zu wollen, wich dem
|
Debugging-Sessions. Der Stolz, es "richtig" machen zu wollen, wich dem
|
||||||
Pragmatismus, eine funktionierende Lösung zu liefern. Das gefundene
|
Pragmatismus, eine funktionierende Lösung zu liefern. Das gefundene
|
||||||
Alternative Modul – ironischerweise simpler und stabiler – rettete das
|
Alternative Modul – ironischerweise simpler und stabiler – rettete das
|
||||||
Projekt; ein Beweis dafür, dass der einfachste Weg oft der beste ist.
|
Projekt.
|
||||||
|
|
||||||
## 3.3 Maßnahmen zur Qualitätskontrolle
|
## 3.3 Maßnahmen zur Qualitätskontrolle
|
||||||
|
|
||||||
Die Qualitätskontrolle erfolgte kontinuierlich und vielschichtig.
|
Die Qualitätskontrolle erfolgte kontinuierlich und vielschichtig.
|
||||||
Automatisierte Tests liefen bei jedem Commit, manuelle Tests ergänzten
|
Automatisierte Tests liefen bei jedem Commit, manuelle Tests ergänzten
|
||||||
diese bei kritischen Funktionen. Die Herausforderung bestand darin, die
|
diese bei kritischen Funktionen. Die Herausforderung bestand darin, die
|
||||||
Hardware-abhängigen Komponenten testbar zu machen – ein Problem, das
|
Hardware-abhängigen Komponenten testbar zu machen.
|
||||||
kreative Lösungen erforderte.
|
|
||||||
|
|
||||||
Mock-Objekte simulierten die Smart-Plugs für Unit-Tests. Diese Mocks
|
Mock-Objekte simulierten die Smart-Plugs für Unit-Tests. Diese Mocks
|
||||||
replizierten das Verhalten der echten Hardware, einschließlich typischer
|
replizierten das Verhalten der echten Hardware, einschließlich typischer
|
||||||
Fehlerszenarien wie Timeouts oder Verbindungsabbrüche. Die Test-Coverage
|
Fehlerszenarien wie Timeouts oder Verbindungsabbrüche. Die Test-Coverage
|
||||||
erreichte respektable 85% – die fehlenden 15% waren hauptsächlich
|
erreichte 85% – die fehlenden 15% waren hauptsächlich
|
||||||
UI-Code und Error-Handler, deren Test-Aufwand in keinem vernünftigen
|
UI-Code und Error-Handler, deren Test-Aufwand in keinem vernünftigen
|
||||||
Verhältnis zum Nutzen stand.
|
Verhältnis zum Nutzen stand.
|
||||||
|
|
||||||
@ -700,13 +674,12 @@ Integrationstests mit echter Hardware deckten Probleme auf, die in der
|
|||||||
Simulation nicht auftraten. Timing-Issues bei simultanen Zugriffen,
|
Simulation nicht auftraten. Timing-Issues bei simultanen Zugriffen,
|
||||||
Memory-Leaks bei lang laufenden Operationen, Race Conditions im
|
Memory-Leaks bei lang laufenden Operationen, Race Conditions im
|
||||||
Scheduler – all diese Probleme wurden iterativ identifiziert und
|
Scheduler – all diese Probleme wurden iterativ identifiziert und
|
||||||
behoben; ein Prozess, der Geduld und Durchhaltevermögen erforderte.
|
behoben.
|
||||||
|
|
||||||
Die Implementierung eines Logging-Systems erwies sich als unschätzbar
|
Die Implementierung eines Logging-Systems erwies sich als unschätzbar
|
||||||
wertvoll. Jede Operation, jeder Fehler, jede Anomalie wurde
|
wertvoll. Jede Operation, jeder Fehler, jede Anomalie wurde
|
||||||
protokolliert. Die Log-Analyse wurde zum wichtigsten Debugging-Tool,
|
protokolliert. Die Log-Analyse wurde zum wichtigsten Debugging-Tool,
|
||||||
insbesondere bei sporadisch auftretenden Problemen – digitale Forensik
|
insbesondere bei sporadisch auftretenden Problemen.
|
||||||
im Kleinen.
|
|
||||||
|
|
||||||
## 3.4 Implementierung, Konfiguration und Inbetriebnahme von Schnittstellen und unterschiedlicher Prozesse und Systeme
|
## 3.4 Implementierung, Konfiguration und Inbetriebnahme von Schnittstellen und unterschiedlicher Prozesse und Systeme
|
||||||
|
|
||||||
@ -714,41 +687,37 @@ Die Implementierung der verschiedenen Schnittstellen erfolgte modular
|
|||||||
und iterativ. Die REST-API wurde Blueprint-basiert strukturiert, was
|
und iterativ. Die REST-API wurde Blueprint-basiert strukturiert, was
|
||||||
eine klare Trennung der Funktionsbereiche ermöglichte. Authentication,
|
eine klare Trennung der Funktionsbereiche ermöglichte. Authentication,
|
||||||
User Management, Printer Management und Job Management erhielten jeweils
|
User Management, Printer Management und Job Management erhielten jeweils
|
||||||
eigene Blueprints – eine Architektur, die Ordnung ins Chaos brachte.
|
eigene Blueprints.
|
||||||
|
|
||||||
Die Smart-Plug-Schnittstelle durchlief mehrere Iterationen. Die finale
|
Die Smart-Plug-Schnittstelle durchlief mehrere Iterationen. Die finale
|
||||||
Implementation kapselte die gesamte Kommunikationslogik in einer
|
Implementation kapselte die gesamte Kommunikationslogik in einer
|
||||||
einzigen Klasse, die eine simple API bot: turn_on(), turn_off(),
|
einzigen Klasse, die eine simple API bot: turn_on(), turn_off(),
|
||||||
get_status(). Diese Abstraktion verbarg die Komplexität des
|
get_status(). Diese Abstraktion verbarg die Komplexität des
|
||||||
darunterliegenden Protokolls und ermöglichte einfache Erweiterungen –
|
darunterliegenden Protokolls und ermöglichte einfache Erweiterungen.
|
||||||
Simplizität als Designprinzip.
|
|
||||||
|
|
||||||
Die Datenbank-Schnittstelle nutzte SQLAlchemy's ORM-Funktionalität. Die
|
Die Datenbank-Schnittstelle nutzte SQLAlchemy's ORM-Funktionalität. Die
|
||||||
Definition der Models erfolgte deklarativ, Migrationen wurden über
|
Definition der Models erfolgte deklarativ, Migrationen wurden über
|
||||||
Alembic verwaltet. Die Entscheidung für SQLite als Datenbank war
|
Alembic verwaltet. Die Entscheidung für SQLite als Datenbank war
|
||||||
pragmatisch – keine zusätzlichen Services, keine Konfiguration, perfekt
|
pragmatisch – keine zusätzlichen Services, keine Konfiguration, perfekt
|
||||||
für die Offline-Anforderung; manchmal ist die einfachste Lösung die
|
für die Offline-Anforderung.
|
||||||
beste.
|
|
||||||
|
|
||||||
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öglichte asynchrone Hardware-Operationen ohne Blockierung der
|
||||||
Web-Requests – Parallelität ohne Kopfschmerzen.
|
Web-Requests.
|
||||||
|
|
||||||
## 3.5 Konfiguration von Übertragungssystemen und Integration in die Gesamtinfrastruktur
|
## 3.5 Konfiguration von Übertragungssystemen und Integration in die Gesamtinfrastruktur
|
||||||
|
|
||||||
Die Integration in die Mercedes-Benz-Infrastruktur erforderte zahlreiche
|
Die Integration in die Mercedes-Benz-Infrastruktur erforderte zahlreiche
|
||||||
Kompromisse und kreative Lösungen. Das dedizierte IoT-Subnetz wurde
|
Kompromisse und kreative Lösungen. Das dedizierte IoT-Subnetz wurde
|
||||||
speziell für das MYP-System eingerichtet, mit restriktiven
|
speziell für das MYP-System eingerichtet, mit restriktiven
|
||||||
Firewall-Regeln und ohne Internet-Zugang – eine digitale Quarantäne, die
|
Firewall-Regeln und ohne Internet-Zugang.
|
||||||
Sicherheit gewährleistete.
|
|
||||||
|
|
||||||
Die Netzwerkkonfiguration erfolgte in enger Abstimmung mit der
|
Die Netzwerkkonfiguration erfolgte in enger Abstimmung mit der
|
||||||
IT-Abteilung. Jede Änderung erforderte ein Change-Request, jede
|
IT-Abteilung. Jede Änderung erforderte ein Change-Request, jede
|
||||||
Port-Öffnung eine Security-Review. Der bürokratische Overhead war
|
Port-Öffnung eine Security-Review. Der bürokratische Overhead war
|
||||||
erheblich, aber notwendig für die Compliance – ein notwendiges Übel im
|
erheblich, aber notwendig für die Compliance.
|
||||||
Konzernumfeld.
|
|
||||||
|
|
||||||
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.
|
||||||
@ -767,7 +736,7 @@ stabile Verbindungen; manchmal ist der steinige Weg der sicherste.
|
|||||||
Die Informationssicherheit wurde von Anfang an als kritischer
|
Die Informationssicherheit wurde von Anfang an als kritischer
|
||||||
Erfolgsfaktor behandelt. Jede Designentscheidung wurde durch die
|
Erfolgsfaktor behandelt. Jede Designentscheidung wurde durch die
|
||||||
Sicherheitsbrille betrachtet, jede Implementierung auf Schwachstellen
|
Sicherheitsbrille betrachtet, jede Implementierung auf Schwachstellen
|
||||||
geprüft – Security als Religion, nicht als Afterthought.
|
geprüft.
|
||||||
|
|
||||||
Die Authentifizierung implementierte moderne Best Practices:
|
Die Authentifizierung implementierte moderne Best Practices:
|
||||||
bcrypt-Hashing, sichere Session-Verwaltung, CSRF-Protection. Die
|
bcrypt-Hashing, sichere Session-Verwaltung, CSRF-Protection. Die
|
||||||
@ -796,8 +765,7 @@ Der Vergleich zwischen geplanten und erreichten Zielen offenbart ein
|
|||||||
gemischtes, aber letztendlich positives Bild. Die Kernfunktionalität –
|
gemischtes, aber letztendlich positives Bild. Die Kernfunktionalität –
|
||||||
digitale Reservierungsverwaltung mit automatischer Hardware-Steuerung –
|
digitale Reservierungsverwaltung mit automatischer Hardware-Steuerung –
|
||||||
wurde vollständig implementiert und übertraf in einigen Aspekten sogar
|
wurde vollständig implementiert und übertraf in einigen Aspekten sogar
|
||||||
die ursprünglichen Anforderungen; ein Erfolg, der süßer schmeckt, weil
|
die ursprünglichen Anforderungen.
|
||||||
er hart erkämpft wurde.
|
|
||||||
|
|
||||||
#### Erfolgreich umgesetzte Anforderungen:
|
#### Erfolgreich umgesetzte Anforderungen:
|
||||||
|
|
||||||
@ -819,14 +787,13 @@ er hart erkämpft wurde.
|
|||||||
Die größte positive Überraschung war die erfolgreiche Integration des
|
Die größte positive Überraschung war die erfolgreiche Integration des
|
||||||
Energiemonitorings. Diese ursprünglich nicht geplante Funktion
|
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; ein Feature,
|
– wertvolle Daten für die Optimierung des Druckerbetriebs.
|
||||||
das aus der Not geboren wurde und zum Alleinstellungsmerkmal avancierte.
|
|
||||||
|
|
||||||
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
|
||||||
und wartungsfreundlicher als eine Quick-and-Dirty-Implementation gewesen
|
und wartungsfreundlicher als eine Quick-and-Dirty-Implementation gewesen
|
||||||
wäre; Qualität setzt sich durch, auch wenn der Weg steinig ist.
|
wäre.
|
||||||
|
|
||||||
## 4.2 Fazit
|
## 4.2 Fazit
|
||||||
|
|
||||||
@ -835,28 +802,25 @@ und technisches Geschick aus scheinbar unüberwindbaren Hindernissen
|
|||||||
elegante Lösungen entstehen können. Die Transformation eines analogen
|
elegante Lösungen entstehen können. Die Transformation eines analogen
|
||||||
Whiteboards in ein modernes cyber-physisches System mag auf den ersten
|
Whiteboards in ein modernes cyber-physisches System mag auf den ersten
|
||||||
Blick trivial erscheinen – die Umsetzung offenbarte jedoch die volle
|
Blick trivial erscheinen – die Umsetzung offenbarte jedoch die volle
|
||||||
Komplexität vernetzter Systeme; ein Eisberg, dessen Spitze täuscht.
|
Komplexität vernetzter Systeme.
|
||||||
|
|
||||||
Die Entscheidung, die fehlenden Schnittstellen der 3D-Drucker durch
|
Die Entscheidung, die fehlenden Schnittstellen der 3D-Drucker durch
|
||||||
Smart-Plugs zu überbrücken, erwies sich als Glücksgriff. Diese
|
Smart-Plugs zu überbrücken, erwies sich als Glücksgriff. Diese
|
||||||
Abstraktion auf die grundlegendste Ebene – Stromversorgung – ermöglichte
|
Abstraktion auf die grundlegendste Ebene – Stromversorgung – ermöglichte
|
||||||
eine universelle Lösung, die unabhängig von Druckermodell oder
|
eine universelle Lösung, die unabhängig von Druckermodell oder
|
||||||
Hersteller funktioniert. Ein klassisches Beispiel für laterales Denken,
|
Hersteller funktioniert.
|
||||||
das komplexe Probleme durch Perspektivwechsel löst.
|
|
||||||
|
|
||||||
Die technische Exzellenz des Systems zeigt sich in den Details: Über
|
Die technische Exzellenz des Systems zeigt sich in den Details: Über
|
||||||
9.000 Zeilen sauber strukturierter Python-Code, eine umfassende
|
9.000 Zeilen sauber strukturierter Python-Code, eine umfassende
|
||||||
REST-API, robuste Fehlerbehandlung, durchdachte Sicherheitsarchitektur.
|
REST-API, robuste Fehlerbehandlung, durchdachte Sicherheitsarchitektur.
|
||||||
Doch der wahre Erfolg liegt in der Praxistauglichkeit – das System läuft
|
Doch der wahre Erfolg liegt in der Praxistauglichkeit – das System läuft
|
||||||
stabil, wird aktiv genutzt und hat das manuelle Chaos endgültig beendet;
|
stabil, wird aktiv genutzt und hat das manuelle Chaos endgültig beendet.
|
||||||
ein digitaler Phönix, der aus der Asche des Whiteboards aufstieg.
|
|
||||||
|
|
||||||
Persönlich war das Projekt eine Achterbahnfahrt der Emotionen. Von der
|
Persönlich war das Projekt eine Achterbahnfahrt der Emotionen. Von der
|
||||||
anfänglichen Euphorie über die frustrierenden Debugging-Sessions bis zum
|
anfänglichen Euphorie über die frustrierenden Debugging-Sessions bis zum
|
||||||
finalen Triumph – jede Phase bot Lernerfahrungen. Die Fähigkeit, unter
|
finalen Triumph – jede Phase bot Lernerfahrungen. Die Fähigkeit, unter
|
||||||
Zeitdruck pragmatische Entscheidungen zu treffen, ohne dabei die
|
Zeitdruck pragmatische Entscheidungen zu treffen, ohne dabei die
|
||||||
Qualität zu kompromittieren, war die wichtigste erworbene Kompetenz; eine
|
Qualität zu kompromittieren, war die wichtigste erworbene Kompetenz.
|
||||||
Lektion, die über das Projekt hinaus Bestand haben wird.
|
|
||||||
|
|
||||||
## 4.3 Optimierungsmöglichkeiten
|
## 4.3 Optimierungsmöglichkeiten
|
||||||
|
|
||||||
@ -889,7 +853,7 @@ die Möglichkeiten sind grenzenlos.
|
|||||||
Die formale Projektabnahme erfolgte am 2. Juni 2025 durch die
|
Die formale Projektabnahme erfolgte am 2. Juni 2025 durch die
|
||||||
Ausbildungsleitung der TBA. Die Präsentation umfasste eine
|
Ausbildungsleitung der TBA. Die Präsentation umfasste eine
|
||||||
Live-Demonstration aller Kernfunktionen sowie eine technische
|
Live-Demonstration aller Kernfunktionen sowie eine technische
|
||||||
Deep-Dive-Session für interessierte Kollegen – ein Moment der Wahrheit.
|
Deep-Dive-Session für interessierte Kollegen.
|
||||||
|
|
||||||
Die Live-Demonstration begann mit einem kleinen Missverständnis: Das
|
Die Live-Demonstration begann mit einem kleinen Missverständnis: Das
|
||||||
System war noch nicht vollständig produktiv aufgebaut, da letzte
|
System war noch nicht vollständig produktiv aufgebaut, da letzte
|
||||||
@ -898,8 +862,7 @@ zeigte sich die wahre Stärke der Architektur – dank der robusten
|
|||||||
Systemkonzeption konnte ich aus dem Stegreif improvisieren und das
|
Systemkonzeption konnte ich aus dem Stegreif improvisieren und das
|
||||||
System dennoch eindrucksvoll demonstrieren. Die automatische Aktivierung
|
System dennoch eindrucksvoll demonstrieren. Die automatische Aktivierung
|
||||||
eines 3D-Druckers zur reservierten Zeit funktionierte einwandfrei und
|
eines 3D-Druckers zur reservierten Zeit funktionierte einwandfrei und
|
||||||
löste sichtbare Begeisterung aus; ein Moment, der die monatelange Arbeit
|
löste sichtbare Begeisterung aus.
|
||||||
rechtfertigte.
|
|
||||||
|
|
||||||
Besonders positiv wurde die Wirtschaftlichkeit der Lösung bewertet. Mit
|
Besonders positiv wurde die Wirtschaftlichkeit der Lösung bewertet. Mit
|
||||||
Gesamtkosten unter 600 Euro (inklusive privat finanzierter Komponenten)
|
Gesamtkosten unter 600 Euro (inklusive privat finanzierter Komponenten)
|
||||||
@ -923,8 +886,7 @@ moderner Software-Entwicklung.
|
|||||||
|
|
||||||
Die Transformation der 3D-Drucker-Verwaltung von analog zu digital, von
|
Die Transformation der 3D-Drucker-Verwaltung von analog zu digital, von
|
||||||
chaotisch zu strukturiert, von manuell zu automatisiert ist vollbracht.
|
chaotisch zu strukturiert, von manuell zu automatisiert ist vollbracht.
|
||||||
Was als technische Herausforderung begann, endete als Erfolgsgeschichte
|
Was als technische Herausforderung begann, endete als Erfolgsgeschichte – ein Beweis dafür, dass mit Kreativität, Durchhaltevermögen und einer
|
||||||
– 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.
|
||||||
|
|
||||||
|
101
backend/setup.sh
101
backend/setup.sh
@ -1206,86 +1206,33 @@ EOF
|
|||||||
debug "Raspberry Pi Optimierungen zur sysctl-Konfiguration hinzugefügt"
|
debug "Raspberry Pi Optimierungen zur sysctl-Konfiguration hinzugefügt"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Sysctl-Einstellungen vorsichtig anwenden (non-blocking)
|
# OPTIONAL: Sysctl-Einstellungen anwenden (kann übersprungen werden)
|
||||||
progress "Wende sysctl-Einstellungen an (non-blocking)..."
|
progress "OPTIONAL: Versuche sysctl-Einstellungen anzuwenden..."
|
||||||
|
|
||||||
# Teste unsere spezielle sysctl-Datei zuerst (mit mehreren Fallbacks)
|
# Umgebungsvariable zum Überspringen
|
||||||
if [ -f "$myp_sysctl_file" ]; then
|
if [ "${SKIP_SYSCTL:-0}" = "1" ]; then
|
||||||
local sysctl_success=false
|
warning "⚠️ SKIP_SYSCTL gesetzt - überspringe sysctl komplett"
|
||||||
|
info " → Einstellungen werden beim nächsten Neustart aktiv"
|
||||||
# Strategie 1: Komplette Datei mit Timeout anwenden
|
return
|
||||||
progress "Versuche komplette sysctl-Datei anzuwenden..."
|
|
||||||
if timeout 10 sysctl -p "$myp_sysctl_file" >/dev/null 2>&1; then
|
|
||||||
success "✅ MYP sysctl-Einstellungen erfolgreich angewendet"
|
|
||||||
sysctl_success=true
|
|
||||||
else
|
|
||||||
warning "⚠️ Komplette sysctl-Datei fehlgeschlagen"
|
|
||||||
debug "sysctl -p $myp_sysctl_file Fehlerausgabe: $(timeout 5 sysctl -p "$myp_sysctl_file" 2>&1 || echo 'Timeout oder Fehler')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Strategie 2: Nur IPv6-Deaktivierung (kritisch)
|
|
||||||
if [ "$sysctl_success" = false ]; then
|
|
||||||
progress "Versuche nur IPv6-Deaktivierung..."
|
|
||||||
local ipv6_settings=(
|
|
||||||
"net.ipv6.conf.all.disable_ipv6=1"
|
|
||||||
"net.ipv6.conf.default.disable_ipv6=1"
|
|
||||||
)
|
|
||||||
|
|
||||||
local ipv6_applied=0
|
|
||||||
for setting in "${ipv6_settings[@]}"; do
|
|
||||||
if timeout 3 sysctl -w "$setting" >/dev/null 2>&1; then
|
|
||||||
((ipv6_applied++))
|
|
||||||
debug "IPv6-Setting angewendet: $setting"
|
|
||||||
else
|
|
||||||
debug "IPv6-Setting fehlgeschlagen: $setting"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $ipv6_applied -gt 0 ]; then
|
|
||||||
success "✅ IPv6-Deaktivierung teilweise erfolgreich ($ipv6_applied/2)"
|
|
||||||
sysctl_success=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Strategie 3: Sicherheits-Grundeinstellungen
|
|
||||||
if [ "$sysctl_success" = false ]; then
|
|
||||||
progress "Versuche Basis-Sicherheitseinstellungen..."
|
|
||||||
local security_settings=(
|
|
||||||
"net.ipv4.ip_forward=0"
|
|
||||||
"net.ipv4.tcp_syncookies=1"
|
|
||||||
)
|
|
||||||
|
|
||||||
local security_applied=0
|
|
||||||
for setting in "${security_settings[@]}"; do
|
|
||||||
if timeout 3 sysctl -w "$setting" >/dev/null 2>&1; then
|
|
||||||
((security_applied++))
|
|
||||||
debug "Sicherheits-Setting angewendet: $setting"
|
|
||||||
else
|
|
||||||
debug "Sicherheits-Setting fehlgeschlagen: $setting"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $security_applied -gt 0 ]; then
|
|
||||||
success "✅ Basis-Sicherheitseinstellungen angewendet ($security_applied/2)"
|
|
||||||
sysctl_success=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Strategie 4: Vollständig überspringen (Graceful Degradation)
|
|
||||||
if [ "$sysctl_success" = false ]; then
|
|
||||||
warning "⚠️ Alle sysctl-Anwendungen fehlgeschlagen"
|
|
||||||
warning "⚠️ Einstellungen werden beim nächsten Neustart automatisch aktiv"
|
|
||||||
info " 📁 Konfiguration verfügbar in: $myp_sysctl_file"
|
|
||||||
info " 🔧 Manuelle Anwendung: sudo sysctl -p $myp_sysctl_file"
|
|
||||||
debug "Sysctl komplett übersprungen - System läuft mit Standard-Einstellungen"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
warning "⚠️ MYP sysctl-Konfigurationsdatei nicht gefunden"
|
|
||||||
debug "Überspringe sysctl-Anwendung komplett"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Niemals das System-weite sysctl -p ausführen (zu problematisch)
|
# Sehr kurzer Test mit sofortigem Fallback
|
||||||
debug "Überspringe system-weites sysctl -p (zu riskant)"
|
if [ -f "$myp_sysctl_file" ]; then
|
||||||
|
# Nur 5 Sekunden für sysctl versuchen
|
||||||
|
if timeout 5 sysctl -p "$myp_sysctl_file" >/dev/null 2>&1; then
|
||||||
|
success "✅ MYP sysctl-Einstellungen angewendet"
|
||||||
|
else
|
||||||
|
warning "⚠️ Sysctl-Anwendung übersprungen (Timeout oder Fehler)"
|
||||||
|
info " → Konfiguration gespeichert in: $myp_sysctl_file"
|
||||||
|
info " → Wird beim nächsten Neustart automatisch aktiv"
|
||||||
|
debug "Sysctl nach 5s abgebrochen - keine Blockierung"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
debug "Sysctl-Datei nicht gefunden - überspringe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sofort weitermachen - keine weiteren Versuche
|
||||||
|
debug "Sysctl-Phase abgeschlossen - fahre mit Installation fort"
|
||||||
|
|
||||||
# IPv6 in Netzwerk-Interfaces deaktivieren (robust)
|
# IPv6 in Netzwerk-Interfaces deaktivieren (robust)
|
||||||
progress "Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)..."
|
progress "Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)..."
|
||||||
|
Loading…
x
Reference in New Issue
Block a user