LAS.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #!/usr/bin/env python3.9
  2. from threading import Thread
  3. import configparser
  4. import os
  5. import time
  6. import traceback
  7. import sys
  8. import json
  9. import common.sys_comm as sys_comm
  10. from common.sys_comm import (
  11. LOGDBG, LOGINFO, LOGWARN, LOGERR, EC,
  12. get_utc_time_ms
  13. )
  14. import mqtt.mqtt_process as mp
  15. from mqtt.mqtt_process import (
  16. MQTTClientThread, RobustMQTTClient, MQTTConsumerThread, g_mqtt_client, g_mqtt_consumer
  17. )
  18. import db.db_process as db_process
  19. from db.db_process import db_req_que
  20. from db.db_process import DBRequest_Async
  21. from db.db_process import (
  22. db_execute_sync, db_execute_async
  23. )
  24. import db.db_sqls as sqls
  25. import device.dev_mng as g_Dev
  26. from device.dev_mng import (
  27. Device, g_dev_mgr, init_dev_mng
  28. )
  29. import core.alarm_plan_manager as ap_mgr
  30. from core.alarm_plan_manager import (
  31. AlarmPlanManager,
  32. init_alarm_plan_mgr,
  33. start_alarm_plan_mgr,
  34. cb_handle_query_all_alarm_plan_info
  35. )
  36. from core.alarm_plan_dispatcher import (
  37. init_alarm_plan_disp,
  38. start_alarm_plan_dispatcher
  39. )
  40. import core.g_LAS as g_las
  41. # 系统初始化
  42. def sys_init():
  43. try:
  44. # 创建日志目录
  45. if not os.path.exists("./log/"):
  46. os.makedirs("./log/")
  47. print("create log dir succeed !")
  48. LOGDBG(f" ================ system init ...")
  49. print(f" ================ system init ...")
  50. # 读取配置文件
  51. config = configparser.ConfigParser()
  52. with open('./conf.ini', 'r', encoding='utf-8') as f:
  53. config.read_file(f)
  54. if not (config.has_option('conf', 'module_name') and
  55. config.has_option('conf', 'platform') and
  56. config.has_option('conf', 'db_host') and
  57. config.has_option('conf', 'log_lvl') and
  58. config.has_option('conf', 'max_log_files') and
  59. config.has_option('conf', 'max_log_files')):
  60. LOGDBG("sys_init failed, invalid conf.ini param")
  61. return 0
  62. if not (config.has_option('conf', 'db_host')):
  63. LOGDBG("sys_init failed, invalid db param")
  64. return 0
  65. if not (config.has_option('linux', 'host_ip') and
  66. config.has_option('windows', 'host_ip') and
  67. config.has_option('windows', 'server_ip') and
  68. config.has_option('windows', 'ssh_host') and
  69. config.has_option('windows', 'ssh_port')):
  70. LOGDBG("sys_init failed, invalid host_ip param")
  71. return 0
  72. LOGDBG("read conf.ini succeed !")
  73. # 初始化日志配置
  74. with sys_comm.g_log_conf_mtx:
  75. sys_comm.g_log_conf["module_name"] = str(config["conf"]["module_name"])
  76. sys_comm.g_log_conf["log_lvl"] = int(config["conf"]["log_lvl"])
  77. sys_comm.g_log_conf["max_log_size"] = int(config["conf"]["max_log_size"]) * 1024 * 1024
  78. sys_comm.g_log_conf["max_log_files"] = int(config["conf"]["max_log_files"])
  79. LOGDBG("log init succeed")
  80. # 初始化系统配置
  81. with sys_comm.g_sys_conf_mtx:
  82. sys_comm.g_sys_conf["module_name"] = str(config["conf"]["module_name"])
  83. sys_comm.g_sys_conf["platform"] = int(config["conf"]["platform"])
  84. sys_comm.g_sys_conf["db_host"] = str(config["conf"]["db_host"])
  85. sys_comm.g_sys_conf["log_lvl"] = int(config["conf"]["log_lvl"])
  86. sys_comm.g_sys_conf["max_log_size"] = int(config["conf"]["max_log_size"]) * 1024 * 1024
  87. sys_comm.g_sys_conf["max_log_files"] = int(config["conf"]["max_log_files"])
  88. # windows 本地
  89. if sys_comm.g_sys_conf["platform"] == 0:
  90. sys_comm.g_sys_conf["host_ip"] = str(config["windows"]["host_ip"])
  91. sys_comm.g_sys_conf["server_ip"] = str(config["windows"]["server_ip"])
  92. sys_comm.g_sys_conf["ssh_host"] = str(config["windows"]["ssh_host"])
  93. sys_comm.g_sys_conf["ssh_port"] = int(config["windows"]["ssh_port"])
  94. mp.MQTT_BROKER = sys_comm.g_sys_conf["server_ip"]
  95. # linux 服务器
  96. elif sys_comm.g_sys_conf["platform"] == 1:
  97. sys_comm.g_sys_conf["host_ip"] = str(config["linux"]["host_ip"])
  98. mp.MQTT_BROKER = sys_comm.g_sys_conf["host_ip"]
  99. sys_comm.g_sys_conf["sp_id"] = sys_comm.g_sys_conf["module_name"] + "_" + str(get_utc_time_ms())
  100. # 报警配置
  101. sys_comm.g_sys_conf["alarm_conf"] = sys_comm.alarm_conf
  102. # 启动成功,打印系统信息
  103. module_name = sys_comm.g_sys_conf["module_name"]
  104. platform = sys_comm.g_sys_conf["platform"]
  105. host_ip = sys_comm.g_sys_conf["host_ip"]
  106. max_log_files = sys_comm.g_sys_conf["max_log_files"]
  107. max_log_size = sys_comm.g_sys_conf["max_log_size"]
  108. log_lvl = sys_comm.g_sys_conf["log_lvl"]
  109. sp_id = sys_comm.g_sys_conf["sp_id"]
  110. print(f" ================ system init succeed !")
  111. print(f" ================ module : {module_name}")
  112. print(f" ================ platform : {platform}")
  113. print(f" ================ host_ip : {host_ip}")
  114. print(f" ================ max_log_files : {max_log_files}")
  115. print(f" ================ max_log_size : {max_log_size}")
  116. print(f" ================ log_lvl : {log_lvl}")
  117. print(f" ================ sp_id : {sp_id}")
  118. print(f" ================ version : v B1.0")
  119. LOGINFO(f" ================ system init succeed !")
  120. LOGINFO(f" ================ module : {module_name}")
  121. LOGINFO(f" ================ platform : {platform}")
  122. LOGINFO(f" ================ host_ip : {host_ip}")
  123. LOGINFO(f" ================ max_log_files : {max_log_files}")
  124. LOGINFO(f" ================ max_log_size : {max_log_size}")
  125. LOGINFO(f" ================ log_lvl : {log_lvl}")
  126. LOGINFO(f" ================ sp_id : {sp_id}")
  127. LOGINFO(f" ================ version : v B1.0")
  128. return 0
  129. except json.JSONDecodeError as e:
  130. tb_info = traceback.extract_tb(e.__traceback__)
  131. for frame in tb_info:
  132. LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error:{e}, {e.doc}")
  133. return EC.EC_FAILED
  134. except Exception as e:
  135. tb_info = traceback.extract_tb(e.__traceback__)
  136. for frame in tb_info:
  137. LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
  138. return EC.EC_FAILED
  139. # 轮循执行一些任务
  140. def run():
  141. # 轮循处理任务
  142. while True:
  143. time.sleep(1)
  144. def query_events_expire_range():
  145. event_save_range = 90
  146. try:
  147. result = db_execute_sync(sql=sqls.sql_event_save_range, timeout=15)
  148. if result and len(result) == 1:
  149. row = result[0]
  150. param_value = row.get("param_value")
  151. if param_value is not None: # 只要不是 None,就用数据库的值
  152. event_save_range = param_value
  153. else:
  154. LOGWARN("found invalid event_save_range, use default 90")
  155. return event_save_range
  156. except Exception as e:
  157. LOGERR(f"query event_save_range failed: {e}, use default 90")
  158. return EC.EC_FAILED
  159. # 创建事件过期计划
  160. def create_events_expire_plan():
  161. event_save_range = query_events_expire_range()
  162. if not event_save_range:
  163. return EC.EC_FAILED
  164. g_las.g_alarm_plan_mgr.create_clean_expire_events_task(event_save_range)
  165. return 0
  166. # 主线程
  167. def main_process():
  168. if not g_las.g_alarm_plan_mgr:
  169. LOGERR(f"error: g_alarm_plan_mgr not init")
  170. return EC.EC_FAILED
  171. if not g_las.g_alarm_plan_disp:
  172. LOGERR(f"error: g_alarm_plan_disp not init")
  173. return EC.EC_FAILED
  174. # 查询所有设备信息
  175. db_req_que.put(DBRequest_Async(sql=sqls.sql_query_all_dev_info,
  176. callback=g_Dev.g_dev_mgr.cb_handle_query_all_dev_info))
  177. # 查询所有告警计划
  178. db_req_que.put(DBRequest_Async(sql=sqls.sql_query_all_alarm_plan,
  179. callback=cb_handle_query_all_alarm_plan_info))
  180. # 创建任务:创建事件过期计划
  181. iRet = create_events_expire_plan()
  182. if iRet:
  183. LOGERR(f"create_events_expire_plan failed, process termination")
  184. return iRet
  185. # 轮循任务
  186. run()
  187. def main():
  188. # 初始化
  189. if (0 != sys_init()):
  190. sys.exit(EC.EC_FAILED)
  191. # 初始化 dev_mng
  192. init_dev_mng()
  193. g_Dev.g_dev_mgr.start()
  194. # 初始化LAS
  195. init_alarm_plan_mgr()
  196. init_alarm_plan_disp()
  197. start_alarm_plan_dispatcher() # 事件分发器
  198. start_alarm_plan_mgr() # 告警计划管理器
  199. # 数据库线程
  200. db_thread = db_process.create_db_process()
  201. db_thread.start()
  202. # MQTT 消息线程
  203. mp.g_mqtt_client = RobustMQTTClient()
  204. mp.g_mqtt_client.start()
  205. mp.g_mqtt_consumer = MQTTConsumerThread()
  206. mp.g_mqtt_consumer.start()
  207. LOGDBG(f" ================ LAS start success ...")
  208. # 主线程
  209. if not main_process():
  210. LOGERR(f"main_process error, process termination")
  211. sys.exit(EC.EC_FAILED)
  212. main()