inspect_files.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. # from itertools import chain
  2. import json
  3. from pathlib import Path
  4. import pandas as pd
  5. from bs4 import BeautifulSoup
  6. from collections import defaultdict
  7. import re
  8. import sys
  9. sys.path.append(sys.path[0] + '\\..')
  10. from tools.config.config import Config
  11. def get_path_info(base_dir):
  12. path_info_df = pd.read_csv(base_dir + '/logs/status/path_info.csv', sep=';',
  13. encoding='latin-1', converters={'process': str})
  14. path_info_df.rename(columns={'name': 'filename'}, inplace=True)
  15. path_info_df['filename'] = path_info_df['filename'].str.lower()
  16. path_info_df.set_index('filename', inplace=True, drop=False)
  17. return path_info_df.to_dict(orient='index')
  18. def get_cubes(base_dir, cfg: Config, path_info, cubes_models):
  19. ver_files = [k for k in path_info.keys() if re.search(r'\\cubes\\.*\.ver', k)]
  20. cubes = {}
  21. for file in ver_files:
  22. match = re.search(r'\\cubes\\(.*)__\d+\.ver$', file)
  23. cube_name = match[1]
  24. cube_subdir = f"{file[:-4]}\\{cube_name}.mdc"
  25. cube_out = f"{cfg.system_dir}\\cube_out\\{cube_name}.mdc"
  26. cubes[cube_name] = {
  27. 'deployed_mdc': path_info[cube_subdir],
  28. 'cube_out_mdc': path_info[cube_out],
  29. 'model': cubes_models[cube_name],
  30. 'errors': []
  31. }
  32. return cubes
  33. def get_models(base_dir, cfg: Config, path_info, fm_sources):
  34. models = {}
  35. for file in Path(base_dir + '\\config\\models').glob('*.log'):
  36. with open(file, 'r') as frh:
  37. model_infos = frh.read().lower().replace('"', '').replace(',', '').split('--')
  38. datasources = model_infos[1].split('\n')
  39. datasources = [d for d in datasources if d != '']
  40. fm_src = []
  41. fm_package = None
  42. if '[' in datasources[0]:
  43. fm_package = datasources.pop(0).upper()
  44. fm_src = datasources
  45. datasources = []
  46. for src in fm_src:
  47. if src in fm_sources:
  48. datasources.extend(fm_sources[src])
  49. datasources = sorted(set(datasources))
  50. cube = re.search(r'\\cube_out\\(.*)\.mdc', model_infos[0])[1]
  51. models[file.name[:-8].lower()] = {
  52. 'framework_manager': 'J' if fm_package else 'N',
  53. 'fm_package': fm_package,
  54. 'fm_sources': fm_src,
  55. 'datasources': datasources,
  56. 'cube': cube,
  57. 'logfile_tasks': path_info.get(cfg.portal_dir + '\\tasks\\logs\\' + file.name[:-8] + '.log', {'mtime': '0'}),
  58. 'logfile_system': path_info.get(cfg.system_dir + '\\logs\\' + file.name[:-8] + '.log', {'mtime': '0'}),
  59. 'model_file': path_info.get(cfg.system_dir + '\\models\\' + file.name[:-4], {'mtime': '0'}),
  60. 'model_file_filled': path_info.get(cfg.system_dir + '\\models\\gefuellt\\' + file.name[:-4], {'mtime': '0'}),
  61. }
  62. return models
  63. def get_database_info(base_dir, cfg: Config):
  64. db_info_df = pd.read_csv(base_dir + '/logs/status/db_info.csv', sep=';',
  65. encoding='latin-1')
  66. db_info_df = db_info_df[db_info_df['DatabaseName'] == 'GC']
  67. db_info_df['table'] = db_info_df['TableName'].str.lower()
  68. db_info_df.set_index('table', inplace=True)
  69. return db_info_df.to_dict(orient='index')
  70. def get_fm_sources(base_dir, cfg):
  71. bs = BeautifulSoup(open(base_dir + '\\config\\fm\\model.xml', 'r'), 'xml')
  72. sources = defaultdict(list)
  73. for item in bs.find_all('queryItem'):
  74. p = item.parent.parent.find('name').string
  75. if item.parent.parent.name == 'folder':
  76. p = item.parent.parent.parent.find('name').string
  77. parent = "[{0}].[{1}]".format(
  78. p,
  79. item.parent.find('name').string
  80. )
  81. src = ''
  82. exp = ''
  83. if item.expression:
  84. if item.expression.refobj:
  85. src = item.expression.refobj.string
  86. else:
  87. exp = item.expression.string
  88. elif item.externalName:
  89. exp = item.externalName.string
  90. sources[parent].append((item.find('name').string, src, exp))
  91. interface = {}
  92. for k, fields in sources.items():
  93. if '[Schnittstelle]' not in k:
  94. continue
  95. key = k.split('.')[-1][1:-1].lower()
  96. links = []
  97. for field in fields:
  98. links.append(follow_links(sources, field, ''))
  99. interface[key] = sorted(list(set([re.search(r'\.\[(.*)\]$', e)[1].lower() for e in links if '[Import]' in e])))
  100. return interface
  101. def follow_links(sources, field, value):
  102. if field[1] == '':
  103. if field[2] == field[0]:
  104. return value
  105. return field[2]
  106. match = re.search(r'(\[.*\]\.\[.*\])\.\[(.*)\]', field[1])
  107. key1 = match[1]
  108. val1 = match[2]
  109. if key1 in sources:
  110. for field2 in sources[key1]:
  111. if field2[0] != val1:
  112. continue
  113. return follow_links(sources, field2, key1)
  114. return key1
  115. def get_datasources(base_dir, cfg, path_info):
  116. all_datasources = set([re.search(r'\\iqd\\.*\\(.*)\.imr', k)[1]
  117. for k in path_info.keys()
  118. if re.search(r'\\iqd\\.*\\.*\.imr', k)])
  119. datasources = {}
  120. for ds in all_datasources:
  121. ds_search = f'\\{ds}.imr'
  122. imr_files = [k for k in path_info.keys()
  123. if re.search(r'\\iqd\\.*\.imr', k) and ds_search in k
  124. and 'austausch' not in k]
  125. if len(imr_files) == 0:
  126. imr_file = '0.imr'
  127. else:
  128. imr_file = imr_files.pop(0)
  129. datasources[ds] = {
  130. 'imr_file': path_info.get(imr_file, {'mtime': '0'}),
  131. 'iqd_file': path_info.get(imr_file[:-4] + '.iqd', {'mtime': '0'}),
  132. 'csv_file': path_info.get(cfg.system_dir + '\\export\\' + ds + '.csv', {'mtime': '0'}),
  133. 'csv_file_iqd_folder': path_info.get(imr_file[:-4] + '.csv', {'mtime': '0'}),
  134. 'duplicates': imr_files
  135. }
  136. return datasources
  137. def cubes_to_models(models):
  138. models_sort = sorted([(v.get('logfile_tasks')['mtime'],
  139. v.get('logfile_system')['mtime'],
  140. v.get('model_file_filled')['mtime'],
  141. v.get('model_file')['mtime'],
  142. k, v['cube']) for k, v in models.items()])
  143. result = {}
  144. for m in models_sort:
  145. result[m[5]] = m[4]
  146. return result
  147. def main():
  148. base_dir = 'status_server\\unzipped'
  149. cfg = Config(str(Path(base_dir + '\\gaps.ini').absolute()))
  150. # Dateiliste
  151. path_info = get_path_info(base_dir)
  152. # random_bat_file = [k for k in path_info.keys() if re.search(r'\\Tasks\\.*\.bat', k)][0]
  153. # portal_dir = re.search(r'(.*)\\Tasks\\.*\.bat', random_bat_file)[1]
  154. # print(path_info)
  155. # Liste aller Cubes
  156. result = {}
  157. # Modelle und Datenquellen
  158. result['fm_sources'] = get_fm_sources(base_dir, cfg)
  159. result['models'] = get_models(base_dir, cfg, path_info, result['fm_sources'])
  160. result['database'] = get_database_info(base_dir, cfg)
  161. result['datasources'] = get_datasources(base_dir, cfg, path_info)
  162. cubes_models = cubes_to_models(result['models'])
  163. result['cubes'] = get_cubes(base_dir, cfg, path_info, cubes_models)
  164. # Cubes aktuell?
  165. # Rest aktuell?
  166. json.dump(result, open('status_server/logs/export.json', 'w'), indent=2)
  167. if __name__ == '__main__':
  168. main()