status_client.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import csv
  2. import os
  3. import re
  4. import subprocess
  5. import zipfile
  6. from datetime import datetime
  7. from pathlib import Path
  8. import config
  9. from status_client.db_info import DatabaseInfo
  10. from status_client.ftp_client import FtpClient
  11. from status_client.path_info import PathInfo
  12. def run_command(cmd, logfile):
  13. with open(logfile, "wb") as stream:
  14. p = subprocess.Popen(cmd, stdout=stream, stderr=stream)
  15. p.wait()
  16. def task_scheduler(logfile, portal_dir):
  17. run_command("schtasks /query /v /fo CSV", logfile)
  18. logfile_filter = lambda line: portal_dir.lower() in line.lower() # noqa: E731
  19. filter_logfile(logfile, logfile_filter)
  20. def filter_logfile(logfile, logfile_filter):
  21. logfile_temp = logfile + ".temp"
  22. Path(logfile_temp).unlink(missing_ok=True)
  23. Path(logfile).rename(logfile_temp)
  24. with open(logfile_temp, "r", encoding="cp850") as frh:
  25. with open(logfile, "w", encoding="latin-1", newline="") as fwh:
  26. fwh.write(frh.readline()) # header
  27. fwh.writelines(line for line in frh.readlines() if logfile_filter(line))
  28. # os.remove(logfile_temp)
  29. def task_manager(logfile):
  30. run_command("tasklist /fo CSV", logfile)
  31. logfile_filter = lambda line: not re.search(r"chrome|msedge|svchost|conhost", line, re.IGNORECASE) # noqa: E731
  32. filter_logfile(logfile, logfile_filter)
  33. def shared_files(logfile):
  34. run_command("openfiles /Query /fo CSV", logfile)
  35. def model_datasources(cfg, model_file: Path, logfile):
  36. cmd = (
  37. f'"{cfg.cognos7.program_dir}\\runmac32.exe" "{cfg.tools_dir}\\VBS\\list-datasources-c11.mac" '
  38. + f'"{model_file.parent}","{model_file.name}","{logfile}"'
  39. )
  40. p = subprocess.Popen(cmd)
  41. p.wait()
  42. def datasources_all_models(cfg: config.Config):
  43. os.makedirs(cfg.tasks_dir + "\\config\\models", exist_ok=True)
  44. for model_file in Path(cfg.system_dir + "\\Models").glob("*.pyj"):
  45. model_datasources(cfg, model_file, cfg.tasks_dir + "\\config\\models\\" + model_file.name + ".log")
  46. def database_info(cfg: config.Config, csv_file):
  47. dbinfo = DatabaseInfo()
  48. result = []
  49. for db in dbinfo.databases():
  50. result.extend(dbinfo.table_size(db[0]))
  51. with open(csv_file, "w", encoding="latin-1", newline="") as fwh:
  52. wr = csv.writer(fwh, delimiter=";")
  53. wr.writerow(
  54. [
  55. "database_name",
  56. "schema_name",
  57. "table_name",
  58. "row_count",
  59. "total_space_kb",
  60. "last_changed",
  61. ]
  62. )
  63. for row in result:
  64. wr.writerow(row)
  65. return result
  66. def zip_to_file(base_dir, zip_file):
  67. filter = [
  68. "Tasks/config/*",
  69. "Tasks/config/info/*",
  70. "Tasks/config/models/*",
  71. "Tasks/logs/*",
  72. "Tasks/*.ini",
  73. "Tasks/*.bat",
  74. ]
  75. with zipfile.ZipFile(zip_file, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zip:
  76. for f in filter:
  77. for e in Path(base_dir).glob(f):
  78. if e.is_file() and ".zip" not in e.name:
  79. zip.write(e, e.relative_to(base_dir))
  80. def system_check():
  81. cfg = config.Config()
  82. # Aufgabenplanung aktueller Stand
  83. task_scheduler(cfg.log_dir + "\\schtasks.csv.log", cfg.portal_dir)
  84. # Laufende Prozesse
  85. task_manager(cfg.log_dir + "\\tasklist.csv.log")
  86. # aktuelle Freigabe-Sessions
  87. # shared_files(cfg.log_dir + "\\openfiles.csv.log")
  88. # Tabellengrößen
  89. database_info(cfg, cfg.log_dir + "\\db_info.csv.log")
  90. # datasources_all_models(cfg)
  91. # Liste aller Dateien im GAPS-Verzeichnis
  92. # filename;size;cdate;mdate
  93. ti = PathInfo()
  94. ti.check_dir(cfg.portal_dir)
  95. ti.write_logfile(cfg.log_dir + "\\path_info.csv.log")
  96. # Logdateien aus Tasks/logs und System/prot
  97. timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S")
  98. zip_file = f"{cfg.tasks_dir}\\logs\\zip\\{cfg.kunde_safe}_{timestamp}.zip"
  99. os.makedirs(Path(zip_file).parent, exist_ok=True)
  100. zip_to_file(cfg.portal_dir, zip_file)
  101. # Upload auf FTP
  102. FtpClient().upload(zip_file)
  103. if __name__ == "__main__":
  104. system_check()