Brak opisu

modules_db.py 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. # IRIS Source Code
  2. # Copyright (C) 2021 - Airbus CyberSecurity (SAS)
  3. # ir@cyberactionlab.net
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU Lesser General Public
  7. # License as published by the Free Software Foundation; either
  8. # version 3 of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # Lesser General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Lesser General Public License
  16. # along with this program; if not, write to the Free Software Foundation,
  17. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. import base64
  19. import datetime
  20. from flask_login import current_user
  21. from app import db, app
  22. from app.models.models import IrisHook
  23. from app.models.models import IrisModule
  24. from app.models.models import IrisModuleHook
  25. from app.models.authorization import User
  26. log = app.logger
  27. def iris_module_exists(module_name):
  28. return IrisModule.query.filter(IrisModule.module_name == module_name).first() is not None
  29. def iris_module_name_from_id(module_id):
  30. data = IrisModule.query.filter(IrisModule.id == module_id).first()
  31. if data:
  32. return data.module_name
  33. return None
  34. def iris_module_add(module_name, module_human_name, module_description,
  35. module_version, interface_version, has_pipeline, pipeline_args, module_config, module_type):
  36. im = IrisModule()
  37. im.module_name = module_name
  38. im.module_human_name = module_human_name
  39. im.module_description = module_description
  40. im.module_version = module_version
  41. im.interface_version = interface_version
  42. im.date_added = datetime.datetime.utcnow()
  43. im.has_pipeline = has_pipeline
  44. im.pipeline_args = pipeline_args
  45. im.module_config = module_config
  46. im.added_by_id = current_user.id if current_user else User.query.first().id
  47. im.is_active = True
  48. im.module_type = module_type
  49. try:
  50. db.session.add(im)
  51. db.session.commit()
  52. except Exception:
  53. return None
  54. return im
  55. def is_mod_configured(mod_config):
  56. missing_params = []
  57. for config in mod_config:
  58. if config['mandatory'] and ("value" not in config or config["value"] == ""):
  59. missing_params.append(config['param_name'])
  60. return len(missing_params) == 0, missing_params
  61. def iris_module_save_parameter(mod_id, mod_config, parameter, value, section=None):
  62. data = IrisModule.query.filter(IrisModule.id == mod_id).first()
  63. if data is None:
  64. return False
  65. index = 0
  66. for config in mod_config:
  67. if config['param_name'] == parameter:
  68. if config['type'] == "bool":
  69. if isinstance(value, str):
  70. value = bool(value.lower() == "true")
  71. elif isinstance(value, bool):
  72. value = bool(value)
  73. else:
  74. value = False
  75. mod_config[index]["value"] = value
  76. data.module_config = mod_config
  77. db.session.commit()
  78. return True
  79. index += 1
  80. return False
  81. def iris_module_enable_by_id(module_id):
  82. data = IrisModule.query.filter(IrisModule.id == module_id).first()
  83. if data:
  84. data.is_active = True
  85. db.session.commit()
  86. return True
  87. return False
  88. def iris_module_disable_by_id(module_id):
  89. data = IrisModule.query.filter(IrisModule.id == module_id).first()
  90. if data:
  91. data.is_active = False
  92. db.session.commit()
  93. return True
  94. return False
  95. def iris_modules_list():
  96. data = IrisModule.query.with_entities(
  97. IrisModule.id, IrisModule.module_human_name, IrisModule.has_pipeline, IrisModule.module_version,
  98. IrisModule.interface_version, IrisModule.date_added, User.name, IrisModule.is_active, IrisModule.module_config
  99. ).join(User).all()
  100. ret = []
  101. for element in data:
  102. dict_element = element._asdict()
  103. mod_configured, _ = is_mod_configured(element.module_config)
  104. if not mod_configured:
  105. iris_module_disable_by_id(element.id)
  106. dict_element['configured'] = False
  107. else:
  108. dict_element['configured'] = True
  109. ret.append(dict_element)
  110. return ret
  111. def get_module_from_id(module_id):
  112. data = IrisModule.query.filter(IrisModule.id == module_id).first()
  113. return data
  114. def get_module_config_from_id(module_id):
  115. data = IrisModule.query.with_entities(
  116. IrisModule.module_config,
  117. IrisModule.module_human_name,
  118. IrisModule.module_name
  119. ).filter(
  120. IrisModule.id == module_id
  121. ).first()
  122. return data.module_config, data.module_human_name, data.module_name
  123. def get_module_config_from_name(module_name):
  124. data = IrisModule.query.with_entities(
  125. IrisModule.module_config,
  126. IrisModule.module_human_name
  127. ).filter(
  128. IrisModule.module_name == module_name
  129. ).first()
  130. return data
  131. def get_module_config_from_hname(module_name):
  132. data = IrisModule.query.with_entities(
  133. IrisModule.module_config
  134. ).filter(
  135. IrisModule.module_human_name == module_name
  136. ).first()
  137. if data:
  138. return data[0]
  139. else:
  140. return None
  141. def get_pipelines_args_from_name(module_name):
  142. data = IrisModule.query.with_entities(
  143. IrisModule.pipeline_args
  144. ).filter(
  145. IrisModule.module_name == module_name
  146. ).first()
  147. return data.pipeline_args
  148. def delete_module_from_id(module_id):
  149. IrisModuleHook.query.filter(
  150. IrisModuleHook.module_id == module_id
  151. ).delete()
  152. db.session.commit()
  153. IrisModule.query.filter(IrisModule.id == module_id).delete()
  154. db.session.commit()
  155. return True
  156. def modules_list_pipelines():
  157. return IrisModule.query.filter(
  158. IrisModule.has_pipeline == True,
  159. IrisModule.is_active == True
  160. ).with_entities(
  161. IrisModule.module_name,
  162. IrisModule.pipeline_args
  163. ).all()
  164. def module_list_hooks_view():
  165. return IrisModuleHook.query.with_entities(
  166. IrisModuleHook.id,
  167. IrisModule.module_name,
  168. IrisModule.is_active,
  169. IrisHook.hook_name,
  170. IrisHook.hook_description,
  171. IrisModuleHook.is_manual_hook
  172. ).join(
  173. IrisModuleHook.module
  174. ).join(
  175. IrisModuleHook.hook
  176. ).all()
  177. def module_list_available_hooks():
  178. return IrisHook.query.with_entities(
  179. IrisHook.id,
  180. IrisHook.hook_name,
  181. IrisHook.hook_description
  182. ).all()
  183. def parse_module_parameter(module_parameter):
  184. try:
  185. param = base64.b64decode(module_parameter).decode('utf-8')
  186. mod_id = param.split('##')[0]
  187. param_name = param.split('##')[1]
  188. except Exception as e:
  189. log.exception(e)
  190. return None, None, None, None
  191. mod_config, mod_name, mod_iname = get_module_config_from_id(mod_id)
  192. parameter = None
  193. for param in mod_config:
  194. if param_name == param['param_name']:
  195. parameter = param
  196. break
  197. if not parameter:
  198. return None, None, None, None
  199. return mod_config, mod_id, mod_name, mod_iname, parameter