예제 #1
0
    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()
예제 #2
0
    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")
예제 #3
0
    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"))
예제 #5
0
    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"))
예제 #6
0
    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)
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
    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"))
예제 #10
0
    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)