def stop(self): super(MissionAgentCheckerManager, self).stop() target_id = self.mission.checkmission.target self.logger.debug("Mission[%s]: get target sud_id: %s", self.mission.title, target_id) checker_ip, port = checker_info.get_checker_ip(self.scene_id, target_id) self.logger.info( "[Stop Agent Mission] Mission[%s]: get checker ip: [%s] , port: [%s]", self.mission.title, checker_ip, port) if checker_ip is None or port is None or target_id is None: self.logger.error( "[Stop Agent Mission] Mission[%s]: get checker ip[%s] or port[%s] error", self.mission.title, checker_ip, port) record_status_information( self.mission, "Stop agent mission error, get checker ip or port is error". format(title=self.mission.title), constant.MissionStatus.STOP) else: data = { "checker_ip": checker_ip, "checker_port": port, "scene_id": self.scene_id, "id": self.mission.id } script_client = ScriptClient(self.logger, data) script_client.stop_agent_client() ConnectCache(self.cr_scene.id, self.mission.id).blank_cache()
def record_results_database(self, cr_scene, mission, cr_event_scene, logger): record_status_information( mission, "Agent check success", ) logger.info("Mission[%s]: Agent check success", mission.title) if mission: mission_score = mission.score check_mission = object_attr(mission, "checkmission") if check_mission is None: return False agent_mission_list = ["is_once", "is_polling", "scripts"] agent_mission_data = parameter_verification( check_mission, agent_mission_list) if agent_mission_data is {}: return False if cr_event_scene: record = scene_models.CrSceneEventUserAnswer.objects.filter( mission=mission.id) if not record.exists(): scene_models.CrSceneEventUserAnswer.objects.create( mission=mission, score=float(mission_score), cr_event=cr_event_scene.cr_event, ) else: if agent_mission_data.get("is_once"): return False else: if agent_mission_data.get("is_polling"): _score = float(record.first().score + float(mission_score)) record.update(score=_score) else: return False else: record = scene_models.CmsTestCheckRecord.objects.filter( mission=mission.id) if not record.exists(): scene_models.CmsTestCheckRecord.objects.create( mission=mission, score=float(mission_score), cr_scene=cr_scene if cr_scene else None, script=agent_mission_data.get("scripts"), target_ip=agent_mission_data.get("scripts")) else: if agent_mission_data.get("is_once"): return False else: if agent_mission_data.get("is_polling"): _score = float(record.first().score + float(mission_score)) record.update(score=_score) else: return False else: logger.error("[record_results_database]No mission")
def stop(self): # 更改Mission状态是停止 record_status_information(self.mission, "Has stopped check", constant.MissionStatus.STOP) delete_channel_delay({"id": self.mission.id}) if self.scene_id: ConnectCache(self.scene_id, self.mission.id).blank_cache() self.logger.info("Mission[%s]: Has stopped check", self.mission.title)
def _check_is_continue(self, mission, is_continue, mission_id, script): """ Determine if check functions continues :param is_continue: is continue :param mission_id: mission id :param script: script name :return: """ if mission: if is_continue: mission_status = inquire_mission_status(mission_id) if mission_status != MissionStatus.STOP and not self.message.get( "is_once"): self.logger.info("Mission[%s]: Check carry on", self.message.get("title")) params = mission.checkmission.params if object_attr( mission.checkmission, "params") else self.message.get("params") self.message = kwargs_process(self.message, params) self.message.update({ "first_check_time": mission.checkmission.interval if mission.checkmission.interval else 0, "is_once": mission.checkmission.is_once, "is_polling": mission.checkmission.is_polling }) start_checker(self.message, self.logger, False) else: record_status_information(mission, "Check over", constant.MissionStatus.STOP) self.logger.info("Mission[%s]: Check over", self.message.get("title")) else: record_status_information(mission, "Check over", constant.MissionStatus.STOP) self.logger.info("Mission[%s]: Check over", self.message.get("title")) else: self.logger.error("Mission[%s]: Mission id is None", self.message.get("title"))
def _run(self, script, script_client, **kwargs): self.logger.info( "Mission[%s] : The parameter check is completed, RPC check start", self.content.get("title")) if script.split(".")[-1] == "py": _ret = script_client.py_script_check(**kwargs) else: _ret = script_client.sh_script_check(**kwargs) self.logger.info("Mission[%s]: Check result: %s", self.content.get("title"), _ret) mission_connect_number = self.mission_connect_cache.set_frequency_cache( _ret.get("status")) # self.logger.info("Mission[%s] : Connect num is %s", self.content.get("title"), mission_connect_number) # set the cache based on the results if mission_connect_number <= MAX_BUMBER_ATTEMPTS: if _ret.get("status") == "down": if mission_connect_number % 9 == 0 or mission_connect_number == 1: self.logger.info( "Mission[%s] : RPC client failed, Reconnecting", self.content.get("title")) start_checker(self.content, self.logger, True) else: self.logger.info( "Mission[%s] : RPC client successful, Reconnecting", self.content.get("title")) mission = Mission.objects.filter( id=self.content.get("id")).first() mission_status = mission.mission_status if mission_status != MissionStatus.STOP: self.logger.debug( "Mission[%s]: Check completed, processing result", self.content.get("title")) _result = ResultProcess(self.content, _ret) _result.check_over(mission) else: record_status_information( self.content.get("id"), "Check has stopped connecting," "because the number of attempts to connect has reached the maximum", constant.MissionStatus.DOWN) self.logger.info( "Mission[%s]:Check has stopped connecting," "because the number of attempts to connect has reached the maximum", self.content.get("title"))
def start(self, no_delay=False): # 更改mission的状态 record_status_information(self.mission, "Start up mission check", constant.MissionStatus.ISPROCESS) # 参数处理 script_data = self._param_check() if script_data is None or script_data == {}: record_status_information(self.mission, "Parameter detection does not pass", constant.MissionStatus.ERROR) self.logger.error("Mission[%s]: Parameter detection does not pass", self.mission.title) else: # 发布任务 self.logger.info("Mission[%s]: Publish mission", self.mission.title) start_checker(script_data, self.logger, no_delay)
def run(self): self.logger.info("Mission[%s]: Start check process", self.content.get("title")) # 检测参数 message_parameter_list = [ "scene_id", "script", "id", "check_type", "first_check_time", "target_ip", "checker_ip", "is_polling", "title", "score", "is_once", "interval", "checker_port", "scene_name" ] parameter = parameter_verification(self.content, message_parameter_list) if not parameter: self.logger.error("Mission[%s]: Parameter Missing", self.content.get("title")) if self.content.get("id"): record_status_information(self.content.get("id"), "Parameter Missing", MissionStatus.ERROR) else: self.logger.error("No mission id") # 验证脚本是否存在 script = self.content.get('script') script_url = settings.BASE_DIR + "/media/scripts/mission/{mission_id}/{script}".format( mission_id=self.content.get("id"), script=script) self.logger.debug("Mission[%s]: script path: %s", self.content.get("title"), script_url) if not os.path.exists(script_url): self.logger.error("Mission[%s] script[%s]: script does not exist", self.content.get("title"), script) record_status_information(self.content.get("id"), "script does not exist", MissionStatus.ERROR) script_client = ScriptClient(self.logger, self.content, script_url) # 验证状态 mission_status = inquire_mission_status(self.content.get('id')) if mission_status == MissionStatus.ISPROCESS or mission_status == MissionStatus.DOWN: kwargs = self.content.get('kwargs', {}) self._run(script, script_client, **kwargs)
def create(self, request, *args, **kwargs): check_result = request.data scene_id = check_result.get("cr_event", None) mission_id = check_result.get("machine_id", None) result = check_result.get("result", None) if mission_id is None or scene_id is None or result is None: logger_critical.error( "Agent Missing parameter: mission[%s], scene_id[%s], result[%s]", mission_id, scene_id, result) return Response(status=status.HTTP_200_OK) else: logger = SceneLogFactory(scene_id, __name__) mission = mission_model.Mission.objects.filter( id=mission_id).first() if mission: logger.info("Mission[%s]: Agent check OK", mission.title) logger.debug("Mission[%s]: Check result [%s]", mission.title, result) if mission.mission_status == constant.MissionStatus.STOP: record_status_information( mission, "mission is stop", ) logger.error("Mission[%s]: mission is stop", mission.title) return Response(status=status.HTTP_200_OK) else: try: result = ast.literal_eval(result) self.write_log_table(result, scene_id, mission, logger) except Exception: self.write_log_table(result, scene_id, mission, logger) else: logger.error("[create]No mission, Id is %s", mission_id) return Response(status=status.HTTP_200_OK)
def _run(self, script, script_client, **kwargs): self.logger.info( "Mission[%s]: The parameter check is completed, Agent check start", self.content.get("title")) if script.split(".")[-1] == "py": is_run = script_client.agent_python_check(**kwargs) else: is_run = script_client.agent_shell_check(**kwargs) if is_run: self.mission_connect_cache.blank_cache( ) # cache set to 0 when the connection is successful record_status_information(self.content.get("id"), "Agent check is running", constant.MissionStatus.ISPROCESS) self.logger.info("Mission[%s]: Agent check is running", self.content.get("title")) else: mission_connect_number = self.mission_connect_cache.set_frequency_cache( ) # Connect failed,set cache if mission_connect_number <= MAX_BUMBER_ATTEMPTS: self.logger.info("Mission[%s]: Agent check unable to connect", self.content.get("title")) mission = Mission.objects.filter( id=self.content.get("id")).first() mission_status = mission.mission_status if mission_status != MissionStatus.STOP: async_exe(start_checker, (self.content, self.logger), delay=1) else: record_status_information( self.content.get("id"), "Agent has stopped connecting," " because the number of attempts to connect has reached the maximum", constant.MissionStatus.DOWN) self.logger.info( "Mission[%s]: Agent has stopped connecting," "because the number of attempts to connect has reached the maximum", self.content.get("title"))
def check_over(self, mission): """ check over do something, Write database,is polling :return: """ parameter_list = [ "scene_id", "script", "id", "check_type", "target_ip", "checker_ip", "is_polling", "title", "score", "is_once", "interval", "checker_port", "scene_name" ] self.message = parameter_verification(self.message_original, parameter_list) if not self.message: self.logger.error("Parameter Missing") # 有问题 record_status_information(self.message_original.get("id"), "Parameter Missing", MissionStatus.STOP) return script = self.message.get('script') mission_id = self.message.get("id") # 记录状态 self.logger.info("Mission[%s]: Check status %s, [%s]", self.message.get("title"), self.ret.get("status", None), self.ret.get("content")) # Write to the log database self.record_results(script) # Whether to continue and Write result database is_continue = self.polling_results(script) self._check_is_continue(mission, is_continue, mission_id, script)