prepare_logfiles.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import re
  2. from config import DSN
  3. from model import StatusMeldung
  4. from logfiles.systeminfo_log import SysteminfoLog
  5. import json
  6. import os
  7. from sqlalchemy import create_engine, select
  8. from sqlalchemy.orm import Session
  9. class PrepareLogfiles:
  10. def prepare_logfiles(self):
  11. with Session(create_engine(DSN)) as db_session:
  12. query = select(StatusMeldung).where(StatusMeldung.fehlerbericht.is_(None))
  13. for sm in db_session.scalars(query):
  14. self.convert_logfile(sm)
  15. db_session.commit()
  16. def convert_logfile(self, sm: StatusMeldung):
  17. whitelist_str = sm.kunde_ref.whitelist if sm.kunde_ref is not None else ""
  18. whitelist = self.get_whitelist(whitelist_str)
  19. fehlerbericht = dict(
  20. [(f["Name"], f) for f in json.loads(sm.fehlerbericht_import)]
  21. )
  22. for name, report in fehlerbericht.items():
  23. if ".bat" in name:
  24. e = report["Errors"][0]
  25. e = e.replace(
  26. "!! Bitte E-Mailadresse fuer Statusbericht angeben !!",
  27. "! Bitte E-Mailadresse fuer Statusbericht angeben !",
  28. )
  29. e = e.replace(
  30. "!! SMTP-Konfiguration bitte anpassen !!",
  31. "! SMTP-Konfiguration bitte anpassen !",
  32. )
  33. e, err_count = re.subn(r"(!![^\n]*!!)", r"<b>\1</b>", e)
  34. e, err_count2 = re.subn(
  35. r"\((\w{2}\d{4})\)( [^\r]*)",
  36. r"<b><a href='/wiki/\1' target='_blank'>(\1)</a>\2</b>",
  37. e,
  38. )
  39. e, _ = re.subn(
  40. r"Error \= \[Micro.* NULL.*\.",
  41. "",
  42. e,
  43. )
  44. err_count3 = 0
  45. e, err_count3 = re.subn(
  46. r"(Error \= \[Micro[^\r]*)",
  47. r"<b>\1</b>",
  48. e,
  49. )
  50. if sum([err_count, err_count2, err_count3]) > 0:
  51. report["ErrorLevel"] = 2
  52. report["Errors"] = [e] + re.findall(r"<b>[^\n]*</b>", e)
  53. sm.anzahl += 1
  54. elif ".dtsx" in name:
  55. e = re.sub(r"\r\n", "\n", report["Errors"][0])
  56. e = re.sub(r"(\w*)ende\n", "§", e)
  57. e = re.sub(r"Copyright ", "§", e)
  58. loglevel_warn = [b for b in e.split("§") if "Status:" not in b]
  59. loglevel_error = [b for b in loglevel_warn if "Fehler:" in b]
  60. loglevel_combined = [
  61. "<b>" + b + "</b>" if "Fehler:" in b else b for b in loglevel_warn
  62. ]
  63. loglevel_combined[-1] = loglevel_combined[-1].replace(
  64. "DTSER_FAILURE", "<b>DTSER_FAILURE</b>"
  65. )
  66. if (
  67. len(loglevel_error) > 0
  68. or "DTSER_SUCCESS" not in loglevel_combined[-1]
  69. ):
  70. report["ErrorLevel"] = 2
  71. sm.anzahl += 1
  72. report["Errors"][0] = "\n".join(loglevel_combined)
  73. elif len(report["Errors"]) > 0 and report["Type"] in [
  74. "Portal",
  75. "Versand",
  76. ]:
  77. report["Errors2"] = [
  78. e for e in report["Errors"] if self.in_whitelist(e, whitelist)
  79. ]
  80. report["Errors"] = [
  81. e for e in report["Errors"] if e not in report["Errors2"]
  82. ]
  83. if len(report["Errors"]) == 0:
  84. report["ErrorLevel"] = 3
  85. sm.anzahl -= 1
  86. sm.fehlerbericht = json.dumps(list(fehlerbericht.values()), indent=2)
  87. # self.export_log_files(sm, fehlerbericht)
  88. # batch_log = [f for f in fehlerbericht if ".bat" in f["Name"]].pop(0)
  89. systeminfo_log = SysteminfoLog(
  90. fehlerbericht.get("system.info", {"Errors": [""]})
  91. )
  92. # if systeminfo_log.ip_address == "0.0.0.0":
  93. # print(sm.kunde)
  94. def in_whitelist(self, e, whitelist):
  95. return any(
  96. [
  97. e["Layer"] in whitelist["Layer"],
  98. e["Report"] in whitelist["Report"],
  99. e["User"] in whitelist["User"],
  100. ]
  101. )
  102. def export_log_files(self, status: StatusMeldung, fehlerbericht):
  103. kunde = status.kunde.replace(" ", "-").lower()
  104. path = f"fehlerbericht/temp/{status.datum}_{kunde}_{status.aufgabe}"
  105. os.makedirs(path, exist_ok=True)
  106. for file_name in os.listdir(path):
  107. file = path + file_name
  108. if os.path.isfile(file):
  109. os.remove(file)
  110. for name, f in fehlerbericht.items():
  111. if f["Type"] != "Workflow":
  112. continue
  113. f["Errors"][0] = f["Errors"][0].replace("\r\n", "\n")
  114. with open(f"{path}/{name}.log", "w", encoding="latin-1") as fwh:
  115. fwh.write(f["Errors"][0])
  116. def get_whitelist(self, whitelist2):
  117. whitelist = {"Layer": [], "Report": [], "User": []}
  118. if whitelist2 is not None and whitelist2 != "":
  119. whitelist.update(json.loads(whitelist2))
  120. return whitelist
  121. def main():
  122. mi = PrepareLogfiles()
  123. mi.prepare_logfiles()
  124. if __name__ == "__main__":
  125. main()
  126. # import cProfile
  127. # cProfile.run(
  128. # "main()",
  129. # "fehlerbericht/prepare_logfiles.prof",
  130. # )