📝 "Update IHK project documentation with Gitmoji emojis in setup.sh" 🌟

This commit is contained in:
Till Tomczak 2025-06-03 15:31:50 +02:00
parent f1094bb125
commit 6a858b0dd3
2 changed files with 96 additions and 187 deletions

View File

@ -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.

View File

@ -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)..."