예제 #1
0
    def _to_deliver(self, task: Task):
        """任务分类,分给各传输器"""
        try:
            succ: bool = False
            try:

                if not isinstance(task, Task):
                    self._logger.error("Invalid task to_deliver")
                    return

                if not isinstance(task._clientid, str) or task._clientid == "":
                    self._logger.error(
                        "Invalid clientid in task object while delivering task:\ntaskid:{}\nclientid:{}"
                        .format(task.taskid, task._clientid))
                    return

                # 拿一下ip
                tmpclients = StatusMantainer.get_clientstatus_id_sorted()
                targetclient: Client = tmpclients.get(task._clientid, None)
                if not isinstance(targetclient, Client):
                    self._logger.error(
                        "Unknown client for task deliver:\nclientid:{}\ntaskid:{}\ntasktype:{}"
                        .format(task._clientid, task.taskid,
                                task.tasktype.name))
                    return

                # 传输给client
                ##########
                # 逻辑为:
                # 1. 事先并不知道分配给哪个采集端。
                # 2. 从数据库读取一条子任务,task任务对象有其被分配到的采集端的clientid。
                # 3. 根据task的clientid,和StatusMantainer的clients对象,找到目标client的clientip
                # 4. 根据clientip和当前TaskDeliver中配置的ip->目录配置,将任务task对象发送到
                #    指定目录(走文件)
                # 5. 或根据配置若走直连传输,则通过clientid找到对应采集端的地址并发送。
                ##########

                if not self._config._ipdir.__contains__(
                        targetclient._statusbasic.ip):
                    self._logger.error(
                        "Client transfer folder not configured: clientip={}".
                        format(targetclient._statusbasic.ip))
                else:
                    targetdir = self._config._ipdir[
                        targetclient._statusbasic.ip]
                    succ = OutputManagement.output_to_file(task, targetdir)

            finally:
                with self._dbmanager.get_automic_locker(
                        EDBAutomic.ReduplicateTask):
                    self._update_to_db(task, targetclient, succ)
                    self._merge_task_status(task)

        except Exception:
            self._logger.error("to_deliver error: taskid:{} error:{}".format(
                task.taskid, traceback.format_exc()))
예제 #2
0
    def _to_deliver(self, task: IscoutTask):
        try:
            succ: bool = False
            targetclient = None
            try:
                if not isinstance(task, IscoutTask):
                    self._logger.error(
                        "Invalid iscouttask to_deliver: {}".format(
                            type(task).__name__))
                    return

                if not isinstance(task._clientid, str) or task._clientid == "":
                    self._logger.error(
                        "Invalid clientid in IScanTask object while delivering task:\niscouttaskid:{}\nclientid:{}"
                        .format(task.taskid, task._clientid))
                    return

                # 拿一下ip
                tmpclients = StatusMantainer.get_clientstatus_id_sorted()
                targetclient: Client = tmpclients.get(task._clientid, None)
                if not isinstance(targetclient, Client):
                    self._logger.error(
                        "Client may DOWN, periodic IScoutTask deliver failed:\niscouttaskid:{}\nclientid:{}"
                        .format(task.taskid, task._clientid))
                    return succ

                # 传输分配
                if not self._config._ipdir.__contains__(
                        targetclient._statusbasic.ip):
                    self._logger.error(
                        "Client transfer folder not configured: clientip={}".
                        format(targetclient._statusbasic.ip))
                else:
                    targetdir = self._config._ipdir[
                        targetclient._statusbasic.ip]
                    succ = OutputManagement.output_to_file(task, targetdir)

            finally:
                with self._dbmanager.get_automic_locker(
                        EDBAutomic.ReduplicateIScoutTask):
                    self._update_to_db(task, targetclient, succ)
                    self._merge_task_status(task)

        except Exception as ex:
            self._logger.error(
                "Deliver IscanTask err:\niscouttaskid:{}\nerr:{}".format(
                    task.taskid, ex))
예제 #3
0
    def _to_deliver(self, cmd: IdownCmd):
        try:
            succ: bool = False
            try:
                if not isinstance(cmd, IdownCmd):
                    self._logger.error("Invalid cmd to_deliver: {}".format(
                        type(cmd).__name__))
                    return

                if not isinstance(cmd._clientid, str) or cmd._clientid == "":
                    self._logger.error(
                        "Invalid clientid in cmd object while delivering task:\ncmdid:{}\nclientid:{}"
                        .format(cmd.cmd_id, cmd._clientid))
                    return

                # 拿一下ip
                tmpclients = StatusMantainer.get_clientstatus_id_sorted()
                targetclient: Client = tmpclients.get(cmd._clientid, None)
                if not isinstance(targetclient, Client):
                    self._logger.error(
                        "Unknown client for cmd deliver:\ncmdid:{}\nclientid:{}"
                        .format(cmd.cmd_id, cmd._clientid))

                # 传输分配
                if not self._config._ipdir.__contains__(
                        targetclient._statusbasic.ip):
                    self._logger.error(
                        "Client transfer folder not configured: clientip={}".
                        format(targetclient._statusbasic.ip))
                else:
                    targetdir = self._config._ipdir[
                        targetclient._statusbasic.ip]
                    succ = OutputManagement.output_to_file(cmd, targetdir)

            finally:
                with self._dbmanager.get_automic_locker(
                        EDBAutomic.ReduplicateTask):
                    self._update_to_db(cmd, targetclient, succ)

        except Exception as ex:
            self._logger.error(
                "Deliver IDownCmd err:\ncmdid:{}\nerr:{}".format(
                    cmd.cmd_id, ex))