From 31d1a3eaf6438ccd81e685e7633e7b19484adf3b Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Tue, 3 Jun 2025 23:04:37 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Update=20project=20documentation?= =?UTF-8?q?=20and=20conversion=20scripts=20to=20Markdown=20format,=20optim?= =?UTF-8?q?ize=20logs=20directory=20structure.=20=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IHK_Projektdokumentation_Final.docx | Bin ...K_Projektdokumentation_Final_Enhanced.docx | Bin 0 -> 56488 bytes .../convert_to_word.py | 0 .../convert_to_word_enhanced.py | 442 ++++++++++++++++++ backend/database/myp.db | Bin 135168 -> 135168 bytes backend/database/myp.db-shm | Bin 32768 -> 0 bytes backend/database/myp.db-wal | Bin 8272 -> 0 bytes backend/logs/analytics/analytics.log | 1 + backend/logs/auth/auth.log | 1 + backend/logs/backup/backup.log | 1 + backend/logs/dashboard/dashboard.log | 4 + backend/logs/database/database.log | 1 + .../database_cleanup/database_cleanup.log | 3 + .../email_notification/email_notification.log | 1 + .../logs/error_recovery/error_recovery.log | 4 + backend/logs/maintenance/maintenance.log | 2 + .../logs/multi_location/multi_location.log | 2 + backend/logs/permissions/permissions.log | 1 + .../logs/printer_monitor/printer_monitor.log | 10 + backend/logs/scheduler/scheduler.log | 31 ++ backend/logs/security/security.log | 1 + .../shutdown_manager/shutdown_manager.log | 1 + backend/logs/startup/startup.log | 9 + .../logs/system_control/system_control.log | 1 + backend/logs/windows_fixes/windows_fixes.log | 4 + 25 files changed, 520 insertions(+) rename IHK_Projektdokumentation/{ => Dokumentation_Final_Markdown}/IHK_Projektdokumentation_Final.docx (100%) create mode 100644 IHK_Projektdokumentation/Dokumentation_Final_Markdown/IHK_Projektdokumentation_Final_Enhanced.docx rename IHK_Projektdokumentation/{ => Dokumentation_Final_Markdown}/convert_to_word.py (100%) create mode 100644 IHK_Projektdokumentation/Dokumentation_Final_Markdown/convert_to_word_enhanced.py delete mode 100644 backend/database/myp.db-shm delete mode 100644 backend/database/myp.db-wal diff --git a/IHK_Projektdokumentation/IHK_Projektdokumentation_Final.docx b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/IHK_Projektdokumentation_Final.docx similarity index 100% rename from IHK_Projektdokumentation/IHK_Projektdokumentation_Final.docx rename to IHK_Projektdokumentation/Dokumentation_Final_Markdown/IHK_Projektdokumentation_Final.docx diff --git a/IHK_Projektdokumentation/Dokumentation_Final_Markdown/IHK_Projektdokumentation_Final_Enhanced.docx b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/IHK_Projektdokumentation_Final_Enhanced.docx new file mode 100644 index 0000000000000000000000000000000000000000..ed991c1daafe6af918c7f2463b5b7ac3a4c073ae GIT binary patch literal 56488 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 literal 0 HcmV?d00001 diff --git a/IHK_Projektdokumentation/convert_to_word.py b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/convert_to_word.py similarity index 100% rename from IHK_Projektdokumentation/convert_to_word.py rename to IHK_Projektdokumentation/Dokumentation_Final_Markdown/convert_to_word.py diff --git a/IHK_Projektdokumentation/Dokumentation_Final_Markdown/convert_to_word_enhanced.py b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/convert_to_word_enhanced.py new file mode 100644 index 00000000..d511753e --- /dev/null +++ b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/convert_to_word_enhanced.py @@ -0,0 +1,442 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Erweiterte Konvertierung der IHK-Projektdokumentation von Markdown nach Word (DOCX) +mit vollständiger IHK-konformer Formatierung. +""" + +import os +import re +from docx import Document +from docx.shared import Pt, Inches, RGBColor, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING +from docx.enum.style import WD_STYLE_TYPE +from docx.enum.section import WD_SECTION +from docx.oxml import OxmlElement +from docx.oxml.ns import qn + +def create_element(name): + """Hilfsfunktion zum Erstellen von XML-Elementen""" + return OxmlElement(name) + +def create_attribute(element, name, value): + """Hilfsfunktion zum Setzen von XML-Attributen""" + element.set(qn(name), value) + +def add_page_numbers(doc): + """Fügt Seitenzahlen in die Fußzeile ein""" + for section in doc.sections: + footer = section.footer + footer_para = footer.paragraphs[0] + footer_para.alignment = WD_ALIGN_PARAGRAPH.CENTER + + # Füge Seitenzahl hinzu + fldChar1 = create_element('w:fldChar') + create_attribute(fldChar1, 'w:fldCharType', 'begin') + + instrText = create_element('w:instrText') + instrText.text = " PAGE " + + fldChar2 = create_element('w:fldChar') + create_attribute(fldChar2, 'w:fldCharType', 'end') + + footer_para._p.append(fldChar1) + footer_para._p.append(instrText) + footer_para._p.append(fldChar2) + +def add_header(doc): + """Fügt Kopfzeile mit Projektinformationen hinzu""" + for section in doc.sections[1:]: # Skip erste Seite (Titelseite) + header = section.header + header_para = header.paragraphs[0] + header_para.text = "IHK-Projektdokumentation - MYP – Manage Your Printer" + header_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT + header_para.style.font.size = Pt(10) + header_para.style.font.italic = True + +def create_ihk_styles(doc): + """Erstellt erweiterte IHK-konforme Formatvorlagen""" + + # Normaler Text mit IHK-Spezifikationen + normal_style = doc.styles['Normal'] + normal_style.font.name = 'Arial' + normal_style.font.size = Pt(11) + normal_style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE + normal_style.paragraph_format.space_after = Pt(6) + normal_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY + normal_style.paragraph_format.first_line_indent = Cm(0.5) # Einzug erste Zeile + + # Überschrift 1 - Hauptkapitel + h1_style = doc.styles['Heading 1'] + h1_style.font.name = 'Arial' + h1_style.font.size = Pt(16) + h1_style.font.bold = True + h1_style.font.color.rgb = RGBColor(0, 0, 0) + h1_style.paragraph_format.space_before = Pt(24) + h1_style.paragraph_format.space_after = Pt(12) + h1_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT + h1_style.paragraph_format.keep_with_next = True + h1_style.paragraph_format.page_break_before = False # Kein automatischer Seitenumbruch + + # Überschrift 2 - Unterkapitel + h2_style = doc.styles['Heading 2'] + h2_style.font.name = 'Arial' + h2_style.font.size = Pt(14) + h2_style.font.bold = True + h2_style.font.color.rgb = RGBColor(0, 0, 0) + h2_style.paragraph_format.space_before = Pt(18) + h2_style.paragraph_format.space_after = Pt(6) + h2_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT + h2_style.paragraph_format.keep_with_next = True + + # Überschrift 3 - Abschnitte + h3_style = doc.styles['Heading 3'] + h3_style.font.name = 'Arial' + h3_style.font.size = Pt(12) + h3_style.font.bold = True + h3_style.font.color.rgb = RGBColor(0, 0, 0) + h3_style.paragraph_format.space_before = Pt(12) + h3_style.paragraph_format.space_after = Pt(6) + h3_style.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT + h3_style.paragraph_format.keep_with_next = True + + # Aufzählungsstil + bullet_style = doc.styles['List Bullet'] + bullet_style.font.name = 'Arial' + bullet_style.font.size = Pt(11) + bullet_style.paragraph_format.left_indent = Cm(1.0) + bullet_style.paragraph_format.first_line_indent = Cm(-0.5) + bullet_style.paragraph_format.space_after = Pt(3) + + # Code-Style für technische Begriffe + try: + code_style = doc.styles.add_style('Code', WD_STYLE_TYPE.CHARACTER) + except: + code_style = doc.styles['Code'] + code_style.font.name = 'Courier New' + code_style.font.size = Pt(10) + code_style.font.color.rgb = RGBColor(0, 0, 139) # Dunkelblau + + # Zitat-Style + try: + quote_style = doc.styles.add_style('Quote', WD_STYLE_TYPE.PARAGRAPH) + except: + quote_style = doc.styles['Quote'] + quote_style.font.name = 'Arial' + quote_style.font.size = Pt(10) + quote_style.font.italic = True + quote_style.paragraph_format.left_indent = Cm(1.0) + quote_style.paragraph_format.right_indent = Cm(1.0) + quote_style.paragraph_format.space_before = Pt(6) + quote_style.paragraph_format.space_after = Pt(6) + + return doc + +def setup_document_layout(doc): + """Richtet das erweiterte Dokumentlayout nach IHK-Vorgaben ein""" + for section in doc.sections: + # IHK-Standard Seitenränder + section.top_margin = Cm(2.5) + section.bottom_margin = Cm(2.0) + section.left_margin = Cm(2.5) + section.right_margin = Cm(2.0) + + # A4 Format + section.page_height = Cm(29.7) + section.page_width = Cm(21.0) + + # Kopf- und Fußzeilenabstand + section.header_distance = Cm(1.25) + section.footer_distance = Cm(1.25) + +def add_enhanced_title_page(doc): + """Fügt eine erweiterte IHK-konforme Titelseite hinzu""" + + # Logo-Platzhalter + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.RIGHT + p.add_run('[Mercedes-Benz Logo]').italic = True + + # Leerzeilen + for _ in range(3): + doc.add_paragraph() + + # Prüfungsinformationen + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = p.add_run('Abschlussprüfung Sommer 2025') + run.font.size = Pt(14) + run.font.bold = True + + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = p.add_run('Industrie- und Handelskammer Berlin') + run.font.size = Pt(12) + + doc.add_paragraph() + + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = p.add_run('Fachinformatiker für digitale Vernetzung') + run.font.size = Pt(16) + run.font.bold = True + + for _ in range(2): + doc.add_paragraph() + + # Dokumenttyp + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = p.add_run('Dokumentation der betrieblichen Projektarbeit') + run.font.size = Pt(14) + + for _ in range(2): + doc.add_paragraph() + + # Projekttitel + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = p.add_run('MYP – Manage Your Printer') + run.font.size = Pt(20) + run.font.bold = True + + doc.add_paragraph() + + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + p.add_run('Digitalisierung des 3D-Drucker-Reservierungsprozesses\n') + p.add_run('durch Etablierung der cyberphysischen Kommunikation\n') + p.add_run('mit relevanten Hardwarekomponenten') + + # Füllung + for _ in range(6): + doc.add_paragraph() + + # Informationsblock am Seitenende + table = doc.add_table(rows=2, cols=2) + table.alignment = WD_ALIGN_PARAGRAPH.CENTER + table.style = 'Table Grid' + + # Ausbildungsbetrieb + cell = table.cell(0, 0) + p = cell.paragraphs[0] + p.add_run('Ausbildungsbetrieb:').bold = True + cell.add_paragraph('Mercedes-Benz AG') + cell.add_paragraph('Daimlerstraße 143') + cell.add_paragraph('12277 Berlin') + + # Prüfungsbewerber + cell = table.cell(0, 1) + p = cell.paragraphs[0] + p.add_run('Prüfungsbewerber:').bold = True + cell.add_paragraph('Till Tomczak') + cell.add_paragraph('Hainbuchenstraße 19') + cell.add_paragraph('16761 Hennigsdorf') + + # Abgabedatum + cell = table.cell(1, 0) + p = cell.paragraphs[0] + p.add_run('Abgabedatum:').bold = True + cell.add_paragraph('5. Juni 2025') + + # Prüflingsnummer + cell = table.cell(1, 1) + p = cell.paragraphs[0] + p.add_run('Prüflingsnummer:').bold = True + cell.add_paragraph('[Wird von IHK vergeben]') + + # Seitenumbruch + doc.add_page_break() + +def process_enhanced_content(content): + """Erweiterte Verarbeitung des Markdown-Inhalts""" + # Entferne den Header-Bereich + content = re.sub(r'^.*?(?=# 1\. Einleitung)', '', content, flags=re.DOTALL) + + # Verbessere Formatierung + content = re.sub(r'–', '–', content) # Korrekter Gedankenstrich + content = re.sub(r'\.\.\.', '…', content) # Auslassungspunkte + content = re.sub(r'"([^"]*)"', '„\\1"', content) # Deutsche Anführungszeichen + + return content + +def add_enhanced_content(doc, content): + """Fügt Inhalt mit erweiterter Formatierung hinzu""" + lines = content.split('\n') + current_paragraph = None + in_list = False + + for i, line in enumerate(lines): + # Überschriften + if line.startswith('# '): + heading = line[2:].strip() + doc.add_heading(heading, level=1) + current_paragraph = None + in_list = False + + elif line.startswith('## '): + heading = line[3:].strip() + doc.add_heading(heading, level=2) + current_paragraph = None + in_list = False + + elif line.startswith('### '): + heading = line[4:].strip() + doc.add_heading(heading, level=3) + current_paragraph = None + in_list = False + + elif line.startswith('#### '): + heading = line[5:].strip() + p = doc.add_paragraph() + p.add_run(heading + ':').bold = True + current_paragraph = None + in_list = False + + # Listen + elif line.strip().startswith('- '): + text = line.strip()[2:] + p = doc.add_paragraph(text, style='List Bullet') + in_list = True + current_paragraph = None + + # Normaler Text + elif line.strip(): + if not in_list: + if current_paragraph is None: + current_paragraph = doc.add_paragraph() + else: + current_paragraph.add_run(' ') + + process_enhanced_inline_formatting(current_paragraph, line.strip()) + else: + in_list = False + current_paragraph = doc.add_paragraph() + process_enhanced_inline_formatting(current_paragraph, line.strip()) + + # Leerzeile + else: + current_paragraph = None + if not in_list: + in_list = False + +def process_enhanced_inline_formatting(paragraph, text): + """Erweiterte Inline-Formatierung mit besserer Erkennung""" + # Komplexere Regex für verschachtelte Formatierungen + pattern = r'(\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`|„[^"]+"|‚[^\']+\')' + parts = re.split(pattern, text) + + for part in parts: + if not part: + continue + + if part.startswith('**') and part.endswith('**'): + # Fett + paragraph.add_run(part[2:-2]).bold = True + elif part.startswith('*') and part.endswith('*') and not part.startswith('**'): + # Kursiv + paragraph.add_run(part[1:-1]).italic = True + elif part.startswith('`') and part.endswith('`'): + # Code/Technische Begriffe + run = paragraph.add_run(part[1:-1]) + run.font.name = 'Courier New' + run.font.size = Pt(10) + run.font.color.rgb = RGBColor(0, 0, 139) + elif part.startswith('„') or part.startswith('"'): + # Zitate + run = paragraph.add_run(part) + run.italic = True + else: + # Normaler Text + paragraph.add_run(part) + +def add_appendix_placeholder(doc): + """Fügt Platzhalter für Anhänge hinzu""" + doc.add_page_break() + doc.add_heading('Anlagen', level=1) + + doc.add_heading('A. Netzwerkdiagramme und Systemarchitektur', level=2) + p = doc.add_paragraph('[Hier Netzwerkdiagramme einfügen]') + p.italic = True + + doc.add_heading('B. API-Dokumentation', level=2) + p = doc.add_paragraph('[Hier API-Dokumentation einfügen]') + p.italic = True + + doc.add_heading('C. Benutzerhandbuch', level=2) + p = doc.add_paragraph('[Hier Benutzerhandbuch einfügen]') + p.italic = True + + doc.add_heading('D. Testprotokolle', level=2) + p = doc.add_paragraph('[Hier Testprotokolle einfügen]') + p.italic = True + + doc.add_heading('E. Screenshots der Benutzeroberfläche', level=2) + p = doc.add_paragraph('[Hier Screenshots einfügen]') + p.italic = True + + doc.add_heading('F. Konfigurationsdateien und Deployment-Skripte', level=2) + p = doc.add_paragraph('[Hier relevante Konfigurationsdateien einfügen]') + p.italic = True + +def main(): + """Hauptfunktion""" + input_file = 'Dokumentation_Final_Markdown/Dokumentation.md' + output_file = 'IHK_Projektdokumentation_Final_Enhanced.docx' + + print("Lese Markdown-Datei...") + with open(input_file, 'r', encoding='utf-8') as f: + content = f.read() + + print("Erstelle Word-Dokument mit erweiterten IHK-Formatierungen...") + doc = Document() + + # Konfiguration + print("Konfiguriere Dokumentlayout und Styles...") + create_ihk_styles(doc) + setup_document_layout(doc) + + # Titelseite + print("Erstelle erweiterte Titelseite...") + add_enhanced_title_page(doc) + + # Kopf- und Fußzeilen + print("Füge Kopf- und Fußzeilen hinzu...") + add_header(doc) + add_page_numbers(doc) + + # Inhaltsverzeichnis + print("Füge Inhaltsverzeichnis-Platzhalter hinzu...") + doc.add_heading('Inhaltsverzeichnis', level=1) + p = doc.add_paragraph() + p.add_run('Bitte generieren Sie das Inhaltsverzeichnis über:\n') + p.add_run('Verweise → Inhaltsverzeichnis → Automatisches Verzeichnis 1\n\n') + p.add_run('Stellen Sie sicher, dass alle Überschriften korrekt als Überschrift 1-3 formatiert sind.') + p.italic = True + doc.add_page_break() + + # Hauptinhalt + print("Verarbeite und füge Hauptinhalt hinzu...") + processed_content = process_enhanced_content(content) + add_enhanced_content(doc, processed_content) + + # Anhänge + print("Füge Anhang-Platzhalter hinzu...") + add_appendix_placeholder(doc) + + # Speichern + print(f"Speichere Dokument als {output_file}...") + doc.save(output_file) + + print("\nKonvertierung erfolgreich abgeschlossen!") + print("\nWichtige Nachbearbeitungsschritte:") + print("1. Generieren Sie das Inhaltsverzeichnis (Verweise → Inhaltsverzeichnis)") + print("2. Überprüfen Sie alle Seitenumbrüche") + print("3. Fügen Sie fehlende Abbildungen und Diagramme ein") + print("4. Prüfen Sie die Seitennummerierung") + print("5. Ergänzen Sie die Anlagen mit den tatsächlichen Dokumenten") + print("6. Führen Sie eine finale Rechtschreibprüfung durch") + print("\nDie Datei entspricht nun den IHK-Formatvorgaben!") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/database/myp.db b/backend/database/myp.db index 8cef9eac9fd96a74f0ac97f4b17e2fcd502478fa..82bc53801c09fe10f7a937df10c3785809e84ce8 100644 GIT binary patch delta 102 zcmZozz|pXPV}dl}`-w8ntnV50+B7$&ut%XI`55?lXOw3eXO;%IWrtT;=;amp zMO0Lj7-#rdW@TnaC59N}q!_uIxurN2L>U!SPF|oN#Aj?}U}9xpsApnkZf0uIWU$PD G@c{tn9w9OS delta 102 zcmZozz|pXPV}dl}+leyHtZy0gk{LIquXli9@q-S7aXkc#GWU$PD G@c{sa?H`5! diff --git a/backend/database/myp.db-shm b/backend/database/myp.db-shm deleted file mode 100644 index dc2b43cbb2670f07701a26ac1cef3384a95e4d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)zX<{{6bIm(e=0#OuM(|J3%76y8>evsD|c`J!Nx`$#NN`%LSN*NYwhIte(*>L zAuss`NO@bPoNiQ+(zqYvEb6#XNa72Ow{0$uV1304|I3cwXycvH!ue}M%)hlhhGw;oK-tT?R%fgfT zLG9|FZ`NwB*Z4=BzBPUE=cg}Uy>sQGAHVzMUzn2M`*u9PG`oBK?_WRo=Kj4^8W3gE z_4`Jkybr5SovPhX6ySZq`QaOXuE38o(cmq3^8NTHeug9b_eJepQySw;=U;Nl#q%#G zemZy1{Oj!Zjph2%*n)Ja_Q&~u@S>BC?o8I@%a^4u0%OA_?6D0Z>MSsVx$N)P7Q0%z zrzySm%~egwQf7h;dzM;zvwV&E{Edl*tg6ztUyALv280E=Pag9p!=rO(OH5N{n&Z?` zRysZHw$@cTYdxj2zPdWAG{+sIPn1vF-Nog0cV_O|H5E}w-=KC%Ze3IP8lM=5H(d*#o)aFr8#z{E5Nx}!-b;3#4<+Gy4A}5FHmOZ?1WjvxUdS#eo)K(kwhH$$ zU5{cRJ>NA6p_YLw?{{MJR^b3`-U6Gd!R0 z<6|c5c$#BI_B`qnmRFy_7~OK<1;rZsq`Pvr-F=|k(H)Dn0ut#!4P+Z{ePlde*g zuC}Cgwa%h;Ux}t!;hIp{h##hkc~jgs_R$J30l#=j2AX58$e?!26$PlFl}P@kdNA2+ z$kWr(;b$TyfT_?;Y6=fzXfTN)0wRqF2po%y`=D?T?0c!ZfeRs`XYAXqVI@{u;^JV! zmU44#ZB=V`xVIi<6w!GQBB{Qb>Q_(38}ikw(&3zdL$G_q?^Ccv*J1hb1Og>b<+zBs zG}Is&O~c{A+z)hNWEn9WLM-ry$bqv0@->ke4Xr}LM=u_7i+Dck6MQbTSTKm**@k@S zlJwLKbIv{sNMEgk4MLBL5hZ`vbov|$2>3Kk##sfCLj%pF7UB#gTf+PkL9>nBZKv7403NHXrEM;kRtu3mB@&xMcIwuh;}RXG4M*d zLr?-Ku9bz#%xz*m0zGGo=)B4}VC$Wgd+VAqlR-gks_%`}<;5wfMjeanMYj;Bm0dB8 zi#Vpw#ae6}+LAEiuNRVJD>5uQjkL}og6vcp7Kg7D2$*9a9D%EE8!WBF=UN})l4P`+ zd^eMQTA^Y6KlCBT!j&hBeMv>mNDxqGD=q0Q;z1SB&*rVzgguv0loArcw(F$nGD?6O z)Qu`GVGrW`G}uRn8f6ed6~d=t6N%9W`%q8U8 zwfX%$=?nbu=(pc*Jeypv`T|v7AXmKcuu+jgt)xoi#+xlftG>XfW)VjkJii3XsxMIW1@x*ffXZq}qR_a? y#rUc(P!>Y+;W(`}P|S(%MukDY>I<+KpQ, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) 2025-06-03 22:16:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 13 nicht einschalten 2025-06-03 22:16:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 14: e2 +2025-06-03 23:03:59 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-03 23:04:01 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 7: test +2025-06-03 23:04:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:03 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 7 nicht einschalten +2025-06-03 23:04:03 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 8: test +2025-06-03 23:04:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:05 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 8 nicht einschalten +2025-06-03 23:04:05 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 1: test +2025-06-03 23:04:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:07 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 1 nicht einschalten +2025-06-03 23:04:07 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 2: test +2025-06-03 23:04:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:09 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 2 nicht einschalten +2025-06-03 23:04:09 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 3: test +2025-06-03 23:04:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:11 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 3 nicht einschalten +2025-06-03 23:04:11 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 4: test +2025-06-03 23:04:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:14 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 4 nicht einschalten +2025-06-03 23:04:14 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 5: test +2025-06-03 23:04:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:16 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 5 nicht einschalten +2025-06-03 23:04:16 - [scheduler] scheduler - [INFO] INFO - 🚀 Starte geplanten Job 6: test +2025-06-03 23:04:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.103: HTTPConnectionPool(host='192.168.0.103', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.103 timed out. (connect timeout=2)')) +2025-06-03 23:04:18 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Job 6 nicht einschalten +2025-06-03 23:04:18 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 9: zi +2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Fehler beim einschalten der Tapo-Steckdose 192.168.0.104: HTTPConnectionPool(host='192.168.0.104', port=80): Max retries exceeded with url: /app (Caused by ConnectTimeoutError(, 'Connection to 192.168.0.104 timed out. (connect timeout=2)')) +2025-06-03 23:04:20 - [scheduler] scheduler - [ERROR] ERROR - ❌ Konnte Steckdose für Sofort-Job 9 nicht einschalten +2025-06-03 23:04:20 - [scheduler] scheduler - [INFO] INFO - ⚡ Starte Sofort-Job 10: zi diff --git a/backend/logs/security/security.log b/backend/logs/security/security.log index 1456f81e..86ffd96c 100644 --- a/backend/logs/security/security.log +++ b/backend/logs/security/security.log @@ -127,3 +127,4 @@ 2025-06-03 22:00:23 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-03 22:15:16 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-03 22:15:51 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-03 23:04:00 - [security] security - [INFO] INFO - 🔒 Security System initialisiert diff --git a/backend/logs/shutdown_manager/shutdown_manager.log b/backend/logs/shutdown_manager/shutdown_manager.log index f38ab29c..0ac4acbe 100644 --- a/backend/logs/shutdown_manager/shutdown_manager.log +++ b/backend/logs/shutdown_manager/shutdown_manager.log @@ -221,3 +221,4 @@ 2025-06-03 22:00:23 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-03 22:15:16 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-03 22:15:51 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-03 23:04:00 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log index be42737e..1cf65217 100644 --- a/backend/logs/startup/startup.log +++ b/backend/logs/startup/startup.log @@ -1143,3 +1143,12 @@ 2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: /mnt 2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T22:15:51.607422 2025-06-03 22:15:51 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ================================================== +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-03T23:04:00.907327 +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-03 23:04:00 - [startup] startup - [INFO] INFO - ================================================== diff --git a/backend/logs/system_control/system_control.log b/backend/logs/system_control/system_control.log index 2368f6b7..42eeb8d1 100644 --- a/backend/logs/system_control/system_control.log +++ b/backend/logs/system_control/system_control.log @@ -10,3 +10,4 @@ 2025-06-03 22:00:23 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert 2025-06-03 22:15:16 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert 2025-06-03 22:15:51 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert +2025-06-03 23:04:01 - [system_control] system_control - [INFO] INFO - 🔧 System-Control-Manager initialisiert diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log index a47ae927..dce8517f 100644 --- a/backend/logs/windows_fixes/windows_fixes.log +++ b/backend/logs/windows_fixes/windows_fixes.log @@ -527,3 +527,7 @@ 2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) 2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet 2025-06-03 20:42:01 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-03 23:03:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet